From 60e5e411070d80815fbbf0f054bf25035dd2770e Mon Sep 17 00:00:00 2001 From: Carlos Crespo Date: Thu, 29 Sep 2022 14:23:50 +0200 Subject: [PATCH 01/72] Fix Legend Options and Node Map layout on mobile view (#142052) * Fix Legend Options and Node Map layout on mobile view * Fix Number of Color bar on mobile Co-authored-by: Kibana Machine <42973632+kibanamachine@users.noreply.github.com> --- .../components/waffle/legend_controls.tsx | 15 +++++++++++++-- .../inventory_view/components/waffle/map.tsx | 1 + .../components/waffle/palette_preview.tsx | 4 ++-- 3 files changed, 16 insertions(+), 4 deletions(-) diff --git a/x-pack/plugins/infra/public/pages/metrics/inventory_view/components/waffle/legend_controls.tsx b/x-pack/plugins/infra/public/pages/metrics/inventory_view/components/waffle/legend_controls.tsx index a9b8b399a6837..77784f855de32 100644 --- a/x-pack/plugins/infra/public/pages/metrics/inventory_view/components/waffle/legend_controls.tsx +++ b/x-pack/plugins/infra/public/pages/metrics/inventory_view/components/waffle/legend_controls.tsx @@ -24,6 +24,7 @@ import { } from '@elastic/eui'; import { i18n } from '@kbn/i18n'; import { FormattedMessage } from '@kbn/i18n-react'; +import { euiStyled } from '@kbn/kibana-react-plugin/common'; import React, { SyntheticEvent, useState, useCallback, useEffect } from 'react'; import { first, last } from 'lodash'; import { InfraWaffleMapBounds, InventoryColorPalette, PALETTES } from '../../../../../lib/lib'; @@ -189,9 +190,10 @@ export const LegendControls = ({ button={buttonComponent} anchorPosition="leftCenter" data-test-subj="legendControls" + // panelStyle={{ width: '100%', maxWidth: 375 }} > Legend Options - + - + ); }; + +const StyledEuiForm = euiStyled(EuiForm)` + min-width: 400px; + @media (max-width: 480px) { + min-width: 100%; + max-width: 100%; + width: 100vw; + } +`; diff --git a/x-pack/plugins/infra/public/pages/metrics/inventory_view/components/waffle/map.tsx b/x-pack/plugins/infra/public/pages/metrics/inventory_view/components/waffle/map.tsx index e0d03284d63fc..a4558d6a7e9b0 100644 --- a/x-pack/plugins/infra/public/pages/metrics/inventory_view/components/waffle/map.tsx +++ b/x-pack/plugins/infra/public/pages/metrics/inventory_view/components/waffle/map.tsx @@ -105,6 +105,7 @@ const WaffleMapOuterContainer = euiStyled.div<{ bottomMargin: number; staticHeig overflow-x: hidden; overflow-y: auto; margin-bottom: ${(props) => props.bottomMargin}px; + max-width: calc(100vw - 90px); ${(props) => props.staticHeight && 'min-height: 300px;'} `; diff --git a/x-pack/plugins/infra/public/pages/metrics/inventory_view/components/waffle/palette_preview.tsx b/x-pack/plugins/infra/public/pages/metrics/inventory_view/components/waffle/palette_preview.tsx index 132982eae69b9..9dc5f3acd6e57 100644 --- a/x-pack/plugins/infra/public/pages/metrics/inventory_view/components/waffle/palette_preview.tsx +++ b/x-pack/plugins/infra/public/pages/metrics/inventory_view/components/waffle/palette_preview.tsx @@ -28,9 +28,9 @@ export const PalettePreview = ({ steps, palette, reverse }: Props) => { }; const Swatch = euiStyled.div` - width: 15px; + max-width: 15px; height: 12px; - flex: 0 0 auto; + flex: 1 1 auto; &:first-child { border-radius: ${(props) => props.theme.eui.euiBorderRadius} 0 0 ${(props) => props.theme.eui.euiBorderRadius}; From e678b7888f64d7b8b80fdeb128c6ac96f87d3709 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Istv=C3=A1n=20Zolt=C3=A1n=20Szab=C3=B3?= Date: Thu, 29 Sep 2022 14:32:29 +0200 Subject: [PATCH 02/72] Adds ML URL shortcut to doc link manager (#142091) Co-authored-by: Lisa Cawley --- packages/kbn-doc-links/src/get_doc_links.ts | 53 +++++++++++---------- 1 file changed, 27 insertions(+), 26 deletions(-) diff --git a/packages/kbn-doc-links/src/get_doc_links.ts b/packages/kbn-doc-links/src/get_doc_links.ts index 721fc431a3c2e..3a0b89c1f0d1b 100644 --- a/packages/kbn-doc-links/src/get_doc_links.ts +++ b/packages/kbn-doc-links/src/get_doc_links.ts @@ -31,6 +31,7 @@ export const getDocLinks = ({ kibanaBranch }: GetDocLinkOptions): DocLinks => { const ENTERPRISE_SEARCH_DOCS = `${ELASTIC_WEBSITE_URL}guide/en/enterprise-search/${DOC_LINK_VERSION}/`; const WORKPLACE_SEARCH_DOCS = `${ELASTIC_WEBSITE_URL}guide/en/workplace-search/${DOC_LINK_VERSION}/`; const SEARCH_UI_DOCS = `${DOCS_WEBSITE_URL}search-ui/`; + const MACHINE_LEARNING_DOCS = `${ELASTIC_WEBSITE_URL}guide/en/machine-learning/${DOC_LINK_VERSION}/`; return deepFreeze({ settings: `${ELASTIC_WEBSITE_URL}guide/en/kibana/${DOC_LINK_VERSION}/settings.html`, @@ -398,39 +399,39 @@ export const getDocLinks = ({ kibanaBranch }: GetDocLinkOptions): DocLinks => { savedObjectsApiList: `${KIBANA_DOCS}saved-objects-api.html#saved-objects-api`, }, ml: { - guide: `${ELASTIC_WEBSITE_URL}guide/en/machine-learning/${DOC_LINK_VERSION}/index.html`, - aggregations: `${ELASTIC_WEBSITE_URL}guide/en/machine-learning/${DOC_LINK_VERSION}/ml-configuring-aggregation.html`, - anomalyDetection: `${ELASTIC_WEBSITE_URL}guide/en/machine-learning/${DOC_LINK_VERSION}/ml-ad-overview.html`, - anomalyDetectionJobs: `${ELASTIC_WEBSITE_URL}guide/en/machine-learning/${DOC_LINK_VERSION}/ml-ad-finding-anomalies.html`, - anomalyDetectionConfiguringCategories: `${ELASTIC_WEBSITE_URL}guide/en/machine-learning/${DOC_LINK_VERSION}/ml-configuring-categories.html`, - anomalyDetectionBucketSpan: `${ELASTIC_WEBSITE_URL}guide/en/machine-learning/${DOC_LINK_VERSION}/ml-ad-run-jobs.html#ml-ad-bucket-span`, - anomalyDetectionCardinality: `${ELASTIC_WEBSITE_URL}guide/en/machine-learning/${DOC_LINK_VERSION}/ml-ad-run-jobs.html#ml-ad-cardinality`, - anomalyDetectionCreateJobs: `${ELASTIC_WEBSITE_URL}guide/en/machine-learning/${DOC_LINK_VERSION}/ml-ad-run-jobs.html#ml-ad-create-job`, - anomalyDetectionDetectors: `${ELASTIC_WEBSITE_URL}guide/en/machine-learning/${DOC_LINK_VERSION}/ml-ad-run-jobs.html#ml-ad-detectors`, - anomalyDetectionInfluencers: `${ELASTIC_WEBSITE_URL}guide/en/machine-learning/${DOC_LINK_VERSION}/ml-ad-run-jobs.html#ml-ad-influencers`, + guide: `${MACHINE_LEARNING_DOCS}index.html`, + aggregations: `${MACHINE_LEARNING_DOCS}ml-configuring-aggregation.html`, + anomalyDetection: `${MACHINE_LEARNING_DOCS}ml-ad-overview.html`, + anomalyDetectionJobs: `${MACHINE_LEARNING_DOCS}ml-ad-finding-anomalies.html`, + anomalyDetectionConfiguringCategories: `${MACHINE_LEARNING_DOCS}ml-configuring-categories.html`, + anomalyDetectionBucketSpan: `${MACHINE_LEARNING_DOCS}ml-ad-run-jobs.html#ml-ad-bucket-span`, + anomalyDetectionCardinality: `${MACHINE_LEARNING_DOCS}ml-ad-run-jobs.html#ml-ad-cardinality`, + anomalyDetectionCreateJobs: `${MACHINE_LEARNING_DOCS}ml-ad-run-jobs.html#ml-ad-create-job`, + anomalyDetectionDetectors: `${MACHINE_LEARNING_DOCS}ml-ad-run-jobs.html#ml-ad-detectors`, + anomalyDetectionInfluencers: `${MACHINE_LEARNING_DOCS}ml-ad-run-jobs.html#ml-ad-influencers`, anomalyDetectionJobResource: `${ELASTICSEARCH_DOCS}ml-put-job.html#ml-put-job-path-parms`, anomalyDetectionJobResourceAnalysisConfig: `${ELASTICSEARCH_DOCS}ml-put-job.html#put-analysisconfig`, - anomalyDetectionJobTips: `${ELASTIC_WEBSITE_URL}guide/en/machine-learning/${DOC_LINK_VERSION}/ml-ad-run-jobs.html#ml-ad-job-tips`, - alertingRules: `${ELASTIC_WEBSITE_URL}guide/en/machine-learning/${DOC_LINK_VERSION}/ml-configuring-alerts.html`, - anomalyDetectionModelMemoryLimits: `${ELASTIC_WEBSITE_URL}guide/en/machine-learning/${DOC_LINK_VERSION}/ml-ad-run-jobs.html#ml-ad-model-memory-limits`, - calendars: `${ELASTIC_WEBSITE_URL}guide/en/machine-learning/${DOC_LINK_VERSION}/ml-ad-run-jobs.html#ml-ad-calendars`, - classificationEvaluation: `${ELASTIC_WEBSITE_URL}guide/en/machine-learning/${DOC_LINK_VERSION}/ml-dfa-classification.html#ml-dfanalytics-classification-evaluation`, - customRules: `${ELASTIC_WEBSITE_URL}guide/en/machine-learning/${DOC_LINK_VERSION}/ml-ad-run-jobs.html#ml-ad-rules`, - customUrls: `${ELASTIC_WEBSITE_URL}guide/en/machine-learning/${DOC_LINK_VERSION}/ml-configuring-url.html`, - dataFrameAnalytics: `${ELASTIC_WEBSITE_URL}guide/en/machine-learning/${DOC_LINK_VERSION}/ml-dfanalytics.html`, - dFAPrepareData: `${ELASTIC_WEBSITE_URL}guide/en/machine-learning/${DOC_LINK_VERSION}/ml-dfa-overview.html#prepare-transform-data`, - featureImportance: `${ELASTIC_WEBSITE_URL}guide/en/machine-learning/${DOC_LINK_VERSION}/ml-feature-importance.html`, - outlierDetectionRoc: `${ELASTIC_WEBSITE_URL}guide/en/machine-learning/${DOC_LINK_VERSION}/ml-dfa-finding-outliers.html#ml-dfanalytics-roc`, - regressionEvaluation: `${ELASTIC_WEBSITE_URL}guide/en/machine-learning/${DOC_LINK_VERSION}/ml-dfa-regression.html#ml-dfanalytics-regression-evaluation`, - classificationAucRoc: `${ELASTIC_WEBSITE_URL}guide/en/machine-learning/${DOC_LINK_VERSION}/ml-dfa-classification.html#ml-dfanalytics-class-aucroc`, + anomalyDetectionJobTips: `${MACHINE_LEARNING_DOCS}ml-ad-run-jobs.html#ml-ad-job-tips`, + alertingRules: `${MACHINE_LEARNING_DOCS}ml-configuring-alerts.html`, + anomalyDetectionModelMemoryLimits: `${MACHINE_LEARNING_DOCS}ml-ad-run-jobs.html#ml-ad-model-memory-limits`, + calendars: `${MACHINE_LEARNING_DOCS}ml-ad-run-jobs.html#ml-ad-calendars`, + classificationEvaluation: `${MACHINE_LEARNING_DOCS}ml-dfa-classification.html#ml-dfanalytics-classification-evaluation`, + customRules: `${MACHINE_LEARNING_DOCS}ml-ad-run-jobs.html#ml-ad-rules`, + customUrls: `${MACHINE_LEARNING_DOCS}ml-configuring-url.html`, + dataFrameAnalytics: `${MACHINE_LEARNING_DOCS}ml-dfanalytics.html`, + dFAPrepareData: `${MACHINE_LEARNING_DOCS}ml-dfa-overview.html#prepare-transform-data`, + featureImportance: `${MACHINE_LEARNING_DOCS}ml-feature-importance.html`, + outlierDetectionRoc: `${MACHINE_LEARNING_DOCS}ml-dfa-finding-outliers.html#ml-dfanalytics-roc`, + regressionEvaluation: `${MACHINE_LEARNING_DOCS}ml-dfa-regression.html#ml-dfanalytics-regression-evaluation`, + classificationAucRoc: `${MACHINE_LEARNING_DOCS}ml-dfa-classification.html#ml-dfanalytics-class-aucroc`, setUpgradeMode: `${ELASTICSEARCH_DOCS}ml-set-upgrade-mode.html`, - trainedModels: `${ELASTIC_WEBSITE_URL}guide/en/machine-learning/${DOC_LINK_VERSION}/ml-trained-models.html`, - startTrainedModelsDeployment: `${ELASTIC_WEBSITE_URL}guide/en/machine-learning/${DOC_LINK_VERSION}/ml-nlp-deploy-models.html#ml-nlp-deploy-model`, + trainedModels: `${MACHINE_LEARNING_DOCS}ml-trained-models.html`, + startTrainedModelsDeployment: `${MACHINE_LEARNING_DOCS}ml-nlp-deploy-models.html#ml-nlp-deploy-model`, }, transforms: { guide: `${ELASTICSEARCH_DOCS}transforms.html`, // TODO add valid docs URL - alertingRules: `${ELASTIC_WEBSITE_URL}guide/en/machine-learning/${DOC_LINK_VERSION}/ml-configuring-alerts.html`, + alertingRules: `${MACHINE_LEARNING_DOCS}ml-configuring-alerts.html`, }, visualize: { guide: `${KIBANA_DOCS}dashboard.html`, From 7c9875c33c1922bb0a6c4ca436e25dd7f0c95ea7 Mon Sep 17 00:00:00 2001 From: doakalexi <109488926+doakalexi@users.noreply.github.com> Date: Thu, 29 Sep 2022 08:56:47 -0400 Subject: [PATCH 03/72] [Response Ops] [Alerting] Rules and Connectors: Current page in breadcrumbs shows as link (#141838) * Updating breadcrumb function for alerting * Remove href --- .../public/application/lib/breadcrumb.test.ts | 31 +++++++++------- .../public/application/lib/breadcrumb.ts | 35 +++++++++++-------- .../rule_details/components/rule_details.tsx | 7 ++-- 3 files changed, 41 insertions(+), 32 deletions(-) diff --git a/x-pack/plugins/triggers_actions_ui/public/application/lib/breadcrumb.test.ts b/x-pack/plugins/triggers_actions_ui/public/application/lib/breadcrumb.test.ts index 26a69093ae48d..cbe226ce68aa8 100644 --- a/x-pack/plugins/triggers_actions_ui/public/application/lib/breadcrumb.test.ts +++ b/x-pack/plugins/triggers_actions_ui/public/application/lib/breadcrumb.test.ts @@ -5,40 +5,47 @@ * 2.0. */ -import { getAlertingSectionBreadcrumb, getRuleDetailsBreadcrumb } from './breadcrumb'; +import { getAlertingSectionBreadcrumb } from './breadcrumb'; import { i18n } from '@kbn/i18n'; import { routeToConnectors, routeToRules, routeToHome } from '../constants'; describe('getAlertingSectionBreadcrumb', () => { test('if change calls return proper breadcrumb title ', async () => { - expect(getAlertingSectionBreadcrumb('connectors')).toMatchObject({ + expect(getAlertingSectionBreadcrumb('connectors', true)).toMatchObject({ text: i18n.translate('xpack.triggersActionsUI.connectors.breadcrumbTitle', { defaultMessage: 'Connectors', }), href: `${routeToConnectors}`, }); - expect(getAlertingSectionBreadcrumb('rules')).toMatchObject({ + expect(getAlertingSectionBreadcrumb('rules', true)).toMatchObject({ text: i18n.translate('xpack.triggersActionsUI.rules.breadcrumbTitle', { defaultMessage: 'Rules', }), href: `${routeToRules}`, }); - expect(getAlertingSectionBreadcrumb('home')).toMatchObject({ + expect(getAlertingSectionBreadcrumb('home', true)).toMatchObject({ text: i18n.translate('xpack.triggersActionsUI.home.breadcrumbTitle', { defaultMessage: 'Rules and Connectors', }), href: `${routeToHome}`, }); }); -}); - -describe('getRuleDetailsBreadcrumb', () => { - test('if select an alert should return proper breadcrumb title with alert name ', async () => { - expect(getRuleDetailsBreadcrumb('testId', 'testName')).toMatchObject({ - text: i18n.translate('xpack.triggersActionsUI.alertDetails.breadcrumbTitle', { - defaultMessage: 'testName', + test('if boolean is passed in returns proper breadcrumb href ', async () => { + expect(getAlertingSectionBreadcrumb('connectors', true)).toMatchObject({ + text: i18n.translate('xpack.triggersActionsUI.connectors.breadcrumbTitle', { + defaultMessage: 'Connectors', + }), + href: `${routeToConnectors}`, + }); + expect(getAlertingSectionBreadcrumb('rules', false)).toMatchObject({ + text: i18n.translate('xpack.triggersActionsUI.rules.breadcrumbTitle', { + defaultMessage: 'Rules', + }), + }); + expect(getAlertingSectionBreadcrumb('home', false)).toMatchObject({ + text: i18n.translate('xpack.triggersActionsUI.home.breadcrumbTitle', { + defaultMessage: 'Rules and Connectors', }), - href: '/rule/testId', }); }); }); diff --git a/x-pack/plugins/triggers_actions_ui/public/application/lib/breadcrumb.ts b/x-pack/plugins/triggers_actions_ui/public/application/lib/breadcrumb.ts index d26cdbcb3d174..46a15b12bb733 100644 --- a/x-pack/plugins/triggers_actions_ui/public/application/lib/breadcrumb.ts +++ b/x-pack/plugins/triggers_actions_ui/public/application/lib/breadcrumb.ts @@ -6,9 +6,12 @@ */ import { i18n } from '@kbn/i18n'; -import { routeToHome, routeToConnectors, routeToRules, routeToRuleDetails } from '../constants'; +import { routeToHome, routeToConnectors, routeToRules } from '../constants'; -export const getAlertingSectionBreadcrumb = (type: string): { text: string; href: string } => { +export const getAlertingSectionBreadcrumb = ( + type: string, + returnHref: boolean = false +): { text: string; href?: string } => { // Home and sections switch (type) { case 'connectors': @@ -16,31 +19,33 @@ export const getAlertingSectionBreadcrumb = (type: string): { text: string; href text: i18n.translate('xpack.triggersActionsUI.connectors.breadcrumbTitle', { defaultMessage: 'Connectors', }), - href: `${routeToConnectors}`, + ...(returnHref + ? { + href: `${routeToConnectors}`, + } + : {}), }; case 'rules': return { text: i18n.translate('xpack.triggersActionsUI.rules.breadcrumbTitle', { defaultMessage: 'Rules', }), - href: `${routeToRules}`, + ...(returnHref + ? { + href: `${routeToRules}`, + } + : {}), }; default: return { text: i18n.translate('xpack.triggersActionsUI.home.breadcrumbTitle', { defaultMessage: 'Rules and Connectors', }), - href: `${routeToHome}`, + ...(returnHref + ? { + href: `${routeToHome}`, + } + : {}), }; } }; - -export const getRuleDetailsBreadcrumb = ( - id: string, - name: string -): { text: string; href: string } => { - return { - text: name, - href: `${routeToRuleDetails.replace(':ruleId', id)}`, - }; -}; diff --git a/x-pack/plugins/triggers_actions_ui/public/application/sections/rule_details/components/rule_details.tsx b/x-pack/plugins/triggers_actions_ui/public/application/sections/rule_details/components/rule_details.tsx index c17bc40086666..38357d7c56057 100644 --- a/x-pack/plugins/triggers_actions_ui/public/application/sections/rule_details/components/rule_details.tsx +++ b/x-pack/plugins/triggers_actions_ui/public/application/sections/rule_details/components/rule_details.tsx @@ -36,7 +36,7 @@ import { hasExecuteActionsCapability, hasManageApiKeysCapability, } from '../../../lib/capabilities'; -import { getAlertingSectionBreadcrumb, getRuleDetailsBreadcrumb } from '../../../lib/breadcrumb'; +import { getAlertingSectionBreadcrumb } from '../../../lib/breadcrumb'; import { getCurrentDocTitle } from '../../../lib/doc_title'; import { Rule, @@ -117,10 +117,7 @@ export const RuleDetails: React.FunctionComponent = ({ // Set breadcrumb and page title useEffect(() => { - setBreadcrumbs([ - getAlertingSectionBreadcrumb('rules'), - getRuleDetailsBreadcrumb(rule.id, rule.name), - ]); + setBreadcrumbs([getAlertingSectionBreadcrumb('rules', true), { text: rule.name }]); chrome.docTitle.change(getCurrentDocTitle('rules')); // eslint-disable-next-line react-hooks/exhaustive-deps }, []); From b2ab340425da35fb9f0f3627d3bde5d55c9ae3ea Mon Sep 17 00:00:00 2001 From: Paul Tavares <56442535+paul-tavares@users.noreply.github.com> Date: Thu, 29 Sep 2022 09:40:41 -0400 Subject: [PATCH 04/72] [Security Solution][Endpoint] Move all endpoint responder jest tests for response actions to (jest) integration tests (#142006) * un-skip tests in endpoint_responder * move endpoint responder tests to integration tests * [CI] Auto-commit changed files from 'node scripts/precommit_hook.js --ref HEAD~1..HEAD --fix' * Add jest integration config file * add standard setup for react testing `data-test-subj` testIdAttribute * change `@kbn/test/jest_integration` preset to include all `setupFilesAfterEnv` from base preset * Fix jest testing warning/error about missing react `key` in command_usage.tsx component * Stabilise test when checking calls to action details api Co-authored-by: kibanamachine <42973632+kibanamachine@users.noreply.github.com> --- .../kbn-test/jest_integration/jest-preset.js | 3 +-- .../jest.integration.config.js | 12 +++++++++ .../console/components/command_usage.tsx | 4 +-- .../get_processes_action.test.tsx | 25 ++++++++--------- .../isolate_action.test.tsx | 27 ++++++++++--------- .../kill_process_action.test.tsx | 27 ++++++++++--------- .../release_action.test.tsx | 27 ++++++++++--------- .../suspend_process_action.test.tsx | 25 ++++++++--------- 8 files changed, 84 insertions(+), 66 deletions(-) create mode 100644 x-pack/plugins/security_solution/jest.integration.config.js rename x-pack/plugins/security_solution/public/management/components/endpoint_responder/{ => integration_tests}/get_processes_action.test.tsx (88%) rename x-pack/plugins/security_solution/public/management/components/endpoint_responder/{ => integration_tests}/isolate_action.test.tsx (87%) rename x-pack/plugins/security_solution/public/management/components/endpoint_responder/{ => integration_tests}/kill_process_action.test.tsx (91%) rename x-pack/plugins/security_solution/public/management/components/endpoint_responder/{ => integration_tests}/release_action.test.tsx (88%) rename x-pack/plugins/security_solution/public/management/components/endpoint_responder/{ => integration_tests}/suspend_process_action.test.tsx (91%) diff --git a/packages/kbn-test/jest_integration/jest-preset.js b/packages/kbn-test/jest_integration/jest-preset.js index b039329893d37..d150f8bd9e45d 100644 --- a/packages/kbn-test/jest_integration/jest-preset.js +++ b/packages/kbn-test/jest_integration/jest-preset.js @@ -15,9 +15,8 @@ module.exports = { (pattern) => !pattern.includes('integration_tests') ), setupFilesAfterEnv: [ + ...preset.setupFilesAfterEnv, '/node_modules/@kbn/test/target_node/src/jest/setup/after_env.integration.js', - '/node_modules/@kbn/test/target_node/src/jest/setup/mocks.moment_timezone.js', - '/node_modules/@kbn/test/target_node/src/jest/setup/mocks.eui.js', ], reporters: [ 'default', diff --git a/x-pack/plugins/security_solution/jest.integration.config.js b/x-pack/plugins/security_solution/jest.integration.config.js new file mode 100644 index 0000000000000..046faf5e6198c --- /dev/null +++ b/x-pack/plugins/security_solution/jest.integration.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/jest_integration', + rootDir: '../../..', + roots: ['/x-pack/plugins/security_solution'], +}; diff --git a/x-pack/plugins/security_solution/public/management/components/console/components/command_usage.tsx b/x-pack/plugins/security_solution/public/management/components/console/components/command_usage.tsx index e70383d8251c5..a79cc3cd7ad54 100644 --- a/x-pack/plugins/security_solution/public/management/components/console/components/command_usage.tsx +++ b/x-pack/plugins/security_solution/public/management/components/console/components/command_usage.tsx @@ -22,10 +22,10 @@ export const CommandInputUsage = memo>(({ const usageHelp = useMemo(() => { return getArgumentsForCommand(commandDef).map((usage, index) => { return ( - <> + {index > 0 && } {`${commandDef.name} ${usage}`} - + ); }); }, [commandDef]); diff --git a/x-pack/plugins/security_solution/public/management/components/endpoint_responder/get_processes_action.test.tsx b/x-pack/plugins/security_solution/public/management/components/endpoint_responder/integration_tests/get_processes_action.test.tsx similarity index 88% rename from x-pack/plugins/security_solution/public/management/components/endpoint_responder/get_processes_action.test.tsx rename to x-pack/plugins/security_solution/public/management/components/endpoint_responder/integration_tests/get_processes_action.test.tsx index 97689a790afa1..3b46967c33abf 100644 --- a/x-pack/plugins/security_solution/public/management/components/endpoint_responder/get_processes_action.test.tsx +++ b/x-pack/plugins/security_solution/public/management/components/endpoint_responder/integration_tests/get_processes_action.test.tsx @@ -5,19 +5,19 @@ * 2.0. */ -import type { AppContextTestRender } from '../../../common/mock/endpoint'; -import { createAppRootMockRenderer } from '../../../common/mock/endpoint'; +import type { AppContextTestRender } from '../../../../common/mock/endpoint'; +import { createAppRootMockRenderer } from '../../../../common/mock/endpoint'; import { ConsoleManagerTestComponent, getConsoleManagerMockRenderResultQueriesAndActions, -} from '../console/components/console_manager/mocks'; +} from '../../console/components/console_manager/mocks'; import React from 'react'; -import { getEndpointResponseActionsConsoleCommands } from './endpoint_response_actions_console_commands'; -import { responseActionsHttpMocks } from '../../mocks/response_actions_http_mocks'; -import { enterConsoleCommand } from '../console/mocks'; +import { getEndpointResponseActionsConsoleCommands } from '../endpoint_response_actions_console_commands'; +import { responseActionsHttpMocks } from '../../../mocks/response_actions_http_mocks'; +import { enterConsoleCommand } from '../../console/mocks'; import { waitFor } from '@testing-library/react'; -import type { ResponderCapabilities } from '../../../../common/endpoint/constants'; -import { RESPONDER_CAPABILITIES } from '../../../../common/endpoint/constants'; +import type { ResponderCapabilities } from '../../../../../common/endpoint/constants'; +import { RESPONDER_CAPABILITIES } from '../../../../../common/endpoint/constants'; describe('When using processes action from response actions console', () => { let render: ( @@ -161,6 +161,7 @@ describe('When using processes action from response actions console', () => { await waitFor(() => { expect(apiMocks.responseProvider.processes).toHaveBeenCalledTimes(1); + expect(apiMocks.responseProvider.actionDetails).toHaveBeenCalledTimes(1); }); // Hide the console @@ -182,20 +183,20 @@ describe('When using processes action from response actions console', () => { path: '/api/endpoint/action/1.2.3', }); pendingDetailResponse.data.isCompleted = false; + apiMocks.responseProvider.actionDetails.mockClear(); apiMocks.responseProvider.actionDetails.mockReturnValue(pendingDetailResponse); await render(); - expect(apiMocks.responseProvider.actionDetails).toHaveBeenCalledTimes(2); + expect(apiMocks.responseProvider.actionDetails).toHaveBeenCalledTimes(1); await consoleManagerMockAccess.openRunningConsole(); await waitFor(() => { - expect(apiMocks.responseProvider.actionDetails).toHaveBeenCalledTimes(3); + expect(apiMocks.responseProvider.actionDetails).toHaveBeenCalledTimes(2); }); }); - // FLAKY: https://github.com/elastic/kibana/issues/139707 - it.skip('should display completion output if done (no additional API calls)', async () => { + it('should display completion output if done (no additional API calls)', async () => { await render(); expect(apiMocks.responseProvider.actionDetails).toHaveBeenCalledTimes(1); diff --git a/x-pack/plugins/security_solution/public/management/components/endpoint_responder/isolate_action.test.tsx b/x-pack/plugins/security_solution/public/management/components/endpoint_responder/integration_tests/isolate_action.test.tsx similarity index 87% rename from x-pack/plugins/security_solution/public/management/components/endpoint_responder/isolate_action.test.tsx rename to x-pack/plugins/security_solution/public/management/components/endpoint_responder/integration_tests/isolate_action.test.tsx index 110ddbb53b1b0..10dde22e6083a 100644 --- a/x-pack/plugins/security_solution/public/management/components/endpoint_responder/isolate_action.test.tsx +++ b/x-pack/plugins/security_solution/public/management/components/endpoint_responder/integration_tests/isolate_action.test.tsx @@ -5,20 +5,20 @@ * 2.0. */ -import type { AppContextTestRender } from '../../../common/mock/endpoint'; -import { createAppRootMockRenderer } from '../../../common/mock/endpoint'; +import type { AppContextTestRender } from '../../../../common/mock/endpoint'; +import { createAppRootMockRenderer } from '../../../../common/mock/endpoint'; import { ConsoleManagerTestComponent, getConsoleManagerMockRenderResultQueriesAndActions, -} from '../console/components/console_manager/mocks'; +} from '../../console/components/console_manager/mocks'; import React from 'react'; -import { getEndpointResponseActionsConsoleCommands } from './endpoint_response_actions_console_commands'; -import { responseActionsHttpMocks } from '../../mocks/response_actions_http_mocks'; -import { enterConsoleCommand } from '../console/mocks'; +import { getEndpointResponseActionsConsoleCommands } from '../endpoint_response_actions_console_commands'; +import { responseActionsHttpMocks } from '../../../mocks/response_actions_http_mocks'; +import { enterConsoleCommand } from '../../console/mocks'; import { waitFor } from '@testing-library/react'; -import type { ResponderCapabilities } from '../../../../common/endpoint/constants'; -import { RESPONDER_CAPABILITIES } from '../../../../common/endpoint/constants'; -import { getDeferred } from '../../mocks/utils'; +import type { ResponderCapabilities } from '../../../../../common/endpoint/constants'; +import { RESPONDER_CAPABILITIES } from '../../../../../common/endpoint/constants'; +import { getDeferred } from '../../../mocks/utils'; describe('When using isolate action from response actions console', () => { let render: ( @@ -170,6 +170,7 @@ describe('When using isolate action from response actions console', () => { await waitFor(() => { expect(apiMocks.responseProvider.isolateHost).toHaveBeenCalledTimes(1); + expect(apiMocks.responseProvider.actionDetails).toHaveBeenCalledTimes(1); }); // Hide the console @@ -191,20 +192,20 @@ describe('When using isolate action from response actions console', () => { path: '/api/endpoint/action/1.2.3', }); pendingDetailResponse.data.isCompleted = false; + apiMocks.responseProvider.actionDetails.mockClear(); apiMocks.responseProvider.actionDetails.mockReturnValue(pendingDetailResponse); await render(); - expect(apiMocks.responseProvider.actionDetails).toHaveBeenCalledTimes(2); + expect(apiMocks.responseProvider.actionDetails).toHaveBeenCalledTimes(1); await consoleManagerMockAccess.openRunningConsole(); await waitFor(() => { - expect(apiMocks.responseProvider.actionDetails).toHaveBeenCalledTimes(3); + expect(apiMocks.responseProvider.actionDetails).toHaveBeenCalledTimes(2); }); }); - // SKIP: https://github.com/elastic/kibana/issues/139586 - it.skip('should display completion output if done (no additional API calls)', async () => { + it('should display completion output if done (no additional API calls)', async () => { await render(); expect(apiMocks.responseProvider.actionDetails).toHaveBeenCalledTimes(1); diff --git a/x-pack/plugins/security_solution/public/management/components/endpoint_responder/kill_process_action.test.tsx b/x-pack/plugins/security_solution/public/management/components/endpoint_responder/integration_tests/kill_process_action.test.tsx similarity index 91% rename from x-pack/plugins/security_solution/public/management/components/endpoint_responder/kill_process_action.test.tsx rename to x-pack/plugins/security_solution/public/management/components/endpoint_responder/integration_tests/kill_process_action.test.tsx index f888df2099b13..12cec2dd613b5 100644 --- a/x-pack/plugins/security_solution/public/management/components/endpoint_responder/kill_process_action.test.tsx +++ b/x-pack/plugins/security_solution/public/management/components/endpoint_responder/integration_tests/kill_process_action.test.tsx @@ -5,19 +5,19 @@ * 2.0. */ -import type { AppContextTestRender } from '../../../common/mock/endpoint'; -import { createAppRootMockRenderer } from '../../../common/mock/endpoint'; +import type { AppContextTestRender } from '../../../../common/mock/endpoint'; +import { createAppRootMockRenderer } from '../../../../common/mock/endpoint'; import { ConsoleManagerTestComponent, getConsoleManagerMockRenderResultQueriesAndActions, -} from '../console/components/console_manager/mocks'; +} from '../../console/components/console_manager/mocks'; import React from 'react'; -import { getEndpointResponseActionsConsoleCommands } from './endpoint_response_actions_console_commands'; -import { enterConsoleCommand } from '../console/mocks'; +import { getEndpointResponseActionsConsoleCommands } from '../endpoint_response_actions_console_commands'; +import { enterConsoleCommand } from '../../console/mocks'; import { waitFor } from '@testing-library/react'; -import { responseActionsHttpMocks } from '../../mocks/response_actions_http_mocks'; -import type { ResponderCapabilities } from '../../../../common/endpoint/constants'; -import { RESPONDER_CAPABILITIES } from '../../../../common/endpoint/constants'; +import { responseActionsHttpMocks } from '../../../mocks/response_actions_http_mocks'; +import type { ResponderCapabilities } from '../../../../../common/endpoint/constants'; +import { RESPONDER_CAPABILITIES } from '../../../../../common/endpoint/constants'; describe('When using the kill-process action from response actions console', () => { let render: ( @@ -250,6 +250,7 @@ describe('When using the kill-process action from response actions console', () await waitFor(() => { expect(apiMocks.responseProvider.killProcess).toHaveBeenCalledTimes(1); + expect(apiMocks.responseProvider.actionDetails).toHaveBeenCalledTimes(1); }); // Hide the console @@ -270,21 +271,23 @@ describe('When using the kill-process action from response actions console', () const pendingDetailResponse = apiMocks.responseProvider.actionDetails({ path: '/api/endpoint/action/1.2.3', }); + pendingDetailResponse.data.isCompleted = false; + apiMocks.responseProvider.actionDetails.mockClear(); apiMocks.responseProvider.actionDetails.mockReturnValue(pendingDetailResponse); + await render(); - expect(apiMocks.responseProvider.actionDetails).toHaveBeenCalledTimes(2); + expect(apiMocks.responseProvider.actionDetails).toHaveBeenCalledTimes(1); await consoleManagerMockAccess.openRunningConsole(); await waitFor(() => { - expect(apiMocks.responseProvider.actionDetails).toHaveBeenCalledTimes(3); + expect(apiMocks.responseProvider.actionDetails).toHaveBeenCalledTimes(2); }); }); - // FLAKY: https://github.com/elastic/kibana/issues/139962 - it.skip('should display completion output if done (no additional API calls)', async () => { + it('should display completion output if done (no additional API calls)', async () => { await render(); expect(apiMocks.responseProvider.actionDetails).toHaveBeenCalledTimes(1); diff --git a/x-pack/plugins/security_solution/public/management/components/endpoint_responder/release_action.test.tsx b/x-pack/plugins/security_solution/public/management/components/endpoint_responder/integration_tests/release_action.test.tsx similarity index 88% rename from x-pack/plugins/security_solution/public/management/components/endpoint_responder/release_action.test.tsx rename to x-pack/plugins/security_solution/public/management/components/endpoint_responder/integration_tests/release_action.test.tsx index d1c1ea264f863..c2052a4e6401a 100644 --- a/x-pack/plugins/security_solution/public/management/components/endpoint_responder/release_action.test.tsx +++ b/x-pack/plugins/security_solution/public/management/components/endpoint_responder/integration_tests/release_action.test.tsx @@ -5,20 +5,20 @@ * 2.0. */ -import type { AppContextTestRender } from '../../../common/mock/endpoint'; -import { createAppRootMockRenderer } from '../../../common/mock/endpoint'; +import type { AppContextTestRender } from '../../../../common/mock/endpoint'; +import { createAppRootMockRenderer } from '../../../../common/mock/endpoint'; import { ConsoleManagerTestComponent, getConsoleManagerMockRenderResultQueriesAndActions, -} from '../console/components/console_manager/mocks'; +} from '../../console/components/console_manager/mocks'; import React from 'react'; -import { getEndpointResponseActionsConsoleCommands } from './endpoint_response_actions_console_commands'; -import { enterConsoleCommand } from '../console/mocks'; +import { getEndpointResponseActionsConsoleCommands } from '../endpoint_response_actions_console_commands'; +import { enterConsoleCommand } from '../../console/mocks'; import { waitFor } from '@testing-library/react'; -import { responseActionsHttpMocks } from '../../mocks/response_actions_http_mocks'; -import type { ResponderCapabilities } from '../../../../common/endpoint/constants'; -import { RESPONDER_CAPABILITIES } from '../../../../common/endpoint/constants'; -import { getDeferred } from '../../mocks/utils'; +import { responseActionsHttpMocks } from '../../../mocks/response_actions_http_mocks'; +import type { ResponderCapabilities } from '../../../../../common/endpoint/constants'; +import { RESPONDER_CAPABILITIES } from '../../../../../common/endpoint/constants'; +import { getDeferred } from '../../../mocks/utils'; describe('When using the release action from response actions console', () => { let render: ( @@ -171,6 +171,7 @@ describe('When using the release action from response actions console', () => { await waitFor(() => { expect(apiMocks.responseProvider.releaseHost).toHaveBeenCalledTimes(1); + expect(apiMocks.responseProvider.actionDetails).toHaveBeenCalledTimes(1); }); // Hide the console @@ -192,20 +193,20 @@ describe('When using the release action from response actions console', () => { path: '/api/endpoint/action/1.2.3', }); pendingDetailResponse.data.isCompleted = false; + apiMocks.responseProvider.actionDetails.mockClear(); apiMocks.responseProvider.actionDetails.mockReturnValue(pendingDetailResponse); await render(); - expect(apiMocks.responseProvider.actionDetails).toHaveBeenCalledTimes(2); + expect(apiMocks.responseProvider.actionDetails).toHaveBeenCalledTimes(1); await consoleManagerMockAccess.openRunningConsole(); await waitFor(() => { - expect(apiMocks.responseProvider.actionDetails).toHaveBeenCalledTimes(3); + expect(apiMocks.responseProvider.actionDetails).toHaveBeenCalledTimes(2); }); }); - // FLAKY: https://github.com/elastic/kibana/issues/139641 - it.skip('should display completion output if done (no additional API calls)', async () => { + it('should display completion output if done (no additional API calls)', async () => { await render(); expect(apiMocks.responseProvider.actionDetails).toHaveBeenCalledTimes(1); diff --git a/x-pack/plugins/security_solution/public/management/components/endpoint_responder/suspend_process_action.test.tsx b/x-pack/plugins/security_solution/public/management/components/endpoint_responder/integration_tests/suspend_process_action.test.tsx similarity index 91% rename from x-pack/plugins/security_solution/public/management/components/endpoint_responder/suspend_process_action.test.tsx rename to x-pack/plugins/security_solution/public/management/components/endpoint_responder/integration_tests/suspend_process_action.test.tsx index 7479e52edfb07..28fe91999662a 100644 --- a/x-pack/plugins/security_solution/public/management/components/endpoint_responder/suspend_process_action.test.tsx +++ b/x-pack/plugins/security_solution/public/management/components/endpoint_responder/integration_tests/suspend_process_action.test.tsx @@ -5,19 +5,19 @@ * 2.0. */ -import type { AppContextTestRender } from '../../../common/mock/endpoint'; -import { createAppRootMockRenderer } from '../../../common/mock/endpoint'; +import type { AppContextTestRender } from '../../../../common/mock/endpoint'; +import { createAppRootMockRenderer } from '../../../../common/mock/endpoint'; import { ConsoleManagerTestComponent, getConsoleManagerMockRenderResultQueriesAndActions, -} from '../console/components/console_manager/mocks'; +} from '../../console/components/console_manager/mocks'; import React from 'react'; -import { getEndpointResponseActionsConsoleCommands } from './endpoint_response_actions_console_commands'; -import { enterConsoleCommand } from '../console/mocks'; +import { getEndpointResponseActionsConsoleCommands } from '../endpoint_response_actions_console_commands'; +import { enterConsoleCommand } from '../../console/mocks'; import { waitFor } from '@testing-library/react'; -import { responseActionsHttpMocks } from '../../mocks/response_actions_http_mocks'; -import type { ResponderCapabilities } from '../../../../common/endpoint/constants'; -import { RESPONDER_CAPABILITIES } from '../../../../common/endpoint/constants'; +import { responseActionsHttpMocks } from '../../../mocks/response_actions_http_mocks'; +import type { ResponderCapabilities } from '../../../../../common/endpoint/constants'; +import { RESPONDER_CAPABILITIES } from '../../../../../common/endpoint/constants'; describe('When using the suspend-process action from response actions console', () => { let render: ( @@ -241,6 +241,7 @@ describe('When using the suspend-process action from response actions console', await waitFor(() => { expect(apiMocks.responseProvider.suspendProcess).toHaveBeenCalledTimes(1); + expect(apiMocks.responseProvider.actionDetails).toHaveBeenCalledTimes(1); }); // Hide the console @@ -262,20 +263,20 @@ describe('When using the suspend-process action from response actions console', path: '/api/endpoint/action/1.2.3', }); pendingDetailResponse.data.isCompleted = false; + apiMocks.responseProvider.actionDetails.mockClear(); apiMocks.responseProvider.actionDetails.mockReturnValue(pendingDetailResponse); await render(); - expect(apiMocks.responseProvider.actionDetails).toHaveBeenCalledTimes(2); + expect(apiMocks.responseProvider.actionDetails).toHaveBeenCalledTimes(1); await consoleManagerMockAccess.openRunningConsole(); await waitFor(() => { - expect(apiMocks.responseProvider.actionDetails).toHaveBeenCalledTimes(3); + expect(apiMocks.responseProvider.actionDetails).toHaveBeenCalledTimes(2); }); }); - // FLAKY: https://github.com/elastic/kibana/issues/140119 - it.skip('should display completion output if done (no additional API calls)', async () => { + it('should display completion output if done (no additional API calls)', async () => { await render(); expect(apiMocks.responseProvider.actionDetails).toHaveBeenCalledTimes(1); From db6a82530b00914f3e03f414a71707d7f942a755 Mon Sep 17 00:00:00 2001 From: Gloria Hornero Date: Thu, 29 Sep 2022 15:44:53 +0200 Subject: [PATCH 05/72] [Security Solution] Adds Cypress test for index action in detection rules (#141069) Co-authored-by: Dmitrii Shevchenko Co-authored-by: Kibana Machine <42973632+kibanamachine@users.noreply.github.com> --- .../detection_rules/custom_query_rule.cy.ts | 30 ++- .../custom_query_rule_data_view.cy.ts | 24 +- .../custom_saved_query_rule.cy.ts | 6 +- .../event_correlation_rule.cy.ts | 21 +- .../indicator_match_rule.cy.ts | 16 +- .../e2e/detection_rules/new_terms_rule.cy.ts | 16 +- .../e2e/detection_rules/override.cy.ts | 21 +- .../e2e/detection_rules/rule_actions.cy.ts | 74 ++++++ .../e2e/detection_rules/threshold_rule.cy.ts | 20 +- .../cypress/objects/connector.ts | 24 +- .../security_solution/cypress/objects/rule.ts | 41 ++- .../cypress/screens/create_new_rule.ts | 8 + .../cypress/tasks/api_calls/elasticsearch.ts | 55 ++++ .../cypress/tasks/api_calls/rules.ts | 94 ++++--- .../security_solution/cypress/tasks/common.ts | 43 ++++ .../cypress/tasks/create_new_rule.ts | 235 +++++++++++------- .../json_editor_with_message_variables.tsx | 1 + 17 files changed, 533 insertions(+), 196 deletions(-) create mode 100644 x-pack/plugins/security_solution/cypress/e2e/detection_rules/rule_actions.cy.ts create mode 100644 x-pack/plugins/security_solution/cypress/tasks/api_calls/elasticsearch.ts diff --git a/x-pack/plugins/security_solution/cypress/e2e/detection_rules/custom_query_rule.cy.ts b/x-pack/plugins/security_solution/cypress/e2e/detection_rules/custom_query_rule.cy.ts index bdc76cc5f0a59..a594d7f3ffc2f 100644 --- a/x-pack/plugins/security_solution/cypress/e2e/detection_rules/custom_query_rule.cy.ts +++ b/x-pack/plugins/security_solution/cypress/e2e/detection_rules/custom_query_rule.cy.ts @@ -6,6 +6,7 @@ */ import { formatMitreAttackDescription } from '../../helpers/rules'; +import type { Mitre } from '../../objects/rule'; import { getNewRule, getExistingRule, @@ -13,6 +14,7 @@ import { getEditedRule, getNewOverrideRule, } from '../../objects/rule'; +import type { CompleteTimeline } from '../../objects/timeline'; import { ALERT_GRID_CELL, NUMBER_OF_ALERTS } from '../../screens/alerts'; import { @@ -46,6 +48,7 @@ import { FROM_VALIDATION_ERROR, EMAIL_ACTION_TO_INPUT, EMAIL_ACTION_SUBJECT_INPUT, + SCHEDULE_CONTINUE_BUTTON, } from '../../screens/create_new_rule'; import { ADDITIONAL_LOOK_BACK_DETAILS, @@ -87,7 +90,7 @@ import { createAndEnableRule, fillAboutRule, fillAboutRuleAndContinue, - fillDefineCustomRuleWithImportedQueryAndContinue, + fillDefineCustomRuleAndContinue, fillEmailConnectorForm, fillScheduleRuleAndContinue, goToAboutStepTab, @@ -108,19 +111,21 @@ describe('Custom query rules', () => { login(); }); describe('Custom detection rules creation', () => { - const expectedUrls = getNewRule().referenceUrls.join(''); - const expectedFalsePositives = getNewRule().falsePositivesExamples.join(''); - const expectedTags = getNewRule().tags.join(''); - const expectedMitre = formatMitreAttackDescription(getNewRule().mitre); + const expectedUrls = getNewRule().referenceUrls?.join(''); + const expectedFalsePositives = getNewRule().falsePositivesExamples?.join(''); + const expectedTags = getNewRule().tags?.join(''); + const mitreAttack = getNewRule().mitre as Mitre[]; + const expectedMitre = formatMitreAttackDescription(mitreAttack); const expectedNumberOfRules = 1; beforeEach(() => { + const timeline = getNewRule().timeline as CompleteTimeline; deleteAlertsAndRules(); - createTimeline(getNewRule().timeline).then((response) => { + createTimeline(timeline).then((response) => { cy.wrap({ ...getNewRule(), timeline: { - ...getNewRule().timeline, + ...timeline, id: response.body.data.persistTimeline.timeline.savedObjectId, }, }).as('rule'); @@ -129,7 +134,7 @@ describe('Custom query rules', () => { it('Creates and enables a new rule', function () { visit(RULE_CREATION); - fillDefineCustomRuleWithImportedQueryAndContinue(this.rule); + fillDefineCustomRuleAndContinue(this.rule); fillAboutRuleAndContinue(this.rule); fillScheduleRuleAndContinue(this.rule); @@ -144,6 +149,7 @@ describe('Custom query rules', () => { cy.get(RULE_NAME_INPUT).invoke('val').should('eql', this.rule.name); cy.get(ABOUT_CONTINUE_BTN).should('exist').click({ force: true }); cy.get(ABOUT_CONTINUE_BTN).should('not.exist'); + cy.get(SCHEDULE_CONTINUE_BUTTON).click({ force: true }); createAndEnableRule(); @@ -182,11 +188,11 @@ describe('Custom query rules', () => { cy.get(SCHEDULE_DETAILS).within(() => { getDetails(RUNS_EVERY_DETAILS).should( 'have.text', - `${getNewRule().runsEvery.interval}${getNewRule().runsEvery.type}` + `${getNewRule().runsEvery?.interval}${getNewRule().runsEvery?.type}` ); getDetails(ADDITIONAL_LOOK_BACK_DETAILS).should( 'have.text', - `${getNewRule().lookBack.interval}${getNewRule().lookBack.type}` + `${getNewRule().lookBack?.interval}${getNewRule().lookBack?.type}` ); }); @@ -299,7 +305,7 @@ describe('Custom query rules', () => { context('Edition', () => { const rule = getEditedRule(); - const expectedEditedtags = rule.tags.join(''); + const expectedEditedtags = rule.tags?.join(''); const expectedEditedIndexPatterns = rule.dataSource.type === 'indexPatterns' && rule.dataSource.index && @@ -349,7 +355,7 @@ describe('Custom query rules', () => { // expect about step to populate cy.get(RULE_NAME_INPUT).invoke('val').should('eql', existingRule.name); cy.get(RULE_DESCRIPTION_INPUT).should('have.text', existingRule.description); - cy.get(TAGS_FIELD).should('have.text', existingRule.tags.join('')); + cy.get(TAGS_FIELD).should('have.text', existingRule.tags?.join('')); cy.get(SEVERITY_DROPDOWN).should('have.text', existingRule.severity); cy.get(DEFAULT_RISK_SCORE_INPUT).invoke('val').should('eql', existingRule.riskScore); diff --git a/x-pack/plugins/security_solution/cypress/e2e/detection_rules/custom_query_rule_data_view.cy.ts b/x-pack/plugins/security_solution/cypress/e2e/detection_rules/custom_query_rule_data_view.cy.ts index 77a4ae274e6e4..727c7257b6682 100644 --- a/x-pack/plugins/security_solution/cypress/e2e/detection_rules/custom_query_rule_data_view.cy.ts +++ b/x-pack/plugins/security_solution/cypress/e2e/detection_rules/custom_query_rule_data_view.cy.ts @@ -6,7 +6,9 @@ */ import { formatMitreAttackDescription } from '../../helpers/rules'; +import type { Mitre } from '../../objects/rule'; import { getDataViewRule } from '../../objects/rule'; +import type { CompleteTimeline } from '../../objects/timeline'; import { ALERT_GRID_CELL, NUMBER_OF_ALERTS } from '../../screens/alerts'; import { @@ -50,7 +52,7 @@ import { postDataView } from '../../tasks/common'; import { createAndEnableRule, fillAboutRuleAndContinue, - fillDefineCustomRuleWithImportedQueryAndContinue, + fillDefineCustomRuleAndContinue, fillScheduleRuleAndContinue, waitForAlertsToPopulate, waitForTheRuleToBeExecuted, @@ -69,10 +71,11 @@ describe('Custom query rules', () => { describe('Custom detection rules creation with data views', () => { const rule = getDataViewRule(); - const expectedUrls = rule.referenceUrls.join(''); - const expectedFalsePositives = rule.falsePositivesExamples.join(''); - const expectedTags = rule.tags.join(''); - const expectedMitre = formatMitreAttackDescription(rule.mitre); + const expectedUrls = rule.referenceUrls?.join(''); + const expectedFalsePositives = rule.falsePositivesExamples?.join(''); + const expectedTags = rule.tags?.join(''); + const mitreAttack = rule.mitre as Mitre[]; + const expectedMitre = formatMitreAttackDescription(mitreAttack); const expectedNumberOfRules = 1; beforeEach(() => { @@ -80,12 +83,13 @@ describe('Custom query rules', () => { are creating a data view we'll use after and cleanKibana does not delete all the data views created, esArchiverReseKibana does. We don't use esArchiverReseKibana in all the tests because is a time-consuming method and we don't need to perform an exhaustive cleaning in all the other tests. */ + const timeline = rule.timeline as CompleteTimeline; esArchiverResetKibana(); - createTimeline(rule.timeline).then((response) => { + createTimeline(timeline).then((response) => { cy.wrap({ ...rule, timeline: { - ...rule.timeline, + ...timeline, id: response.body.data.persistTimeline.timeline.savedObjectId, }, }).as('rule'); @@ -97,7 +101,7 @@ describe('Custom query rules', () => { it('Creates and enables a new rule', function () { visit(RULE_CREATION); - fillDefineCustomRuleWithImportedQueryAndContinue(this.rule); + fillDefineCustomRuleAndContinue(this.rule); fillAboutRuleAndContinue(this.rule); fillScheduleRuleAndContinue(this.rule); createAndEnableRule(); @@ -138,11 +142,11 @@ describe('Custom query rules', () => { cy.get(SCHEDULE_DETAILS).within(() => { getDetails(RUNS_EVERY_DETAILS).should( 'have.text', - `${getDataViewRule().runsEvery.interval}${getDataViewRule().runsEvery.type}` + `${getDataViewRule().runsEvery?.interval}${getDataViewRule().runsEvery?.type}` ); getDetails(ADDITIONAL_LOOK_BACK_DETAILS).should( 'have.text', - `${getDataViewRule().lookBack.interval}${getDataViewRule().lookBack.type}` + `${getDataViewRule().lookBack?.interval}${getDataViewRule().lookBack?.type}` ); }); diff --git a/x-pack/plugins/security_solution/cypress/e2e/detection_rules/custom_saved_query_rule.cy.ts b/x-pack/plugins/security_solution/cypress/e2e/detection_rules/custom_saved_query_rule.cy.ts index 5027fe09a8d3e..7a4117f0d58a3 100644 --- a/x-pack/plugins/security_solution/cypress/e2e/detection_rules/custom_saved_query_rule.cy.ts +++ b/x-pack/plugins/security_solution/cypress/e2e/detection_rules/custom_saved_query_rule.cy.ts @@ -42,6 +42,7 @@ import { getDetails } from '../../tasks/rule_details'; import { createSavedQueryRule, createCustomRule } from '../../tasks/api_calls/rules'; import { RULE_CREATION, SECURITY_DETECTIONS_RULES_URL } from '../../urls/navigation'; +import type { CompleteTimeline } from '../../objects/timeline'; const savedQueryName = 'custom saved query'; const savedQueryQuery = 'process.name: test'; @@ -56,11 +57,12 @@ describe('Custom saved_query rules', () => { beforeEach(() => { deleteAlertsAndRules(); deleteSavedQueries(); - createTimeline(getNewRule().timeline).then((response) => { + const timeline = getNewRule().timeline as CompleteTimeline; + createTimeline(timeline).then((response) => { cy.wrap({ ...getNewRule(), timeline: { - ...getNewRule().timeline, + ...timeline, id: response.body.data.persistTimeline.timeline.savedObjectId, }, }).as('rule'); diff --git a/x-pack/plugins/security_solution/cypress/e2e/detection_rules/event_correlation_rule.cy.ts b/x-pack/plugins/security_solution/cypress/e2e/detection_rules/event_correlation_rule.cy.ts index 310efde996da3..4812dcc2a626a 100644 --- a/x-pack/plugins/security_solution/cypress/e2e/detection_rules/event_correlation_rule.cy.ts +++ b/x-pack/plugins/security_solution/cypress/e2e/detection_rules/event_correlation_rule.cy.ts @@ -6,6 +6,7 @@ */ import { formatMitreAttackDescription } from '../../helpers/rules'; +import type { Mitre } from '../../objects/rule'; import { getEqlRule, getEqlSequenceRule, getIndexPatterns } from '../../objects/rule'; import { ALERT_DATA_GRID, NUMBER_OF_ALERTS } from '../../screens/alerts'; @@ -59,6 +60,7 @@ import { login, visit } from '../../tasks/login'; import { RULE_CREATION } from '../../urls/navigation'; import { esArchiverLoad, esArchiverUnload } from '../../tasks/es_archiver'; +import type { CompleteTimeline } from '../../objects/timeline'; describe('EQL rules', () => { before(() => { @@ -67,19 +69,21 @@ describe('EQL rules', () => { deleteAlertsAndRules(); }); describe('Detection rules, EQL', () => { - const expectedUrls = getEqlRule().referenceUrls.join(''); - const expectedFalsePositives = getEqlRule().falsePositivesExamples.join(''); - const expectedTags = getEqlRule().tags.join(''); - const expectedMitre = formatMitreAttackDescription(getEqlRule().mitre); + const expectedUrls = getEqlRule().referenceUrls?.join(''); + const expectedFalsePositives = getEqlRule().falsePositivesExamples?.join(''); + const expectedTags = getEqlRule().tags?.join(''); + const mitreAttack = getEqlRule().mitre as Mitre[]; + const expectedMitre = formatMitreAttackDescription(mitreAttack); const expectedNumberOfRules = 1; const expectedNumberOfAlerts = '2 alerts'; beforeEach(() => { - createTimeline(getEqlRule().timeline).then((response) => { + const timeline = getEqlRule().timeline as CompleteTimeline; + createTimeline(timeline).then((response) => { cy.wrap({ ...getEqlRule(), timeline: { - ...getEqlRule().timeline, + ...timeline, id: response.body.data.persistTimeline.timeline.savedObjectId, }, }).as('rule'); @@ -161,11 +165,12 @@ describe('EQL rules', () => { esArchiverLoad('auditbeat_big'); }); beforeEach(() => { - createTimeline(getEqlSequenceRule().timeline).then((response) => { + const timeline = getEqlSequenceRule().timeline as CompleteTimeline; + createTimeline(timeline).then((response) => { cy.wrap({ ...getEqlSequenceRule(), timeline: { - ...getEqlSequenceRule().timeline, + ...timeline, id: response.body.data.persistTimeline.timeline.savedObjectId, }, }).as('rule'); diff --git a/x-pack/plugins/security_solution/cypress/e2e/detection_rules/indicator_match_rule.cy.ts b/x-pack/plugins/security_solution/cypress/e2e/detection_rules/indicator_match_rule.cy.ts index 7c3ba64536faf..4ffab681d4aaa 100644 --- a/x-pack/plugins/security_solution/cypress/e2e/detection_rules/indicator_match_rule.cy.ts +++ b/x-pack/plugins/security_solution/cypress/e2e/detection_rules/indicator_match_rule.cy.ts @@ -6,6 +6,7 @@ */ import { formatMitreAttackDescription } from '../../helpers/rules'; +import type { Mitre } from '../../objects/rule'; import { getIndexPatterns, getNewThreatIndicatorRule, @@ -109,10 +110,11 @@ const DEFAULT_THREAT_MATCH_QUERY = '@timestamp >= "now-30d/d"'; describe('indicator match', () => { describe('Detection rules, Indicator Match', () => { - const expectedUrls = getNewThreatIndicatorRule().referenceUrls.join(''); - const expectedFalsePositives = getNewThreatIndicatorRule().falsePositivesExamples.join(''); - const expectedTags = getNewThreatIndicatorRule().tags.join(''); - const expectedMitre = formatMitreAttackDescription(getNewThreatIndicatorRule().mitre); + const expectedUrls = getNewThreatIndicatorRule().referenceUrls?.join(''); + const expectedFalsePositives = getNewThreatIndicatorRule().falsePositivesExamples?.join(''); + const expectedTags = getNewThreatIndicatorRule().tags?.join(''); + const mitreAttack = getNewThreatIndicatorRule().mitre as Mitre[]; + const expectedMitre = formatMitreAttackDescription(mitreAttack); const expectedNumberOfRules = 1; const expectedNumberOfAlerts = '1 alert'; @@ -479,11 +481,11 @@ describe('indicator match', () => { cy.get(SCHEDULE_DETAILS).within(() => { getDetails(RUNS_EVERY_DETAILS).should( 'have.text', - `${rule.runsEvery.interval}${rule.runsEvery.type}` + `${rule.runsEvery?.interval}${rule.runsEvery?.type}` ); getDetails(ADDITIONAL_LOOK_BACK_DETAILS).should( 'have.text', - `${rule.lookBack.interval}${rule.lookBack.type}` + `${rule.lookBack?.interval}${rule.lookBack?.type}` ); }); @@ -492,7 +494,7 @@ describe('indicator match', () => { cy.get(NUMBER_OF_ALERTS).should('have.text', expectedNumberOfAlerts); cy.get(ALERT_RULE_NAME).first().should('have.text', rule.name); - cy.get(ALERT_SEVERITY).first().should('have.text', rule.severity.toLowerCase()); + cy.get(ALERT_SEVERITY).first().should('have.text', rule.severity?.toLowerCase()); cy.get(ALERT_RISK_SCORE).first().should('have.text', rule.riskScore); }); diff --git a/x-pack/plugins/security_solution/cypress/e2e/detection_rules/new_terms_rule.cy.ts b/x-pack/plugins/security_solution/cypress/e2e/detection_rules/new_terms_rule.cy.ts index 764d8d0b688ac..2c0507ca38157 100644 --- a/x-pack/plugins/security_solution/cypress/e2e/detection_rules/new_terms_rule.cy.ts +++ b/x-pack/plugins/security_solution/cypress/e2e/detection_rules/new_terms_rule.cy.ts @@ -6,6 +6,7 @@ */ import { formatMitreAttackDescription } from '../../helpers/rules'; +import type { Mitre } from '../../objects/rule'; import { getNewTermsRule, getIndexPatterns } from '../../objects/rule'; import { ALERT_DATA_GRID } from '../../screens/alerts'; @@ -60,6 +61,7 @@ import { import { login, visit } from '../../tasks/login'; import { RULE_CREATION } from '../../urls/navigation'; +import type { CompleteTimeline } from '../../objects/timeline'; describe('New Terms rules', () => { before(() => { @@ -67,19 +69,21 @@ describe('New Terms rules', () => { login(); }); describe('Detection rules, New Terms', () => { - const expectedUrls = getNewTermsRule().referenceUrls.join(''); - const expectedFalsePositives = getNewTermsRule().falsePositivesExamples.join(''); - const expectedTags = getNewTermsRule().tags.join(''); - const expectedMitre = formatMitreAttackDescription(getNewTermsRule().mitre); + const expectedUrls = getNewTermsRule().referenceUrls?.join(''); + const expectedFalsePositives = getNewTermsRule().falsePositivesExamples?.join(''); + const expectedTags = getNewTermsRule().tags?.join(''); + const mitreAttack = getNewTermsRule().mitre as Mitre[]; + const expectedMitre = formatMitreAttackDescription(mitreAttack); const expectedNumberOfRules = 1; beforeEach(() => { + const timeline = getNewTermsRule().timeline as CompleteTimeline; deleteAlertsAndRules(); - createTimeline(getNewTermsRule().timeline).then((response) => { + createTimeline(timeline).then((response) => { cy.wrap({ ...getNewTermsRule(), timeline: { - ...getNewTermsRule().timeline, + ...timeline, id: response.body.data.persistTimeline.timeline.savedObjectId, }, }).as('rule'); diff --git a/x-pack/plugins/security_solution/cypress/e2e/detection_rules/override.cy.ts b/x-pack/plugins/security_solution/cypress/e2e/detection_rules/override.cy.ts index 701efb2706bf3..68973fdc56941 100644 --- a/x-pack/plugins/security_solution/cypress/e2e/detection_rules/override.cy.ts +++ b/x-pack/plugins/security_solution/cypress/e2e/detection_rules/override.cy.ts @@ -6,8 +6,9 @@ */ import { formatMitreAttackDescription } from '../../helpers/rules'; -import type { OverrideRule } from '../../objects/rule'; +import type { Mitre, OverrideRule } from '../../objects/rule'; import { getIndexPatterns, getNewOverrideRule, getSeveritiesOverride } from '../../objects/rule'; +import type { CompleteTimeline } from '../../objects/timeline'; import { NUMBER_OF_ALERTS, ALERT_GRID_CELL } from '../../screens/alerts'; @@ -55,7 +56,7 @@ import { cleanKibana } from '../../tasks/common'; import { createAndEnableRule, fillAboutRuleWithOverrideAndContinue, - fillDefineCustomRuleWithImportedQueryAndContinue, + fillDefineCustomRuleAndContinue, fillScheduleRuleAndContinue, waitForAlertsToPopulate, waitForTheRuleToBeExecuted, @@ -66,21 +67,23 @@ import { getDetails } from '../../tasks/rule_details'; import { RULE_CREATION } from '../../urls/navigation'; describe('Detection rules, override', () => { - const expectedUrls = getNewOverrideRule().referenceUrls.join(''); - const expectedFalsePositives = getNewOverrideRule().falsePositivesExamples.join(''); - const expectedTags = getNewOverrideRule().tags.join(''); - const expectedMitre = formatMitreAttackDescription(getNewOverrideRule().mitre); + const expectedUrls = getNewOverrideRule().referenceUrls?.join(''); + const expectedFalsePositives = getNewOverrideRule().falsePositivesExamples?.join(''); + const expectedTags = getNewOverrideRule().tags?.join(''); + const mitreAttack = getNewOverrideRule().mitre as Mitre[]; + const expectedMitre = formatMitreAttackDescription(mitreAttack); before(() => { cleanKibana(); login(); }); beforeEach(() => { - createTimeline(getNewOverrideRule().timeline).then((response) => { + const timeline = getNewOverrideRule().timeline as CompleteTimeline; + createTimeline(timeline).then((response) => { cy.wrap({ ...getNewOverrideRule(), timeline: { - ...getNewOverrideRule().timeline, + ...timeline, id: response.body.data.persistTimeline.timeline.savedObjectId, }, }).as('rule'); @@ -89,7 +92,7 @@ describe('Detection rules, override', () => { it('Creates and enables a new custom rule with override option', function () { visitWithoutDateRange(RULE_CREATION); - fillDefineCustomRuleWithImportedQueryAndContinue(this.rule); + fillDefineCustomRuleAndContinue(this.rule); fillAboutRuleWithOverrideAndContinue(this.rule); fillScheduleRuleAndContinue(this.rule); createAndEnableRule(); diff --git a/x-pack/plugins/security_solution/cypress/e2e/detection_rules/rule_actions.cy.ts b/x-pack/plugins/security_solution/cypress/e2e/detection_rules/rule_actions.cy.ts new file mode 100644 index 0000000000000..b0f78cc76881c --- /dev/null +++ b/x-pack/plugins/security_solution/cypress/e2e/detection_rules/rule_actions.cy.ts @@ -0,0 +1,74 @@ +/* + * 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 { getIndexConnector } from '../../objects/connector'; +import { getSimpleCustomQueryRule } from '../../objects/rule'; + +import { goToRuleDetails } from '../../tasks/alerts_detection_rules'; +import { deleteIndex, waitForNewDocumentToBeIndexed } from '../../tasks/api_calls/elasticsearch'; +import { + cleanKibana, + deleteAlertsAndRules, + deleteConnectors, + deleteDataView, +} from '../../tasks/common'; +import { + createAndEnableRule, + fillAboutRuleAndContinue, + fillDefineCustomRuleAndContinue, + fillRuleAction, + fillScheduleRuleAndContinue, +} from '../../tasks/create_new_rule'; +import { login, visit } from '../../tasks/login'; + +import { RULE_CREATION } from '../../urls/navigation'; + +describe('Rule actions during detection rule creation', () => { + const indexConnector = getIndexConnector(); + + before(() => { + cleanKibana(); + login(); + }); + + beforeEach(() => { + deleteAlertsAndRules(); + deleteConnectors(); + deleteIndex(indexConnector.index); + deleteDataView(indexConnector.index); + }); + + const rule = { + ...getSimpleCustomQueryRule(), + actions: { throttle: 'rule', connectors: [indexConnector] }, + }; + const index = rule.actions.connectors[0].index; + const initialNumberOfDocuments = 0; + const expectedJson = JSON.parse(rule.actions.connectors[0].document); + + it('Indexes a new document after the index action is triggered ', function () { + visit(RULE_CREATION); + fillDefineCustomRuleAndContinue(rule); + fillAboutRuleAndContinue(rule); + fillScheduleRuleAndContinue(rule); + fillRuleAction(rule); + createAndEnableRule(); + goToRuleDetails(); + + /* When the rule is executed, the action is triggered. We wait for the new document to be indexed */ + waitForNewDocumentToBeIndexed(index, initialNumberOfDocuments); + + /* We assert that the new indexed document is the one set on the index action */ + cy.request({ + method: 'GET', + url: `${Cypress.env('ELASTICSEARCH_URL')}/${index}/_search`, + headers: { 'kbn-xsrf': 'cypress-creds' }, + }).then((response) => { + expect(response.body.hits.hits[0]._source).to.deep.equal(expectedJson); + }); + }); +}); diff --git a/x-pack/plugins/security_solution/cypress/e2e/detection_rules/threshold_rule.cy.ts b/x-pack/plugins/security_solution/cypress/e2e/detection_rules/threshold_rule.cy.ts index 4e2b42c7b7ee1..59efa1cced40c 100644 --- a/x-pack/plugins/security_solution/cypress/e2e/detection_rules/threshold_rule.cy.ts +++ b/x-pack/plugins/security_solution/cypress/e2e/detection_rules/threshold_rule.cy.ts @@ -6,6 +6,7 @@ */ import { formatMitreAttackDescription } from '../../helpers/rules'; +import type { Mitre } from '../../objects/rule'; import { getIndexPatterns, getNewThresholdRule } from '../../objects/rule'; import { ALERT_GRID_CELL, NUMBER_OF_ALERTS } from '../../screens/alerts'; @@ -60,13 +61,15 @@ import { import { login, visitWithoutDateRange } from '../../tasks/login'; import { RULE_CREATION } from '../../urls/navigation'; +import type { CompleteTimeline } from '../../objects/timeline'; describe('Detection rules, threshold', () => { let rule = getNewThresholdRule(); - const expectedUrls = getNewThresholdRule().referenceUrls.join(''); - const expectedFalsePositives = getNewThresholdRule().falsePositivesExamples.join(''); - const expectedTags = getNewThresholdRule().tags.join(''); - const expectedMitre = formatMitreAttackDescription(getNewThresholdRule().mitre); + const expectedUrls = getNewThresholdRule().referenceUrls?.join(''); + const expectedFalsePositives = getNewThresholdRule().falsePositivesExamples?.join(''); + const expectedTags = getNewThresholdRule().tags?.join(''); + const mitreAttack = getNewThresholdRule().mitre as Mitre[]; + const expectedMitre = formatMitreAttackDescription(mitreAttack); before(() => { cleanKibana(); @@ -75,9 +78,10 @@ describe('Detection rules, threshold', () => { beforeEach(() => { rule = getNewThresholdRule(); + const timeline = rule.timeline as CompleteTimeline; deleteAlertsAndRules(); - createTimeline(getNewThresholdRule().timeline).then((response) => { - rule.timeline.id = response.body.data.persistTimeline.timeline.savedObjectId; + createTimeline(timeline).then((response) => { + timeline.id = response.body.data.persistTimeline.timeline.savedObjectId; }); visitWithoutDateRange(RULE_CREATION); }); @@ -132,11 +136,11 @@ describe('Detection rules, threshold', () => { cy.get(SCHEDULE_DETAILS).within(() => { getDetails(RUNS_EVERY_DETAILS).should( 'have.text', - `${rule.runsEvery.interval}${rule.runsEvery.type}` + `${rule.runsEvery?.interval}${rule.runsEvery?.type}` ); getDetails(ADDITIONAL_LOOK_BACK_DETAILS).should( 'have.text', - `${rule.lookBack.interval}${rule.lookBack.type}` + `${rule.lookBack?.interval}${rule.lookBack?.type}` ); }); diff --git a/x-pack/plugins/security_solution/cypress/objects/connector.ts b/x-pack/plugins/security_solution/cypress/objects/connector.ts index 5c2abeab06026..39c93e6f80383 100644 --- a/x-pack/plugins/security_solution/cypress/objects/connector.ts +++ b/x-pack/plugins/security_solution/cypress/objects/connector.ts @@ -5,22 +5,42 @@ * 2.0. */ -export interface EmailConnector { +interface Connector { name: string; +} + +export interface EmailConnector extends Connector { from: string; host: string; port: string; user: string; password: string; service: string; + type: 'email'; +} + +export interface IndexConnector extends Connector { + index: string; + document: string; + type: 'index'; } +export type Connectors = IndexConnector | EmailConnector; + export const getEmailConnector = (): EmailConnector => ({ - name: 'Test connector', + name: 'Test email connector', from: 'test@example.com', host: 'example.com', port: '80', user: 'username', password: 'password', service: 'Other', + type: 'email', +}); + +export const getIndexConnector = (): IndexConnector => ({ + name: 'Test index connector', + index: 'my-index-000001', + document: '{"test": "123"}', + type: 'index', }); diff --git a/x-pack/plugins/security_solution/cypress/objects/rule.ts b/x-pack/plugins/security_solution/cypress/objects/rule.ts index 7b9d543e480ee..245e220c340c6 100644 --- a/x-pack/plugins/security_solution/cypress/objects/rule.ts +++ b/x-pack/plugins/security_solution/cypress/objects/rule.ts @@ -5,11 +5,13 @@ * 2.0. */ +import type { Throttle } from '@kbn/securitysolution-io-ts-alerting-types'; import { rawRules } from '../../server/lib/detection_engine/rules/prepackaged_rules'; import { getMockThreatData } from '../../public/detections/mitre/mitre_tactics_techniques'; import type { CompleteTimeline } from './timeline'; import { getTimeline, getIndicatorMatchTimelineTemplate } from './timeline'; import type { FullResponseSchema } from '../../common/detection_engine/schemas/request'; +import type { Connectors } from './connector'; export const totalNumberOfPrebuiltRules = rawRules.length; @@ -36,6 +38,11 @@ interface Interval { type: string; } +export interface Actions { + throttle: Throttle; + connectors: Connectors[]; +} + export type RuleDataSource = | { type: 'indexPatterns'; index: string[] } | { type: 'dataView'; dataView: string }; @@ -46,20 +53,21 @@ export interface CustomRule { description: string; dataSource: RuleDataSource; interval?: string; - severity: string; - riskScore: string; - tags: string[]; + severity?: string; + riskScore?: string; + tags?: string[]; timelineTemplate?: string; - referenceUrls: string[]; - falsePositivesExamples: string[]; - mitre: Mitre[]; - note: string; - runsEvery: Interval; - lookBack: Interval; - timeline: CompleteTimeline; - maxSignals: number; + referenceUrls?: string[]; + falsePositivesExamples?: string[]; + mitre?: Mitre[]; + note?: string; + runsEvery?: Interval; + lookBack?: Interval; + timeline?: CompleteTimeline; + maxSignals?: number; buildingBlockType?: string; exceptionLists?: Array<{ id: string; list_id: string; type: string; namespace_type: string }>; + actions?: Actions; } export interface ThresholdRule extends CustomRule { @@ -231,6 +239,15 @@ export const getNewRule = (): CustomRule => ({ maxSignals: 100, }); +export const getSimpleCustomQueryRule = (): CustomRule => ({ + customQuery: 'host.name: *', + dataSource: { index: getIndexPatterns(), type: 'indexPatterns' }, + name: 'New Rule Test', + description: 'The new rule description.', + runsEvery: getRunsEvery(), + lookBack: getLookBack(), +}); + export const getBuildingBlockRule = (): CustomRule => ({ customQuery: 'host.name: *', dataSource: { index: getIndexPatterns(), type: 'indexPatterns' }, @@ -489,7 +506,7 @@ export const getEditedRule = (): CustomRule => ({ ...getExistingRule(), severity: 'Medium', description: 'Edited Rule description', - tags: [...getExistingRule().tags, 'edited'], + tags: [...(getExistingRule().tags || []), 'edited'], }); export const expectedExportedRule = ( diff --git a/x-pack/plugins/security_solution/cypress/screens/create_new_rule.ts b/x-pack/plugins/security_solution/cypress/screens/create_new_rule.ts index e46e8a75a4341..96928ff49da40 100644 --- a/x-pack/plugins/security_solution/cypress/screens/create_new_rule.ts +++ b/x-pack/plugins/security_solution/cypress/screens/create_new_rule.ts @@ -42,6 +42,8 @@ export const EMAIL_CONNECTOR_PASSWORD_INPUT = '[data-test-subj="emailPasswordInp export const EMAIL_CONNECTOR_SERVICE_SELECTOR = '[data-test-subj="emailServiceSelectInput"]'; +export const JSON_EDITOR = "[data-test-subj='actionJsonEditor']"; + export const ADD_FALSE_POSITIVE_BTN = '[data-test-subj="detectionEngineStepAboutRuleFalsePositives"] .euiButtonEmpty__text'; @@ -58,6 +60,8 @@ export const COMBO_BOX_CLEAR_BTN = '[data-test-subj="comboBoxClearButton"]'; export const COMBO_BOX_INPUT = '[data-test-subj="comboBoxInput"]'; +export const COMBO_BOX_SELECTION = '.euiMark'; + export const CREATE_AND_ENABLE_BTN = '[data-test-subj="create-enable"]'; export const CUSTOM_QUERY_INPUT = '[data-test-subj="queryInput"]'; @@ -256,3 +260,7 @@ export const savedQueryByName = (savedQueryName: string) => export const APPLY_SELECTED_SAVED_QUERY_BUTTON = '[data-test-subj="saved-query-management-apply-changes-button"]'; + +export const INDEX_SELECTOR = "[data-test-subj='.index-siem-ActionTypeSelectOption']"; + +export const CREATE_CONNECTOR_BTN = "[data-test-subj='createActionConnectorButton-0']"; diff --git a/x-pack/plugins/security_solution/cypress/tasks/api_calls/elasticsearch.ts b/x-pack/plugins/security_solution/cypress/tasks/api_calls/elasticsearch.ts new file mode 100644 index 0000000000000..7e2cef6654034 --- /dev/null +++ b/x-pack/plugins/security_solution/cypress/tasks/api_calls/elasticsearch.ts @@ -0,0 +1,55 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +export const createIndex = (index: string) => { + cy.request({ + method: 'PUT', + url: `${Cypress.env('ELASTICSEARCH_URL')}/${index}`, + headers: { 'kbn-xsrf': 'cypress-creds' }, + failOnStatusCode: false, + }); +}; + +export const createDocument = (index: string, document: string) => { + cy.request({ + method: 'POST', + url: `${Cypress.env('ELASTICSEARCH_URL')}/${index}/_doc`, + headers: { 'kbn-xsrf': 'cypress-creds' }, + body: JSON.parse(document), + }); +}; + +export const deleteIndex = (index: string) => { + cy.request({ + method: 'DELETE', + url: `${Cypress.env('ELASTICSEARCH_URL')}/${index}`, + headers: { 'kbn-xsrf': 'cypress-creds' }, + failOnStatusCode: false, + }); +}; + +export const waitForNewDocumentToBeIndexed = (index: string, initialNumberOfDocuments: number) => { + cy.waitUntil( + () => { + return cy + .request({ + method: 'GET', + url: `${Cypress.env('ELASTICSEARCH_URL')}/${index}/_search`, + headers: { 'kbn-xsrf': 'cypress-creds' }, + failOnStatusCode: false, + }) + .then((response) => { + if (response.status !== 200) { + return false; + } else { + return response.body.hits.hits.length > initialNumberOfDocuments; + } + }); + }, + { interval: 500, timeout: 12000 } + ); +}; diff --git a/x-pack/plugins/security_solution/cypress/tasks/api_calls/rules.ts b/x-pack/plugins/security_solution/cypress/tasks/api_calls/rules.ts index 80fb77013acbb..1909030b726d3 100644 --- a/x-pack/plugins/security_solution/cypress/tasks/api_calls/rules.ts +++ b/x-pack/plugins/security_solution/cypress/tasks/api_calls/rules.ts @@ -40,17 +40,21 @@ export const createCustomRule = ( rule: CustomRule, ruleId = 'rule_testing', interval = '100m' -): Cypress.Chainable> => - cy.request({ +): Cypress.Chainable> => { + const riskScore = rule.riskScore != null ? parseInt(rule.riskScore, 10) : undefined; + const severity = rule.severity != null ? rule.severity.toLocaleLowerCase() : undefined; + const timeline = rule.timeline != null ? rule.timeline : undefined; + + return cy.request({ method: 'POST', url: 'api/detection_engine/rules', body: { rule_id: ruleId, - risk_score: parseInt(rule.riskScore, 10), + risk_score: riskScore, description: rule.description, interval, name: rule.name, - severity: rule.severity.toLocaleLowerCase(), + severity, type: 'query', from: 'now-50000h', index: rule.dataSource.type === 'indexPatterns' ? rule.dataSource.index : undefined, @@ -60,29 +64,33 @@ export const createCustomRule = ( enabled: false, exceptions_list: rule.exceptionLists ?? [], tags: rule.tags, - ...(rule.timeline.id ?? rule.timeline.templateTimelineId + ...(timeline?.id ?? timeline?.templateTimelineId ? { - timeline_id: rule.timeline.id ?? rule.timeline.templateTimelineId, - timeline_title: rule.timeline.title, + timeline_id: timeline.id ?? timeline.templateTimelineId, + timeline_title: timeline.title, } : {}), }, headers: { 'kbn-xsrf': 'cypress-creds' }, failOnStatusCode: false, }); +}; export const createEventCorrelationRule = (rule: CustomRule, ruleId = 'rule_testing') => { + const riskScore = rule.riskScore != null ? parseInt(rule.riskScore, 10) : undefined; + const severity = rule.severity != null ? rule.severity.toLowerCase() : undefined; + cy.request({ method: 'POST', url: 'api/detection_engine/rules', body: { rule_id: ruleId, - risk_score: parseInt(rule.riskScore, 10), + risk_score: riskScore, description: rule.description, - interval: `${rule.runsEvery.interval}${rule.runsEvery.type}`, - from: `now-${rule.lookBack.interval}${rule.lookBack.type}`, + interval: `${rule.runsEvery?.interval}${rule.runsEvery?.type}`, + from: `now-${rule.lookBack?.interval}${rule.lookBack?.type}`, name: rule.name, - severity: rule.severity.toLocaleLowerCase(), + severity, type: 'eql', index: rule.dataSource.type === 'indexPatterns' ? rule.dataSource.index : undefined, data_view_id: rule.dataSource.type === 'dataView' ? rule.dataSource.dataView : undefined, @@ -96,17 +104,20 @@ export const createEventCorrelationRule = (rule: CustomRule, ruleId = 'rule_test }; export const createThresholdRule = (rule: ThresholdRule, ruleId = 'rule_testing') => { + const riskScore = rule.riskScore != null ? parseInt(rule.riskScore, 10) : undefined; + const severity = rule.severity != null ? rule.severity.toLocaleLowerCase() : undefined; + cy.request({ method: 'POST', url: 'api/detection_engine/rules', body: { rule_id: ruleId, - risk_score: parseInt(rule.riskScore, 10), + risk_score: riskScore, description: rule.description, - interval: `${rule.runsEvery.interval}${rule.runsEvery.type}`, - from: `now-${rule.lookBack.interval}${rule.lookBack.type}`, + interval: `${rule.runsEvery?.interval}${rule.runsEvery?.type}`, + from: `now-${rule.lookBack?.interval}${rule.lookBack?.type}`, name: rule.name, - severity: rule.severity.toLocaleLowerCase(), + severity, type: 'threshold', index: rule.dataSource.type === 'indexPatterns' ? rule.dataSource.index : undefined, data_view_id: rule.dataSource.type === 'dataView' ? rule.dataSource.dataView : undefined, @@ -124,17 +135,20 @@ export const createThresholdRule = (rule: ThresholdRule, ruleId = 'rule_testing' }; export const createNewTermsRule = (rule: NewTermsRule, ruleId = 'rule_testing') => { + const riskScore = rule.riskScore != null ? parseInt(rule.riskScore, 10) : undefined; + const severity = rule.severity != null ? rule.severity.toLocaleLowerCase() : undefined; + cy.request({ method: 'POST', url: 'api/detection_engine/rules', body: { rule_id: ruleId, - risk_score: parseInt(rule.riskScore, 10), + risk_score: riskScore, description: rule.description, - interval: `${rule.runsEvery.interval}${rule.runsEvery.type}`, - from: `now-${rule.lookBack.interval}${rule.lookBack.type}`, + interval: `${rule.runsEvery?.interval}${rule.runsEvery?.type}`, + from: `now-${rule.lookBack?.interval}${rule.lookBack?.type}`, name: rule.name, - severity: rule.severity.toLocaleLowerCase(), + severity, type: 'new_terms', index: rule.dataSource.type === 'indexPatterns' ? rule.dataSource.index : undefined, data_view_id: rule.dataSource.type === 'dataView' ? rule.dataSource.dataView : undefined, @@ -151,17 +165,21 @@ export const createNewTermsRule = (rule: NewTermsRule, ruleId = 'rule_testing') export const createSavedQueryRule = ( rule: SavedQueryRule, ruleId = 'saved_query_rule_testing' -): Cypress.Chainable> => - cy.request({ +): Cypress.Chainable> => { + const riskScore = rule.riskScore != null ? parseInt(rule.riskScore, 10) : undefined; + const severity = rule.severity != null ? rule.severity.toLocaleLowerCase() : undefined; + const timeline = rule.timeline != null ? rule.timeline : undefined; + + return cy.request({ method: 'POST', url: 'api/detection_engine/rules', body: { rule_id: ruleId, - risk_score: parseInt(rule.riskScore, 10), + risk_score: riskScore, description: rule.description, interval: rule.interval, name: rule.name, - severity: rule.severity.toLocaleLowerCase(), + severity, type: 'saved_query', from: 'now-50000h', index: rule.dataSource.type === 'indexPatterns' ? rule.dataSource.index : undefined, @@ -171,33 +189,38 @@ export const createSavedQueryRule = ( enabled: false, exceptions_list: rule.exceptionLists ?? [], tags: rule.tags, - ...(rule.timeline.id ?? rule.timeline.templateTimelineId + ...(timeline?.id ?? timeline?.templateTimelineId ? { - timeline_id: rule.timeline.id ?? rule.timeline.templateTimelineId, - timeline_title: rule.timeline.title, + timeline_id: timeline.id ?? timeline.templateTimelineId, + timeline_title: timeline.title, } : {}), }, headers: { 'kbn-xsrf': 'cypress-creds' }, failOnStatusCode: false, }); +}; export const createCustomIndicatorRule = (rule: ThreatIndicatorRule, ruleId = 'rule_testing') => { + const riskScore = rule.riskScore != null ? parseInt(rule.riskScore, 10) : undefined; + const severity = rule.severity != null ? rule.severity.toLocaleLowerCase() : undefined; + const timeline = rule.timeline != null ? rule.timeline : undefined; + cy.request({ method: 'POST', url: 'api/detection_engine/rules', body: { rule_id: ruleId, - risk_score: parseInt(rule.riskScore, 10), + risk_score: riskScore, description: rule.description, // Default interval is 1m, our tests config overwrite this to 1s // See https://github.com/elastic/kibana/pull/125396 for details interval: '10s', name: rule.name, - severity: rule.severity.toLocaleLowerCase(), + severity, type: 'threat_match', - timeline_id: rule.timeline.templateTimelineId, - timeline_title: rule.timeline.title, + timeline_id: timeline?.templateTimelineId, + timeline_title: timeline?.title, threat_mapping: [ { entries: [ @@ -233,17 +256,20 @@ export const createCustomRuleEnabled = ( interval = '100m', maxSignals = 500 ) => { + const riskScore = rule.riskScore != null ? parseInt(rule.riskScore, 10) : undefined; + const severity = rule.severity != null ? rule.severity.toLocaleLowerCase() : undefined; + if (rule.dataSource.type === 'indexPatterns') { cy.request({ method: 'POST', url: 'api/detection_engine/rules', body: { rule_id: ruleId, - risk_score: parseInt(rule.riskScore, 10), + risk_score: riskScore, description: rule.description, interval, name: rule.name, - severity: rule.severity.toLocaleLowerCase(), + severity, type: 'query', from: 'now-50000h', index: rule.dataSource.index, @@ -264,11 +290,11 @@ export const createCustomRuleEnabled = ( url: 'api/detection_engine/rules', body: { rule_id: ruleId, - risk_score: parseInt(rule.riskScore, 10), + risk_score: riskScore, description: rule.description, interval, name: rule.name, - severity: rule.severity.toLocaleLowerCase(), + severity, type: 'query', from: 'now-50000h', index: [], diff --git a/x-pack/plugins/security_solution/cypress/tasks/common.ts b/x-pack/plugins/security_solution/cypress/tasks/common.ts index cd9525e95b0b2..4b6ad24c59f15 100644 --- a/x-pack/plugins/security_solution/cypress/tasks/common.ts +++ b/x-pack/plugins/security_solution/cypress/tasks/common.ts @@ -179,6 +179,40 @@ export const deleteCases = () => { }); }; +export const deleteConnectors = () => { + const kibanaIndexUrl = `${Cypress.env('ELASTICSEARCH_URL')}/.kibana_\*`; + cy.request('POST', `${kibanaIndexUrl}/_delete_by_query?conflicts=proceed`, { + query: { + bool: { + filter: [ + { + match: { + type: 'action', + }, + }, + ], + }, + }, + }); +}; + +export const deleteSavedQueries = () => { + const kibanaIndexUrl = `${Cypress.env('ELASTICSEARCH_URL')}/.kibana_\*`; + cy.request('POST', `${kibanaIndexUrl}/_delete_by_query?conflicts=proceed`, { + query: { + bool: { + filter: [ + { + match: { + type: 'query', + }, + }, + ], + }, + }, + }); +}; + export const postDataView = (dataSource: string) => { cy.request({ method: 'POST', @@ -196,6 +230,15 @@ export const postDataView = (dataSource: string) => { }); }; +export const deleteDataView = (dataSource: string) => { + cy.request({ + method: 'DELETE', + url: `api/data_views/data_view/${dataSource}`, + headers: { 'kbn-xsrf': 'cypress-creds' }, + failOnStatusCode: false, + }); +}; + export const scrollToBottom = () => cy.scrollTo('bottom'); export const waitForPageToBeLoaded = () => { diff --git a/x-pack/plugins/security_solution/cypress/tasks/create_new_rule.ts b/x-pack/plugins/security_solution/cypress/tasks/create_new_rule.ts index 2b7e8e0b3375e..8f59172220717 100644 --- a/x-pack/plugins/security_solution/cypress/tasks/create_new_rule.ts +++ b/x-pack/plugins/security_solution/cypress/tasks/create_new_rule.ts @@ -5,8 +5,8 @@ * 2.0. */ -import type { EmailConnector } from '../objects/connector'; -import { getEmailConnector } from '../objects/connector'; +import type { EmailConnector, IndexConnector } from '../objects/connector'; +import { getIndexConnector, getEmailConnector } from '../objects/connector'; import type { CustomRule, MachineLearningRule, @@ -14,6 +14,7 @@ import type { ThreatIndicatorRule, ThresholdRule, NewTermsRule, + Mitre, } from '../objects/rule'; import { getMachineLearningRule } from '../objects/rule'; import { @@ -106,6 +107,14 @@ import { NEW_TERMS_HISTORY_SIZE, NEW_TERMS_HISTORY_TIME_TYPE, NEW_TERMS_INPUT_AREA, + ACTIONS_THROTTLE_INPUT, + INDEX_SELECTOR, + CREATE_CONNECTOR_BTN, + SAVE_ACTION_CONNECTOR_BTN, + JSON_EDITOR, + CREATE_ACTION_CONNECTOR_BTN, + EMAIL_ACTION_BTN, + COMBO_BOX_SELECTION, } from '../screens/create_new_rule'; import { TOAST_ERROR } from '../screens/shared'; import { SERVER_SIDE_EVENT_COUNT } from '../screens/timeline'; @@ -114,7 +123,6 @@ import { refreshPage } from './security_header'; import { EUI_FILTER_SELECT_ITEM } from '../screens/common/controls'; export const createAndEnableRule = () => { - cy.get(SCHEDULE_CONTINUE_BUTTON).click({ force: true }); cy.get(CREATE_AND_ENABLE_BTN).click({ force: true }); cy.get(CREATE_AND_ENABLE_BTN).should('not.exist'); cy.get(BACK_TO_ALL_RULES_LINK).click({ force: true }); @@ -126,34 +134,41 @@ export const fillAboutRule = ( ) => { cy.get(RULE_NAME_INPUT).clear({ force: true }).type(rule.name, { force: true }); cy.get(RULE_DESCRIPTION_INPUT).clear({ force: true }).type(rule.description, { force: true }); + if (rule.severity) { + fillSeverity(rule.severity); + } + if (rule.riskScore) { + fillRiskScore(rule.riskScore); + } + if (rule.tags) { + fillRuleTags(rule.tags); + } + cy.get(ADVANCED_SETTINGS_BTN).click({ force: true }); - cy.get(SEVERITY_DROPDOWN).click({ force: true }); - cy.get(`#${rule.severity.toLowerCase()}`).click(); - - cy.get(DEFAULT_RISK_SCORE_INPUT).type(`{selectall}${rule.riskScore}`, { force: true }); - - rule.tags.forEach((tag) => { - cy.get(TAGS_INPUT).type(`${tag}{enter}`, { force: true }); - }); + if (rule.referenceUrls) { + fillReferenceUrls(rule.referenceUrls); + } - cy.get(ADVANCED_SETTINGS_BTN).click({ force: true }); + if (rule.falsePositivesExamples) { + fillFalsePositiveExamples(rule.falsePositivesExamples); + } - rule.referenceUrls.forEach((url, index) => { - cy.get(REFERENCE_URLS_INPUT).eq(index).clear({ force: true }).type(url, { force: true }); - cy.get(ADD_REFERENCE_URL_BTN).click({ force: true }); - }); + if (rule.mitre) { + fillMitre(rule.mitre); + } + if (rule.note) { + fillNote(rule.note); + } +}; - rule.falsePositivesExamples.forEach((falsePositive, index) => { - cy.get(FALSE_POSITIVES_INPUT) - .eq(index) - .clear({ force: true }) - .type(falsePositive, { force: true }); - cy.get(ADD_FALSE_POSITIVE_BTN).click({ force: true }); - }); +export const fillNote = (note: string) => { + cy.get(INVESTIGATION_NOTES_TEXTAREA).clear({ force: true }).type(note, { force: true }); +}; +export const fillMitre = (mitreAttacks: Mitre[]) => { let techniqueIndex = 0; let subtechniqueInputIndex = 0; - rule.mitre.forEach((mitre, tacticIndex) => { + mitreAttacks.forEach((mitre, tacticIndex) => { cy.get(MITRE_ATTACK_TACTIC_DROPDOWN).eq(tacticIndex).click({ force: true }); cy.contains(MITRE_TACTIC, mitre.tactic).click(); @@ -175,8 +190,38 @@ export const fillAboutRule = ( cy.get(MITRE_ATTACK_ADD_TACTIC_BUTTON).click({ force: true }); }); +}; - cy.get(INVESTIGATION_NOTES_TEXTAREA).clear({ force: true }).type(rule.note, { force: true }); +export const fillFalsePositiveExamples = (falsePositives: string[]) => { + falsePositives.forEach((falsePositive, index) => { + cy.get(FALSE_POSITIVES_INPUT) + .eq(index) + .clear({ force: true }) + .type(falsePositive, { force: true }); + cy.get(ADD_FALSE_POSITIVE_BTN).click({ force: true }); + }); +}; + +export const fillSeverity = (severity: string) => { + cy.get(SEVERITY_DROPDOWN).click({ force: true }); + cy.get(`#${severity.toLowerCase()}`).click(); +}; + +export const fillRiskScore = (riskScore: string) => { + cy.get(DEFAULT_RISK_SCORE_INPUT).type(`{selectall}${riskScore}`, { force: true }); +}; + +export const fillRuleTags = (tags: string[]) => { + tags.forEach((tag) => { + cy.get(TAGS_INPUT).type(`${tag}{enter}`, { force: true }); + }); +}; + +export const fillReferenceUrls = (referenceUrls: string[]) => { + referenceUrls.forEach((url, index) => { + cy.get(REFERENCE_URLS_INPUT).eq(index).clear({ force: true }).type(url, { force: true }); + cy.get(ADD_REFERENCE_URL_BTN).click({ force: true }); + }); }; export const fillAboutRuleAndContinue = ( @@ -200,8 +245,9 @@ export const fillAboutRuleWithOverrideAndContinue = (rule: OverrideRule) => { }); }); - cy.get(SEVERITY_DROPDOWN).click({ force: true }); - cy.get(`#${rule.severity.toLowerCase()}`).click(); + if (rule.severity) { + fillSeverity(rule.severity); + } cy.get(RISK_MAPPING_OVERRIDE_OPTION).click(); cy.get(RISK_OVERRIDE).within(() => { @@ -210,48 +256,24 @@ export const fillAboutRuleWithOverrideAndContinue = (rule: OverrideRule) => { cy.get(DEFAULT_RISK_SCORE_INPUT).type(`{selectall}${rule.riskScore}`, { force: true }); - rule.tags.forEach((tag) => { - cy.get(TAGS_INPUT).type(`${tag}{enter}`, { force: true }); - }); + if (rule.tags) { + fillRuleTags(rule.tags); + } cy.get(ADVANCED_SETTINGS_BTN).click({ force: true }); - rule.referenceUrls.forEach((url, index) => { - cy.get(REFERENCE_URLS_INPUT).eq(index).type(url, { force: true }); - cy.get(ADD_REFERENCE_URL_BTN).click({ force: true }); - }); - - rule.falsePositivesExamples.forEach((falsePositive, index) => { - cy.get(FALSE_POSITIVES_INPUT).eq(index).type(falsePositive, { force: true }); - cy.get(ADD_FALSE_POSITIVE_BTN).click({ force: true }); - }); - - let techniqueIndex = 0; - let subtechniqueInputIndex = 0; - rule.mitre.forEach((mitre, tacticIndex) => { - cy.get(MITRE_ATTACK_TACTIC_DROPDOWN).eq(tacticIndex).click({ force: true }); - cy.contains(MITRE_TACTIC, mitre.tactic).click(); - - mitre.techniques.forEach((technique) => { - cy.get(MITRE_ATTACK_ADD_TECHNIQUE_BUTTON).eq(tacticIndex).click({ force: true }); - cy.get(MITRE_ATTACK_TECHNIQUE_DROPDOWN).eq(techniqueIndex).click({ force: true }); - cy.contains(MITRE_TACTIC, technique.name).click(); - - technique.subtechniques.forEach((subtechnique) => { - cy.get(MITRE_ATTACK_ADD_SUBTECHNIQUE_BUTTON).eq(techniqueIndex).click({ force: true }); - cy.get(MITRE_ATTACK_SUBTECHNIQUE_DROPDOWN) - .eq(subtechniqueInputIndex) - .click({ force: true }); - cy.contains(MITRE_TACTIC, subtechnique).click(); - subtechniqueInputIndex++; - }); - techniqueIndex++; - }); - - cy.get(MITRE_ATTACK_ADD_TACTIC_BUTTON).click({ force: true }); - }); - - cy.get(INVESTIGATION_NOTES_TEXTAREA).type(rule.note, { force: true }); + if (rule.referenceUrls) { + fillReferenceUrls(rule.referenceUrls); + } + if (rule.falsePositivesExamples) { + fillFalsePositiveExamples(rule.falsePositivesExamples); + } + if (rule.mitre) { + fillMitre(rule.mitre); + } + if (rule.note) { + fillNote(rule.note); + } cy.get(RULE_NAME_OVERRIDE).within(() => { cy.get(COMBO_BOX_INPUT).type(`${rule.nameOverride}{enter}`); @@ -264,35 +286,65 @@ export const fillAboutRuleWithOverrideAndContinue = (rule: OverrideRule) => { getAboutContinueButton().should('exist').click({ force: true }); }; -export const fillDefineCustomRuleWithImportedQueryAndContinue = ( - rule: CustomRule | OverrideRule -) => { +export const fillCustomQuery = (rule: CustomRule | OverrideRule) => { + if (rule.timeline?.id) { + cy.get(IMPORT_QUERY_FROM_SAVED_TIMELINE_LINK).click(); + cy.get(TIMELINE(rule.timeline.id)).click(); + cy.get(CUSTOM_QUERY_INPUT).should('have.value', rule.customQuery); + } else { + cy.get(CUSTOM_QUERY_INPUT) + .first() + .type(rule.customQuery || ''); + } +}; + +export const fillDefineCustomRuleAndContinue = (rule: CustomRule | OverrideRule) => { if (rule.dataSource.type === 'dataView') { cy.get(DATA_VIEW_OPTION).click(); cy.get(DATA_VIEW_COMBO_BOX).type(`${rule.dataSource.dataView}{enter}`); } - cy.get(IMPORT_QUERY_FROM_SAVED_TIMELINE_LINK).click(); - cy.get(TIMELINE(rule.timeline.id)).click(); - cy.get(CUSTOM_QUERY_INPUT).should('have.value', rule.customQuery); - + fillCustomQuery(rule); cy.get(DEFINE_CONTINUE_BUTTON).should('exist').click({ force: true }); - cy.get(CUSTOM_QUERY_INPUT).should('not.exist'); }; export const fillScheduleRuleAndContinue = (rule: CustomRule | MachineLearningRule) => { - cy.get(RUNS_EVERY_INTERVAL).type('{selectall}').type(rule.runsEvery.interval); - cy.get(RUNS_EVERY_TIME_TYPE).select(rule.runsEvery.timeType); - cy.get(LOOK_BACK_INTERVAL).type('{selectAll}').type(rule.lookBack.interval); - cy.get(LOOK_BACK_TIME_TYPE).select(rule.lookBack.timeType); + if (rule.runsEvery) { + cy.get(RUNS_EVERY_INTERVAL).type('{selectall}').type(rule.runsEvery.interval); + cy.get(RUNS_EVERY_TIME_TYPE).select(rule.runsEvery.timeType); + } + if (rule.lookBack) { + cy.get(LOOK_BACK_INTERVAL).type('{selectAll}').type(rule.lookBack.interval); + cy.get(LOOK_BACK_TIME_TYPE).select(rule.lookBack.timeType); + } + cy.get(SCHEDULE_CONTINUE_BUTTON).click({ force: true }); +}; + +export const fillRuleAction = (rule: CustomRule) => { + if (rule.actions) { + cy.get(ACTIONS_THROTTLE_INPUT).select(rule.actions.throttle); + rule.actions?.connectors.forEach((connector) => { + switch (connector.type) { + case 'index': + cy.get(INDEX_SELECTOR).click(); + cy.get(CREATE_CONNECTOR_BTN).click(); + fillIndexConnectorForm(connector); + break; + case 'email': + cy.get(EMAIL_ACTION_BTN).click(); + cy.get(CREATE_ACTION_CONNECTOR_BTN).click(); + fillEmailConnectorForm(connector); + break; + } + }); + } }; export const fillDefineThresholdRule = (rule: ThresholdRule) => { const thresholdField = 0; const threshold = 1; - cy.get(IMPORT_QUERY_FROM_SAVED_TIMELINE_LINK).click(); - cy.get(TIMELINE(rule.timeline.id)).click(); + fillCustomQuery(rule); cy.get(COMBO_BOX_CLEAR_BTN).first().click(); if (rule.dataSource.type === 'indexPatterns') { @@ -318,9 +370,7 @@ export const fillDefineThresholdRuleAndContinue = (rule: ThresholdRule) => { const typeThresholdField = ($el: Cypress.ObjectLike) => cy.wrap($el).type(rule.thresholdField, { delay: 35 }); - cy.get(IMPORT_QUERY_FROM_SAVED_TIMELINE_LINK).click(); - cy.get(TIMELINE(rule.timeline.id)).click(); - cy.get(CUSTOM_QUERY_INPUT).should('have.value', rule.customQuery); + fillCustomQuery(rule); cy.get(THRESHOLD_INPUT_AREA) .find(INPUT) .then((inputs) => { @@ -360,9 +410,7 @@ export const fillDefineEqlRuleAndContinue = (rule: CustomRule) => { }; export const fillDefineNewTermsRuleAndContinue = (rule: NewTermsRule) => { - cy.get(IMPORT_QUERY_FROM_SAVED_TIMELINE_LINK).click(); - cy.get(TIMELINE(rule.timeline.id)).click(); - cy.get(CUSTOM_QUERY_INPUT).should('have.value', rule.customQuery); + fillCustomQuery(rule); cy.get(NEW_TERMS_INPUT_AREA).find(INPUT).click().type(rule.newTermsFields[0], { delay: 35 }); cy.get(EUI_FILTER_SELECT_ITEM).click({ force: true }); cy.focused().type('{esc}'); // Close combobox dropdown so next inputs can be interacted with @@ -449,6 +497,21 @@ export const fillEmailConnectorForm = (connector: EmailConnector = getEmailConne cy.get(EMAIL_CONNECTOR_PASSWORD_INPUT).type(connector.password); }; +export const fillIndexConnectorForm = (connector: IndexConnector = getIndexConnector()) => { + cy.get(CONNECTOR_NAME_INPUT).type(connector.name); + cy.get(COMBO_BOX_INPUT).type(connector.index); + + cy.get(COMBO_BOX_SELECTION).click({ force: true }); + + cy.get(SAVE_ACTION_CONNECTOR_BTN).click(); + cy.get(SAVE_ACTION_CONNECTOR_BTN).should('not.exist'); + cy.get(JSON_EDITOR).should('be.visible'); + cy.get(JSON_EDITOR).click(); + cy.get(JSON_EDITOR).type(connector.document, { + parseSpecialCharSequences: false, + }); +}; + /** Returns the indicator index drop down field. Pass in row number, default is 1 */ export const getIndicatorIndexComboField = (row = 1) => cy.get(THREAT_COMBO_BOX_INPUT).eq(row * 2 - 2); diff --git a/x-pack/plugins/triggers_actions_ui/public/application/components/json_editor_with_message_variables.tsx b/x-pack/plugins/triggers_actions_ui/public/application/components/json_editor_with_message_variables.tsx index 135d4783da822..643e1b69a513d 100644 --- a/x-pack/plugins/triggers_actions_ui/public/application/components/json_editor_with_message_variables.tsx +++ b/x-pack/plugins/triggers_actions_ui/public/application/components/json_editor_with_message_variables.tsx @@ -148,6 +148,7 @@ export const JsonEditorWithMessageVariables: React.FunctionComponent = ({ return ( 0 && inputTargetValue !== undefined} From 3811568a7ee6e720a32fe389357e55105784d0cc Mon Sep 17 00:00:00 2001 From: Kibana Machine <42973632+kibanamachine@users.noreply.github.com> Date: Thu, 29 Sep 2022 08:05:55 -0600 Subject: [PATCH 06/72] skip failing test suite (#142152) --- .../apps/ml/data_frame_analytics/results_view_content.ts | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/x-pack/test/functional/apps/ml/data_frame_analytics/results_view_content.ts b/x-pack/test/functional/apps/ml/data_frame_analytics/results_view_content.ts index 2bddf0a7d9512..af023ea52d9b3 100644 --- a/x-pack/test/functional/apps/ml/data_frame_analytics/results_view_content.ts +++ b/x-pack/test/functional/apps/ml/data_frame_analytics/results_view_content.ts @@ -14,7 +14,8 @@ export default function ({ getService }: FtrProviderContext) { const esArchiver = getService('esArchiver'); const ml = getService('ml'); - describe('results view content and total feature importance', function () { + // Failing: See https://github.com/elastic/kibana/issues/142152 + describe.skip('results view content and total feature importance', function () { const testDataList: Array<{ suiteTitle: string; archive: string; From b94538185a184309de5186432fdb07be38ba3da1 Mon Sep 17 00:00:00 2001 From: Pablo Machado Date: Thu, 29 Sep 2022 16:24:08 +0200 Subject: [PATCH 07/72] Fix needless tool tip inside host and user risk inspect modal (#142219) --- .../cti_details/host_risk_summary.tsx | 1 - .../cti_details/user_risk_summary.tsx | 1 - .../risk_score_deprecated/index.tsx | 11 +++++++- .../risk_score_header_title.tsx | 23 ----------------- .../risk_score_no_data_detected.tsx | 11 +++++++- .../host_risk_score_table/index.tsx | 25 +++---------------- .../host_risk_score/index.tsx | 2 ++ .../user_risk_score/index.tsx | 2 ++ .../components/host_overview/index.tsx | 2 -- .../components/user_overview/index.tsx | 2 -- .../user_risk_score_table/index.tsx | 25 +++---------------- 11 files changed, 30 insertions(+), 75 deletions(-) diff --git a/x-pack/plugins/security_solution/public/common/components/event_details/cti_details/host_risk_summary.tsx b/x-pack/plugins/security_solution/public/common/components/event_details/cti_details/host_risk_summary.tsx index 68d2d9a65157e..c4380550c4220 100644 --- a/x-pack/plugins/security_solution/public/common/components/event_details/cti_details/host_risk_summary.tsx +++ b/x-pack/plugins/security_solution/public/common/components/event_details/cti_details/host_risk_summary.tsx @@ -31,7 +31,6 @@ const HostRiskSummaryComponent: React.FC<{ } toolTipContent={ diff --git a/x-pack/plugins/security_solution/public/common/components/event_details/cti_details/user_risk_summary.tsx b/x-pack/plugins/security_solution/public/common/components/event_details/cti_details/user_risk_summary.tsx index c97878cf6f5e9..5cda8c903dd1b 100644 --- a/x-pack/plugins/security_solution/public/common/components/event_details/cti_details/user_risk_summary.tsx +++ b/x-pack/plugins/security_solution/public/common/components/event_details/cti_details/user_risk_summary.tsx @@ -31,7 +31,6 @@ const UserRiskSummaryComponent: React.FC<{ } toolTipContent={ diff --git a/x-pack/plugins/security_solution/public/common/components/risk_score/risk_score_deprecated/index.tsx b/x-pack/plugins/security_solution/public/common/components/risk_score/risk_score_deprecated/index.tsx index 13ec1df29ae01..f4391f13fd21c 100644 --- a/x-pack/plugins/security_solution/public/common/components/risk_score/risk_score_deprecated/index.tsx +++ b/x-pack/plugins/security_solution/public/common/components/risk_score/risk_score_deprecated/index.tsx @@ -13,6 +13,7 @@ import { useCheckSignalIndex } from '../../../../detections/containers/detection import type { inputsModel } from '../../../store'; import { HeaderSection } from '../../header_section'; import * as i18n from './translations'; +import * as overviewI18n from '../../../../overview/components/entity_analytics/common/translations'; import { RiskScoreHeaderTitle } from '../risk_score_onboarding/risk_score_header_title'; export const RiskScoresDeprecated = ({ @@ -46,7 +47,15 @@ export const RiskScoresDeprecated = ({ return ( - } titleSize="s" /> + } + titleSize="s" + tooltip={ + entityType === RiskScoreEntity.user + ? overviewI18n.USER_RISK_TABLE_TOOLTIP + : overviewI18n.HOST_RISK_TABLE_TOOLTIP + } + /> {translations.cta}} body={translations.body} diff --git a/x-pack/plugins/security_solution/public/common/components/risk_score/risk_score_onboarding/risk_score_header_title.tsx b/x-pack/plugins/security_solution/public/common/components/risk_score/risk_score_onboarding/risk_score_header_title.tsx index dffb9c646d7ce..47eb0d9cb61d6 100644 --- a/x-pack/plugins/security_solution/public/common/components/risk_score/risk_score_onboarding/risk_score_header_title.tsx +++ b/x-pack/plugins/security_solution/public/common/components/risk_score/risk_score_onboarding/risk_score_header_title.tsx @@ -5,46 +5,23 @@ * 2.0. */ import React from 'react'; -import styled from 'styled-components'; -import { EuiIconTip } from '@elastic/eui'; import { RiskScoreEntity } from '../../../../../common/search_strategy'; import { NavItemBetaBadge } from '../../navigation/nav_item_beta_badge'; import * as i18n from '../../../../overview/components/entity_analytics/common/translations'; import { TECHNICAL_PREVIEW } from './translations'; -const IconWrapper = styled.span` - margin-left: ${({ theme }) => theme.eui.euiSizeS}; -`; - const RiskScoreHeaderTitleComponent = ({ riskScoreEntity, - showTooltip = true, title, }: { riskScoreEntity: RiskScoreEntity; - showTooltip?: boolean; title?: string; }) => { return ( <> {title ?? (riskScoreEntity === RiskScoreEntity.user ? i18n.USER_RISK_TITLE : i18n.HOST_RISK_TITLE)} - {showTooltip && ( - - - - )} ); diff --git a/x-pack/plugins/security_solution/public/common/components/risk_score/risk_score_onboarding/risk_score_no_data_detected.tsx b/x-pack/plugins/security_solution/public/common/components/risk_score/risk_score_onboarding/risk_score_no_data_detected.tsx index b492ee51e42af..1baafecd663da 100644 --- a/x-pack/plugins/security_solution/public/common/components/risk_score/risk_score_onboarding/risk_score_no_data_detected.tsx +++ b/x-pack/plugins/security_solution/public/common/components/risk_score/risk_score_onboarding/risk_score_no_data_detected.tsx @@ -14,6 +14,7 @@ import * as i18n from './translations'; import { RiskScoreHeaderTitle } from './risk_score_header_title'; import { RiskScoreRestartButton } from './risk_score_restart_button'; import type { inputsModel } from '../../../store'; +import * as overviewI18n from '../../../../overview/components/entity_analytics/common/translations'; const RiskScoresNoDataDetectedComponent = ({ entityType, @@ -33,7 +34,15 @@ const RiskScoresNoDataDetectedComponent = ({ return ( - } titleSize="s" /> + } + titleSize="s" + tooltip={ + entityType === RiskScoreEntity.user + ? overviewI18n.USER_RISK_TABLE_TOOLTIP + : overviewI18n.HOST_RISK_TABLE_TOOLTIP + } + /> {translations.title}} body={translations.body} diff --git a/x-pack/plugins/security_solution/public/hosts/components/host_risk_score_table/index.tsx b/x-pack/plugins/security_solution/public/hosts/components/host_risk_score_table/index.tsx index 9a2138786b3a8..dd2aacef77f65 100644 --- a/x-pack/plugins/security_solution/public/hosts/components/host_risk_score_table/index.tsx +++ b/x-pack/plugins/security_solution/public/hosts/components/host_risk_score_table/index.tsx @@ -8,8 +8,7 @@ import React, { useMemo, useCallback } from 'react'; import { useDispatch } from 'react-redux'; -import { EuiFlexGroup, EuiFlexItem, EuiIconTip } from '@elastic/eui'; -import styled from 'styled-components'; +import { EuiFlexGroup, EuiFlexItem } from '@elastic/eui'; import type { Columns, Criteria, ItemsPerRow } from '../../../common/components/paginated_table'; import { PaginatedTable } from '../../../common/components/paginated_table'; import { useDeepEqualSelector } from '../../../common/hooks/use_selector'; @@ -43,10 +42,6 @@ export const rowItems: ItemsPerRow[] = [ }, ]; -const IconWrapper = styled.span` - margin-left: ${({ theme }) => theme.eui.euiSizeS}; -`; - const tableType = hostsModel.HostsTableType.risk; interface HostRiskScoreTableProps { @@ -150,21 +145,6 @@ const HostRiskScoreTableComponent: React.FC = ({ ); - const headerTitle = ( - <> - {i18nHosts.HOST_RISK_TITLE} - - - - - ); - const getHostRiskScoreFilterQuerySelector = useMemo( () => hostsSelectors.hostRiskScoreSeverityFilterSelector(), [] @@ -200,8 +180,9 @@ const HostRiskScoreTableComponent: React.FC = ({ /> } headerSupplement={risk} - headerTitle={headerTitle} + headerTitle={i18nHosts.HOST_RISK_TITLE} headerUnit={i18n.UNIT(totalCount)} + headerTooltip={i18nHosts.HOST_RISK_TABLE_TOOLTIP} id={id} isInspect={isInspect} itemsPerRow={rowItems} diff --git a/x-pack/plugins/security_solution/public/overview/components/entity_analytics/host_risk_score/index.tsx b/x-pack/plugins/security_solution/public/overview/components/entity_analytics/host_risk_score/index.tsx index 49df0b1b0e456..9bb06fd261ddc 100644 --- a/x-pack/plugins/security_solution/public/overview/components/entity_analytics/host_risk_score/index.tsx +++ b/x-pack/plugins/security_solution/public/overview/components/entity_analytics/host_risk_score/index.tsx @@ -37,6 +37,7 @@ import { RiskScoresNoDataDetected } from '../../../../common/components/risk_sco import { useRefetchQueries } from '../../../../common/hooks/use_refetch_queries'; import { Loader } from '../../../../common/components/loader'; import { Panel } from '../../../../common/components/panel'; +import * as commonI18n from '../common/translations'; const TABLE_QUERY_ID = 'hostRiskDashboardTable'; const HOST_RISK_KPI_QUERY_ID = 'headerHostRiskScoreKpiQuery'; @@ -161,6 +162,7 @@ const EntityAnalyticsHostRiskScoresComponent = () => { id={TABLE_QUERY_ID} toggleStatus={toggleStatus} toggleQuery={setToggleStatus} + tooltip={commonI18n.HOST_RISK_TABLE_TOOLTIP} > {toggleStatus && ( diff --git a/x-pack/plugins/security_solution/public/overview/components/entity_analytics/user_risk_score/index.tsx b/x-pack/plugins/security_solution/public/overview/components/entity_analytics/user_risk_score/index.tsx index 034e62bb37ad3..cf01417d0eab3 100644 --- a/x-pack/plugins/security_solution/public/overview/components/entity_analytics/user_risk_score/index.tsx +++ b/x-pack/plugins/security_solution/public/overview/components/entity_analytics/user_risk_score/index.tsx @@ -37,6 +37,7 @@ import { RiskScoresNoDataDetected } from '../../../../common/components/risk_sco import { useRefetchQueries } from '../../../../common/hooks/use_refetch_queries'; import { Loader } from '../../../../common/components/loader'; import { Panel } from '../../../../common/components/panel'; +import * as commonI18n from '../common/translations'; const TABLE_QUERY_ID = 'userRiskDashboardTable'; const USER_RISK_KPI_QUERY_ID = 'headerUserRiskScoreKpiQuery'; @@ -161,6 +162,7 @@ const EntityAnalyticsUserRiskScoresComponent = () => { id={TABLE_QUERY_ID} toggleStatus={toggleStatus} toggleQuery={setToggleStatus} + tooltip={commonI18n.USER_RISK_TABLE_TOOLTIP} > {toggleStatus && ( diff --git a/x-pack/plugins/security_solution/public/overview/components/host_overview/index.tsx b/x-pack/plugins/security_solution/public/overview/components/host_overview/index.tsx index 70c304e031163..fe221ee9b0988 100644 --- a/x-pack/plugins/security_solution/public/overview/components/host_overview/index.tsx +++ b/x-pack/plugins/security_solution/public/overview/components/host_overview/index.tsx @@ -119,7 +119,6 @@ export const HostOverview = React.memo( ), description: ( @@ -135,7 +134,6 @@ export const HostOverview = React.memo( ), description: ( diff --git a/x-pack/plugins/security_solution/public/overview/components/user_overview/index.tsx b/x-pack/plugins/security_solution/public/overview/components/user_overview/index.tsx index 68b40f581d384..8cd4ee428aeac 100644 --- a/x-pack/plugins/security_solution/public/overview/components/user_overview/index.tsx +++ b/x-pack/plugins/security_solution/public/overview/components/user_overview/index.tsx @@ -119,7 +119,6 @@ export const UserOverview = React.memo( ), description: ( @@ -135,7 +134,6 @@ export const UserOverview = React.memo( ), description: ( diff --git a/x-pack/plugins/security_solution/public/users/components/user_risk_score_table/index.tsx b/x-pack/plugins/security_solution/public/users/components/user_risk_score_table/index.tsx index 245150f4fb49d..984f737d9f97d 100644 --- a/x-pack/plugins/security_solution/public/users/components/user_risk_score_table/index.tsx +++ b/x-pack/plugins/security_solution/public/users/components/user_risk_score_table/index.tsx @@ -8,8 +8,7 @@ import React, { useMemo, useCallback } from 'react'; import { useDispatch } from 'react-redux'; -import { EuiFlexGroup, EuiFlexItem, EuiIconTip } from '@elastic/eui'; -import styled from 'styled-components'; +import { EuiFlexGroup, EuiFlexItem } from '@elastic/eui'; import type { Columns, Criteria, ItemsPerRow } from '../../../common/components/paginated_table'; import { PaginatedTable } from '../../../common/components/paginated_table'; @@ -32,10 +31,6 @@ import type { UserRiskScore, } from '../../../../common/search_strategy'; -const IconWrapper = styled.span` - margin-left: ${({ theme }) => theme.eui.euiSizeS}; -`; - export const rowItems: ItemsPerRow[] = [ { text: i18n.ROWS_5, @@ -152,21 +147,6 @@ const UserRiskScoreTableComponent: React.FC = ({ ); - const headerTitle = ( - <> - {i18nUsers.NAVIGATION_RISK_TITLE} - - - - - ); - const getUserRiskScoreFilterQuerySelector = useMemo( () => usersSelectors.userRiskScoreSeverityFilterSelector(), [] @@ -201,7 +181,8 @@ const UserRiskScoreTableComponent: React.FC = ({ /> } headerSupplement={risk} - headerTitle={headerTitle} + headerTitle={i18nUsers.NAVIGATION_RISK_TITLE} + headerTooltip={i18n.USER_RISK_TABLE_TOOLTIP} headerUnit={i18n.UNIT(totalCount)} id={id} isInspect={isInspect} From 9993b56233adb51e7108d64fb6c27b51394b045c Mon Sep 17 00:00:00 2001 From: Julia Bardi <90178898+juliaElastic@users.noreply.github.com> Date: Thu, 29 Sep 2022 16:27:28 +0200 Subject: [PATCH 08/72] [Fleet] added last checkin message to Agent UI (#142220) * added last checkin message to Agent UI * added last_checkin_message to FleetServerAgent --- .../fleet/common/types/models/agent.ts | 5 ++ .../agent_details/agent_details_overview.tsx | 6 +++ .../agents/components/agent_health.tsx | 47 ++++++++++++------- 3 files changed, 41 insertions(+), 17 deletions(-) diff --git a/x-pack/plugins/fleet/common/types/models/agent.ts b/x-pack/plugins/fleet/common/types/models/agent.ts index 5def12287b4fd..fa54f8c943e27 100644 --- a/x-pack/plugins/fleet/common/types/models/agent.ts +++ b/x-pack/plugins/fleet/common/types/models/agent.ts @@ -84,6 +84,7 @@ interface AgentBase { policy_revision?: number | null; last_checkin?: string; last_checkin_status?: 'error' | 'online' | 'degraded' | 'updating'; + last_checkin_message?: string; user_provided_metadata: AgentMetadata; local_metadata: AgentMetadata; tags?: string[]; @@ -229,6 +230,10 @@ export interface FleetServerAgent { * Last checkin status */ last_checkin_status?: 'error' | 'online' | 'degraded' | 'updating'; + /** + * Last checkin message + */ + last_checkin_message?: string; /** * ID of the API key the Elastic Agent uses to authenticate with elasticsearch */ diff --git a/x-pack/plugins/fleet/public/applications/fleet/sections/agents/agent_details_page/components/agent_details/agent_details_overview.tsx b/x-pack/plugins/fleet/public/applications/fleet/sections/agents/agent_details_page/components/agent_details/agent_details_overview.tsx index 5799b130b6a46..11ddcef4c8aee 100644 --- a/x-pack/plugins/fleet/public/applications/fleet/sections/agents/agent_details_page/components/agent_details/agent_details_overview.tsx +++ b/x-pack/plugins/fleet/public/applications/fleet/sections/agents/agent_details_page/components/agent_details/agent_details_overview.tsx @@ -58,6 +58,12 @@ export const AgentDetailsOverviewSection: React.FunctionComponent<{ '-' ), }, + { + title: i18n.translate('xpack.fleet.agentDetails.lastCheckinMessageLabel', { + defaultMessage: 'Last checkin message', + }), + description: agent.last_checkin_message ? agent.last_checkin_message : '-', + }, { title: i18n.translate('xpack.fleet.agentDetails.hostIdLabel', { defaultMessage: 'Agent ID', diff --git a/x-pack/plugins/fleet/public/applications/fleet/sections/agents/components/agent_health.tsx b/x-pack/plugins/fleet/public/applications/fleet/sections/agents/components/agent_health.tsx index b2c03ba745d7b..93091ff726258 100644 --- a/x-pack/plugins/fleet/public/applications/fleet/sections/agents/components/agent_health.tsx +++ b/x-pack/plugins/fleet/public/applications/fleet/sections/agents/components/agent_health.tsx @@ -74,8 +74,33 @@ export const AgentHealth: React.FunctionComponent = ({ agent, showOfflinePreviousStatus, }) => { - const { last_checkin: lastCheckIn } = agent; + const { last_checkin: lastCheckIn, last_checkin_message: lastCheckInMessage } = agent; const msLastCheckIn = new Date(lastCheckIn || 0).getTime(); + const lastCheckInMessageText = lastCheckInMessage ? ( + + ) : null; + const lastCheckinText = msLastCheckIn ? ( + <> + , + }} + /> + + ) : ( + + ); const previousToOfflineStatus = useMemo(() => { if (!showOfflinePreviousStatus || agent.status !== 'offline') { @@ -89,22 +114,10 @@ export const AgentHealth: React.FunctionComponent = ({ - , - }} - /> - - ) : ( - - ) + <> +

{lastCheckinText}

+

{lastCheckInMessageText}

+ } > <> From 9ed75bfedaded5b07e3c062677937b6cdc2bfdc6 Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Thu, 29 Sep 2022 23:57:44 +0930 Subject: [PATCH 09/72] Update dependency @elastic/charts to v50 (main) (#141252) * Update dependency @elastic/charts to v50 * update test screenshot Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> Co-authored-by: Marco Vettorello --- package.json | 2 +- .../charts/__snapshots__/donut_chart.test.tsx.snap | 11 +++++++++++ yarn.lock | 8 ++++---- 3 files changed, 16 insertions(+), 5 deletions(-) diff --git a/package.json b/package.json index 3bbcabba0cdd6..75751ce826dfc 100644 --- a/package.json +++ b/package.json @@ -105,7 +105,7 @@ "@dnd-kit/utilities": "^2.0.0", "@elastic/apm-rum": "^5.12.0", "@elastic/apm-rum-react": "^1.4.2", - "@elastic/charts": "49.0.0", + "@elastic/charts": "50.0.1", "@elastic/datemath": "5.0.3", "@elastic/elasticsearch": "npm:@elastic/elasticsearch-canary@8.3.0-canary.1", "@elastic/ems-client": "8.3.3", diff --git a/x-pack/plugins/synthetics/public/legacy_uptime/components/common/charts/__snapshots__/donut_chart.test.tsx.snap b/x-pack/plugins/synthetics/public/legacy_uptime/components/common/charts/__snapshots__/donut_chart.test.tsx.snap index b4486e65c5396..9989a4d5df13a 100644 --- a/x-pack/plugins/synthetics/public/legacy_uptime/components/common/charts/__snapshots__/donut_chart.test.tsx.snap +++ b/x-pack/plugins/synthetics/public/legacy_uptime/components/common/charts/__snapshots__/donut_chart.test.tsx.snap @@ -233,6 +233,17 @@ exports[`DonutChart component passes correct props without errors for valid prop "visible": true, }, }, + "flamegraph": Object { + "navigation": Object { + "buttonBackgroundColor": "rgb(204, 228, 245)", + "buttonDisabledBackgroundColor": "rgba(211, 218, 230, 0.15)", + "buttonDisabledTextColor": "rgb(162, 171, 186)", + "buttonTextColor": "rgb(0, 97, 166)", + "textColor": "rgb(52, 55, 65)", + }, + "scrollbarThumb": "rgb(52, 55, 65)", + "scrollbarTrack": "rgb(211, 218, 230)", + }, "goal": Object { "arcBoxSamplePitch": 0.08726646259971647, "barThicknessMinSizeRatio": 0.1, diff --git a/yarn.lock b/yarn.lock index 804502ebeb4c7..2902890199d39 100644 --- a/yarn.lock +++ b/yarn.lock @@ -1455,10 +1455,10 @@ dependencies: object-hash "^1.3.0" -"@elastic/charts@49.0.0": - version "49.0.0" - resolved "https://registry.yarnpkg.com/@elastic/charts/-/charts-49.0.0.tgz#6cda2bdb8c92691c12843ba44014fad5a60d61b0" - integrity sha512-LXurKWGyPWXgMUJ6l21tSI4y9N3lJh3yJkDGCjvW9M5P3CXICR1V9ZizMMZlj9p1OXULsccrInsiUBFMU0Ktog== +"@elastic/charts@50.0.1": + version "50.0.1" + resolved "https://registry.yarnpkg.com/@elastic/charts/-/charts-50.0.1.tgz#a0ee66668c857be7cfea2e134e0b84930d1564c5" + integrity sha512-O1L8rot0dycTQo/0eW7aD2P4K3Bh1LtzMgRBXYZAtIpbzdxveRkl8fOlIkGxeeHE4YNvntUJaJWeyT+ngGg7QA== dependencies: "@popperjs/core" "^2.4.0" bezier-easing "^2.1.0" From 5a5a1a98aaf210a94b3b0b6053be626059347674 Mon Sep 17 00:00:00 2001 From: Georgii Gorbachev Date: Thu, 29 Sep 2022 16:30:25 +0200 Subject: [PATCH 10/72] [Security Solution] Fix flaky e2e tests for Related Integrations (#142134) **Related to:** https://github.com/elastic/kibana/pull/142040, https://github.com/elastic/kibana/pull/135181 ## Summary - Fixes flakiness in Cypress tests for the "related integrations" feature. - Unskips tests that have been skipped in https://github.com/elastic/kibana/pull/142040 --- .../related_integrations.cy.ts | 94 +++++++++++-------- .../cypress/tasks/alerts_detection_rules.ts | 30 +++++- .../cypress/tasks/api_calls/fleet.ts | 80 ++++++++++++++++ .../security_solution/cypress/tasks/common.ts | 42 --------- .../cypress/tasks/integrations.ts | 4 +- 5 files changed, 168 insertions(+), 82 deletions(-) create mode 100644 x-pack/plugins/security_solution/cypress/tasks/api_calls/fleet.ts diff --git a/x-pack/plugins/security_solution/cypress/e2e/detection_rules/related_integrations.cy.ts b/x-pack/plugins/security_solution/cypress/e2e/detection_rules/related_integrations.cy.ts index 02ccff0c265dd..f6a80a8a15f42 100644 --- a/x-pack/plugins/security_solution/cypress/e2e/detection_rules/related_integrations.cy.ts +++ b/x-pack/plugins/security_solution/cypress/e2e/detection_rules/related_integrations.cy.ts @@ -5,47 +5,52 @@ * 2.0. */ +import { DETECTIONS_RULE_MANAGEMENT_URL } from '../../urls/navigation'; + +import { FIELD } from '../../screens/alerts_details'; +import { INTEGRATIONS, INTEGRATIONS_STATUS } from '../../screens/rule_details'; import { INTEGRATIONS_POPOVER, INTEGRATIONS_POPOVER_TITLE, RULE_NAME, } from '../../screens/alerts_detection_rules'; -import { INTEGRATIONS, INTEGRATIONS_STATUS } from '../../screens/rule_details'; + +import { cleanFleet } from '../../tasks/api_calls/fleet'; +import { importRule } from '../../tasks/api_calls/rules'; +import { + disableRelatedIntegrations, + enableRelatedIntegrations, +} from '../../tasks/api_calls/kibana_advanced_settings'; + +import { cleanKibana } from '../../tasks/common'; +import { login, visit } from '../../tasks/login'; +import { expandFirstAlert } from '../../tasks/alerts'; +import { filterBy, openTable } from '../../tasks/alerts_details'; +import { waitForAlertsToPopulate } from '../../tasks/create_new_rule'; +import { installAwsCloudFrontWithPolicy } from '../../tasks/integrations'; import { enableRule, goToTheRuleDetailsOf, openIntegrationsPopover, + waitForRulesTableToShow, waitForRuleToChangeStatus, } from '../../tasks/alerts_detection_rules'; -import { importRule } from '../../tasks/api_calls/rules'; -import { cleanKibana, cleanPackages } from '../../tasks/common'; -import { login, visit } from '../../tasks/login'; -import { DETECTIONS_RULE_MANAGEMENT_URL } from '../../urls/navigation'; -import { installAwsCloudFrontWithPolicy } from '../../tasks/integrations'; -import { expandFirstAlert } from '../../tasks/alerts'; -import { waitForAlertsToPopulate } from '../../tasks/create_new_rule'; -import { filterBy, openTable } from '../../tasks/alerts_details'; -import { FIELD } from '../../screens/alerts_details'; -import { - disableRelatedIntegrations, - enableRelatedIntegrations, -} from '../../tasks/api_calls/kibana_advanced_settings'; /* - Note that the rule we are using for testing purposes has the following characteristics, changing that may affect the coverage. - - - Single-integration - - Package: system - - Multi-integration package - - Package: aws - - Integration: cloudtrail - - Integration: cloudfront - - Not existing package: - - Package: unknown - - Not existing integration & existing package: - - Package: aws - - Integration: unknown - */ +Note that the rule we are using for testing purposes has the following characteristics, changing that may affect the coverage. + +- Single-integration + - Package: system +- Multi-integration package + - Package: aws + - Integration: cloudtrail + - Integration: cloudfront +- Not existing package: + - Package: unknown +- Not existing integration & existing package: + - Package: aws + - Integration: unknown +*/ describe('Related integrations', () => { before(() => { @@ -62,8 +67,12 @@ describe('Related integrations', () => { }; before(() => { - cleanPackages(); + cleanFleet(); + }); + + beforeEach(() => { visit(DETECTIONS_RULE_MANAGEMENT_URL); + waitForRulesTableToShow(); }); it('should display a badge with the installed integrations on the rule management page', () => { @@ -117,19 +126,24 @@ describe('Related integrations', () => { }; before(() => { - cleanPackages(); - installAwsCloudFrontWithPolicy(); + cleanFleet().then(() => { + installAwsCloudFrontWithPolicy(); + }); + }); + + beforeEach(() => { visit(DETECTIONS_RULE_MANAGEMENT_URL); + waitForRulesTableToShow(); }); - it.skip('should display a badge with the installed integrations on the rule management page', () => { + it('should display a badge with the installed integrations on the rule management page', () => { cy.get(INTEGRATIONS_POPOVER).should( 'have.text', `${rule.enabledIntegrations}/${rule.integrations.length} integrations` ); }); - it.skip('should display a popover when clicking the badge with the installed integrations on the rule management page', () => { + it('should display a popover when clicking the badge with the installed integrations on the rule management page', () => { openIntegrationsPopover(); cy.get(INTEGRATIONS_POPOVER_TITLE).should( @@ -148,7 +162,7 @@ describe('Related integrations', () => { }); }); - it.skip('should display the integrations on the definition section', () => { + it('should display the integrations on the definition section', () => { goToTheRuleDetailsOf(rule.name); cy.get(INTEGRATIONS).should('have.length', rule.integrations.length); @@ -169,7 +183,6 @@ describe('Related integrations', () => { const expectedRelatedIntegrationsText = '{"package":"system","version":"1.17.0"}{"package":"aws","integration":"cloudtrail","version":"1.17.0"}{"package":"aws","integration":"cloudfront","version":"1.17.0"}{"package":"aws","integration":"unknown","version":"1.17.0"}'; - visit(DETECTIONS_RULE_MANAGEMENT_URL); enableRule(firstRule); waitForRuleToChangeStatus(); goToTheRuleDetailsOf(rule.name); @@ -193,15 +206,20 @@ describe('Related integrations', () => { }; before(() => { - cleanPackages(); - disableRelatedIntegrations(); - visit(DETECTIONS_RULE_MANAGEMENT_URL); + cleanFleet().then(() => { + disableRelatedIntegrations(); + }); }); after(() => { enableRelatedIntegrations(); }); + beforeEach(() => { + visit(DETECTIONS_RULE_MANAGEMENT_URL); + waitForRulesTableToShow(); + }); + it('should not display a badge with the installed integrations on the rule management page', () => { cy.get(RULE_NAME).should('have.text', rule.name); cy.get(INTEGRATIONS).should('not.exist'); diff --git a/x-pack/plugins/security_solution/cypress/tasks/alerts_detection_rules.ts b/x-pack/plugins/security_solution/cypress/tasks/alerts_detection_rules.ts index 4432059c7f20f..b8e38d3e11e0e 100644 --- a/x-pack/plugins/security_solution/cypress/tasks/alerts_detection_rules.ts +++ b/x-pack/plugins/security_solution/cypress/tasks/alerts_detection_rules.ts @@ -253,9 +253,37 @@ export const sortByEnabledRules = () => { cy.get(SORT_RULES_BTN).contains('Enabled').click({ force: true }); }; +/** + * Because the Rule Management page is relatively slow, in order to avoid timeouts and flakiness, + * we almost always want to wait until the Rules table is "loaded" before we do anything with it. + * + * This task should be sufficient for the vast majority of the tests. It waits for the table + * to show up on the page, but doesn't wait until it is fully loaded and filled with rows. + * + * @example + * beforeEach(() => { + * visit(DETECTIONS_RULE_MANAGEMENT_URL); // returns on "load" event, still lots of work to do + * waitForRulesTableToShow(); // a lot has done in React and the table shows up on the page + * }); + */ +export const waitForRulesTableToShow = () => { + // Wait up to 5 minutes for the table to show up as in CI containers this can be very slow + cy.get(RULES_TABLE, { timeout: 300000 }).should('exist'); +}; + +/** + * Because the Rule Management page is relatively slow, in order to avoid timeouts and flakiness, + * we almost always want to wait until the Rules table is "loaded" before we do anything with it. + * + * This task can be needed for some tests that e.g. check the table load/refetch/pagination logic. + * It waits for the table's own loading indicator to show up and disappear. + * + * NOTE: Normally, we should not rely on loading indicators in tests, because due to their + * dynamic nature it's possible to introduce race conditions and flakiness. + */ export const waitForRulesTableToBeLoaded = () => { - cy.get(RULES_TABLE_INITIAL_LOADING_INDICATOR).should('exist'); // Wait up to 5 minutes for the rules to load as in CI containers this can be very slow + cy.get(RULES_TABLE_INITIAL_LOADING_INDICATOR, { timeout: 300000 }).should('exist'); cy.get(RULES_TABLE_INITIAL_LOADING_INDICATOR, { timeout: 300000 }).should('not.exist'); }; diff --git a/x-pack/plugins/security_solution/cypress/tasks/api_calls/fleet.ts b/x-pack/plugins/security_solution/cypress/tasks/api_calls/fleet.ts new file mode 100644 index 0000000000000..da5ab6ba488d4 --- /dev/null +++ b/x-pack/plugins/security_solution/cypress/tasks/api_calls/fleet.ts @@ -0,0 +1,80 @@ +/* + * 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. + */ + +/** + * Deletes all existing Fleet packages, package policies and agent policies. + */ +export const cleanFleet = () => { + // NOTE: order does matter. + return deletePackagePolicies() + .then(() => { + deletePackages(); + }) + .then(() => { + deleteAgentPolicies(); + }); +}; + +const deleteAgentPolicies = () => { + return cy + .request({ + method: 'GET', + url: 'api/fleet/agent_policies', + headers: { 'kbn-xsrf': 'cypress-creds' }, + }) + .then((response) => { + response.body.items.forEach((item: { id: string }) => { + cy.request({ + method: 'POST', + url: `api/fleet/agent_policies/delete`, + headers: { 'kbn-xsrf': 'cypress-creds' }, + body: { + agentPolicyId: item.id, + }, + }); + }); + }); +}; + +const deletePackagePolicies = () => { + return cy + .request({ + method: 'GET', + url: 'api/fleet/package_policies', + headers: { 'kbn-xsrf': 'cypress-creds' }, + }) + .then((response) => { + cy.request({ + method: 'POST', + url: `api/fleet/package_policies/delete`, + headers: { 'kbn-xsrf': 'cypress-creds' }, + body: { + packagePolicyIds: response.body.items.map((item: { id: string }) => item.id), + }, + }); + }); +}; + +const deletePackages = () => { + return cy + .request({ + method: 'GET', + url: 'api/fleet/epm/packages', + headers: { 'kbn-xsrf': 'cypress-creds' }, + }) + .then((response) => { + response.body.items.forEach((item: { status: string; name: string; version: string }) => { + if (item.status === 'installed') { + cy.request({ + method: 'DELETE', + url: `api/fleet/epm/packages/${item.name}/${item.version}`, + headers: { 'kbn-xsrf': 'cypress-creds' }, + }); + } + }); + }); +}; diff --git a/x-pack/plugins/security_solution/cypress/tasks/common.ts b/x-pack/plugins/security_solution/cypress/tasks/common.ts index 4b6ad24c59f15..e576c25cc256a 100644 --- a/x-pack/plugins/security_solution/cypress/tasks/common.ts +++ b/x-pack/plugins/security_solution/cypress/tasks/common.ts @@ -62,48 +62,6 @@ export const cleanKibana = () => { deleteTimelines(); }; -export const cleanPackages = () => { - deletePolicies(); - deletePackages(); -}; - -export const deletePolicies = () => { - cy.request({ - method: 'GET', - url: 'api/fleet/agent_policies', - headers: { 'kbn-xsrf': 'cypress-creds' }, - }).then((response) => { - response.body.items.forEach((item: { id: string }) => { - cy.request({ - method: 'POST', - url: `api/fleet/agent_policies/delete`, - headers: { 'kbn-xsrf': 'cypress-creds' }, - body: { - agentPolicyId: item.id, - }, - }); - }); - }); -}; - -export const deletePackages = () => { - cy.request({ - method: 'GET', - url: 'api/fleet/epm/packages', - headers: { 'kbn-xsrf': 'cypress-creds' }, - }).then((response) => { - response.body.items.forEach((item: { status: string; name: string; version: string }) => { - if (item.status === 'installed') { - cy.request({ - method: 'DELETE', - url: `api/fleet/epm/packages/${item.name}/${item.version}`, - headers: { 'kbn-xsrf': 'cypress-creds' }, - }); - } - }); - }); -}; - export const deleteAlertsAndRules = () => { const kibanaIndexUrl = `${Cypress.env('ELASTICSEARCH_URL')}/.kibana_\*`; diff --git a/x-pack/plugins/security_solution/cypress/tasks/integrations.ts b/x-pack/plugins/security_solution/cypress/tasks/integrations.ts index 1da83a591aa12..0150d0c83c3d5 100644 --- a/x-pack/plugins/security_solution/cypress/tasks/integrations.ts +++ b/x-pack/plugins/security_solution/cypress/tasks/integrations.ts @@ -18,6 +18,8 @@ export const installAwsCloudFrontWithPolicy = () => { visit('app/integrations/detail/aws-1.17.0/overview?integration=cloudfront'); cy.get(ADD_INTEGRATION_BTN).click(); cy.get(QUEUE_URL).type('http://www.example.com'); + + // Fleet installs an integration very slowly, so we have to increase the timeout here. cy.get(SAVE_AND_CONTINUE_BTN).click(); - cy.get(INTEGRATION_ADDED_POP_UP).should('exist'); + cy.get(INTEGRATION_ADDED_POP_UP, { timeout: 120000 }).should('exist'); }; From c56d738d6fda2ba84fa1f6b0dcf8568664995018 Mon Sep 17 00:00:00 2001 From: Pablo Machado Date: Thu, 29 Sep 2022 17:01:30 +0200 Subject: [PATCH 11/72] Fix Host risk classification filter sort order changes when option is clicked (#142207) --- .../security_solution/risk_score/all/index.ts | 8 ++++ .../severity/severity_filter_group.test.tsx | 42 +++++++++++++++++++ .../severity/severity_filter_group.tsx | 9 ++-- 3 files changed, 55 insertions(+), 4 deletions(-) create mode 100644 x-pack/plugins/security_solution/public/common/components/severity/severity_filter_group.test.tsx diff --git a/x-pack/plugins/security_solution/common/search_strategy/security_solution/risk_score/all/index.ts b/x-pack/plugins/security_solution/common/search_strategy/security_solution/risk_score/all/index.ts index 5a773d49134da..cefd43fe5f99e 100644 --- a/x-pack/plugins/security_solution/common/search_strategy/security_solution/risk_score/all/index.ts +++ b/x-pack/plugins/security_solution/common/search_strategy/security_solution/risk_score/all/index.ts @@ -105,3 +105,11 @@ export const EMPTY_SEVERITY_COUNT = { [RiskSeverity.moderate]: 0, [RiskSeverity.unknown]: 0, }; + +export const SEVERITY_UI_SORT_ORDER = [ + RiskSeverity.unknown, + RiskSeverity.low, + RiskSeverity.moderate, + RiskSeverity.high, + RiskSeverity.critical, +]; diff --git a/x-pack/plugins/security_solution/public/common/components/severity/severity_filter_group.test.tsx b/x-pack/plugins/security_solution/public/common/components/severity/severity_filter_group.test.tsx new file mode 100644 index 0000000000000..187f743f0b468 --- /dev/null +++ b/x-pack/plugins/security_solution/public/common/components/severity/severity_filter_group.test.tsx @@ -0,0 +1,42 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ +import React from 'react'; +import { render, fireEvent } from '@testing-library/react'; +import { SeverityFilterGroup } from './severity_filter_group'; +import { RiskSeverity } from '../../../../common/search_strategy'; +import { TestProviders } from '../../mock'; + +describe('SeverityFilterGroup', () => { + it('preserves sort order when severityCount is out of order', () => { + const { getByTestId, getAllByTestId } = render( + + + + ); + + fireEvent.click(getByTestId('risk-filter-button')); + + expect(getAllByTestId('risk-score').map((ele) => ele.textContent)).toEqual([ + 'Unknown', + 'Low', + 'Moderate', + 'High', + 'Critical', + ]); + }); +}); diff --git a/x-pack/plugins/security_solution/public/common/components/severity/severity_filter_group.tsx b/x-pack/plugins/security_solution/public/common/components/severity/severity_filter_group.tsx index 126f3e3870ab1..ea05c31d6f481 100644 --- a/x-pack/plugins/security_solution/public/common/components/severity/severity_filter_group.tsx +++ b/x-pack/plugins/security_solution/public/common/components/severity/severity_filter_group.tsx @@ -16,6 +16,7 @@ import { } from '@elastic/eui'; import type { RiskSeverity } from '../../../../common/search_strategy'; +import { SEVERITY_UI_SORT_ORDER } from '../../../../common/search_strategy'; import type { SeverityCount } from './types'; import { RiskScore } from './common'; @@ -46,10 +47,10 @@ export const SeverityFilterGroup: React.FC<{ const items: SeverityItems[] = useMemo(() => { const checked: FilterChecked = 'on'; - return (Object.keys(severityCount) as RiskSeverity[]).map((k) => ({ - risk: k, - count: severityCount[k], - checked: selectedSeverities.includes(k) ? checked : undefined, + return SEVERITY_UI_SORT_ORDER.map((severity) => ({ + risk: severity, + count: severityCount[severity], + checked: selectedSeverities.includes(severity) ? checked : undefined, })); }, [severityCount, selectedSeverities]); From b0432083a61c5df9a8695c6308e11e90a228ed01 Mon Sep 17 00:00:00 2001 From: "Joey F. Poon" Date: Thu, 29 Sep 2022 10:10:28 -0500 Subject: [PATCH 12/72] [Security Solution] use endpoint rbac for process operations (#142031) --- .../endpoint/service/authz/authz.test.ts | 49 ++++++++----------- .../common/endpoint/service/authz/authz.ts | 13 +++-- 2 files changed, 28 insertions(+), 34 deletions(-) diff --git a/x-pack/plugins/security_solution/common/endpoint/service/authz/authz.test.ts b/x-pack/plugins/security_solution/common/endpoint/service/authz/authz.test.ts index b9c0dcff2054a..d8f65cf07d28f 100644 --- a/x-pack/plugins/security_solution/common/endpoint/service/authz/authz.test.ts +++ b/x-pack/plugins/security_solution/common/endpoint/service/authz/authz.test.ts @@ -108,37 +108,28 @@ describe('Endpoint Authz service', () => { }); }); - describe('endpoint rbac is enabled', () => { - describe('canIsolateHost', () => { - it('should be true if packagePrivilege.writeHostIsolation is true', () => { - fleetAuthz.packagePrivileges!.endpoint.actions.writeHostIsolation.executePackageAction = - true; - const authz = calculateEndpointAuthz(licenseService, fleetAuthz, userRoles, true); - expect(authz.canIsolateHost).toBe(true); - }); - - it('should be false if packagePrivilege.writeHostIsolation is false', () => { - fleetAuthz.packagePrivileges!.endpoint.actions.writeHostIsolation.executePackageAction = - false; - const authz = calculateEndpointAuthz(licenseService, fleetAuthz, userRoles, true); - expect(authz.canIsolateHost).toBe(false); - }); + describe('and endpoint rbac is enabled', () => { + it.each<[EndpointAuthzKeyList[number], string]>([ + ['canIsolateHost', 'writeHostIsolation'], + ['canUnIsolateHost', 'writeHostIsolation'], + ['canKillProcess', 'writeProcessOperations'], + ['canSuspendProcess', 'writeProcessOperations'], + ['canGetRunningProcesses', 'writeProcessOperations'], + ])('%s should be true if `packagePrivilege.%s` is `true`', (auth) => { + const authz = calculateEndpointAuthz(licenseService, fleetAuthz, userRoles, true); + expect(authz[auth]).toBe(true); }); - describe('canUnIsolateHost', () => { - it('should be true if packagePrivilege.writeHostIsolation is true', () => { - fleetAuthz.packagePrivileges!.endpoint.actions.writeHostIsolation.executePackageAction = - true; - const authz = calculateEndpointAuthz(licenseService, fleetAuthz, userRoles, true); - expect(authz.canUnIsolateHost).toBe(true); - }); - - it('should be false if packagePrivilege.writeHostIsolation is false', () => { - fleetAuthz.packagePrivileges!.endpoint.actions.writeHostIsolation.executePackageAction = - false; - const authz = calculateEndpointAuthz(licenseService, fleetAuthz, userRoles, true); - expect(authz.canUnIsolateHost).toBe(false); - }); + it.each<[EndpointAuthzKeyList[number], string]>([ + ['canIsolateHost', 'writeHostIsolation'], + ['canUnIsolateHost', 'writeHostIsolation'], + ['canKillProcess', 'writeProcessOperations'], + ['canSuspendProcess', 'writeProcessOperations'], + ['canGetRunningProcesses', 'writeProcessOperations'], + ])('%s should be false if `packagePrivilege.%s` is `false`', (auth, privilege) => { + fleetAuthz.packagePrivileges!.endpoint.actions[privilege].executePackageAction = false; + const authz = calculateEndpointAuthz(licenseService, fleetAuthz, userRoles, true); + expect(authz[auth]).toBe(false); }); }); }); diff --git a/x-pack/plugins/security_solution/common/endpoint/service/authz/authz.ts b/x-pack/plugins/security_solution/common/endpoint/service/authz/authz.ts index bc40bd11f5d79..9e280f383cae3 100644 --- a/x-pack/plugins/security_solution/common/endpoint/service/authz/authz.ts +++ b/x-pack/plugins/security_solution/common/endpoint/service/authz/authz.ts @@ -22,7 +22,6 @@ export const calculateEndpointAuthz = ( licenseService: LicenseService, fleetAuthz: FleetAuthz, userRoles: MaybeImmutable, - // to be used in follow-up PRs isEndpointRbacEnabled: boolean = false ): EndpointAuthz => { const isPlatinumPlusLicense = licenseService.isPlatinumPlus(); @@ -32,17 +31,21 @@ export const calculateEndpointAuthz = ( ? fleetAuthz.packagePrivileges?.endpoint?.actions?.writeHostIsolation?.executePackageAction || false : hasEndpointManagementAccess; + const canWriteProcessOperations = isEndpointRbacEnabled + ? fleetAuthz.packagePrivileges?.endpoint?.actions?.writeProcessOperations + ?.executePackageAction || false + : hasEndpointManagementAccess; return { canAccessFleet: fleetAuthz?.fleet.all ?? userRoles.includes('superuser'), canAccessEndpointManagement: hasEndpointManagementAccess, canCreateArtifactsByPolicy: hasEndpointManagementAccess && isPlatinumPlusLicense, // Response Actions - canIsolateHost: isPlatinumPlusLicense && canIsolateHost, + canIsolateHost: canIsolateHost && isPlatinumPlusLicense, canUnIsolateHost: canIsolateHost, - canKillProcess: hasEndpointManagementAccess && isEnterpriseLicense, - canSuspendProcess: hasEndpointManagementAccess && isEnterpriseLicense, - canGetRunningProcesses: hasEndpointManagementAccess && isEnterpriseLicense, + canKillProcess: canWriteProcessOperations && isEnterpriseLicense, + canSuspendProcess: canWriteProcessOperations && isEnterpriseLicense, + canGetRunningProcesses: canWriteProcessOperations && isEnterpriseLicense, canAccessResponseConsole: hasEndpointManagementAccess && isEnterpriseLicense, }; }; From b5c18d14779fd81f2fe6b521533a413f46446ece Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Thu, 29 Sep 2022 17:15:26 +0200 Subject: [PATCH 13/72] Update dependency cypress to ^10.9.0 (#141171) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> Co-authored-by: Patryk Kopyciński --- package.json | 2 +- yarn.lock | 18 +++++++++--------- 2 files changed, 10 insertions(+), 10 deletions(-) diff --git a/package.json b/package.json index 75751ce826dfc..e7b1f86b9c053 100644 --- a/package.json +++ b/package.json @@ -1286,7 +1286,7 @@ "cssnano": "^5.1.12", "cssnano-preset-default": "^5.2.12", "csstype": "^3.0.2", - "cypress": "^10.7.0", + "cypress": "^10.9.0", "cypress-axe": "^1.0.0", "cypress-file-upload": "^5.0.8", "cypress-multi-reporters": "^1.6.1", diff --git a/yarn.lock b/yarn.lock index 2902890199d39..968956a15ccfa 100644 --- a/yarn.lock +++ b/yarn.lock @@ -12559,10 +12559,10 @@ cypress-recurse@^1.23.0: resolved "https://registry.yarnpkg.com/cypress-recurse/-/cypress-recurse-1.23.0.tgz#f87334747516de6737bc4708754e8f429057bc6d" integrity sha512-CAsdvynhuR3SUEXVJRO2jBEnZRJ6nJp7nMXHwzV4UQq9Lap3Bj72AwcJK0cl51fJXcTaGDXYTQQ9zvGe3TyaQA== -cypress@^10.7.0: - version "10.7.0" - resolved "https://registry.yarnpkg.com/cypress/-/cypress-10.7.0.tgz#2d37f8b9751c6de33ee48639cb7e67a2ce593231" - integrity sha512-gTFvjrUoBnqPPOu9Vl5SBHuFlzx/Wxg/ZXIz2H4lzoOLFelKeF7mbwYUOzgzgF0oieU2WhJAestQdkgwJMMTvQ== +cypress@^10.9.0: + version "10.9.0" + resolved "https://registry.yarnpkg.com/cypress/-/cypress-10.9.0.tgz#273a61a6304766f9d6423e5ac8d4a9a11ed8b485" + integrity sha512-MjIWrRpc+bQM9U4kSSdATZWZ2hUqHGFEQTF7dfeZRa4MnalMtc88FIE49USWP2ZVtfy5WPBcgfBX+YorFqGElA== dependencies: "@cypress/request" "^2.88.10" "@cypress/xvfb" "^1.2.4" @@ -12583,7 +12583,7 @@ cypress@^10.7.0: dayjs "^1.10.4" debug "^4.3.2" enquirer "^2.3.6" - eventemitter2 "^6.4.3" + eventemitter2 "6.4.7" execa "4.1.0" executable "^4.1.1" extract-zip "2.0.1" @@ -14679,10 +14679,10 @@ eventemitter-asyncresource@^1.0.0: resolved "https://registry.yarnpkg.com/eventemitter-asyncresource/-/eventemitter-asyncresource-1.0.0.tgz#734ff2e44bf448e627f7748f905d6bdd57bdb65b" integrity sha512-39F7TBIV0G7gTelxwbEqnwhp90eqCPON1k0NwNfwhgKn4Co4ybUbj2pECcXT0B3ztRKZ7Pw1JujUUgmQJHcVAQ== -eventemitter2@^6.4.3: - version "6.4.3" - resolved "https://registry.yarnpkg.com/eventemitter2/-/eventemitter2-6.4.3.tgz#35c563619b13f3681e7eb05cbdaf50f56ba58820" - integrity sha512-t0A2msp6BzOf+QAcI6z9XMktLj52OjGQg+8SJH6v5+3uxNpWYRR3wQmfA+6xtMU9kOC59qk9licus5dYcrYkMQ== +eventemitter2@6.4.7: + version "6.4.7" + resolved "https://registry.yarnpkg.com/eventemitter2/-/eventemitter2-6.4.7.tgz#a7f6c4d7abf28a14c1ef3442f21cb306a054271d" + integrity sha512-tYUSVOGeQPKt/eC1ABfhHy5Xd96N3oIijJvN3O9+TsC28T5V9yX9oEfEK5faP0EFSNVOG97qtAS68GBrQB2hDg== eventemitter3@^4.0.0: version "4.0.7" From 49d0858a406d1c6854b2305263141bb5ab9e8f0d Mon Sep 17 00:00:00 2001 From: Yara Tercero Date: Thu, 29 Sep 2022 08:19:50 -0700 Subject: [PATCH 14/72] [Security Solution][Exceptions] - Fixes up some bugs in the all exception items view (#141682) ### Summary Addresses #140709, #141056, #141421, #141042 --- .../all_exception_items_table/index.tsx | 36 ++++++++++++++----- .../all_exception_items_table/search_bar.tsx | 9 ++--- .../all_exception_items_table/translations.ts | 25 +++++++++++-- .../logic/use_find_references.tsx | 8 +++-- .../rules/all/exceptions/translations.ts | 4 +-- .../translations/translations/fr-FR.json | 1 - .../translations/translations/ja-JP.json | 1 - .../translations/translations/zh-CN.json | 1 - 8 files changed, 64 insertions(+), 21 deletions(-) diff --git a/x-pack/plugins/security_solution/public/detection_engine/rule_exceptions/components/all_exception_items_table/index.tsx b/x-pack/plugins/security_solution/public/detection_engine/rule_exceptions/components/all_exception_items_table/index.tsx index 9ba216b80f14e..d090f5a3bc590 100644 --- a/x-pack/plugins/security_solution/public/detection_engine/rule_exceptions/components/all_exception_items_table/index.tsx +++ b/x-pack/plugins/security_solution/public/detection_engine/rule_exceptions/components/all_exception_items_table/index.tsx @@ -6,20 +6,21 @@ */ import React, { useCallback, useMemo, useEffect, useReducer } from 'react'; -import { EuiPanel, EuiSpacer } from '@elastic/eui'; +import { EuiPanel, EuiSpacer, EuiText } from '@elastic/eui'; import type { ExceptionListItemSchema, UseExceptionListItemsSuccess, Pagination, - ExceptionListTypeEnum, } from '@kbn/securitysolution-io-ts-list-types'; +import { ExceptionListTypeEnum } from '@kbn/securitysolution-io-ts-list-types'; import { transformInput } from '@kbn/securitysolution-list-hooks'; import { deleteExceptionListItemById, fetchExceptionListsItemsByListIds, } from '@kbn/securitysolution-list-api'; +import styled from 'styled-components'; import { DEFAULT_INDEX_PATTERN } from '../../../../../common/constants'; import { useUserData } from '../../../../detections/components/user_info'; import { useKibana, useToasts } from '../../../../common/lib/kibana'; @@ -37,6 +38,10 @@ import * as i18n from './translations'; import { useFindExceptionListReferences } from '../../logic/use_find_references'; import type { Rule } from '../../../../detections/containers/detection_engine/rules/types'; +const StyledText = styled(EuiText)` + font-style: italic; +`; + const STATES_SEARCH_HIDDEN: ViewerState[] = ['error', 'empty']; const STATES_PAGINATION_UTILITY_HIDDEN: ViewerState[] = [ 'loading', @@ -51,7 +56,7 @@ const initialState: State = { pageIndex: 0, pageSize: 25, totalItemCount: 0, - pageSizeOptions: [1, 5, 10, 25, 50, 100, 200, 300], + pageSizeOptions: [5, 10, 25, 50, 100, 200, 300], }, exceptions: [], exceptionToEdit: null, @@ -154,7 +159,18 @@ const ExceptionsViewerComponent = ({ [dispatch] ); - const [_, allReferences] = useFindExceptionListReferences(exceptionListsToQuery); + const [isLoadingReferences, isFetchReferencesError, allReferences] = + useFindExceptionListReferences(exceptionListsToQuery); + + useEffect(() => { + if (isFetchReferencesError) { + setViewerState('error'); + } else if (viewerState == null && isLoadingReferences) { + setViewerState('loading'); + } else if (viewerState === 'loading' && !isLoadingReferences) { + setViewerState(null); + } + }, [isLoadingReferences, isFetchReferencesError, setViewerState, viewerState]); const handleFetchItems = useCallback( async (options?: GetExceptionItemProps) => { @@ -212,12 +228,8 @@ const ExceptionsViewerComponent = ({ const handleGetExceptionListItems = useCallback( async (options?: GetExceptionItemProps) => { try { - setViewerState('loading'); - const { pageIndex, itemsPerPage, total, data } = await handleFetchItems(options); - setViewerState(total > 0 ? null : 'empty'); - setExceptions({ exceptions: data, pagination: { @@ -226,6 +238,8 @@ const ExceptionsViewerComponent = ({ total, }, }); + + setViewerState(total > 0 ? null : 'empty'); } catch (e) { setViewerState('error'); @@ -367,6 +381,12 @@ const ExceptionsViewerComponent = ({ <> + + {listType === ExceptionListTypeEnum.ENDPOINT + ? i18n.ENDPOINT_EXCEPTIONS_TAB_ABOUT + : i18n.EXCEPTIONS_TAB_ABOUT} + + {!STATES_SEARCH_HIDDEN.includes(viewerState) && ( { return listType === ExceptionListTypeEnum.ENDPOINT - ? i18n.ADD_TO_ENDPOINT_LIST - : i18n.ADD_TO_DETECTIONS_LIST; + ? sharedI18n.ADD_TO_ENDPOINT_LIST + : sharedI18n.ADD_TO_DETECTIONS_LIST; }, [listType]); return ( @@ -84,7 +85,7 @@ const ExceptionsViewerSearchBarComponent = ({ values: { itemName }, defaultMessage: '"{itemName}" deleted successfully.', }); + +export const ENDPOINT_EXCEPTIONS_TAB_ABOUT = i18n.translate( + 'xpack.securitySolution.exceptions.allExceptionItems.exceptionEndpointDetailsDescription', + { + defaultMessage: + 'Endpoint exceptions are added to both the detection rule and the Elastic Endpoint agent on your hosts.', + } +); + +export const EXCEPTIONS_TAB_ABOUT = i18n.translate( + 'xpack.securitySolution.exceptions.allExceptionItems.exceptionDetectionDetailsDescription', + { + defaultMessage: 'Rule exceptions are added to the detection rule.', + } +); + +export const SEARCH_PLACEHOLDER = i18n.translate( + 'xpack.securitySolution.exceptions.allExceptionItems.searchPlaceholder', + { + defaultMessage: 'Filter exceptions using simple query syntax, for example, name:"my list"', + } +); diff --git a/x-pack/plugins/security_solution/public/detection_engine/rule_exceptions/logic/use_find_references.tsx b/x-pack/plugins/security_solution/public/detection_engine/rule_exceptions/logic/use_find_references.tsx index f30d5aeb598a0..f7628f0014d23 100644 --- a/x-pack/plugins/security_solution/public/detection_engine/rule_exceptions/logic/use_find_references.tsx +++ b/x-pack/plugins/security_solution/public/detection_engine/rule_exceptions/logic/use_find_references.tsx @@ -14,7 +14,7 @@ import { useToasts } from '../../../common/lib/kibana'; import type { FindRulesReferencedByExceptionsListProp } from '../../../detections/containers/detection_engine/rules/types'; import * as i18n from '../utils/translations'; -export type ReturnUseFindExceptionListReferences = [boolean, RuleReferences | null]; +export type ReturnUseFindExceptionListReferences = [boolean, boolean, RuleReferences | null]; export interface RuleReferences { [key: string]: RuleReferenceSchema[]; @@ -28,6 +28,7 @@ export const useFindExceptionListReferences = ( ): ReturnUseFindExceptionListReferences => { const toasts = useToasts(); const [isLoading, setIsLoading] = useState(false); + const [errorExists, setErrorExists] = useState(false); const [references, setReferences] = useState(null); const listRefs = useMemo((): FindRulesReferencedByExceptionsListProp[] => { return ruleExceptionLists.map((list) => { @@ -61,11 +62,13 @@ export const useFindExceptionListReferences = ( }, {}); if (isSubscribed) { + setErrorExists(false); setIsLoading(false); setReferences(results); } } catch (error) { if (isSubscribed) { + setErrorExists(true); setIsLoading(false); toasts.addError(error, { title: i18n.ERROR_FETCHING_REFERENCES_TITLE }); } @@ -73,6 +76,7 @@ export const useFindExceptionListReferences = ( }; if (listRefs.length === 0 && isSubscribed) { + setErrorExists(false); setIsLoading(false); setReferences(null); } else { @@ -85,5 +89,5 @@ export const useFindExceptionListReferences = ( }; }, [ruleExceptionLists, listRefs, toasts]); - return [isLoading, references]; + return [isLoading, errorExists, references]; }; diff --git a/x-pack/plugins/security_solution/public/detections/pages/detection_engine/rules/all/exceptions/translations.ts b/x-pack/plugins/security_solution/public/detections/pages/detection_engine/rules/all/exceptions/translations.ts index b22d4030384a3..8baf21db15c0d 100644 --- a/x-pack/plugins/security_solution/public/detections/pages/detection_engine/rules/all/exceptions/translations.ts +++ b/x-pack/plugins/security_solution/public/detections/pages/detection_engine/rules/all/exceptions/translations.ts @@ -155,9 +155,9 @@ export const referenceErrorMessage = (referenceCount: number) => }); export const EXCEPTION_LIST_SEARCH_PLACEHOLDER = i18n.translate( - 'xpack.securitySolution.exceptions.searchPlaceholder', + 'xpack.securitySolution.detectionEngine.rules.all.exceptions.searchPlaceholder', { - defaultMessage: 'e.g. Example List Name', + defaultMessage: 'Search by name or list_id', } ); diff --git a/x-pack/plugins/translations/translations/fr-FR.json b/x-pack/plugins/translations/translations/fr-FR.json index 60b692e720ec0..09d5ebabd0d0a 100644 --- a/x-pack/plugins/translations/translations/fr-FR.json +++ b/x-pack/plugins/translations/translations/fr-FR.json @@ -28301,7 +28301,6 @@ "xpack.securitySolution.exceptions.referenceModalCancelButton": "Annuler", "xpack.securitySolution.exceptions.referenceModalDeleteButton": "Retirer la liste d'exceptions", "xpack.securitySolution.exceptions.referenceModalTitle": "Retirer la liste d'exceptions", - "xpack.securitySolution.exceptions.searchPlaceholder": "par ex. Exemple de liste de noms", "xpack.securitySolution.exceptions.viewer.addCommentPlaceholder": "Ajouter un nouveau commentaire...", "xpack.securitySolution.exceptions.viewer.addToClipboard": "Commentaire", "xpack.securitySolution.exceptions.viewer.addToDetectionsListLabel": "Ajouter une exception à une règle", diff --git a/x-pack/plugins/translations/translations/ja-JP.json b/x-pack/plugins/translations/translations/ja-JP.json index 0aa5fa39b93e0..32c2dbbf5f01e 100644 --- a/x-pack/plugins/translations/translations/ja-JP.json +++ b/x-pack/plugins/translations/translations/ja-JP.json @@ -28276,7 +28276,6 @@ "xpack.securitySolution.exceptions.referenceModalCancelButton": "キャンセル", "xpack.securitySolution.exceptions.referenceModalDeleteButton": "例外リストを削除", "xpack.securitySolution.exceptions.referenceModalTitle": "例外リストを削除", - "xpack.securitySolution.exceptions.searchPlaceholder": "例:例外リスト名", "xpack.securitySolution.exceptions.viewer.addCommentPlaceholder": "新しいコメントを追加...", "xpack.securitySolution.exceptions.viewer.addToClipboard": "コメント", "xpack.securitySolution.exceptions.viewer.addToDetectionsListLabel": "ルール例外の追加", diff --git a/x-pack/plugins/translations/translations/zh-CN.json b/x-pack/plugins/translations/translations/zh-CN.json index baf98e70b8dd0..48fe03474e196 100644 --- a/x-pack/plugins/translations/translations/zh-CN.json +++ b/x-pack/plugins/translations/translations/zh-CN.json @@ -28310,7 +28310,6 @@ "xpack.securitySolution.exceptions.referenceModalCancelButton": "取消", "xpack.securitySolution.exceptions.referenceModalDeleteButton": "移除例外列表", "xpack.securitySolution.exceptions.referenceModalTitle": "移除例外列表", - "xpack.securitySolution.exceptions.searchPlaceholder": "例如,示例列表名称", "xpack.securitySolution.exceptions.viewer.addCommentPlaceholder": "添加新注释......", "xpack.securitySolution.exceptions.viewer.addToClipboard": "注释", "xpack.securitySolution.exceptions.viewer.addToDetectionsListLabel": "添加规则例外", From 27916d316a0268ee6bc86807f6bef16c93f4fcd6 Mon Sep 17 00:00:00 2001 From: Dominique Clarke Date: Thu, 29 Sep 2022 11:23:21 -0400 Subject: [PATCH 15/72] [Synthetics] enable/disable - prevent incorrect keys from being added to the monitor saved object (#140553) * synthetics - enable/disable - prevent incorrect keys from being added to the monitor saved object * [CI] Auto-commit changed files from 'node scripts/precommit_hook.js --ref HEAD~1..HEAD --fix' * adjust types * add exact typing * [CI] Auto-commit changed files from 'node scripts/precommit_hook.js --ref HEAD~1..HEAD --fix' * adjust test * use exact types * use exact types for editing * adjust types * adjust tests * adjust types * Update x-pack/test/api_integration/apis/uptime/rest/add_monitor.ts * adjust normalizers * Update x-pack/plugins/synthetics/common/runtime_types/monitor_management/monitor_types.ts * Update x-pack/plugins/synthetics/server/routes/monitor_cruds/add_monitor.ts * adjust types * [CI] Auto-commit changed files from 'node scripts/eslint --no-cache --fix' * adjust jest tests * adjust types * adjust api_integration tests * update tests Co-authored-by: kibanamachine <42973632+kibanamachine@users.noreply.github.com> --- .../common/constants/monitor_defaults.ts | 2 + .../common/formatters/browser/formatters.ts | 4 +- .../common/formatters/common/formatters.ts | 2 + .../common/formatters/http/formatters.ts | 1 + .../common/formatters/tcp/formatters.ts | 1 + .../monitor_management/monitor_types.ts | 19 ++- .../monitor_add_edit/form/formatter.test.tsx | 2 + .../monitor_list_table/monitor_enabled.tsx | 2 +- .../overview/actions_popover.test.tsx | 20 +-- .../overview/overview/actions_popover.tsx | 2 +- .../hooks/use_monitor_enable_handler.tsx | 10 +- .../synthetics/state/monitor_list/actions.ts | 3 +- .../apps/synthetics/state/monitor_list/api.ts | 3 +- .../__mocks__/synthetics_store.mock.ts | 6 +- .../fleet_package/browser/normalizers.ts | 4 +- .../fleet_package/common/normalizers.ts | 2 + .../fleet_package/http/normalizers.ts | 1 + .../fleet_package/tcp/normalizers.ts | 1 + .../routes/monitor_cruds/add_monitor.ts | 9 +- .../routes/monitor_cruds/edit_monitor.ts | 6 +- .../monitor_cruds/monitor_validation.test.ts | 5 +- .../monitor_cruds/monitor_validation.ts | 20 ++- .../synthetics_service/run_once_monitor.ts | 4 +- .../synthetics_service/formatters/browser.ts | 4 +- .../synthetics_service/formatters/common.ts | 2 + .../synthetics_service/formatters/http.ts | 1 + .../synthetics_service/formatters/tcp.ts | 1 + .../normalizers/http_monitor.test.ts | 2 + .../normalizers/icmp_monitor.test.ts | 4 +- .../normalizers/tcp_monitor.test.ts | 7 +- .../project_monitor_formatter.ts | 23 ++- .../apis/uptime/rest/add_monitor.ts | 35 ++++ .../apis/uptime/rest/add_monitor_project.ts | 149 +++++++++++++++++- .../apis/uptime/rest/edit_monitor.ts | 62 +++++++- .../uptime/rest/fixtures/http_monitor.json | 1 + .../uptime/rest/fixtures/icmp_monitor.json | 21 +-- .../uptime/rest/fixtures/tcp_monitor.json | 1 + 37 files changed, 339 insertions(+), 103 deletions(-) diff --git a/x-pack/plugins/synthetics/common/constants/monitor_defaults.ts b/x-pack/plugins/synthetics/common/constants/monitor_defaults.ts index 1d142bbe33c68..a926cba109e62 100644 --- a/x-pack/plugins/synthetics/common/constants/monitor_defaults.ts +++ b/x-pack/plugins/synthetics/common/constants/monitor_defaults.ts @@ -108,6 +108,7 @@ export const DEFAULT_HTTP_SIMPLE_FIELDS: HTTPSimpleFields = { [ConfigKey.MAX_REDIRECTS]: '0', [ConfigKey.MONITOR_TYPE]: DataStream.HTTP, [ConfigKey.FORM_MONITOR_TYPE]: FormMonitorType.HTTP, + [ConfigKey.PORT]: null, }; export const DEFAULT_HTTP_ADVANCED_FIELDS: HTTPAdvancedFields = { @@ -144,6 +145,7 @@ export const DEFAULT_TCP_SIMPLE_FIELDS: TCPSimpleFields = { [ConfigKey.HOSTS]: '', [ConfigKey.MONITOR_TYPE]: DataStream.TCP, [ConfigKey.FORM_MONITOR_TYPE]: FormMonitorType.TCP, + [ConfigKey.PORT]: null, }; export const DEFAULT_TCP_ADVANCED_FIELDS: TCPAdvancedFields = { diff --git a/x-pack/plugins/synthetics/common/formatters/browser/formatters.ts b/x-pack/plugins/synthetics/common/formatters/browser/formatters.ts index 78e55e97d5b0c..409f2b44343e8 100644 --- a/x-pack/plugins/synthetics/common/formatters/browser/formatters.ts +++ b/x-pack/plugins/synthetics/common/formatters/browser/formatters.ts @@ -18,6 +18,7 @@ import { tlsValueToStringFormatter, tlsArrayToYamlFormatter, } from '../tls/formatters'; +import { tlsFormatters } from '../tls/formatters'; export type BrowserFormatMap = Record; @@ -72,9 +73,8 @@ export const browserFormatters: BrowserFormatMap = { arrayToJsonFormatter(fields[ConfigKey.JOURNEY_FILTERS_TAGS]), [ConfigKey.THROTTLING_CONFIG]: throttlingFormatter, [ConfigKey.IGNORE_HTTPS_ERRORS]: null, - [ConfigKey.PROJECT_ID]: null, [ConfigKey.PLAYWRIGHT_OPTIONS]: null, - [ConfigKey.ORIGINAL_SPACE]: null, [ConfigKey.TEXT_ASSERTION]: null, ...commonFormatters, + ...tlsFormatters, }; diff --git a/x-pack/plugins/synthetics/common/formatters/common/formatters.ts b/x-pack/plugins/synthetics/common/formatters/common/formatters.ts index 751721e5d7036..739c7184e7221 100644 --- a/x-pack/plugins/synthetics/common/formatters/common/formatters.ts +++ b/x-pack/plugins/synthetics/common/formatters/common/formatters.ts @@ -29,7 +29,9 @@ export const commonFormatters: CommonFormatMap = { [ConfigKey.MONITOR_SOURCE_TYPE]: null, [ConfigKey.FORM_MONITOR_TYPE]: null, [ConfigKey.JOURNEY_ID]: null, + [ConfigKey.PROJECT_ID]: null, [ConfigKey.CUSTOM_HEARTBEAT_ID]: null, + [ConfigKey.ORIGINAL_SPACE]: null, }; export const arrayToJsonFormatter = (value: string[] = []) => diff --git a/x-pack/plugins/synthetics/common/formatters/http/formatters.ts b/x-pack/plugins/synthetics/common/formatters/http/formatters.ts index 0dc9b795717a0..5eeb5888255dc 100644 --- a/x-pack/plugins/synthetics/common/formatters/http/formatters.ts +++ b/x-pack/plugins/synthetics/common/formatters/http/formatters.ts @@ -41,6 +41,7 @@ export const httpFormatters: HTTPFormatMap = { [ConfigKey.REQUEST_HEADERS_CHECK]: (fields) => objectToJsonFormatter(fields[ConfigKey.REQUEST_HEADERS_CHECK]), [ConfigKey.REQUEST_METHOD_CHECK]: null, + [ConfigKey.PORT]: null, ...tlsFormatters, ...commonFormatters, }; diff --git a/x-pack/plugins/synthetics/common/formatters/tcp/formatters.ts b/x-pack/plugins/synthetics/common/formatters/tcp/formatters.ts index 5b3737229a129..bec7ceb444845 100644 --- a/x-pack/plugins/synthetics/common/formatters/tcp/formatters.ts +++ b/x-pack/plugins/synthetics/common/formatters/tcp/formatters.ts @@ -19,6 +19,7 @@ export const tcpFormatters: TCPFormatMap = { [ConfigKey.PROXY_USE_LOCAL_RESOLVER]: null, [ConfigKey.RESPONSE_RECEIVE_CHECK]: null, [ConfigKey.REQUEST_SEND_CHECK]: null, + [ConfigKey.PORT]: null, ...tlsFormatters, ...commonFormatters, }; diff --git a/x-pack/plugins/synthetics/common/runtime_types/monitor_management/monitor_types.ts b/x-pack/plugins/synthetics/common/runtime_types/monitor_management/monitor_types.ts index 46bc0f135452f..bbb6eb1bb30d6 100644 --- a/x-pack/plugins/synthetics/common/runtime_types/monitor_management/monitor_types.ts +++ b/x-pack/plugins/synthetics/common/runtime_types/monitor_management/monitor_types.ts @@ -83,6 +83,8 @@ export const CommonFieldsCodec = t.intersection([ [ConfigKey.MONITOR_SOURCE_TYPE]: SourceTypeCodec, [ConfigKey.CONFIG_ID]: t.string, [ConfigKey.JOURNEY_ID]: t.string, + [ConfigKey.PROJECT_ID]: t.string, + [ConfigKey.ORIGINAL_SPACE]: t.string, [ConfigKey.CUSTOM_HEARTBEAT_ID]: t.string, }), ]); @@ -94,6 +96,7 @@ export const TCPSimpleFieldsCodec = t.intersection([ t.interface({ [ConfigKey.METADATA]: MetadataCodec, [ConfigKey.HOSTS]: t.string, + [ConfigKey.PORT]: t.union([t.number, t.null]), }), CommonFieldsCodec, ]); @@ -151,6 +154,7 @@ export const HTTPSimpleFieldsCodec = t.intersection([ [ConfigKey.METADATA]: MetadataCodec, [ConfigKey.MAX_REDIRECTS]: t.string, [ConfigKey.URLS]: t.string, + [ConfigKey.PORT]: t.union([t.number, t.null]), }), CommonFieldsCodec, ]); @@ -217,8 +221,6 @@ export const EncryptedBrowserSimpleFieldsCodec = t.intersection([ }), t.partial({ [ConfigKey.PLAYWRIGHT_OPTIONS]: t.string, - [ConfigKey.PROJECT_ID]: t.string, - [ConfigKey.ORIGINAL_SPACE]: t.string, [ConfigKey.TEXT_ASSERTION]: t.string, }), ]), @@ -241,7 +243,7 @@ export const BrowserSensitiveSimpleFieldsCodec = t.intersection([ CommonFieldsCodec, ]); -export const BrowserAdvancedFieldsCodec = t.interface({ +export const EncryptedBrowserAdvancedFieldsCodec = t.interface({ [ConfigKey.SCREENSHOTS]: t.string, [ConfigKey.JOURNEY_FILTERS_MATCH]: t.string, [ConfigKey.JOURNEY_FILTERS_TAGS]: t.array(t.string), @@ -263,25 +265,26 @@ export const BrowserSensitiveAdvancedFieldsCodec = t.interface({ [ConfigKey.SYNTHETICS_ARGS]: t.array(t.string), }); -export const BrowserAdvancedsCodec = t.intersection([ - BrowserAdvancedFieldsCodec, +export const BrowserAdvancedFieldsCodec = t.intersection([ + EncryptedBrowserAdvancedFieldsCodec, BrowserSensitiveAdvancedFieldsCodec, ]); export const EncryptedBrowserFieldsCodec = t.intersection([ EncryptedBrowserSimpleFieldsCodec, - BrowserAdvancedFieldsCodec, + EncryptedBrowserAdvancedFieldsCodec, + TLSFieldsCodec, ]); export const BrowserFieldsCodec = t.intersection([ BrowserSimpleFieldsCodec, BrowserAdvancedFieldsCodec, - BrowserSensitiveAdvancedFieldsCodec, + TLSCodec, ]); export type BrowserFields = t.TypeOf; export type BrowserSimpleFields = t.TypeOf; -export type BrowserAdvancedFields = t.TypeOf; +export type BrowserAdvancedFields = t.TypeOf; // MonitorFields, represents any possible monitor type export const MonitorFieldsCodec = t.intersection([ diff --git a/x-pack/plugins/synthetics/public/apps/synthetics/components/monitor_add_edit/form/formatter.test.tsx b/x-pack/plugins/synthetics/public/apps/synthetics/components/monitor_add_edit/form/formatter.test.tsx index 4b4e778b87b9b..6ff7cd651b334 100644 --- a/x-pack/plugins/synthetics/public/apps/synthetics/components/monitor_add_edit/form/formatter.test.tsx +++ b/x-pack/plugins/synthetics/public/apps/synthetics/components/monitor_add_edit/form/formatter.test.tsx @@ -134,6 +134,7 @@ describe('format', () => { timeout: '16', type: 'http', urls: 'sample url', + 'url.port': null, username: '', }); }); @@ -347,6 +348,7 @@ describe('format', () => { timeout: '16', type: 'http', urls: 'sample url', + 'url.port': null, username: '', }); }); diff --git a/x-pack/plugins/synthetics/public/apps/synthetics/components/monitors_page/management/monitor_list_table/monitor_enabled.tsx b/x-pack/plugins/synthetics/public/apps/synthetics/components/monitors_page/management/monitor_list_table/monitor_enabled.tsx index be1123b12d417..e5e7c6bbe3781 100644 --- a/x-pack/plugins/synthetics/public/apps/synthetics/components/monitors_page/management/monitor_list_table/monitor_enabled.tsx +++ b/x-pack/plugins/synthetics/public/apps/synthetics/components/monitors_page/management/monitor_list_table/monitor_enabled.tsx @@ -51,7 +51,7 @@ export const MonitorEnabled = ({ const handleEnabledChange = (event: EuiSwitchEvent) => { const checked = event.target.checked; - updateMonitorEnabledState(monitor, checked); + updateMonitorEnabledState(checked); }; return ( diff --git a/x-pack/plugins/synthetics/public/apps/synthetics/components/monitors_page/overview/overview/actions_popover.test.tsx b/x-pack/plugins/synthetics/public/apps/synthetics/components/monitors_page/overview/overview/actions_popover.test.tsx index af6799068c278..d37fb8c2a3001 100644 --- a/x-pack/plugins/synthetics/public/apps/synthetics/components/monitors_page/overview/overview/actions_popover.test.tsx +++ b/x-pack/plugins/synthetics/public/apps/synthetics/components/monitors_page/overview/overview/actions_popover.test.tsx @@ -111,15 +111,7 @@ describe('ActionsPopover', () => { const enableButton = getByText('Disable monitor'); fireEvent.click(enableButton); expect(updateMonitorEnabledState).toHaveBeenCalledTimes(1); - expect(updateMonitorEnabledState.mock.calls[0]).toEqual([ - { - id: 'somelongstring', - isEnabled: true, - location: { id: 'us_central', isServiceManaged: true }, - name: 'Monitor 1', - }, - false, - ]); + expect(updateMonitorEnabledState.mock.calls[0]).toEqual([false]); }); it('sets enabled state to true', async () => { @@ -139,14 +131,6 @@ describe('ActionsPopover', () => { const enableButton = getByText('Enable monitor'); fireEvent.click(enableButton); expect(updateMonitorEnabledState).toHaveBeenCalledTimes(1); - expect(updateMonitorEnabledState.mock.calls[0]).toEqual([ - { - id: 'somelongstring', - isEnabled: false, - location: { id: 'us_central', isServiceManaged: true }, - name: 'Monitor 1', - }, - true, - ]); + expect(updateMonitorEnabledState.mock.calls[0]).toEqual([true]); }); }); diff --git a/x-pack/plugins/synthetics/public/apps/synthetics/components/monitors_page/overview/overview/actions_popover.tsx b/x-pack/plugins/synthetics/public/apps/synthetics/components/monitors_page/overview/overview/actions_popover.tsx index 932c6344c4716..1267c2ab43c52 100644 --- a/x-pack/plugins/synthetics/public/apps/synthetics/components/monitors_page/overview/overview/actions_popover.tsx +++ b/x-pack/plugins/synthetics/public/apps/synthetics/components/monitors_page/overview/overview/actions_popover.tsx @@ -141,7 +141,7 @@ export function ActionsPopover({ icon: 'invert', onClick: () => { if (status !== FETCH_STATUS.LOADING) - updateMonitorEnabledState(monitor, !monitor.isEnabled); + updateMonitorEnabledState(!monitor.isEnabled); }, }, ], diff --git a/x-pack/plugins/synthetics/public/apps/synthetics/hooks/use_monitor_enable_handler.tsx b/x-pack/plugins/synthetics/public/apps/synthetics/hooks/use_monitor_enable_handler.tsx index 6fed27f2df6b5..e00b54ec4b75d 100644 --- a/x-pack/plugins/synthetics/public/apps/synthetics/hooks/use_monitor_enable_handler.tsx +++ b/x-pack/plugins/synthetics/public/apps/synthetics/hooks/use_monitor_enable_handler.tsx @@ -9,11 +9,7 @@ import { useKibana } from '@kbn/kibana-react-plugin/public'; import { FETCH_STATUS } from '@kbn/observability-plugin/public'; import React, { useCallback, useEffect, useState } from 'react'; import { useDispatch, useSelector } from 'react-redux'; -import { - ConfigKey, - EncryptedSyntheticsMonitor, - MonitorOverviewItem, -} from '../components/monitors_page/overview/types'; +import { ConfigKey } from '../components/monitors_page/overview/types'; import { clearMonitorUpsertStatus, fetchUpsertMonitorAction, @@ -41,11 +37,11 @@ export function useMonitorEnableHandler({ const savedObjEnabledState = upsertStatuses[id]?.enabled; const [isEnabled, setIsEnabled] = useState(null); const updateMonitorEnabledState = useCallback( - (monitor: EncryptedSyntheticsMonitor | MonitorOverviewItem, enabled: boolean) => { + (enabled: boolean) => { dispatch( fetchUpsertMonitorAction({ id, - monitor: { ...monitor, [ConfigKey.ENABLED]: enabled }, + monitor: { [ConfigKey.ENABLED]: enabled }, }) ); }, diff --git a/x-pack/plugins/synthetics/public/apps/synthetics/state/monitor_list/actions.ts b/x-pack/plugins/synthetics/public/apps/synthetics/state/monitor_list/actions.ts index 3315719a6bb16..fcfc3d4f22cf7 100644 --- a/x-pack/plugins/synthetics/public/apps/synthetics/state/monitor_list/actions.ts +++ b/x-pack/plugins/synthetics/public/apps/synthetics/state/monitor_list/actions.ts @@ -10,7 +10,6 @@ import { createAction } from '@reduxjs/toolkit'; import { EncryptedSyntheticsMonitor, MonitorManagementListResult, - MonitorOverviewItem, } from '../../../../../common/runtime_types'; import { createAsyncAction } from '../utils/actions'; @@ -23,7 +22,7 @@ export const fetchMonitorListAction = createAsyncAction< export interface UpsertMonitorRequest { id: string; - monitor: EncryptedSyntheticsMonitor | MonitorOverviewItem; + monitor: Partial; } export const fetchUpsertMonitorAction = createAction('fetchUpsertMonitor'); export const fetchUpsertSuccessAction = createAction<{ diff --git a/x-pack/plugins/synthetics/public/apps/synthetics/state/monitor_list/api.ts b/x-pack/plugins/synthetics/public/apps/synthetics/state/monitor_list/api.ts index 5e4e2e1bc1a67..f6a99fd3e02ed 100644 --- a/x-pack/plugins/synthetics/public/apps/synthetics/state/monitor_list/api.ts +++ b/x-pack/plugins/synthetics/public/apps/synthetics/state/monitor_list/api.ts @@ -11,7 +11,6 @@ import { FetchMonitorManagementListQueryArgs, MonitorManagementListResult, MonitorManagementListResultCodec, - MonitorOverviewItem, ServiceLocationErrors, SyntheticsMonitor, } from '../../../../../common/runtime_types'; @@ -55,7 +54,7 @@ export const fetchUpsertMonitor = async ({ monitor, id, }: { - monitor: SyntheticsMonitor | EncryptedSyntheticsMonitor | MonitorOverviewItem; + monitor: Partial | Partial; id?: string; }): Promise<{ attributes: { errors: ServiceLocationErrors } } | SyntheticsMonitor> => { if (id) { diff --git a/x-pack/plugins/synthetics/public/apps/synthetics/utils/testing/__mocks__/synthetics_store.mock.ts b/x-pack/plugins/synthetics/public/apps/synthetics/utils/testing/__mocks__/synthetics_store.mock.ts index 57ce5e39a8dbd..5fa93522e6c9b 100644 --- a/x-pack/plugins/synthetics/public/apps/synthetics/utils/testing/__mocks__/synthetics_store.mock.ts +++ b/x-pack/plugins/synthetics/public/apps/synthetics/utils/testing/__mocks__/synthetics_store.mock.ts @@ -13,6 +13,8 @@ import { LocationStatus, ScheduleUnit, SourceType, + VerificationMode, + TLSVersion, } from '../../../../../../common/runtime_types'; /** @@ -338,8 +340,8 @@ function getMonitorDetailsMockSlice() { 'ssl.certificate': '', 'ssl.key': '', 'ssl.key_passphrase': '', - 'ssl.verification_mode': 'full', - 'ssl.supported_protocols': ['TLSv1.1', 'TLSv1.2', 'TLSv1.3'], + 'ssl.verification_mode': VerificationMode.FULL, + 'ssl.supported_protocols': ['TLSv1.1', 'TLSv1.2', 'TLSv1.3'] as TLSVersion[], revision: 1, updated_at: '2022-07-24T17:15:46.342Z', }, diff --git a/x-pack/plugins/synthetics/public/legacy_uptime/components/fleet_package/browser/normalizers.ts b/x-pack/plugins/synthetics/public/legacy_uptime/components/fleet_package/browser/normalizers.ts index 61f978327b8a5..d1d9917f19c3a 100644 --- a/x-pack/plugins/synthetics/public/legacy_uptime/components/fleet_package/browser/normalizers.ts +++ b/x-pack/plugins/synthetics/public/legacy_uptime/components/fleet_package/browser/normalizers.ts @@ -18,6 +18,7 @@ import { getNormalizer, getJsonToJavascriptNormalizer, } from '../common/normalizers'; +import { tlsNormalizers } from '../tls/normalizers'; import { defaultBrowserSimpleFields, defaultBrowserAdvancedFields } from '../contexts'; @@ -107,9 +108,8 @@ export const browserNormalizers: BrowserNormalizerMap = { ConfigKey.JOURNEY_FILTERS_TAGS ), [ConfigKey.IGNORE_HTTPS_ERRORS]: getBrowserNormalizer(ConfigKey.IGNORE_HTTPS_ERRORS), - [ConfigKey.PROJECT_ID]: getBrowserNormalizer(ConfigKey.PROJECT_ID), [ConfigKey.PLAYWRIGHT_OPTIONS]: getBrowserNormalizer(ConfigKey.PLAYWRIGHT_OPTIONS), - [ConfigKey.ORIGINAL_SPACE]: getBrowserNormalizer(ConfigKey.ORIGINAL_SPACE), [ConfigKey.TEXT_ASSERTION]: getBrowserNormalizer(ConfigKey.TEXT_ASSERTION), ...commonNormalizers, + ...tlsNormalizers, }; diff --git a/x-pack/plugins/synthetics/public/legacy_uptime/components/fleet_package/common/normalizers.ts b/x-pack/plugins/synthetics/public/legacy_uptime/components/fleet_package/common/normalizers.ts index 630ac70a8e055..d05730c5dbe17 100644 --- a/x-pack/plugins/synthetics/public/legacy_uptime/components/fleet_package/common/normalizers.ts +++ b/x-pack/plugins/synthetics/public/legacy_uptime/components/fleet_package/common/normalizers.ts @@ -93,5 +93,7 @@ export const commonNormalizers: CommonNormalizerMap = { [ConfigKey.MONITOR_SOURCE_TYPE]: getCommonNormalizer(ConfigKey.MONITOR_SOURCE_TYPE), [ConfigKey.FORM_MONITOR_TYPE]: getCommonNormalizer(ConfigKey.FORM_MONITOR_TYPE), [ConfigKey.JOURNEY_ID]: getCommonNormalizer(ConfigKey.JOURNEY_ID), + [ConfigKey.PROJECT_ID]: getCommonNormalizer(ConfigKey.PROJECT_ID), [ConfigKey.CUSTOM_HEARTBEAT_ID]: getCommonNormalizer(ConfigKey.CUSTOM_HEARTBEAT_ID), + [ConfigKey.ORIGINAL_SPACE]: getCommonNormalizer(ConfigKey.ORIGINAL_SPACE), }; diff --git a/x-pack/plugins/synthetics/public/legacy_uptime/components/fleet_package/http/normalizers.ts b/x-pack/plugins/synthetics/public/legacy_uptime/components/fleet_package/http/normalizers.ts index f7e7ad3eeac2e..a783639f1ab18 100644 --- a/x-pack/plugins/synthetics/public/legacy_uptime/components/fleet_package/http/normalizers.ts +++ b/x-pack/plugins/synthetics/public/legacy_uptime/components/fleet_package/http/normalizers.ts @@ -34,6 +34,7 @@ export const getHTTPJsonToJavascriptNormalizer = (key: ConfigKey) => { export const httpNormalizers: HTTPNormalizerMap = { [ConfigKey.METADATA]: getHTTPJsonToJavascriptNormalizer(ConfigKey.METADATA), [ConfigKey.URLS]: getHTTPNormalizer(ConfigKey.URLS), + [ConfigKey.PORT]: getHTTPNormalizer(ConfigKey.PORT), [ConfigKey.MAX_REDIRECTS]: getHTTPNormalizer(ConfigKey.MAX_REDIRECTS), [ConfigKey.USERNAME]: getHTTPNormalizer(ConfigKey.USERNAME), [ConfigKey.PASSWORD]: getHTTPNormalizer(ConfigKey.PASSWORD), diff --git a/x-pack/plugins/synthetics/public/legacy_uptime/components/fleet_package/tcp/normalizers.ts b/x-pack/plugins/synthetics/public/legacy_uptime/components/fleet_package/tcp/normalizers.ts index ae36de49fb57c..86efeeae69206 100644 --- a/x-pack/plugins/synthetics/public/legacy_uptime/components/fleet_package/tcp/normalizers.ts +++ b/x-pack/plugins/synthetics/public/legacy_uptime/components/fleet_package/tcp/normalizers.ts @@ -33,6 +33,7 @@ export const getTCPJsonToJavascriptNormalizer = (key: ConfigKey) => { export const tcpNormalizers: TCPNormalizerMap = { [ConfigKey.METADATA]: getTCPJsonToJavascriptNormalizer(ConfigKey.METADATA), [ConfigKey.HOSTS]: getTCPNormalizer(ConfigKey.HOSTS), + [ConfigKey.PORT]: getTCPNormalizer(ConfigKey.PORT), [ConfigKey.PROXY_URL]: getTCPNormalizer(ConfigKey.PROXY_URL), [ConfigKey.PROXY_USE_LOCAL_RESOLVER]: getTCPNormalizer(ConfigKey.PROXY_USE_LOCAL_RESOLVER), [ConfigKey.RESPONSE_RECEIVE_CHECK]: getTCPNormalizer(ConfigKey.RESPONSE_RECEIVE_CHECK), diff --git a/x-pack/plugins/synthetics/server/routes/monitor_cruds/add_monitor.ts b/x-pack/plugins/synthetics/server/routes/monitor_cruds/add_monitor.ts index 1016e37b87e08..1f9a55e347618 100644 --- a/x-pack/plugins/synthetics/server/routes/monitor_cruds/add_monitor.ts +++ b/x-pack/plugins/synthetics/server/routes/monitor_cruds/add_monitor.ts @@ -67,7 +67,7 @@ export const addSyntheticsMonitorRoute: SyntheticsRestApiRouteFactory = () => ({ const validationResult = validateMonitor(monitorWithDefaults as MonitorFields); - if (!validationResult.valid) { + if (!validationResult.valid || !validationResult.decodedMonitor) { const { reason: message, details, payload } = validationResult; return response.badRequest({ body: { message, attributes: { details, ...payload } } }); } @@ -78,8 +78,7 @@ export const addSyntheticsMonitorRoute: SyntheticsRestApiRouteFactory = () => ({ try { const { errors, newMonitor } = await syncNewMonitor({ - normalizedMonitor: monitorWithDefaults, - monitor, + normalizedMonitor: validationResult.decodedMonitor, server, syntheticsMonitorClient, savedObjectsClient, @@ -140,7 +139,6 @@ export const createNewSavedObjectMonitor = async ({ export const syncNewMonitor = async ({ id, - monitor, server, syntheticsMonitorClient, savedObjectsClient, @@ -150,7 +148,6 @@ export const syncNewMonitor = async ({ spaceId, }: { id?: string; - monitor: SyntheticsMonitor; normalizedMonitor: SyntheticsMonitor; server: UptimeServerSetup; syntheticsMonitorClient: SyntheticsMonitorClient; @@ -201,7 +198,7 @@ export const syncNewMonitor = async ({ formatTelemetryEvent({ errors: syncErrors, monitor: monitorSavedObject, - isInlineScript: Boolean((monitor as MonitorFields)[ConfigKey.SOURCE_INLINE]), + isInlineScript: Boolean((normalizedMonitor as MonitorFields)[ConfigKey.SOURCE_INLINE]), kibanaVersion: server.kibanaVersion, }) ); diff --git a/x-pack/plugins/synthetics/server/routes/monitor_cruds/edit_monitor.ts b/x-pack/plugins/synthetics/server/routes/monitor_cruds/edit_monitor.ts index a16a1ba7089e5..d6b50880ed350 100644 --- a/x-pack/plugins/synthetics/server/routes/monitor_cruds/edit_monitor.ts +++ b/x-pack/plugins/synthetics/server/routes/monitor_cruds/edit_monitor.ts @@ -84,13 +84,13 @@ export const editSyntheticsMonitorRoute: SyntheticsRestApiRouteFactory = () => ( const validationResult = validateMonitor(editedMonitor as MonitorFields); - if (!validationResult.valid) { + if (!validationResult.valid || !validationResult.decodedMonitor) { const { reason: message, details, payload } = validationResult; return response.badRequest({ body: { message, attributes: { details, ...payload } } }); } const monitorWithRevision = { - ...editedMonitor, + ...validationResult.decodedMonitor, revision: (previousMonitor.attributes[ConfigKey.REVISION] || 0) + 1, }; const formattedMonitor = formatSecrets(monitorWithRevision); @@ -102,7 +102,7 @@ export const editSyntheticsMonitorRoute: SyntheticsRestApiRouteFactory = () => ( syntheticsMonitorClient, savedObjectsClient, request, - normalizedMonitor: editedMonitor, + normalizedMonitor: validationResult.decodedMonitor, monitorWithRevision: formattedMonitor, spaceId, }); diff --git a/x-pack/plugins/synthetics/server/routes/monitor_cruds/monitor_validation.test.ts b/x-pack/plugins/synthetics/server/routes/monitor_cruds/monitor_validation.test.ts index 8a532279dda88..76bda0f4a2f12 100644 --- a/x-pack/plugins/synthetics/server/routes/monitor_cruds/monitor_validation.test.ts +++ b/x-pack/plugins/synthetics/server/routes/monitor_cruds/monitor_validation.test.ts @@ -109,6 +109,7 @@ describe('validateMonitor', () => { [ConfigKey.METADATA]: testMetaData, [ConfigKey.HOSTS]: 'https://host1.com', [ConfigKey.FORM_MONITOR_TYPE]: FormMonitorType.TCP, + [ConfigKey.PORT]: null, }; testTCPAdvancedFields = { @@ -131,6 +132,7 @@ describe('validateMonitor', () => { [ConfigKey.MAX_REDIRECTS]: '3', [ConfigKey.URLS]: 'https://example.com', [ConfigKey.FORM_MONITOR_TYPE]: FormMonitorType.HTTP, + [ConfigKey.PORT]: null, }; testHTTPAdvancedFields = { @@ -453,7 +455,8 @@ function getJsonPayload() { ' },' + ' "url": "https://example-url.com",' + ' "isServiceManaged": true' + - ' }]' + + ' }],' + + ' "url.port": null' + '}'; return JSON.parse(json); diff --git a/x-pack/plugins/synthetics/server/routes/monitor_cruds/monitor_validation.ts b/x-pack/plugins/synthetics/server/routes/monitor_cruds/monitor_validation.ts index d648722e0d5cd..77cd0fa23a7ce 100644 --- a/x-pack/plugins/synthetics/server/routes/monitor_cruds/monitor_validation.ts +++ b/x-pack/plugins/synthetics/server/routes/monitor_cruds/monitor_validation.ts @@ -4,6 +4,7 @@ * 2.0; you may not use this file except in compliance with the Elastic License * 2.0. */ +import * as t from 'io-ts'; import { isLeft } from 'fp-ts/lib/Either'; import { formatErrors } from '@kbn/securitysolution-io-ts-utils'; @@ -19,6 +20,7 @@ import { ICMPSimpleFieldsCodec, MonitorFields, TCPFieldsCodec, + SyntheticsMonitor, } from '../../../common/runtime_types'; type MonitorCodecType = @@ -39,6 +41,7 @@ export interface ValidationResult { reason: string; details: string; payload: object; + decodedMonitor?: SyntheticsMonitor; } /** @@ -58,9 +61,10 @@ export function validateMonitor(monitorFields: MonitorFields): ValidationResult }; } - const codec = monitorTypeToCodecMap[monitorType]; + // Cast it to ICMPCodec to satisfy typing. During runtime, correct codec will be used to decode. + const SyntheticsMonitorCodec = monitorTypeToCodecMap[monitorType] as typeof ICMPSimpleFieldsCodec; - if (!codec) { + if (!SyntheticsMonitorCodec) { return { valid: false, reason: `Payload is not a valid monitor object`, @@ -69,8 +73,8 @@ export function validateMonitor(monitorFields: MonitorFields): ValidationResult }; } - // Cast it to ICMPCodec to satisfy typing. During runtime, correct codec will be used to decode. - const decodedMonitor = (codec as typeof ICMPSimpleFieldsCodec).decode(monitorFields); + const ExactSyntheticsMonitorCodec = t.exact(SyntheticsMonitorCodec); + const decodedMonitor = ExactSyntheticsMonitorCodec.decode(monitorFields); if (isLeft(decodedMonitor)) { return { @@ -81,7 +85,13 @@ export function validateMonitor(monitorFields: MonitorFields): ValidationResult }; } - return { valid: true, reason: '', details: '', payload: monitorFields }; + return { + valid: true, + reason: '', + details: '', + payload: monitorFields, + decodedMonitor: decodedMonitor.right, + }; } export function validateProjectMonitor(monitorFields: ProjectMonitor): ValidationResult { diff --git a/x-pack/plugins/synthetics/server/routes/synthetics_service/run_once_monitor.ts b/x-pack/plugins/synthetics/server/routes/synthetics_service/run_once_monitor.ts index 394567f45b600..5bbc8c27e3ebe 100644 --- a/x-pack/plugins/synthetics/server/routes/synthetics_service/run_once_monitor.ts +++ b/x-pack/plugins/synthetics/server/routes/synthetics_service/run_once_monitor.ts @@ -26,7 +26,7 @@ export const runOnceSyntheticsMonitorRoute: SyntheticsRestApiRouteFactory = () = const validationResult = validateMonitor(monitor); - if (!validationResult.valid) { + if (!validationResult.valid || !validationResult.decodedMonitor) { const { reason: message, details, payload } = validationResult; return response.badRequest({ body: { message, attributes: { details, ...payload } } }); } @@ -36,7 +36,7 @@ export const runOnceSyntheticsMonitorRoute: SyntheticsRestApiRouteFactory = () = const errors = await syntheticsService.runOnceConfigs([ formatHeartbeatRequest({ // making it enabled, even if it's disabled in the UI - monitor: { ...monitor, enabled: true }, + monitor: { ...validationResult.decodedMonitor, enabled: true }, monitorId, runOnce: true, }), diff --git a/x-pack/plugins/synthetics/server/synthetics_service/formatters/browser.ts b/x-pack/plugins/synthetics/server/synthetics_service/formatters/browser.ts index 7095e437aea29..d9ee08ace167c 100644 --- a/x-pack/plugins/synthetics/server/synthetics_service/formatters/browser.ts +++ b/x-pack/plugins/synthetics/server/synthetics_service/formatters/browser.ts @@ -14,6 +14,7 @@ import { } from './common'; import { BrowserFields, ConfigKey } from '../../../common/runtime_types/monitor_management'; import { DEFAULT_BROWSER_ADVANCED_FIELDS } from '../../../common/constants/monitor_defaults'; +import { tlsFormatters } from './tls'; export type BrowserFormatMap = Record; @@ -66,10 +67,9 @@ export const browserFormatters: BrowserFormatMap = { [ConfigKey.JOURNEY_FILTERS_TAGS]: (fields) => arrayFormatter(fields[ConfigKey.JOURNEY_FILTERS_TAGS]), [ConfigKey.IGNORE_HTTPS_ERRORS]: null, - [ConfigKey.PROJECT_ID]: null, [ConfigKey.PLAYWRIGHT_OPTIONS]: (fields) => stringToObjectFormatter(fields[ConfigKey.PLAYWRIGHT_OPTIONS] || ''), - [ConfigKey.ORIGINAL_SPACE]: null, [ConfigKey.TEXT_ASSERTION]: null, ...commonFormatters, + ...tlsFormatters, }; diff --git a/x-pack/plugins/synthetics/server/synthetics_service/formatters/common.ts b/x-pack/plugins/synthetics/server/synthetics_service/formatters/common.ts index f9c3125041b44..a2427357e3682 100644 --- a/x-pack/plugins/synthetics/server/synthetics_service/formatters/common.ts +++ b/x-pack/plugins/synthetics/server/synthetics_service/formatters/common.ts @@ -31,7 +31,9 @@ export const commonFormatters: CommonFormatMap = { fields[ConfigKey.MONITOR_SOURCE_TYPE] || SourceType.UI, [ConfigKey.FORM_MONITOR_TYPE]: null, [ConfigKey.JOURNEY_ID]: null, + [ConfigKey.PROJECT_ID]: null, [ConfigKey.CUSTOM_HEARTBEAT_ID]: null, + [ConfigKey.ORIGINAL_SPACE]: null, }; export const arrayFormatter = (value: string[] = []) => (value.length ? value : null); diff --git a/x-pack/plugins/synthetics/server/synthetics_service/formatters/http.ts b/x-pack/plugins/synthetics/server/synthetics_service/formatters/http.ts index b8652e0813a0e..83545eb198ba7 100644 --- a/x-pack/plugins/synthetics/server/synthetics_service/formatters/http.ts +++ b/x-pack/plugins/synthetics/server/synthetics_service/formatters/http.ts @@ -14,6 +14,7 @@ export type HTTPFormatMap = Record; export const httpFormatters: HTTPFormatMap = { [ConfigKey.METADATA]: (fields) => objectFormatter(fields[ConfigKey.METADATA]), [ConfigKey.URLS]: null, + [ConfigKey.PORT]: null, [ConfigKey.MAX_REDIRECTS]: null, [ConfigKey.USERNAME]: null, [ConfigKey.PASSWORD]: null, diff --git a/x-pack/plugins/synthetics/server/synthetics_service/formatters/tcp.ts b/x-pack/plugins/synthetics/server/synthetics_service/formatters/tcp.ts index c295a17ed8964..25ba5c08e9b3c 100644 --- a/x-pack/plugins/synthetics/server/synthetics_service/formatters/tcp.ts +++ b/x-pack/plugins/synthetics/server/synthetics_service/formatters/tcp.ts @@ -14,6 +14,7 @@ export type TCPFormatMap = Record; export const tcpFormatters: TCPFormatMap = { [ConfigKey.METADATA]: null, [ConfigKey.HOSTS]: null, + [ConfigKey.PORT]: null, [ConfigKey.PROXY_URL]: null, [ConfigKey.PROXY_USE_LOCAL_RESOLVER]: null, [ConfigKey.RESPONSE_RECEIVE_CHECK]: null, diff --git a/x-pack/plugins/synthetics/server/synthetics_service/project_monitor/normalizers/http_monitor.test.ts b/x-pack/plugins/synthetics/server/synthetics_service/project_monitor/normalizers/http_monitor.test.ts index 922c5ca6dab05..cea5aa8b50de8 100644 --- a/x-pack/plugins/synthetics/server/synthetics_service/project_monitor/normalizers/http_monitor.test.ts +++ b/x-pack/plugins/synthetics/server/synthetics_service/project_monitor/normalizers/http_monitor.test.ts @@ -179,6 +179,7 @@ describe('http normalizers', () => { timeout: '80', type: 'http', urls: 'http://localhost:9200', + 'url.port': null, username: '', }, unsupportedKeys: ['check.response.body', 'unsupportedKey.nestedUnsupportedKey'], @@ -232,6 +233,7 @@ describe('http normalizers', () => { timeout: '80', type: 'http', urls: 'http://localhost:9200', + 'url.port': null, username: '', }, unsupportedKeys: [], diff --git a/x-pack/plugins/synthetics/server/synthetics_service/project_monitor/normalizers/icmp_monitor.test.ts b/x-pack/plugins/synthetics/server/synthetics_service/project_monitor/normalizers/icmp_monitor.test.ts index e32ddf4f328a1..74ac2cb2bfaf3 100644 --- a/x-pack/plugins/synthetics/server/synthetics_service/project_monitor/normalizers/icmp_monitor.test.ts +++ b/x-pack/plugins/synthetics/server/synthetics_service/project_monitor/normalizers/icmp_monitor.test.ts @@ -8,7 +8,7 @@ import { Locations, LocationStatus, PrivateLocation } from '../../../../common/runtime_types'; import { normalizeProjectMonitors } from '.'; -describe('http normalizers', () => { +describe('icmp normalizers', () => { describe('normalize push monitors', () => { const projectId = 'test-project-id'; const locations: Locations = [ @@ -81,7 +81,7 @@ describe('http normalizers', () => { }, ]; - it('properly normalizes http monitors', () => { + it('properly normalizes icmp monitors', () => { const actual = normalizeProjectMonitors({ locations, privateLocations, diff --git a/x-pack/plugins/synthetics/server/synthetics_service/project_monitor/normalizers/tcp_monitor.test.ts b/x-pack/plugins/synthetics/server/synthetics_service/project_monitor/normalizers/tcp_monitor.test.ts index 094bf018ba127..a479bbc09d47b 100644 --- a/x-pack/plugins/synthetics/server/synthetics_service/project_monitor/normalizers/tcp_monitor.test.ts +++ b/x-pack/plugins/synthetics/server/synthetics_service/project_monitor/normalizers/tcp_monitor.test.ts @@ -8,7 +8,7 @@ import { Locations, LocationStatus, PrivateLocation } from '../../../../common/runtime_types'; import { normalizeProjectMonitors } from '.'; -describe('http normalizers', () => { +describe('tcp normalizers', () => { describe('normalize push monitors', () => { const projectId = 'test-project-id'; const locations: Locations = [ @@ -83,7 +83,7 @@ describe('http normalizers', () => { }, ]; - it('properly normalizes http monitors', () => { + it('properly normalizes tcp monitors', () => { const actual = normalizeProjectMonitors({ locations, privateLocations, @@ -106,6 +106,7 @@ describe('http normalizers', () => { enabled: true, form_monitor_type: 'tcp', hosts: 'smtp.gmail.com:587', + 'url.port': null, journey_id: 'gmail-smtp', locations: [ { @@ -157,6 +158,7 @@ describe('http normalizers', () => { enabled: true, form_monitor_type: 'tcp', hosts: 'localhost:18278', + 'url.port': null, journey_id: 'always-down', locations: [ { @@ -221,6 +223,7 @@ describe('http normalizers', () => { enabled: true, form_monitor_type: 'tcp', hosts: 'localhost', + 'url.port': null, journey_id: 'always-down', locations: [ { diff --git a/x-pack/plugins/synthetics/server/synthetics_service/project_monitor/project_monitor_formatter.ts b/x-pack/plugins/synthetics/server/synthetics_service/project_monitor/project_monitor_formatter.ts index 1ca27869aa2cc..16cbf3f33a8aa 100644 --- a/x-pack/plugins/synthetics/server/synthetics_service/project_monitor/project_monitor_formatter.ts +++ b/x-pack/plugins/synthetics/server/synthetics_service/project_monitor/project_monitor_formatter.ts @@ -19,7 +19,6 @@ import { deleteMonitorBulk } from '../../routes/monitor_cruds/bulk_cruds/delete_ import { SyntheticsMonitorClient } from '../synthetics_monitor/synthetics_monitor_client'; import { syncEditedMonitorBulk } from '../../routes/monitor_cruds/bulk_cruds/edit_monitor_bulk'; import { - BrowserFields, ConfigKey, SyntheticsMonitorWithSecrets, EncryptedSyntheticsMonitor, @@ -124,16 +123,16 @@ export class ProjectMonitorFormatter { const existingMonitors = await this.getProjectMonitorsForProject(); this.staleMonitorsMap = await this.getStaleMonitorsMap(existingMonitors); - const normalizedNewMonitors: BrowserFields[] = []; + const normalizedNewMonitors: SyntheticsMonitor[] = []; const normalizedUpdateMonitors: Array<{ previousMonitor: SavedObjectsFindResult; - monitor: BrowserFields; + monitor: SyntheticsMonitor; }> = []; for (const monitor of this.monitors) { const previousMonitor = existingMonitors.find( (monitorObj) => - (monitorObj.attributes as BrowserFields)[ConfigKey.JOURNEY_ID] === monitor.id + (monitorObj.attributes as SyntheticsMonitor)[ConfigKey.JOURNEY_ID] === monitor.id ); const normM = await this.validateProjectMonitor({ @@ -154,7 +153,7 @@ export class ProjectMonitorFormatter { await this.createMonitorsBulk(normalizedNewMonitors); - const { updatedCount } = await this.updateMonitors(normalizedUpdateMonitors); + const { updatedCount } = await this.updateMonitorsBulk(normalizedUpdateMonitors); if (normalizedUpdateMonitors.length > 0) { let updateMessage = ''; @@ -228,16 +227,16 @@ export class ProjectMonitorFormatter { } /* Validates that the normalized monitor is a valid monitor saved object type */ - const { valid: isNormalizedMonitorValid } = this.validateMonitor({ + const { valid: isNormalizedMonitorValid, decodedMonitor } = this.validateMonitor({ validationResult: validateMonitor(normalizedMonitor as MonitorFields), monitorId: monitor.id, }); - if (!isNormalizedMonitorValid) { + if (!isNormalizedMonitorValid || !decodedMonitor) { return null; } - return normalizedMonitor; + return decodedMonitor; } catch (e) { this.server.logger.error(e); this.failedMonitors.push({ @@ -259,7 +258,7 @@ export class ProjectMonitorFormatter { const staleMonitors: StaleMonitorMap = {}; existingMonitors.forEach((savedObject) => { - const journeyId = (savedObject.attributes as BrowserFields)[ConfigKey.JOURNEY_ID]; + const journeyId = (savedObject.attributes as SyntheticsMonitor)[ConfigKey.JOURNEY_ID]; if (journeyId) { staleMonitors[journeyId] = { stale: true, @@ -291,7 +290,7 @@ export class ProjectMonitorFormatter { return hits; }; - private createMonitorsBulk = async (monitors: BrowserFields[]) => { + private createMonitorsBulk = async (monitors: SyntheticsMonitor[]) => { try { if (monitors.length > 0) { const { newMonitors } = await syncNewMonitorBulk({ @@ -352,9 +351,9 @@ export class ProjectMonitorFormatter { ); }; - private updateMonitors = async ( + private updateMonitorsBulk = async ( monitors: Array<{ - monitor: BrowserFields; + monitor: SyntheticsMonitor; previousMonitor: SavedObjectsFindResult; }> ): Promise<{ diff --git a/x-pack/test/api_integration/apis/uptime/rest/add_monitor.ts b/x-pack/test/api_integration/apis/uptime/rest/add_monitor.ts index 4e65bf1c4dbe3..f96479a50bc6f 100644 --- a/x-pack/test/api_integration/apis/uptime/rest/add_monitor.ts +++ b/x-pack/test/api_integration/apis/uptime/rest/add_monitor.ts @@ -140,6 +140,41 @@ export default function ({ getService }: FtrProviderContext) { expect(apiResponse.status).eql(400); }); + it('omits unknown keys', async () => { + // Delete a required property to make payload invalid + const newMonitor = { + name: 'Sample name', + url: 'https://elastic.co', + unknownKey: 'unknownValue', + type: 'http', + locations: [ + { + id: 'eu-west-01', + label: 'Europe West', + geo: { + lat: 33.2343132435, + lon: 73.2342343434, + }, + url: 'https://example-url.com', + isServiceManaged: true, + }, + ], + }; + + const apiResponse = await supertestAPI + .post(API_URLS.SYNTHETICS_MONITORS) + .set('kbn-xsrf', 'true') + .send(newMonitor) + .expect(200); + + const response = await supertestAPI + .get(`${API_URLS.SYNTHETICS_MONITORS}/${apiResponse.body.id}`) + .set('kbn-xsrf', 'true') + .expect(200); + + expect(response.body.attributes).not.to.have.keys('unknownkey', 'url'); + }); + it('can create monitor with API key with proper permissions', async () => { await supertestAPI .post('/internal/security/api_key') diff --git a/x-pack/test/api_integration/apis/uptime/rest/add_monitor_project.ts b/x-pack/test/api_integration/apis/uptime/rest/add_monitor_project.ts index 105e6521c1da4..9dce7e7d8fdaa 100644 --- a/x-pack/test/api_integration/apis/uptime/rest/add_monitor_project.ts +++ b/x-pack/test/api_integration/apis/uptime/rest/add_monitor_project.ts @@ -96,6 +96,114 @@ export default function ({ getService }: FtrProviderContext) { icmpProjectMonitors = setUniqueIds(getFixtureJson('project_icmp_monitor')); }); + it('project monitors - handles browser monitors', async () => { + const successfulMonitors = [projectMonitors.monitors[0]]; + + try { + const messages = await parseStreamApiResponse( + projectMonitorEndpoint, + JSON.stringify(projectMonitors) + ); + + expect(messages).to.have.length(2); + expect(messages[1].updatedMonitors).eql([]); + expect(messages[1].createdMonitors).eql(successfulMonitors.map((monitor) => monitor.id)); + expect(messages[1].failedMonitors).eql([]); + + for (const monitor of successfulMonitors) { + const journeyId = monitor.id; + const createdMonitorsResponse = await supertest + .get(API_URLS.SYNTHETICS_MONITORS) + .query({ filter: `${syntheticsMonitorType}.attributes.journey_id: ${journeyId}` }) + .set('kbn-xsrf', 'true') + .expect(200); + + const decryptedCreatedMonitor = await supertest + .get(`${API_URLS.SYNTHETICS_MONITORS}/${createdMonitorsResponse.body.monitors[0].id}`) + .set('kbn-xsrf', 'true') + .expect(200); + + expect(decryptedCreatedMonitor.body.attributes).to.eql({ + __ui: { + is_zip_url_tls_enabled: false, + script_source: { + file_name: '', + is_generated_script: false, + }, + }, + config_id: '', + custom_heartbeat_id: `${journeyId}-test-suite-default`, + enabled: true, + 'filter_journeys.match': 'check if title is present', + 'filter_journeys.tags': [], + form_monitor_type: 'multistep', + ignore_https_errors: false, + journey_id: journeyId, + locations: [ + { + geo: { + lat: 0, + lon: 0, + }, + id: 'localhost', + isInvalid: false, + isServiceManaged: true, + label: 'Local Synthetics Service', + status: 'experimental', + url: 'mockDevUrl', + }, + ], + name: 'check if title is present', + namespace: 'default', + origin: 'project', + original_space: 'default', + playwright_options: '{"headless":true,"chromiumSandbox":false}', + playwright_text_assertion: '', + project_id: 'test-suite', + params: '', + revision: 1, + schedule: { + number: '10', + unit: 'm', + }, + screenshots: 'on', + 'service.name': '', + 'source.zip_url.folder': '', + 'source.zip_url.proxy_url': '', + 'source.zip_url.url': '', + 'source.zip_url.password': '', + 'source.zip_url.username': '', + synthetics_args: [], + tags: [], + 'throttling.config': '5d/3u/20l', + 'throttling.download_speed': '5', + 'throttling.is_enabled': true, + 'throttling.latency': '20', + 'throttling.upload_speed': '3', + 'ssl.certificate': '', + 'ssl.certificate_authorities': '', + 'ssl.supported_protocols': ['TLSv1.1', 'TLSv1.2', 'TLSv1.3'], + 'ssl.verification_mode': 'full', + 'ssl.key': '', + 'ssl.key_passphrase': '', + 'source.inline.script': '', + 'source.project.content': + 'UEsDBBQACAAIAON5qVQAAAAAAAAAAAAAAAAfAAAAZXhhbXBsZXMvdG9kb3MvYmFzaWMuam91cm5leS50c22Q0WrDMAxF3/sVF7MHB0LMXlc6RvcN+wDPVWNviW0sdUsp/fe5SSiD7UFCWFfHujIGlpnkybwxFTZfoY/E3hsaLEtwhs9RPNWKDU12zAOxkXRIbN4tB9d9pFOJdO6EN2HMqQguWN9asFBuQVMmJ7jiWNII9fIXrbabdUYr58l9IhwhQQZCYORCTFFUC31Btj21NRc7Mq4Nds+4bDD/pNVgT9F52Jyr2Fa+g75LAPttg8yErk+S9ELpTmVotlVwnfNCuh2lepl3+JflUmSBJ3uggt1v9INW/lHNLKze9dJe1J3QJK8pSvWkm6aTtCet5puq+x63+AFQSwcIAPQ3VfcAAACcAQAAUEsBAi0DFAAIAAgA43mpVAD0N1X3AAAAnAEAAB8AAAAAAAAAAAAgAKSBAAAAAGV4YW1wbGVzL3RvZG9zL2Jhc2ljLmpvdXJuZXkudHNQSwUGAAAAAAEAAQBNAAAARAEAAAAA', + timeout: null, + type: 'browser', + 'url.port': null, + urls: '', + }); + } + } finally { + await Promise.all([ + successfulMonitors.map((monitor) => { + return deleteMonitor(monitor.id, httpProjectMonitors.project); + }), + ]); + } + }); + it('project monitors - handles http monitors', async () => { const kibanaVersion = await kibanaServer.version.get(); const successfulMonitors = [httpProjectMonitors.monitors[1]]; @@ -130,7 +238,12 @@ export default function ({ getService }: FtrProviderContext) { .set('kbn-xsrf', 'true') .expect(200); - expect(createdMonitorsResponse.body.monitors[0].attributes).to.eql({ + const decryptedCreatedMonitor = await supertest + .get(`${API_URLS.SYNTHETICS_MONITORS}/${createdMonitorsResponse.body.monitors[0].id}`) + .set('kbn-xsrf', 'true') + .expect(200); + + expect(decryptedCreatedMonitor.body.attributes).to.eql({ __ui: { is_tls_enabled: false, }, @@ -138,6 +251,16 @@ export default function ({ getService }: FtrProviderContext) { 'check.response.status': ['200'], config_id: '', custom_heartbeat_id: `${journeyId}-test-suite-default`, + 'check.response.body.negative': [], + 'check.response.body.positive': ['Saved', 'saved'], + 'check.response.headers': {}, + 'check.request.body': { + type: 'text', + value: '', + }, + 'check.request.headers': { + 'Content-Type': 'application/x-www-form-urlencoded', + }, enabled: false, form_monitor_type: 'http', journey_id: journeyId, @@ -161,6 +284,8 @@ export default function ({ getService }: FtrProviderContext) { origin: 'project', original_space: 'default', project_id: 'test-suite', + username: '', + password: '', proxy_url: '', 'response.include_body': 'always', 'response.include_headers': false, @@ -174,10 +299,13 @@ export default function ({ getService }: FtrProviderContext) { 'ssl.certificate_authorities': '', 'ssl.supported_protocols': ['TLSv1.1', 'TLSv1.2', 'TLSv1.3'], 'ssl.verification_mode': 'full', + 'ssl.key': '', + 'ssl.key_passphrase': '', tags: Array.isArray(monitor.tags) ? monitor.tags : monitor.tags?.split(','), timeout: '80', type: 'http', urls: Array.isArray(monitor.urls) ? monitor.urls?.[0] : monitor.urls, + 'url.port': null, }); } } finally { @@ -223,12 +351,19 @@ export default function ({ getService }: FtrProviderContext) { .set('kbn-xsrf', 'true') .expect(200); - expect(createdMonitorsResponse.body.monitors[0].attributes).to.eql({ + const decryptedCreatedMonitor = await supertest + .get(`${API_URLS.SYNTHETICS_MONITORS}/${createdMonitorsResponse.body.monitors[0].id}`) + .set('kbn-xsrf', 'true') + .expect(200); + + expect(decryptedCreatedMonitor.body.attributes).to.eql({ __ui: { is_tls_enabled: false, }, config_id: '', custom_heartbeat_id: `${journeyId}-test-suite-default`, + 'check.receive': '', + 'check.send': '', enabled: true, form_monitor_type: 'tcp', journey_id: journeyId, @@ -263,10 +398,13 @@ export default function ({ getService }: FtrProviderContext) { 'ssl.certificate_authorities': '', 'ssl.supported_protocols': ['TLSv1.1', 'TLSv1.2', 'TLSv1.3'], 'ssl.verification_mode': 'full', + 'ssl.key': '', + 'ssl.key_passphrase': '', tags: Array.isArray(monitor.tags) ? monitor.tags : monitor.tags?.split(','), timeout: '16', type: 'tcp', hosts: Array.isArray(monitor.hosts) ? monitor.hosts?.[0] : monitor.hosts, + 'url.port': null, }); } } finally { @@ -312,7 +450,12 @@ export default function ({ getService }: FtrProviderContext) { .set('kbn-xsrf', 'true') .expect(200); - expect(createdMonitorsResponse.body.monitors[0].attributes).to.eql({ + const decryptedCreatedMonitor = await supertest + .get(`${API_URLS.SYNTHETICS_MONITORS}/${createdMonitorsResponse.body.monitors[0].id}`) + .set('kbn-xsrf', 'true') + .expect(200); + + expect(decryptedCreatedMonitor.body.attributes).to.eql({ config_id: '', custom_heartbeat_id: `${journeyId}-test-suite-default`, enabled: true, diff --git a/x-pack/test/api_integration/apis/uptime/rest/edit_monitor.ts b/x-pack/test/api_integration/apis/uptime/rest/edit_monitor.ts index 480d07e7144f3..eb44aa36a76c8 100644 --- a/x-pack/test/api_integration/apis/uptime/rest/edit_monitor.ts +++ b/x-pack/test/api_integration/apis/uptime/rest/edit_monitor.ts @@ -16,7 +16,7 @@ import { getFixtureJson } from './helper/get_fixture_json'; import { PrivateLocationTestService } from './services/private_location_test_service'; export default function ({ getService }: FtrProviderContext) { - describe('[PUT] /internal/uptime/service/monitors', function () { + describe('EditMonitor', function () { this.tags('skipCloud'); const supertest = getService('supertest'); @@ -109,6 +109,66 @@ export default function ({ getService }: FtrProviderContext) { ); }); + it('strips unknown keys from monitor edits', async () => { + const newMonitor = httpMonitorJson; + + const { id: monitorId, attributes: savedMonitor } = await saveMonitor( + newMonitor as MonitorFields + ); + + expect(savedMonitor).eql(omit(newMonitor, secretKeys)); + + const updates: Partial = { + [ConfigKey.URLS]: 'https://modified-host.com', + [ConfigKey.NAME]: 'Modified name', + [ConfigKey.LOCATIONS]: [ + { + id: 'eu-west-01', + label: 'Europe West', + geo: { + lat: 33.2343132435, + lon: 73.2342343434, + }, + url: 'https://example-url.com', + isServiceManaged: true, + }, + ], + [ConfigKey.REQUEST_HEADERS_CHECK]: { + sampleHeader2: 'sampleValue2', + }, + [ConfigKey.METADATA]: { + script_source: { + is_generated_script: false, + file_name: 'test-file.name', + }, + }, + unknownkey: 'unknownvalue', + } as Partial; + + const modifiedMonitor = omit( + { + ...newMonitor, + ...updates, + [ConfigKey.METADATA]: { + ...newMonitor[ConfigKey.METADATA], + ...updates[ConfigKey.METADATA], + }, + }, + ['unknownkey'] + ); + + const editResponse = await supertest + .put(API_URLS.SYNTHETICS_MONITORS + '/' + monitorId) + .set('kbn-xsrf', 'true') + .send(modifiedMonitor) + .expect(200); + + expect(editResponse.body.attributes).eql( + omit({ ...modifiedMonitor, revision: 2 }, secretKeys) + ); + expect(editResponse.body.attributes).not.to.have.keys('unknownkey'); + }); + it('returns 404 if monitor id is not present', async () => { const invalidMonitorId = 'invalid-id'; const expected404Message = `Monitor id ${invalidMonitorId} not found!`; diff --git a/x-pack/test/api_integration/apis/uptime/rest/fixtures/http_monitor.json b/x-pack/test/api_integration/apis/uptime/rest/fixtures/http_monitor.json index 76478fd7aee1a..45a2e11e9f306 100644 --- a/x-pack/test/api_integration/apis/uptime/rest/fixtures/http_monitor.json +++ b/x-pack/test/api_integration/apis/uptime/rest/fixtures/http_monitor.json @@ -23,6 +23,7 @@ "max_redirects": "3", "password": "test", "urls": "https://nextjs-test-synthetics.vercel.app/api/users", + "url.port": null, "proxy_url": "http://proxy.com", "check.response.body.negative": [], "check.response.body.positive": [], diff --git a/x-pack/test/api_integration/apis/uptime/rest/fixtures/icmp_monitor.json b/x-pack/test/api_integration/apis/uptime/rest/fixtures/icmp_monitor.json index d9df06d1c7c32..052c811461ae7 100644 --- a/x-pack/test/api_integration/apis/uptime/rest/fixtures/icmp_monitor.json +++ b/x-pack/test/api_integration/apis/uptime/rest/fixtures/icmp_monitor.json @@ -1,5 +1,5 @@ { - "type": "tcp", + "type": "icmp", "locations": [], "journey_id": "", "enabled": true, @@ -14,25 +14,8 @@ "tagT2" ], "timeout": "16", - "__ui": { - "is_tls_enabled": true, - "is_zip_url_tls_enabled": false - }, "hosts": "192.33.22.111:3333", - "proxy_url": "", - "proxy_use_local_resolver": false, - "check.receive": "", - "check.send": "", - "ssl.certificate_authorities": "", - "ssl.certificate": "", - "ssl.key": "", - "ssl.key_passphrase": "", - "ssl.verification_mode": "full", - "ssl.supported_protocols": [ - "TLSv1.1", - "TLSv1.2", - "TLSv1.3" - ], + "wait": "1", "name": "Test HTTP Monitor 04", "namespace": "testnamespace", "origin": "ui", diff --git a/x-pack/test/api_integration/apis/uptime/rest/fixtures/tcp_monitor.json b/x-pack/test/api_integration/apis/uptime/rest/fixtures/tcp_monitor.json index 1c726c1bcc70e..e0b4ca03b1d8d 100644 --- a/x-pack/test/api_integration/apis/uptime/rest/fixtures/tcp_monitor.json +++ b/x-pack/test/api_integration/apis/uptime/rest/fixtures/tcp_monitor.json @@ -15,6 +15,7 @@ "is_zip_url_tls_enabled": false }, "hosts": "example-host:40", + "url.port": null, "proxy_url": "", "proxy_use_local_resolver": false, "check.receive": "", From 1be987e66a36cf693e124ed0ed1d278ffc52358b Mon Sep 17 00:00:00 2001 From: Lisa Cawley Date: Thu, 29 Sep 2022 08:29:07 -0700 Subject: [PATCH 16/72] [DOCS] Link to open API specification from ML sync API (#142136) --- .../machine-learning/ml-apis.asciidoc | 2 +- .../machine-learning/ml_apis_v2_defs.asciidoc | 240 ------------------ .../machine-learning/ml_apis_v2_docs.asciidoc | 49 ---- docs/api/machine-learning/sync.asciidoc | 95 +++++++ docs/redirects.asciidoc | 6 +- docs/user/api.asciidoc | 3 +- 6 files changed, 100 insertions(+), 295 deletions(-) delete mode 100644 docs/api/machine-learning/ml_apis_v2_defs.asciidoc delete mode 100644 docs/api/machine-learning/ml_apis_v2_docs.asciidoc create mode 100644 docs/api/machine-learning/sync.asciidoc diff --git a/docs/api-generated/machine-learning/ml-apis.asciidoc b/docs/api-generated/machine-learning/ml-apis.asciidoc index 3482109d4ab3e..60aff48267f0c 100644 --- a/docs/api-generated/machine-learning/ml-apis.asciidoc +++ b/docs/api-generated/machine-learning/ml-apis.asciidoc @@ -1,4 +1,4 @@ -[[machine-learning-api]] +[[machine-learning-apis]] == Machine learning APIs preview::[] diff --git a/docs/api/machine-learning/ml_apis_v2_defs.asciidoc b/docs/api/machine-learning/ml_apis_v2_defs.asciidoc deleted file mode 100644 index 691557bfb9634..0000000000000 --- a/docs/api/machine-learning/ml_apis_v2_defs.asciidoc +++ /dev/null @@ -1,240 +0,0 @@ -[[Machine_learning_APIs-definitions]] -== Definitions - -* <> -* <> -* <> -* <> -* <> -* <> - -[[MLSyncResponse]] -=== `MLSyncResponse` - -The sync machine learning saved objects API returns this list of machine learning saved objects that required synchronization. - - -==== Properties - -`datafeedsAdded` (++map[string,++<>++]++):: -If a saved object for an anomaly detection job is missing a datafeed identifier, it is added when you run the sync machine learning saved objects API. - - -`datafeedsRemoved` (++map[string,++<>++]++):: -If a saved object for an anomaly detection job references a datafeed that no longer exists, it is deleted when you run the sync machine learning saved objects API. - - -`savedObjectsCreated` (<>):: -If saved objects are missing for machine learning jobs or trained models, they are created when you run the sync machine learning saved objects API. - - -`savedObjectsDeleted` (<>):: -If saved objects exist for machine learning jobs or trained models that no longer exist, they are deleted when you run the sync machine learning saved objects API. - - -==== Example - -[source,json] --------- -{ - "datafeedsAdded" : { - "some_property" : { - "success" : true - } - }, - "datafeedsRemoved" : { - "some_property" : { - "success" : true - } - }, - "savedObjectsCreated" : { - "anomaly-detector" : { - "some_property" : { - "success" : true - } - }, - "data-frame-analytics" : { - "some_property" : { - "success" : true - } - }, - "trained-model" : { - "some_property" : { - "success" : true - } - } - }, - "savedObjectsDeleted" : { - "anomaly-detector" : { - "some_property" : { - "success" : true - } - }, - "data-frame-analytics" : { - "some_property" : { - "success" : true - } - }, - "trained-model" : { - "some_property" : { - "success" : true - } - } - } -} - --------- - -[[MLSyncResponse-Datafeeds]] -=== `MLSyncResponse-Datafeeds` - -The sync machine learning saved objects API response contains this object when there are datafeeds affected by the synchronization. There is an object for each relevant datafeed, which contains the synchronization status. - - -==== Properties - -`success` (+boolean+):: -The success or failure of the synchronization. - - -==== Example - -[source,json] --------- -{ - "success" : true -} - --------- - -[[MLSyncResponse-Jobs]] -=== `MLSyncResponse-Jobs` - -The sync machine learning saved objects API response contains this object when there are machine learning jobs affected by the synchronization. There is an object for each relevant job, which contains the synchronization status. - - -==== Properties - -`success` (+boolean+):: -The success or failure of the synchronization. - - -==== Example - -[source,json] --------- -{ - "success" : true -} - --------- - -[[MLSyncResponse-Models]] -=== `MLSyncResponse-Models` - -The sync machine learning saved objects API response contains this object when there are trained models affected by the synchronization. There is an object for each relevant trained model, which contains the synchronization status. - - -==== Properties - -`success` (+boolean+):: -The success or failure of the synchronization. - - -==== Example - -[source,json] --------- -{ - "success" : true -} - --------- - -[[MLSyncResponse-SavedObjectsCreated]] -=== `MLSyncResponse-SavedObjectsCreated` - -If saved objects are missing for machine learning jobs or trained models, they are created when you run the sync machine learning saved objects API. - - -==== Properties - -`anomaly-detector` (++map[string,++<>++]++):: -This object is present if there are anomaly detection jobs affected by the synchronization. - - -`data-frame-analytics` (++map[string,++<>++]++):: -This object is present if there are data frame analytics jobs affected by the synchronization. - - -`trained-model` (++map[string,++<>++]++):: -This object is present if there are trained models affected by the synchronization. - - -==== Example - -[source,json] --------- -{ - "anomaly-detector" : { - "some_property" : { - "success" : true - } - }, - "data-frame-analytics" : { - "some_property" : { - "success" : true - } - }, - "trained-model" : { - "some_property" : { - "success" : true - } - } -} - --------- - -[[MLSyncResponse-SavedObjectsDeleted]] -=== `MLSyncResponse-SavedObjectsDeleted` - -If saved objects exist for machine learning jobs or trained models that no longer exist, they are deleted when you run the sync machine learning saved objects API. - - -==== Properties - -`anomaly-detector` (++map[string,++<>++]++):: -This object is present if there are anomaly detection jobs affected by the synchronization. - - -`data-frame-analytics` (++map[string,++<>++]++):: -This object is present if there are data frame analytics jobs affected by the synchronization. - - -`trained-model` (++map[string,++<>++]++):: -This object is present if there are trained models affected by the synchronization. - - -==== Example - -[source,json] --------- -{ - "anomaly-detector" : { - "some_property" : { - "success" : true - } - }, - "data-frame-analytics" : { - "some_property" : { - "success" : true - } - }, - "trained-model" : { - "some_property" : { - "success" : true - } - } -} - --------- diff --git a/docs/api/machine-learning/ml_apis_v2_docs.asciidoc b/docs/api/machine-learning/ml_apis_v2_docs.asciidoc deleted file mode 100644 index f4a01cad94206..0000000000000 --- a/docs/api/machine-learning/ml_apis_v2_docs.asciidoc +++ /dev/null @@ -1,49 +0,0 @@ -[[Machine_learning_APIs]] -== Machine learning APIs - -* <> - -[[ml-sync]] -=== Sync machine learning objects - -Synchronizes Kibana saved objects for machine learning jobs and trained models. You must have `all` privileges for the *Machine Learning* feature in the *Analytics* section of the Kibana feature privileges. This API runs automatically when you start Kibana and periodically thereafter. - - -==== Request - -`GET /s/{spaceId}/api/ml/saved_objects/sync` - -==== Path parameters - -[options="header"] -|========== -|Name |Type |Required |Description -|`spaceId` |+string+ |Y |An identifier for the space. If you omit `/s/` and this identifier from the path, the default space is used. - -|========== -==== Query parameters - -[options="header"] -|========== -|Name |Type |Required |Description -|`simulate` |+boolean+; default: ++false++ |N |When true, simulates the synchronization by returning only the list actions that would be performed. - -|========== -==== Responses - -`200`:: -+ --- -(<>) - -Indicates a successful call. - --- - -==== Request example - -[source,json] --------- -curl -XGET https://localhost:5601/s/{spaceId}/api/ml/saved_objects/sync \ --u USER:PASSWORD --------- \ No newline at end of file diff --git a/docs/api/machine-learning/sync.asciidoc b/docs/api/machine-learning/sync.asciidoc new file mode 100644 index 0000000000000..af4f797ade1f2 --- /dev/null +++ b/docs/api/machine-learning/sync.asciidoc @@ -0,0 +1,95 @@ +[[machine-learning-api-sync]] +=== Sync {ml} saved objects API +++++ +Sync {ml} saved objects +++++ + +Synchronizes {kib} saved objects for {ml} jobs and trained models. + +[NOTE] +==== +For the most up-to-date API details, refer to the +{kib-repo}/tree/{branch}/x-pack/plugins/ml/common/openapi[open API specification]. For a preview, check out <>. +==== + +[[machine-learning-api-sync-request]] +==== {api-request-title} + +`GET :/api/ml/saved_objects/sync` + +`GET :/s//api/ml/saved_objects/sync` + +[[machine-learning-api-sync-prereq]] +==== {api-prereq-title} + +You must have `all` privileges for the *Machine Learning* feature in the *Analytics* section of the +<>. + +[[machine-learning-api-sync-desc]] +==== {api-description-title} + +This API runs automatically when you start {kib} and periodically thereafter. + +[[machine-learning-api-sync-path-params]] +==== {api-path-parms-title} + +`space_id`:: +(Optional, string) An identifier for the space. If `space_id` is not provided in +the URL the default space is used. + +[[machine-learning-api-sync-query-params]] +==== {api-query-parms-title} + +`simulate`:: +(Optional, boolean) When `true`, simulates the synchronization by only returning +the list actions that _would_ be performed. + +[[machine-learning-api-sync-response-body]] +==== {api-response-body-title} + +`datafeedsAdded`:: +(array) If a saved object for an {anomaly-job} is missing a {dfeed} identifier, +it is added. This list contains the {dfeed} identifiers and indicates whether +the synchronization was successful. + +`datafeedsRemoved`:: +(array) If a saved object for an anomaly detection job references a datafeed +that no longer exists, it is deleted. This list contains the {dfeed} identifiers +and indicates whether the synchronization was successful. + +`savedObjectsCreated`:: +(array) If saved objects are missing for {ml} jobs or trained models, they are +created. This list contains the job and model identifiers and indicates whether +the synchronization was successful. + +`savedObjectsDeleted`:: +(array) If saved objects exist for {ml} jobs or trained models that no longer +exist, they are deleted. This list contains the job and model identifiers and +indicates whether the synchronization was successful. + +[[machine-learning-api-sync-codes]] +==== {api-response-codes-title} + +`200`:: + Indicates a successful call. + +[[machine-learning-api-sync-example]] +==== {api-examples-title} + +Retrieve the list of {ml} saved objects that require synchronization: + +[source,sh] +-------------------------------------------------- +GET api/ml/saved_objects/sync?simulate=true +-------------------------------------------------- +// KIBANA + +If there are two jobs that need to be synchronized, for example, the API returns +the following response: + +[source,sh] +-------------------------------------------------- +{"savedObjectsCreated":{"anomaly_detector":{"myjob1":{"success":true},"myjob2":{"success":true}}},"savedObjectsDeleted":{},"datafeedsAdded":{},"datafeedsRemoved":{}} +-------------------------------------------------- + +To perform the synchronization, re-run the API and omit the `simulate` parameter. \ No newline at end of file diff --git a/docs/redirects.asciidoc b/docs/redirects.asciidoc index 5c12048315dec..fe1f3b9521cf2 100644 --- a/docs/redirects.asciidoc +++ b/docs/redirects.asciidoc @@ -416,7 +416,7 @@ This page has been deleted. Refer to <>. This page has been deleted. Refer to <>. -[role="exclude",id="machine-learning-api-sync"] -== Sync machine learning saved objects API +[role="exclude",id="ml-sync"] +== Sync machine learning objects API -This page has been deleted. Refer to <>. +This page has been deleted. Refer to <>. \ No newline at end of file diff --git a/docs/user/api.asciidoc b/docs/user/api.asciidoc index 8f55645e5b910..aa567487b296a 100644 --- a/docs/user/api.asciidoc +++ b/docs/user/api.asciidoc @@ -100,8 +100,7 @@ include::{kib-repo-dir}/api/actions-and-connectors.asciidoc[] include::{kib-repo-dir}/api/cases.asciidoc[] include::{kib-repo-dir}/api/dashboard-api.asciidoc[] include::{kib-repo-dir}/api/logstash-configuration-management.asciidoc[] -include::{kib-repo-dir}/api/machine-learning/ml_apis_v2_docs.asciidoc[] -include::{kib-repo-dir}/api/machine-learning/ml_apis_v2_defs.asciidoc[leveloffset=+1] +include::{kib-repo-dir}/api/machine-learning.asciidoc[] include::{kib-repo-dir}/api/osquery-manager.asciidoc[] include::{kib-repo-dir}/api/short-urls.asciidoc[] include::{kib-repo-dir}/api/task-manager/health.asciidoc[] From d20b96f8a7a14a71584476d21a639929a4b499ba Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Istv=C3=A1n=20Zolt=C3=A1n=20Szab=C3=B3?= Date: Thu, 29 Sep 2022 17:34:53 +0200 Subject: [PATCH 17/72] [DOCS] Adds log pattern analysis docs to AIOps Labs subsection (#141939) --- .../ml/images/ml-log-pattern-analysis.png | Bin 0 -> 174028 bytes docs/user/ml/index.asciidoc | 28 ++++++++++++++++-- 2 files changed, 26 insertions(+), 2 deletions(-) create mode 100644 docs/user/ml/images/ml-log-pattern-analysis.png diff --git a/docs/user/ml/images/ml-log-pattern-analysis.png b/docs/user/ml/images/ml-log-pattern-analysis.png new file mode 100644 index 0000000000000000000000000000000000000000..0cf16105a11e9df0d418c733244174b6065f53bc GIT binary patch literal 174028 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

2V!Y0|JSdt|>A&W`h^QP@ax;D@Wd z!+0(eTxtuY36buj2K)hTZ6<6B_M|_+X5L7??@F;;ZqL23^2jJhP=>u>u1mFMd6;eO z1S9QnTwafgqw10|ONA&&@_FKz1fj^S#MnA(N;$e%kvBukf_c1NkCGq_0>BxMrBXki zs3dt?%`-F)gi{+K_~UaB$(9p~A+8%E;jpfYfp1_dOVN&GrVH_XUz z7s}52ZZmjllwmTH_qz+$<9kDQar<<3Cp8jVFX*DUbt~Rua;rNk#dSz;=2*+<_k~*3 zEfoUTi6w_%(J3f8dQ+N+Rh2ftp%L(SE)$gRnHZo)&b)}c>!{AnQa~rMyd|eYl%PuZ zLZrCoW(3eF#yItw-haj&EoLVSs@?2Yy;70Ka$71kOp}XUzrf!k4yAxDD zqm#iHvN>x35MVtQs=Gftq*M&s5W%UQycnL7CR|eu_9Lj`uA`VhSvaYB*X-_;+Zo9h zNuL5D2*Ma!BA!C8ZdmpmAs*z)kCEKU&p&4*w|XO`mK&_HdA!`s{LDu$F{iPZt;Mlf ztQkl-YvEL4s8d)6km7MD2pGDw3N#23z?PUxo_z8*@c* zIK5O3Cko6C@SaiSVofQd2fgV|OQKk8TcBTEp!RL(7bBas);yW$E2Uz^=)Hznm$X*ekcZuBfOpSpH7$t!eIpZ=w1aS4H?lM&!${c-y%Pazp{Z>68l9Ho9EgJ z$RTg`TO~I1{t+p}hk{TO1`=ZDcxR#*u;3iMy}As|G!q8W{Nh__w3DOy7$1*)$C{dPTh*UHDsJO!|~Dnc>RX z+pjQaQ`RFRhhB-0nf@YD#3Y(-$WVf=~vF&8k&>J%hnw8gM{G_2T|4@O-s5z63@6 z=oC5Da|3(IcF%7MzwLdQAgh|(C%xF_QPDvmUOC!GPZV-b)^+f+Z4Z@5+%@5wn!j_^ zGZqA548$o*C9xjKV1?a?8|~l0DH3r0xf{}k`)W(l8k0Bb4)~*aub0QTpOLr~GE={X zzfCg5>Y7S3c2$N{Hu9N>43=p$6dDxJnA7v+L+QHTmAh1`S?a9Qy`sWOsQR3sKjw=^!ofk`9Lg@-T|FN zEb*&+zPJRt!)~5@-mqNR(oHUNq!}27w5MryrFarUUR*RpOQqfRFTTZ?PHO{bq|{k} z#e7)8BmSeSCZ}DKK^=l|D=JD=HL1KDb*D&4}(NPwq zFG4(n$0yHW9&c(@v|_*Rb2i#3B9&w(FZ4!gcT=DP+#c2#d#Xn%@rBHgCdS`!pbeeh zaUjFB)(3kiMNwz-iOyG4(Z*F>*M1Hs^GW{?VWpu;rHaCEPi$Wqa%E&>(z&vVri~LL z+5E<0d4j+sFD``L4yt#Row~V=w)010X|&Yc-(CaypwN_)UdX|8>Le1#MR7Un$>7Y~ zr97GOIjviZJRn(;6yW^e_$#G*E9odCem%cL8A3WE&aBsIAe4C8=M8q4vViY`5Ys6A z{!kJvpL3>2grtch0KeDK zZ9pPg&?Uxxfuc8V(X2B^(+f1jtHjv5kk$*##%Np$$6;27Q(OL8i8nM$BpNljNhEr` zxWg3-cw7)s#)N|=mnUwpClibx(`rTv((L2@K(x$-tSlgrpuX<$eSU2~L-h=UUlZzi zt^G|1Z|m-OSHt~olhF&UoV}i^|7KD4Cm%o!m|BOZ=OGqq{t_~j&+F7>`fwj1} z;;V`TjHOrT%#3V*fgH#l6%w7kR|5GZj`_HK&?uyX4CD&=nX4^a9pyPa_w(m^GmSvT zlKgNy#>n$4APCVvQ9w`7M36T2pHxO%1|KR^D3H-0Pa7G6P)w$*t;Vd(JtIX+)*=Fq02!uB|e6&i%zEyYJ$A0#Y{*UQ&wiZuoRDz4^9ir~o|(Q#9> zcVmC>GdO{cm3gd>rBYjAVhL;Gm}wp&3=*!=7oO4oo{Uam$|C^l44!6*!{}K4UO_V} zBG9U_2S8JK@0*fDO|DA7tAv71R^OW*O)QnnG}G#)pdoCPAB97|l8**6=9MF_pfj0B zPm~uI#uKskFLU=VbQp>aoL^lIoC*}A&hkm1ty+Yp7o0EG!p7pYE?uNZ3PPfuD_1jf zfl_w-i9YhC(d@TSI)Ff_+eB{^TF@8RX0B^iX?dVe$@>0SuqWu|1TF3;(=ds{C_Cyw zF-V)c1!ZUfxslHE@p@37IhN8krkV^y0%=g?21OnGjyNiwlA*zBfelN}WTB zV;sGGKz6=NhIXxeA44b_WxidVrU(~?W9wuSb4;{;qZ&YMt3S%7ZYiD_b}OY+t<9gq z>_G zbWXfD%70eBHids?^+pSqthMV=A4;IDFjKNE>Sj+RkuaXV@ir4otcPy?r2NlgT7lsr3F7N2&4C*g3T#Pa*+TJhEvjZ{+yZpr%q!xZYCjU?;@j_d!2p z9xRkV=V*>PkaLM;8mSd-_LA_=t^b?D@hVBM(DoGdCg?jrd`9Nqw#HsCrm&W+I!TZH91i+Xo0IO%SU?7~OF~ z8i%(uuSE-=WXEwgGvc5{ULOH?Wh>6DKZ!V~EM=?e+6SpthzFqhrjU^(Tw__|8(Afadu zfBizvaz3tKXQiZ{8pO35>4e>*U+K2|6n2vG_>v>3TZeQ?|9N)+U>m&LVUs|=*lz@3 z)AxOtts|YsOQhgLMvPiY$#b9siED|C9O#?$;?( z0Jxy+!Q+0K0CB^piv9XTZRuYs4cKiPsEi1%4tnlDom_)6%0{2=KF zVP_Il6%Z$}>EZOD+Ohr~{+t(Fqrs|112gF4WTvWZm8&)Sj|1^P?#%`im~!lAfZoh^ zpVxGfU|g2c>XvVjOX;he$M72F4dB{?5Q)CzUC>MkMz=^P_P3<|3xq;nuY}!-Ken0U{vUOk^R-T?|%@&8^QVXCxl~s z*>I=AFTrPPZDbr)I)(*Q>a~UT3!A2s*_bs~4F9RF|ClnO5Ok$*$or3D6@u`bmC$2< z9EAU5Vm7`5i|7hTA zfv77SVuAC~`osS`(+zM4)&HBq|4HGu>i&Ns1=}aNQ8v5Hv8W|fo8bRuF#ghm`$1?! zUmjWJ05IE16{$~Z%6#;3uu_9Z<{~{|A=*sM!{}aIfk9GhA3HaL!My&d< zmC--<45BNOHDt2Ea>X3DwpBqk^S;3;T=hJOkdYik94HwTu!MG0e@V_58bj@Ax8>)GcqySx%H^M-cjK2c*FJjwO3Jd4^H9(uuEm^MUa_g?9VM1M!s+Q z)OEV*^Sll^WsrxotW#b&STutFRyRHZl>6%&&Q;gjA8S6pq|FHMVS-ukX%ub6v54RT zoohUy?d!HpOVa9{FMIlF9nU5yA8%iHVX#Swo0rms9DmFY5Aa{tIKNWDPb~s?IiE-vTyQi6p;=+Y9IOe7q%NH+%WM-Db6f4q{^M|Z9U{X2u=92-nEK_~=OnMcE`7@8ia>P-Xg&7KdkH%((7*04d{JoCNt(@^s# z1$(KQ9&cG%W1Ff+z~>!KBrczGwnq4;LGsHKdxwvIZg~SlY>eC8Biu+Z7z&NfIMUo` z1Hs;%2oSE0*u0&vJK2v01sMoC#%fk;pxK~9U)o9{gVMeJWi2~ZAOs)~PA8y(xSAs> z&YK;-bl@m}yqoK+-JgHuaQqj$nCNQ*4S~@$sg~$l^V>tAq8}UopAGDDEvWo*8c%(V z{`aQ)?-?(hYT*3Ra+j|!9^Fy@7S4Y-Qm;~-qaBpBD(kZ)^Su+2cnlI^tgJ(c^Z`n@ zqEUF0FCP)=uFp5SYOk$hvp|V743BRVu4)ogA7AibkKPl&kFk>;g=PK;7 zGoswbK^q>`59r@TMHCuUjr==>sxIu3)Os@1vklZjCL9hQI;k21wr=GUtMzs~2%qa7P`PG!CiN=DS?+xZA`jMGU5VHQ{i}tRDsYDXANn4?~+%CU5pR7rw zu-N2*PPnjvuNcNXpz{eY^7*-|1ZWo&)E%)*fKo=F<3~XNtk}j=ujfxyPG1lnRc_R!^8AA+NP+HN!*wvj%U$91Ih{M<)_d+U+NWyEO!kjYOk&A_lIAK)CU>HGFShz~t`DZ=bH5?IZ#}p>|&C(hRyn-@8NL0+Wmx7 z%_z{G6;miFv+TSBqKK>cZ_N1=?!G#?zF_0(ZdF&g?h%Kpz$jaWiqhETGxc{2=Jl-L+h zz$jbf(~;UL!u3<2TgL4u>xukwBZw@m+St4|lC-+Dv|3|=A2Pfw5KSVX@4i|n8MzW* ztHbMXiz5t$udTU^NuF$rzzTEN6v(-#f4NyjTqG(2*ZE# zODli2Amc%{`(gG3rZ*vw^tk=Za}!^)`x5#kfVG_EZhXbxN7MYWJq_0gDLiCtd}PHda%1dLH!3%LJNqD7;4MdK+*`U)#0tR_Sv8}oLna! z6e_i%1o2L@dPJ$>k3iW6AW~)S#+DHjgUg!d;bKixyvcky_is+R6(%DE=|?J}?x0T+ zgS$QCS&i%(?W!v+E*W@XDXhe`wobqd9$dY*@z9i|9MP!0h--usRRV<1={yc1>Y5vV z2`o}r#1`2V2q9_=CWHX*bL6k}uI;L>+HC4y$czyyb{kz6vddhHLiUFf4zdIx72+u3 zcH%*)d%!0IoZPjxx7c_Nv0jM{5P7vwqk%@b%;77wc5MZe3x2K2;M3ifa2I7f6x)7W zKxBGKG0j_gyW5pWdvE3%l^R3L1<9lkCb=E(aE7jMw%Eil}f(Dx_fK zn-1bC2&pP=^mOM+6__siQC^D8W+S7plA^Tt=-YjPhOySiS#dn>g2aSgxg0)po6uvN^lV~J(GpO<@MC{YRT zf_Lgovw5s)2cj67k{jEzcOGxBXNnvUE;PLfIMWh?P=*44D55DpS!))|bZ9)^Uen@f zb$~>o5i!hEnslOE(+Wdwtuqalv-~_Qb_jwVLm+$Tb9=C9(2s+*@i0-Pz&e@4Q+9%o zoP(v`{vb@?xi^E}Ghir= zGPtzocs-T<%5-Q3lL0?g(EVl@21vdg?St*p-5niL#loE|zb|uqcp%y4;zSdf0mi9YglRqE`B{5S0`Uu@IH(x4^ zV0}^+D(#TPic@?yjDu8GTPmGNx%IseT^R=MD5(?|bsUksxVne$me3%To zZL;a^K#3hYKF-NC%xSWr$X2yH*ZISxvW5>=e(#0S^09GDJa-io z434N=f(nH zcerjii>&Lluug*MTyEk{M{e36MJk&_CE1s7I-OETU)B?X6C){8XQ?Ry*zMre+V5i7 zrHY!*e?C1?AdQL{vaS0hi4<&iuak2F+!Fjn=BAUvW0kFVs9p+32+O%_l-oA1J*<-j zZDLpgoBK`DOF{r?pVMe?gW(jFwc5zk|A1LxA|IBva3NY}0r)4HBk8SpX#^dg z>=+lW?NAQIg%C-fI2i$*J`s@X`K}h^O2}1c`>5||()pAtiNatuyBrlc0YJQT&NB6; zmF!gYg=!;8X3H5x>LK#W@pNV_F4G*f+zL?sA1D!urbAV&6cN_z=@yA~S7b>7aV6lI z9zS0?N$d^98k5m@q#B@JVU2q@UlFA!REYKsIO)?#@OY3-rm&bUHg^sT7vgA$f2e$)8c!f*)Yfzwe&g zT<{*FBObIO9aEYx#o)apX56Oq%X=#P)GZ*$bxMcx5F z(Us|dF{Efz1*+s~-`C?ywOS%cVOfa)w%5^L1l_SXonsZ84u%czhU!2Wm=a?kk7!nO_W)w@9YC>{+&>4zHrdVFah z-u5VEdb$!gQ!fR(csm$VAOSm%_C^ywhgqUrfpVrz)LT;#s~9er<*>CwKJ9j>^UXq6E@%|mHo)3h)=EF(ob=M3-LV|li5=8Yf=l} z@+rIC4^(Z>D&=^n4QPqvb){l*To zGYYALGoN1)d5IT%+l~A{e`)VM>66|=T_%q)UU{&05^$|L4+Yo9OLOaSB&O@x!V=^% z>6)?J8t8A9<)h6TOE-HN@AJ_5qVwL&A2MURnJX|%~X?j4Vxx9^`E zX^xg7-8=!kHvtw|(rH)_VezwD&;2*aq*4@*0G{fxWcEM`#Zu|z`jgCTVOZ=E+x^z- zBCVemk{v&OFGbtWbF27!d@99^u1?Yx08pB;6tik`Q@W{ge|< z$2=sW{;Ad`MrszhLRqkG8QMmS@#LGR{NA|=SePqu;FQm{RoJiYXu~@to4k-daWZuK z@JIYWIHXhx!*FTp%b$7CW;t>x&ljdsco~8pV@EgKI+E+p!0NP}M?=b9Th+LwkigB} zPFI>FK4G~#Cn}%VVL$1V47TT`8mEa^_NEvf0u(9ZYFa zt4r-YbI*$d{Us|SlepZ9FMnE$O%Rz>I6s`q5CAlw1c2NjE`xx z2R6wQU^P zth#?HEhoX57Kxyai!a7$U#mZx7*quMa{e8EHiX)cz4Cc~v zkD^+s!*#csFVC3|=}cH>F&mOZ%GmiU*1W2h?#>7edVm@SQ!g0TJ2xKe9WNue?r#s2 z%;~KW@%XL9aZL|95tXaCS#x#rBpa{{ zv5c=e@wfAR!M}ZP)%tiIXW7#wk#2QZ%y3SWoqnJSreBLoT_$dlyGLU3Fg+sguoLFvF$9V6ZDIq9+@o$gNe=aXA6 zrI;X`L#bK2GtUSFf*31J6wg}Z^@Zw#TujSig_fY&G5&sNWGPQq)4AHL+H2ogLo-?n z*l=|ywHoL5PR9!o@E%QCAUdlKg*II>KEx3Gc?Ts&nm9Zz2i1}`5VUb2C4?M>=0g?` z5L3w(g0*$~Da>JN;!>f4!741lqXi@ zI-W*T%C9|8%I2cpZ~)*ODn1t6Wbw1OYOOqFfhl#%gs_+`PTHeLOKGD&3r}*$HDX&C zI1Z8NAM1$hklCxQinz~A2FMA3(sLtSE1H12l!_>4+}LJWveKLF%+@Q0ZW$H}mF3?w zswY)7X`X6r26hx$!sip0CO|o`X7lB3GdUh6ak)|#^svZ`#&Fb9ya7BaEw@^|Rhobp z+@_CZYBkzxHnC_Jr9jB*Gr^m~Ipmk5ipRsUUs-g4(YgEq96ZfEYG}@W5ULS;;o``- z{C@t8#P=tbcPWlN{LMA?JMkY+I$o2TOPl#$SY0U$C=9Q8yjR0WbFtr7Pxsro?bN!* zC)%SZSmb7|ksuE~kTz{kg&{TVJVyta4H!6D`qnR{_Zw_=$4XG{y6I!y5~~!YNMO1ut*<;#hC8VFZM^5lL37=*I0FNuGivFr%tq@FA@C$ z+{cNX()yLznzlDXLz=(whvk4>Ss)ejw&HUzN~KN|qhu{<9YraV!kI4Up2VA*+V+?8 zsZm8*N=zF46B1WTqur|VgFDC69r!e)9)v~YgULJ%--#lWX_lexH4NeUDo}7L)rTyw z`sQeNw0tzir~eeC%j&?Z!E27Yoii}bcwF~u{JN<-Q5;i=>#Qtr~O;nt{G^G+R2W*BAw(VmF}9NonI`S+(e z6%iW@3j1JX2o^d0&gaqu{A?rx_o!lUu*8C*9R`DlWkBTAv%;FK`@CFj+`mo7WVIEk!SW=2>)?SF@ZMFQ)xgGrIe?}1r~9}foj`T(weCj> zZE$nz$Pb`E=o;2ry*0i77SUiE2KmThlN2IVwWU%l24C8C$rw%}_r{p_Ah-Jzrdr5B zZ;^uDB7xFz{^~7-1yZlWMNemLQn$-TMU&KYmTEW#Wi6{VCvL5yZTM9sy;e^OZSx3$ zM!AK!=ap1;Z+(|lH#d0;3J#fig2QG-gbT@|$6Jw!i>X$=|EK?!alb)eaFL{Ey11iU z&RQZJS`Xez4-o`iT&M3{l3868(_UD5ytdaPCuR*&=bD*1&DD%&fEBkO<6qhgs#NkZm~qd0{_Pj_oPX>iGLTIW`K zK&x`V@b|oh&xvdn6Ees7=JI&yRn1b@hYOGMm-mOd&6Y`;erk!zSKU<=nYH;p_^r!T zN7OOz@hMu?)O3lHi;D$L@va_c7`NF&SQYsY2(MCGm^e_?HO@!}lygr4HrC(<*jCVz zov;sEe4WwvzYIj|)>7+PdHsSRDMrDl84V8RPonpJ!xx(G?|`~@;pF7himmb;O|40& zC|9epp^KC)>1%>^lo|sua`h~q&H9*+U^F=0{ml=(SB3TTx;lZmrA~`hz@)c!~`6Sm?4EMMVw7=Kpm1e4TP(-)53%= zKAivQBoKZMH&j=vP>avvse~t>{M=-JZY%7dsab$QtNEd#a;N)kb!#s{Y;d_$x9C?R zl2W=MOQ0LU*;%+570xo4rqdWm6;%@mVkt+~l~k2PQ^z6TZB!YkDrUWyZlu`?F<+z+ zcW=3&{z=%v?&p8SHVBDtC$^yRfM@(X0tHU_Fp{v7`@jQP)ue?VQLV>2+Pn#s8-?=) zTb)^E!v~TRzmiU?yz(v>Y6!=cjg7ww$hdsa{;WT^EtKI9g#m*=68-CBpk$%hJ9Mc% z6Ugb)n0C`B)0K`v2*R`sRJgREr>(CuR7K%;KeCEBpkMx6rh@Kch?t5e)f*H}FX0M- z{LaN`dlIo~N;c2kU=fijHHod#4hy`Tf-(-7C~eTi!ye+qN#w`#RSDG=ipsNPI_n}N z`6HrQ#iyW~r&UtCj7ge0yA< zlj&abH&uRDnIr9gsnqJKqD17WThwXOBajeJOd z5!2Q%-~50sS_3DMJ(zP#}u0P9i?ycpbmYeQOlYETW)B3 zFuH(&mnU%IrCYdfr$I@pX5-NU!5sD&RJgfli_yRn<=zd;C}vsGNmg^!1NEU!T{)t= zQAR0lUKZ8gukWwnV-n-fX!fd8fS=R4=zFu{QBcxoevR`8BL z>2K;V6aNLIxcuG`NINANr||uOzh-p(o|2AbGd%)h_fGL16n6}nVSVbrGAdcmNsKp| zKCZYk(>lGwd~ZUBn70N1HE~oYj4J*SHXlo4Si|F=j0V!uhd)#Ay^z-8Xm!{%tkNfP0mz}i*@p!FR_BXkoS~~m8#Gwlq zsZ?g;KeU>0i9|QFi`K+X&%&aUr!CyH6T6>Av{(pvbtT`tU&bfQOnBd^szo(zg>x@d z)a5ioG9KJfGeBrs_>ek8=4Q~Vg4>;k>cfC5o33Y~QZj)-)I$nOVP~5+^UJ7GVo<;T z^*)g6O;Ps@)zLZyPNNJEkA-o?(-avOXwS;1@2UnY^20JZ$)?b!o`==CwYguXL`ly6 zv{!JC)i8@zX`d9;f*Hko4dpcv(9oCIP}hk-GifvO-pc5%R+I`tnM49by!P?uSGv3@ zDad+j2DiVzWNqE?h}jGH6x=xWO)su#!KzbgNoE$78j1eRp+KL)*z{m?1GWLgo2<{` zhh_}l%v!^^D3$tJr+%NhmMtG;u%4RUk0sFEbwh;yKnGZg;_Orl>Gb4$CU z4=Nv&k%VC|vm8Ld;zJ1eJkyHWxz|sVE03&tuh%FekZizY7^j+GNB~iwUZuP!;_sKi z+ML5_Px#p9av5y2-udd}v2&m#&+W&f-+A+L72vJ|5j@`6(KayJ4WZp`nl2uNtY*G9 zw)pq2(O#6*-!aU+{s&=T-;)wk)e@F`gu&WUtIS^G8I5o8N~zY9sDI$35~y_0F7^VYj-r8 z^Gg%bJW(|a>`Ko_5~Eo;HL%|kNlRJ+z*UHoUdcRN+{azc=ft1NbxfbYSa5~1#Cq1{ za6dD)x~NjfCU@kq4a9I<$)YGBTkj5<8hLtNsPa_(h!4v3l}OPcABa}Wh$&dz>FQ8x z)tPFIhg0}sR2S%%T+^%Flign@u6|6Vg3(z)yHdERcbQ$1CUaSZyb9}56yPf_j1+c~ zJ`a6^CsscDoDVDZ#I=ld?Dk#IqfIiX`AHO-k&i@q3}6jJJ5Gr5R@4D^a@2qHl)&G(yQme_svO7&mP=b{z!m8lghXp+D-;R_!r3`Fx1{8B`BwUsgj zC&%#os3NTh376%CffELrw|K2j00w=WfowX^#4Lz}hbXS*yOo3X z2(})xFv4`I%qU@1na!eY-sf%8=Ey)=-SVz3kM}SPS6&;fqWVHUxsUOe^4y!4K@0`2 z=<1xsGRFbx6G;*+)mi&&xdbn8gm;5TE}dTP3_R!M=rK%70C1@um#nA6_MK6JdP>&Vh})Rbt<3*i%NZ|^Aio>Zx8=sZNV#4x#y@MrQOh8tDg@6d7z;>S0V)>)8yiuY&7KMPqP(= ziJ93$VNxDS2F&q$8qH50v+Y1|N-dU6g=}6V7*0w&v>Z|fx$tzQRfqB)zS`hNKindH z0M}M*fMMXrkUBfE&T5Wf5Pq#qtpw2C!~l651EZ&HV9+T#e7maY}|J)_yiA$>;X zJSag}iInv9P7nho*(^TFC678mt3j~Cn7yNahm!>x`?**Z;-)DALMUN zh$1NRBt;u)Fu~ueI>(nMlS7Zd*U2m%#$Bw4q&7-?Rd+cSa+a<1cDLtvr{V}%D>Sjh z6mrRGw;zv3*U)!fign~uFiuVE=k&52^&m6fqy(|`31E92t0jhKEFqM7_U<5 z8k{UgSVpavBJhR!JGTXFL5S!QRVmYoBEzQ#8aiqym;CD0+7(a_VjevZkEV))!I3Fk zMbzmeopFFDM_ZFvuHK<1iY&XXWHM7NBS|IdD4;nXJr7&Qxs;DN)qbj;z-&B0x}9!8 zU1EbUGG>Gy)q=wJ&CBU6#}_M1$>`G`MTZZHizB zQTj~mHlzX(48nkOh!*}cSZmY~i|fY?2ZBdhXXd`mU~` zPZ2P|8}}~?(-$G&{+;qR(yFsv{^ID}k<2&`#H=qa^^L99XE;uqWPPLa3|JjD6wChf zz1rTNd2c;kpTH7vIfSvoW48q9&*_)j$>k~bci2~H;1d^aLb9!pCU0R{-JJ;oN$#>x z4ay0`z8{sSBs6<(zqYR%@vjh|7UGIhS6Jg63d=Ktm@9ek9V-Bow$xf(Hr6|yPEko% zZ-?2oyTT|(OP5d(OMUI!jSp4(gH(%D=e^f_BCgF#AVmaP%bJj4Wcl%1g+fp^+R?9@ zhmJy%5rFlaY;1V^3cGQoV4f`wQ#R!wfOm^{=Nt+@jb zoIja++}5q*5T&Rguvru`LxEY654EYcw_>|tPz4~f*7}a4O4yzmizlcA@;WU|(DnEs z`~BgZ?>4SZNLBRmgOaeC%HaKrlank+J=jy`{fOIA^c-&H*N%Pt%H}9CjoOQ4y(Mk@ zPm3a(tNA(`bK2y^RU_+!+B|+tTpUEnVJM^MEj(#d&Io#!lO>a?hxFxa0^(#KN$XHaxB&#w;x6V>dEzi# z#bM(4zCEFBQTi9jpBNz~!akL2tfLA&#@X39HGYyj)}{<0l(<-|Glo?}fU3d%o{5sP zF-3N6jW|~lH&dqkRqJ%tU(TUKSaFvx(W^MB>yi4 z;T%*3r+ongRAi(JKN`!9OuBk7j(+Wfu%sM#s}(@!RBM$O0x2AU;<_o;pH-;CZ{RSJ z9yO?A%T=owDt%&q)1u%ztvpCO>Ayzq-u6I0!}|Ba7EGC9$RIT$E-zDWr6r+NbD`KY zI3;WMHZ>*cs^ep7koWFFuk;vzCxDa_9&`waqwSH>+b5b8Z(u8v5e5#xONKSpx>56V z*A^?XsNX!knh4}3kz3-e#Tp3*Dut%d>*cX?CeL%bNw~`At00Y17a{aWHUJYwSbRZq zxZf|lfiT4)@7F2x+ib2&L6$31$STB`u?1e2H|G~`p48}5u@@{5d`Oe}ax+5_Ypz55 zUseaF>=o{!EoO`AfWH(d5g&An?bj6tOI!|XSg2+6!JPI%pl*k;hw-aVht@Y~VA9-c zr9}j4CPTF%Y|X+7E>EsW$LLLM)valM*!ja-JkH%v4mD^ZZxWB)aP82tddf2GrhEbJ z-{U4yhLZjI^yoPwWN~yps~x(=Z`Fx1Slr*a3Yev z1yCaE;JHJMWCLIX&7}Lu;MaWH(UkWJwQ!R#E;7IZz+-X6CWCfb%bNXZTK2{>G}1Wj zQ---Di24KdTBi*4&#!`*;!wN>rbj=bataB0F+VJ#QOjyK*)aOzoWdGF13(IK!15Ph zYBhb0X6_)&M`W+6a;Qs(^CeI8*J44FFQX^bRNrx6?S#RAQ2SOy+>#-L6}eGKhoo0@ zhS{L>Vz~*%!bJhGM-wpwAdLKy0*N@I6Qr)Mn8-w;_n)Or)rUnvlCmv7hCUFQ)l(MT zl3LoV4}?;i@6-k&`G{aO|c++@jY*>gm+XY*7>qp9CgNGd0K~u z)uUg>=wAvWY`uTpDkaWJnb3zz=G}!OO!Xz{0<;?m#4NK0+##APrEU%<=8yD5252t7 zfLmJK9Jj+PR!u&AwoE$+YEJBtz9i*;sbTpWjb?z~0Ba4_yh9|s!k)!cCkOBrd4ME) zq$Wc)b!<92y4J4`rA0BO+mxXA1xV=lR(=Ua>rc(P2=Dz2PzIPtv1A}v$oG_%+RpvH zBa4_ll*0v!>RoO^oa0IevN|XT*E&+1Nw+6s(IQT#7=zM&H1#tN1gPYR^cp)1N#Is|ARzhv zqe7#C{#Z7VvPu5ht6wJ&EEqx>qQ$qxT!|8a+>fsaF;CH7)BXFCgX|zOuty_@yARd( zR~^+(q)eqK?$E(1o!PP6MpOWmZ97{r8(>uH5W<)_L!?q6w872i$n{1*_K4R-KVF-U z@@ya>94F$i@G&@bqw=xnI%z6FvyezcXA`#u3hwNUFDp+4T|?PvA8{G!0eZk95pWNc zk=1m)xQd95KK%X38)S&$wRv>Byc4x1bB??#LHcm&JA|@y{tr-*)bZT78H|?JWN#KM zBpd?jyw17)>Q39$3shtwoeF@%RaLq?VUi{Y-hx$bcT-|mT}%gpE81F#8%uqEMjbpA z;z`rhk_8BO-+A5yvPK6()X@CDVAE@gOpEcw#cciR|E3_BQJZPg>%>^X@PeWZp(#1Tzh6KNOAPF*sFFqQ0% z_zV?vKlpWv(El6c)^C1TxP^%1uVK%RmbfLbBNAiVPoc)xBPU?=62*6)jv^80Ir8g0 zhJ^Y0%f8GNOOz)VS+poSlgV<>F>y@G!NT%w8R>*nmvVUFsC*=!qt%Zv?E32wS&`gX z9modw;6WAIOjYbU`-#npBkLH)<1S4Wc4D+bH6+GO^xppnHj3L|1`&O z%KWq!CJ!VmmOT0P7rRRms;r*WnK@$z7fCB73aKP*e5~X#1afOo4E)QdjW@503r&V5 zL;_nh2m2MRV!p80oR%v24#V5E!9JA*nCG`UK`LHis%A0#;GEX4#A48{OnBw*$zP)nwRZ?$Nvi%Xe3!UFjQt2$;)kXpUXPsrv$e9-@?lo(ld0X zZ!(4h$}83fqM$(0%EazCsB7$q&5yFf*fI$7Kfld0R^ckAQ-tg^QE4@p&S6kkOlFhy z&;9cBA1+3X7~0P<53g%eRj_p=l+4!8Ha zPdEX6Z+WTg7u0Vi%F_X#t+uU}s3EdNjKOBo4aT^o(x~>M44QH6DAiOrNZ1gm$@<9+ zviIopvE@0j(C?l>d#9b$DU8a07vjw}G(fUV6mHUgWmjLy#1-ci8ZUR`tN4y)BI~05 zBmpjz7|kH>aFZc-&A-+d%3ei4G#C!j7=wj5_HD3Q*Rr5?Sc* z1bb(i$VITr%)w=_K>jcvR}>6jzlcbvOvFaFY!e- zW{TxMjhJldM;S#_)bUKL@cQJ;JO$#r-0dj9Cc1!ey$J0t$4!w@T7($>%LNP^?!IJ_&4E?{kv-it7+YRU8Xy08q=94fZ~|hBJ2sS%FtB*$BGg4IA)0$gE1BfesZ&$hrT++)nX*xx#v&+kp z(NZQyBy1&4{LMz{QmQVD2a|1dL+;OX{8Y93RdQP#QM7&g&{%qs!H7CXgK3^w^4{P| zc%g);htVYj2ky9EYr`lalc#~m_xmgk1rk#g62d5?5ibk)dkYCF3?n7xNTTe(KJ2(p z_;9$B!8WSnn!0MrY1UvgxtrR~!Dheat1q>8(&38LuB5D;G@3t3!hI4tsxVA~Idc7m zOjT6;3nrm0M(sX?p#8f6&!k}a{Uw7o%vl;TzYEnsaHK}TrhrDN;Z|GU_oJKQHzOFt z(&Xp+Q;xu%uXO(avPU+JDvOOVL>^$<`3==7Xs0%Yiagfq^}I#A1Bal_{G}URTo1?ChOqbA;&i+xw5)FToQj<9PDPr(OmXOFwVg z>s0!WlBUiX_1bjgeb&A2352ubcLi%2wW~nMu4fDR#)#kO%skrVGCwb_tffy6&6Y?P zi}7FYji>q(A+j3qdLN}}nLd316B8l5EO^-t-Hjh5rt-x$g+c%*{CKp1$c&+x(jbaJ z$=EkJBAz3d`fr?8OJif0!9Bl#dN8zm-=Z<+4K!-J=vmSoYXIKy2>iJIXC#x=E&dN0 zeOtX)&Vo;twc7euyal+g)hQZheX!!;qit4pzs;#!vmrPvPKbbn8BOm`cPW`lTYs)6 zIqS9}_(*FJ@!mW+SzLVIE;ANioi33@4I$;mjAY1Afq-Y#Qmhzl(A2r%Jr6B2iPot1wqh*2(O%l*@#DbQ}6Z3R9@@SJT zXR<9rkTh^rnMO>a5njNI<`oehRrnCN%nVDRAgH1f+G=PVyx`i1IvuoLiZ_i##0-L2 zpB^@67~Mp7a8o9>knlnz43?_4e3^*0_nepsy&u*X86Y&GMu9`1(=E*%OS?>-4wsHU z|3I2@$!6Dxp2M)ze~vFYRy&VHsg~x(WBt&EO$cW>uNL?xK+1R7qTe$tllu&xQ{y=s zWw(cco?ea#D-Pw9dpV>I;;$gyyd}%bqQ~9HfW^yc)BYHDP^%$8UQ$FMK@5Cg{<`CE z{Z)9-U14eKeY(vxknq`;snZ(-L$7D|?92O>)5MRx?wR*S()7t7SlQj!hE}}hJs-uG z9%nLAY9RszkBo)ZDS`O&Q2GnSWqVV#K95E21O-GLxj@JY)q~>c*NbiN%O$S1jN`Xg!Z%n|EytWG0n6GP)?Py+IS2!06L$?NXv5X@)iMFNr4c!nGAS!QmL& z`D>Bc@NrtkJ4jNGy> zzSQ5kTKku#Q&=JLXK)!ylXXTY=vDT&z~J|Ds!Q!#5nR(3gZ-=tf`Izc#7u<5sfCmc zaplQ01iQTy@URIj-ZJ~kC6eoR9bS){mOHmvexlUv7P+-;C!$dv3K@)4nh`os$nYrt z?m#M_`%4W5dD_sQqo;aXEPWRz7bYS$?^pZN{cJjE?1_9jD;={hN19!;+!llU8)Xj? zIr>4{Yf!NIUcz{bB*&|;qEGg&_=#J#qTPy3P+N<(`t(-;;U4S63;wSq>@cxAdKNJ> z&wJ^SZx`fRt}D)y@j*vye1d4b)$45IL?=y9sL+IT!;2^H_U9o~_1G5Bsh(lDDRVXN zp?ji4yH{8lB+c%vGB(=fsx;q}$RB~|ddb8$!_2W9!5sQD!O3#`YLd@pi^!2t#vU2U zuSTHAV=5&g-zTdoYIO%VE`JWf@^>p0-|8pMQZ%XNE-t8~YEj^|&OLyGmU1 za}3>Yszmb$3V|9+jXv}=jDtkkM1cY^ZO?R1H!~`js>(n0fr1kTzZjMk8Ugd^E$I_` zINkZTu9=Gi!STV-oiq9gTo-IHbY!3|)#g&8={Ud}>1uwMAWo~^7ByStl~mHBq0*^3 z`Y^71*=+yyJlk&d*Ab}i!m!=~wn(eqEzc>-=e$mE@Y1KZ4MeDp0&7JcrwZDTHpUA` zRQ0awus2AybRIoy+uNzSzzRQvH&YtYL3mGHs`g0KoLtKl)+2C=*F0@&(38`@qPu@6 zM6p?U%xu@VB2|?0?w)HJ#T%}eM)HW{M)4U;2$b5|Ky~{8Y7g+!5w%~D$HLl*5GRD=#j2DFb%0-!V$=>4Ii@rG+eaus*4%E)5O8M4gOH}cZq>_YH znWA7cl}Tx3$>!V&pBFAqcmknC4O=lA!4We*%99wEIwdN|lbtVV#p=>1QUR-ay@iBZ zl~j<-K6c6#c<%;ZPi!wIdQlQE6QN*WM%|mn$Wso+O3~;(-7VYumZm-bj1o;}xBfMv zFx~GJMbJL#AUn_&$F8G3j4K=SsbU1|7NCpn zfsbhZ51xV-)?GMA$`2$({D^u{_$OmWlF9v^YcX_<9NMSFm}fgCU0#0dB6$HCwHP1` zfnD%gd_^$2Q`tfkUgPtY5)pcZdIF%(3uQf=vc%9&9%=`u;P3bWC#Vg z-F=<4PQUK$o`#|0?MXcT9ZyF4?M<~}Z?nnF+AWoTQ_J>wzyyu>+pjA`8aQ^oL=OYGTIsCM?_SUQ^rSbpcV2knp4TLgLC=YPHPf6gzyLtx18 zc?V_3y&16+dQD~9K%j`(X!N_+=cFk}{>%4n41)-btF%9XTcrH*I2j>K9MOpVsZxa^ zFci)j_zxA#xm{A8v+q{wZW**+8A4eX{{BZBw-ktFs;Y68&ka@vm@rEQFH26f82T;b z9y#3RH0wEm=1EHtcc;EnP?Eg4tu8s8(BE&*T9T@|6x)9+d!1oDQwn!*<&gfjn^}`2 zCjTsQ(ZL?`k>~N!+KEYQt7MKMgE|ae03|waIZo?x;>)XXAYG1HRtv-kICsvNP!VzJ}sc?5gCJ z`VP5pi@X<~bQDaXqH)|t%D?y0zrP3nG^YC)%(Wl5bDIYHuYdiI^KLv?Me55Cr9HNU ze}8=c=OO-|pIqX8BH=1&nqmLrrT^b&|6gDI|1dU)X<)@9+wQ9c&N{LV?IgeGC;l!C zP2g#YEtHBUrTKNSz;D0O4#e3Cy-&Q9GsD#Fh21oh_EfkGuu|Jla32*#M99cL(~I=> z7JyEt{=;DY=Ls=4np84v(ZfSw(g$B6Fv0~oK2>q68Z{U&1P!TnvOk0brMHi32q)OY z&^~;r@`EY7lb4%gY|2_P2&dSLuXmo*qS5;tTBwk^RQ9xqs^r8;Ee5aX@BfxS;!WFh zuBwJb`d=oq|1&+rlKD-(k&zaVlauR;^b(f3+xa~_7t1vIP*x+DOrMHURm=Qpd>c{e zoi7kW%dqq4Hv%-X{p;%*PUZ?F0~8iKPzq>a|e4=P>ju zLF;bEy4Hau_xak1hmTLHL@Ps4H)bm`Tz1V#;W^jnftI6*d|lX7VE`>ibm|}IP_%%s z$pLE?FoYESKfL7GpCO7L?cm%|(Bds)_c-#%KYvz!nJLU6M5>OZ;1i3Rrr;3$lJEhu zMx5;bZnHmC@`t?+lCN(Wn!rcFqcMGAG5$)Xn{lEWa)Pw<}h90LG^gpy$s+;#8gBatur}94=#Q#s9CB9>~$g=Dw5O2v$DwMm@6u@+&C|n_}k$WHQD=7CA-kt=?bhldH8gDFIWtK!xph%gIKdG-N z=Z9fQ6e~+RJrk72O(&rf(v)A+eSBLGNG47@eE^KkQ{QBL^tp$TNjZ-P-a_2Dv zEpBOk*HehxA3GdN3a-RelW5n_@s_dGhfK5HOn$%iHH~oxw~?lJRDGT?rqas!YlKpQR;7p4z{OwQmFKa*@^m&^ndrffV+?aL1#C+q_xykNx$kn&h^>;C-u~RvdrT6(8L)~ zOgd={7s7;|5CfmqYP#hPp-(a@!AKNF`g%{Epc!C2GKQ;bY&!oP_fOlZt6M-)iV}UlM03-x@s$ zPr$9CWz!aB&($4H&vyhst;Y@zjY_C_W{Mj^E;r4)GhS+BB7r3ObT-)tj5%cAd%HNF z^%z3IGLVk1bjcdG#YuNp=mq?cCQ5EUdgn^p z)y(UFK^B>LS2!e3{v@esYFcQsTBj3!l)n3Sx58=n$a(k&MMLG=tG(9yBv#ptDz{$D z`hS{mKM+tty5rd>fh6m8-4*Pt5sTCz+%g_KnR(ysH!q!Gk1Q1(K+7qGuto)jLM9ys z%}RRiNmcrn2Ix}8R4-f8)lKxMfcE5&(E64^Mm&Q)x=+F3zaNI#0PCy@0ik@%&>t>v z-bqm;gApm4cv=1Jte4`^<&2cSM>ch?72H_C8Lciey=6vMIDCDpTXmFjm9|63@1nfa z_4n`L^FUF|baX|4;oWKbx!Gv5-q!g!laY~;2k%4QeNt(%C?}MX@y>o?a+;$oyq&O& zTZL|2`^~}A5BGe8JhQQf8fSL{0|Tv>KDfh$JBqSl3LK<$OgM8P}`EJuNy{18?0v9fd-j?Z#2FysPVfw#^n{Zd@0y41fw~Duk4y zbt0`{VN!bSDxq`AlF`^f=ux(B!bHD;!M9ua^nSAa@m#v8gl^ccC#Nju{K@>|(3QXn z)xXRhQu-i1b!vZ3@KsEATp&3In^O{TEI6U_mne03l|oE4*`{@Lb+u;)*H@PxN6HXE)_PGD7&v05K=ccd-$T+k1MjpNlo z`U$33<>{hSLN2HjBU=`rm~&iRn%$kft7>d9=k+a%%J{5T9Q8i7tD_w=3#?Lh zhA_L}-qrz4>TeT58i{QH3y_pB5ILeyZc{^O|EZ)ESi}8?#g;1mr-NCp68tJE^eNEi zvRy|V7T{YQN2AdXC_S9(xJ_7pZvj+cUgl-ft=$*=JsGt}k}_6gfmUor%( zh91}FD^>Ckiyh$Q6qlNOlvqn^;TIS%1L|&u)J7n;f{;w84Vsg_+q~Dq1zt>}7YX+b z{=Pm++#lC*`7M5X_%@F&dE_CH;hJQq)NV<_-`aFTEKH=hH&?~0tmZ8erBIWFIQ54! zY;$?9inmbctzF%S44X+$iSgNYc#~|1qUy@j>cva1OsOfNPn{V5C13Xi;7`##UhSp) zaxS+<%0VO`77(a=rzShu8OqTZovq+3bjW-8d(iqzIbRc1>uOs@tIM(CZUN_EnA+-Z zY4(*%DdXlQYQ57fQN4UP=)$!gR`=go03T@61at2Eey5XVtO5job?n;ERIzmBf!l9D z0U_}pyQhecyh-6%$l1WQv#m4v~VX7HxpB^}PVdn2}}&)d8Y0SS3C z`C%dusvQMI*>v*m>|JB7{BAP4jk-1I;BsViyfE$;Rqw!{+=I4f5uZj^Of{Sf?8n3T zw$QPMJzj3txBQL$)Ba&L2zxjO!22T=ta;J9D`QRxokDJ+5{tynoEw!l~yI(1aeTk!Y*?dx~v~Sg} zJcsj!s_V$0AjG-IG(7)T=jn5hdpwqv0-1#m2R?g-O7ONY-{YC+rn;#Mf;!UWI!&xZ577Trf4-Ad@-EgF0>P2Glp&f)Ey7m!YG|2sN zfb!`ES+MG_tuaJQTxg%#Z^n2rP&t+-C4ZCPg&H~iRh49aQ(zMy@rMq5wAmp0iVPw0I~Oh z^2(6}(EC5>UUX&?{Z}DJ!G|tz8w1{!J+o0j2QMTtz|fK)busAZUQ5{3!XBKl8{FC*49?s?fvC7Ph-Y@g8#I##Qvtj z-BemPS4vc;!5cUvoYI&0vub}eMQ>{L9-&FYPq_StQ)h80A=sp4xfMh#<+9Asjck04CS%&h1>k1?0%?M9?Y`6GBAStK}0;eo9* zXtJSGFBkn{sRA-KXyGL2DuPC@zNP(7i$5b=eBb)K!uh;Lukc)@R$+Z$P?~J=LU1@= zJDDMlt0r`EXy4yB>RA-)ZUTrn+cnjo6`}7=rg$8-)3+C$!iL@C?gc#a_3kDWv={h7 zz5@7s%5No3X6>))R29c81jNFY+R26(BH`^qfNW0U8nJzn)i zE_!(*m`UBry1(Vy9%KEYUwb!rf6$3-Vky2@>h||D?qZ6wUFX6Q_hs|>X|)&N*})y$!yq6cWA0=N<2ra1JBdG9 z9$0dh9&PPU-+5E({0e%+x^vqk6+`6Pm!W7Ok^T%Kb&KmE{y@T%P_)`bWbFR1Adt|{ zs9_A$34?J%E>|tjjlKM4YK2QgA=c$_8j@bK>wNaFD_?RV2tqm_Sp7RiMOa;*Vj^hc zfTz5gDx(CJBAJ$d7mae~vtv`tDI&A*>DsQE)ogtkQr<$lbL!h?!hG2N_-R@VXas%o z&=~yb=L>Q_qX87TT$G4Fe2j~ymT~~p;B(aow_58G<00dHWwUU|R?Lx8{jz?&H<>Ew zNtcTtFdTx5PJCjb9OMA+R@*=1Ok``6OeEJ_=MiF*=3uN0m?E_8q^mR7xopxsbSz## z&ZS~RTm*PrnG)22Bz`#i__m`-w0Tr-eG)PAiS|LNeyCy~Noa|SuR^5*X1nqM0)50H z{p{pr&1jY>WfwUlIWg0DENZmL*g>4#%&0YYQQomdO?VumL^8w&Gj-A2T9jxFy`(cZ zTAv2TF35#&$rYQ}-DbG7t-v+QfD@WDBu;XQ82D=-0wV#DR&_|7x`&`BPS z|89JoZL$!&reW@T*9vJd?KEsi$z&KLw`-qT6}jWZ`sZUyCaWglGRn2npDQ2>u_5Y1YrwXBK$FlA;R| z74xagjb?YiBvbX;@%IotIU2N~J2wWdkcQ6IHxDEYfv+U}1p8?;=w-lSDRW}(y%@?S zck@fWN&A0zPRBnm!S*E%)mPTVniXQxKPlDVn6?JU7Rymi(g*PnzlRtBWK~vp?u)ID z3bhToP0-E}STvTZbxWl8h$0~uCq&2uCeDb2(BerJK~-v=#a9K)$>+O>n50`#dB`X> z5g3dQnwJhuJ1hvK0lT~qb(1K#4*UgZRtTdnVWEyTZ5{6i7Nhn2^xqP6g~`n_VmlWXx(=Rtug|N5RoMdI<)D>^t&|5;=!B!Nj2mo z?b31W7_Im`&NjBmHIUixwP6=huVw6aBmp?XY?oj`0W*nCC~~!+-^@-6p?ly0Gas~> zCU!40q~(V9TpV|jIBE=inhQ%Qn?7>*a7+6#K9Ud;K~OLHnpag;_R1z7P2-JN-h;@@|jJ{?3WTq;VI*v4r{KzO7CnIP+Dd~Ta4;bp`;RHe0STW5Vpjy znd}UV1yiIr&zO8g1~ep0X{kE=-g}v9*qiBo3b&}$0T$_ew>nv={qc$r9}!wLH-`U| z@4~Cw7RhF)domE`(eXtaTB7R{6v<*v4-F(~z>Yc1{y3hu|7wp&{?cf1{JxkkY8>J< zGvvjso!^8#=CRvks6Z{;Q(f~j^(|1KVdT-suG<{uHS?!o8KE`3k+n5!LvIiPx{sSS zF7zZJJ+}=`%5X3aNXfW->*kQ^wTkjKW$m-u{sv~C7n{VDPSiI`sWiL3^glEfL&)x8 z-Eh(t@$--_cP~)<0x=J`lNhNCY2CaOBnSc8x=SJx_-RFP$tbTzc>n6ho>3XTI_5o} zpI^jCjli+=ufcJ^_B`gkZ5s#fCiEiVec6B){Qk<+-&cRg(SWQ?_~V{mnq0VKgM`)O zNdtnU&@uO_%`7lR+U{U{|$d>B0fCx$wz%p zPQ%_%X6TmV_lN(*-djb*wLEX2L4vzWaCg@b+zG+m5+nqIyIUY=kik8;yE{RGJA~lw z?hbd8b54@;JGoEy;lBJ?vu15(&+NUsySlsTtFNj~N_?z>WoVbyXP?R_FHan~q({rH zm3o;goGp@uNtI{yH8tI2475qp3nd-~w3b&(g0AjBYqZK=R`=eNq^$9ff4SXPXjAtc zMIb!#dnFpg3gg#m%JM+V031AJ~QQ%u;dn2Yq|k&d8gCjx)J4RiRm%L#*hXxEFPV(bNm!PNUJ551*+^L49iq$>FdNqU%zjD5C(WhV7{KY&w*W|$+ zp=P&W?Nfw0Bwe*Snh?49ofle4s(JDRZeQ$Mlmqo?J-?dRy1PDiU)af}+?Ay%d66Lf{as-$8it!(Fy|qRwc%QC%(yV(w2wcmYPXl` z1Bgh~R1S4qBtXWoDjf=eE=dr^X9FG~vhUt~9*f+&vzJ?vJa9rCi{VZ~uVycU-{c69 zE{?e42`t0Xz?1jss%A7Av#ZWWA!wwFU{4MZ5BC5F?hB}Xff^Ma90`FG#y1LMo2Xxx z00v{ya(4W#t@h2D@i)tAebB40=tBNUg{C{pt-6&dq2?r-TGgPZm1)&osBFk}+> z?v;{fu~MkjM~o**-dC#oTz~~iGKg3c>$-8chYp5$a}s;FrK1I;3sghB0l#36A+K%> zwMC&iFEC7#d}%sF+}nC%l(F5ACDa(t?EI16?9zH8M_}EC$JZ zxH%_Me8XF}+pK175@!FqWPw5jgW$1C#K{Po<-c^zwV;=4Q4K99rz$3bnChn)ebIc! zTiYQ?c)pf@`6%eK<^{w=aJ!c5aQUbd-h1|NCKnlNAnC&*&@CI>CKp(KOEYA~we)}27twZ2)U6ZQLQv zpZOs1eUaX1=(xVsf;L)Ic@uxpR!s;=d?*qSm^H;;u~rp#e#9?ST7FTCbGFFfV-!?o zW@p0+gQK2IWAG8dv|syxM>Lw9Hl(Y(_!V;@UiI36*-q%!Azk-IqC92B@VI$s*E1`| z;)4$v=V&{8^B40FA5Fv3ZH&+;A*su*dmW^H`t%p2NUYX0!&m!~x#8=`;nO;BBw;AE zi{J;IP8=XsHJ?F>0?xrdhfV9 zTX0fP+uMebUMWx2B6g2OjwyyVt7vMU!rx2g1#oD>?I2OE{ZdC1+My|RsGN*{8NY|D z00m~2c@cPfGSz1Zb`T6P$68B-@qO`}2HFzX4#e%uA_QAVnlg3@&YWF{?UBipXZJ6vwO#+zwRDK%|FtC->c za;pC8U67URiH;DtCOAaOlQhU(_|-vjz$Yi8uI~Hj0FHao79}h~Mt-Rq7sZ&+ZY>l{ z$InkgA#(j>ug(_mrMHo#$5nLrAUpmN>3?J!LHQOoL%t`ARzzE74Y-C6*d?g#Xjl4&A$fn zA6awa1I`i(i0%^qsnK2yfY00-+hpGVk4;*E1w87PB>K?*?OmXoXCEm>4U#APe{2$= z9B{S^8TGm3ANzyxag`BExFGpclMbC8X?Pw1--Z6zAC9P><(C;p8Jwgi4+oK%2gL$Q(SZW4Yy>}#fuTn@OA{5FL!-9f9It>@yb+#J@42e-s zv6wVyqiNNm*9WwEf%NQ|V>_18cThu8c6N3la|zE6o&&WjQnc&sdMxT*P>Uc0eu`F_7Vc9dB z_Q8NYF$#Obvqo?+5(C6z3%Y=7_v|92vU2SCoQr&|F97w>SGn!mTvgBCj~^OROE7Ca&VE@~f8 z&2lX(R;w?G$Cl!Kbz!-vUsk9*3D6lgz0>wPhI93Zqjh~+$76B=??*_<$whTt_Ykj6$0F)?)5U_L zu0@?1wapXmZ75g&&aN#-T_uN)kNeZsO< zE!NJu7)s(H8%SuOUhudPaOZRB$3D*A22u;jz{A0Ts`q%i$4%H)w4s!fl zoFuiu0SXW?V=Iu1(DY0+p4A9sv(_v95dk;q$ugM|r5p$d=81|({S>T|q{ zb2Vk9b5QpY(Qvp6f`Xe{{q0~90}yu??FZj7W?%kxfHWAJX=1JU#v*Ngf4WYVv+zO2 z{~CvDzT7_X{1%7D#@CI__2X@$TRc#0LT{akc|wS%vdVM8BA(ki2?I#neqr57_Qha8 z&vPeRv+|t4DMJ9)~sjZF*i_V zBvYksZ^p5Es$wHkucf*CIu^6sbi$@!=MSVBpbsRUJ+>YWgZ^{sV(XU=s&e3#K`_y= zK)DwGX(huIfy7E<$%u4{P87;EvbLh_#nwalE8RfkD|iglDF4Y$BuwcKtEE64lNi8t zDFY;euH29)O5o@>zjZy-YtpOQW^)M+CxRinIp1fCHIZ*=&U}?T?G|zv3sBelfRfx% z)F%a4q9M%BY}3>o&JP4W%Z%q<74DyW77{sSxi&TVS}~EQBa`ZpFZ{Hx?_ZAmU*kvq z*aBc$(zryWBPcuH6sT!iPrUEFA|eZwP!qUY%ME>srM`5`z*PGixB-Vb0B?4 z@sPdCp2}3YbH=?efs;Q#*#l|U+4KPAW%>&So;|lXekYVQTW7mduU4Wxp+&y{A3;$9 zS7vPptefdf1F0?Yt{Ii?SydV7NJATg$ufE$Bw()_w^HrPoyS~EhCh3&Bm-B!@|IXfB7KrO&1q4C7(Vu@0Qfk!9&L5a!JDZdW%*u zPhV^e7A-H86)5L!qq%l+X>kvJqC~bt1Ii@bfQgwK075vxAR4#_UZ zXOm-g$yfu4CPyo4swJC1urvMT{A|pU6suc@F>k~!^c~dZdqn(kuGq3UAsj?L<@<}4 zx@$$-Xzp(+1$r$h#jNJn2+^5mQEr?zA*~HS3_HH6tV*7u6j9jaDO)_p4*u3zsKJ-+ zd{X4!cc`Do%VMqO!mut=Cwu#>Zr@S%M!ZF{5;@I54tu&0e(>vC{_pbmq)e4dvQ=ww zsewQ_5U``|oY0W_y$a?1>?u%Zw*_jv(Y0)v-Cq_vnF!(#%RGR-JF5di>SMhjZgzM- zKp{ps&O2)XwTl>HOSDIBu6?d!fJAeTF&#)FTk}mhw^ti@xR-A{O(wP}G6FJRo^dC9 zE7JWoNwSMU{~C^hRW0C6*W{#}p82`3QWF}I>X!4_#N--~iu`yj7CrOz7oYWM8l}wf zER#Z-J=GhbbO975LL@$jFzfp-T*_;Ook!N}6ml49;>le+nira8|dXlQ6U^m{^i_6m|DZQ8Yez>{mK@KL7OGsso^e|V>h674@Lzt-qgSZ> zK^|KMu+@bLBQazzA z%H}aCo^pxmL~ml}M74U#9~C%TSiTYAzzu!lp`UW|`vG4>>k6*Si?Y~V^gpRmKmdm~ zpe=C;t~31ptDnapXh65@F-ZC@^T$?jp-3vGk@HR?%5`h~rJIt&gWo2H(|-(1{-sHH zQvo_xLn<@vb{ZcHY;1U`WMGIJHFx&kK?#CDIMqb2Aq_?Af&@6kEo7H|eI5@17*MYL|sG-*1x=OekOsyC-SSWLJBPNg3yT3nOL;$-TY&}3SMhw&f z0=B{-FJDoR%T|m1t@`%(dujQikzogx$?`jWSNbvf-kGF}+Xo267Lm$iXRGtE2jh{? ztKC@tmW+Tv;1{4c-qt@6T>&d-k>=4p>Xj@d`d=ODhlvCP`3Osakink+V=(>eTmN5w z?8cWxwhR43Vg#4bYHjwipYeOBGHN$73Vpda9T?4#p>wu1id5``lN{XDK&yc;Oa9kv z1A#rxgV*8T#U5K5z~o((=+O6tEQj#@`rzE_FWAM=3>xa&6NRVhxG6t()*lC!k9J?8 zc;b*W&;`+u9{27UNexyU-;Dj$(d-VI8^7l|6dI*Qf#W0VMdjwcyW^%&3|JjZQiU^; zW8%-liQnGE8M;34%9KB>=cL~;!;I}Mdf_C*dFv{~?{;M(wU^kNRZst$!D3A!m`2Vx zuKvT^1Hpnhfw;*)IAI^kb5|HrDBPQMEcxmu99+Vn6tg6e3T#tsthTpxG#av33(BW^Zh?$(V6prj*huQ2qt<+|dG9ZY%2M_MSWRAgDO>s*M>9 z&ATgp76dyv3kZO@TA!&qUR%v8-;UK=8{B)YSgef;#Gz$k-`yOL;6ArVf2p=d^uj^= zQF{g0x?|=Gwbn|_DZEO}NvF|nE${NQn{9xI%0htnMwycY*erd8Q?`bqv3flREhP~E z|E90&!$+yIbTM)*P9^+}LA`Lx=6Eu6s#g&}5WgDVs5B7D*YCc8^eDsRrk%D@Q1(daQckNPG#SNTUg^Punjf^7G{&Av-kWV1c7V*wS2|Sc zimrJbt{62c9+EB#P$GnRSid)9@jHrF9qs8o^mary7`2mN-k&gQO7k5fjp*WOg~AGJ zX5TgIo#!@VbjRqH=iZPY7~KZxpglulgdUoUO5Se%l)`#P$TFRD+ebL%whBTbqBR@w zFK{I6u3R|Zx=sw$j@iWpHyUn}McdrSz%d-Zn|9eP@4r3y{8FPyEmXIWYzzFBTrHdZ zditJ?%W(15)9$LobB=1ENPv`yt|Vrp&!IcJJvP%~sxhH`(JygrV~?t+xtLA?+DBPC z#e6CT{dl6p_00AKx&? z^EkQubvtTcfJ<%{#FJiA`!r8jt>8bxYIXV zce1voO0Wv(&!hDdGB%fosJL7npgIZH^WDgl7YngoUQf1$?=b-#FR1e1uwJ{tK{ocv zWg8)0z%!x}D42l92GA-2o|}VI4aR&D&@N(x9lj zT;LKv+*WAlx?G8wWHo!-TKm0B=9HNfo4SYKj{)jcN%mnU$^gl1vL+jdV6HtMnzztf zfP8dPVT1=gJxV!QBL3ANMjhU*$p^BjTI|OYr@=Y@7vyM8nyE9@gfBU z&uAtUNs9&8YKCmJug<%foq>S9+N))0AEQyxJh5EaNl~B^Ku!&;RFThiJ>F&Rzx6^x zA&nL+Kj^owv)O2_+qsC6v|ijrqzLidw)JP4jS_o!7Cq!SO*6#`**!ltY1G>IN%~zW zR$d6yuxgFTd&8x#WSW_E?o2N~GR@P$NM6**B0+0-c9Be)TcTTeouyeQ-9k9&j~y2xjoW!blb(WFk&>C zc^>T}J*Ca%gz`%^owwn5`5qb?A%)S2aWqj)N_a}eeN5su z1a6!{bF7OlvnWxk?L=r-B<>E}?LRv|ut{=4^6^VZ<-8)uRLTjhpXriI3OAo|=-pHx ztE7@(JnLC?J#hcr8S*lowO36~F4ntmY75Z`E_d%7FrVZ#qhi1Q=rhAfzWVQ121y03aOgU^?5VOC>;J zGjM7iclq$wkRcRa4EUn=s7|{o^jgZP^R|b+g)_HKFrS+0WAcsp~! zaIR$|OEjg+Hh_NCN!bDj9mRctN2@^Aa89|E!Kb{)b1eO7SuxMbVeS=B&-bip=?ZKp zas`Ms^YfVkBD4LfCVSyk;H35xo$YWlWPMTA`s2huSsQIJTUXI5&ttqZJ{ghmxg~UIC*jn$BnsU2mFHAEo^Q;cmwBHtXCpKFy{Y=Uc75&{d%b;>xh8 z7O&-7-0A8Ben$mom&(-3f+%I5!Njw^OO8oN_IyFY17H|~L zEQOx#7*PO#7pf5AnN+ERy)p2CGiRZ1d=lubUj5oJ`0@GiYgYTF&Q-#zx!d`VE^Y-n_$iSnXz^ z0TM)NkbmJBuX?NzDCMLchXl(yNS3s*O6L8QyX%MYUi;w*e`1*NyzHE;$dfWm8BnmK zkH1%`w>)0^v7r=QYKy9jVwPPBim(+is8xEE)7dSl(Pr}9s3|-$A`Ht%E|`6`IvE{X zT;E(X9v6-5eCGHQE}y4wSW6dCy3!H(w1?N}F*yxz_~eOITN76g{j{#_KGw*(EybqAW=$0z)#1DG=xiO$FBqo5X*18q>dR}38Pw8U=l{nzc>>E# zzIY@YSV41&dJit5-4u5Ggr#r_Ubdg*h^Zhv9)Mx!@w10>K8c@ayIM?tQGX#?>l*l6rA?^`8KsN0dCrc28edO)lmzabys)Um-FP+M4y9!H zftc6!tna4nlV>2WWCxRY=zv8nsz|F^3V;YybfZqnmp8KBju>5sOs%^DM!q5yP{sH> zNt*Eeb*4EG__eo3EY>VoQv<46KpD96SDR2q~g4MAl`lhAG(snCH z=i1f5tq8`6d$nv$lB31rIc&P^(t+a|?U~bIbZ6W8w`z493dh&%m(t=Dp~Ya0lft$c zg`i*+S{V$HD&J$Y53kqld>P%Vv!UH8pt)i={&;zn8HM0|zurhG`D~`y0anL6W15Tp zJ>cpS0{31|L-RS*6?``3e4LNb7p-9C2b+=7#9&iYsMvSqpxSr!jW&8l8?wi6q`6?| zt%cy8AfL~kGKnIGbi#CVrcIo-5|0`&^>5B%ViFiW7Gc=e#24K_#a;@%`9{T!DNP?0 zGyW?>UxcewGLz}bh|~Q!JvfYhrh}##C7*-2NT6=8iS<)^fG0=~A#g1UWKAOja>igg zMYr0l_oubFyrcs!(rQt7tljpIKjA=JO1uGs01LO|eyo{O%q!9RDUk~(Zc%lea8#s_ zv0*r}Or(4~#q_jJX@8-Ci3sT#{Y3r?GO~}J`WP!eBJ|Nh1oQNt5^51TP351d?mgUv zRZ#_6quT3mz>xKbJ+nSF+cS+07o+v>R+FYTQOx_SdzKZC#=v|;bbN=ET!=|m)X|kt z@QjR3#Z{7XdTUA%SQNYZ^*q&i$7%A^=7nY+Xj!1>hG(0I81?S;k4IVd<7LT$ zNi1lEnMQdg7qc_M!onu2(bqQ30H=<~Cc4!nxVu>?h=+x zgap5sa<<2qMe}BzbSJoPR9+ri7Z}qAch-h+MsQ<(RPhagtb$o#InJxSHjCl%{p@F) zP_rMNsX(gAXdl8yU%Ek5bZ?-Ma`Vg9M!^Q}k*5Aa_b8*nuc!0HOT4m{S`TjZDHlO|{r0C#;P95GYG}$}eon`|KUvhv?GdMQ@WVJg4j^IyKb? zl4)6YUN}@Jy?59J>t+iU*9Oe;MdfT)eP!Ft@J2h;1RxdzC|m)HN==RpcUwp65^DpA zzEv6}qcXIYuWL72kp-Azm;SMNl1yJqB?hC zJ9%^Bm|v1VIJ2VK`6YdyRq7)Qf)>;|)M6QBi(Sk+p?%-Tv)U+wpmL1InrP}djvnD7mvbiwBI0lWr=KM(cE5LC@k6b7Bh=T=6 zKWT#oRT1*p(0;vXjm*>?kY5+2aeX1l>wcAZ9w6j|3W)~< zEG&LnW}pY46ms|*cI)mS?4M|=g6v(Zvbn2ER9QY zGl)6L=4pAit1O*#AYZndR?kuV?1-^TRP6`W1EIh1ycEEbF9jY3-R80DcSC+?{{7jb zhT`-TfVE%+`eBO7BHxlPS)Te%3KD0*8)=Ngf@4S}d3BKfwNgll zdyz_k(l$Q*+;st@2>{3pKYy3~rGNec!n`{GegpXt?g`SbmF72`ug4c4=@_!g@BWv0 z^N1)d1MYs%Wr#EMA1`ev+{z#f%evbhQnVGY@b?3?vVf_18Z%4f8N@WAae=$#EPwq} z_4has*P&Yl%Y#ea-}9rP;zrLpmp%OTR2HOO3%CFPTln;{eorl-LPx*O@D+fivJwe8 z{Fn#81(qdS89Y^%(c_cPUoh8b{a{FR!abp~e95z51n`+Yn_GPX*RdE{DS;*$lM z142*!7e6}F>jLfZzKz~smj+y#`vRZUmzzrPQXZH;+JWoBWyfPn7Q>&|fEFD;Y&nW% z-Y0u65EQE~73R^z)Pjc??V))|`Zxyuv>z9fA!oO9b`KJz%MB5tpnH?A?>{g(P@y~!fhpAPe22-$t*fs9lQ`x}GLf6+NwBL!PI zQrD@L0hLiFG zdjDUc0zh^Q=|;=`s~>&&o0R_b97vCJnkOG~eoFrDw{Hvs9_j$!mY?MhcMbP~0IvMZ zYsut)Z~0@Q9FPGIb@Mez?l&;^SJVHmxxf1P|3>%U!o0Y$=;o8!>~u4JJPaO89uV^B2_XzKXUrL{@q3k3is-%TYOeKh zSE}dE$&i4W-dB&KDFY*`<@>uE)^~?68Vwd16K5PMYp{!hDV{7)lh7mL@+jYzxp62OSX zJpzf<-R-&l$G0blnIbow%R4)CR8hIiw__v6_YIaDbMy!QOjsT* z!)t0^ug^HwmmJ zwbqHnv}w?1NkY4tZM7uKYS%63eD`TTCbs|P5CxalEs9@!N-5`6V#(A#z&(-^;2K1J zHY_n+u;Frfm}cix75t3fO*w|)MuY!8H}%w`B}ZlAO}oU-3Xmf_uIp>`jV8xei2pAC zB@~MaQrvGn+0+0mLR=byiIPFjEV~JA-nFI0*Vk9t8~ke352$zMZF(V12XJGG=To`2 z-hWXm(&Wf|A3IqkKin`Rm;;5O3j<{A1`My_Ui@TUQ)?&^@|bGd4U4UBcQ2&kNwXTy zO|>Zav?uHVY$GRFXn1RSPv^>ZK$GGfdqfgX#ZGDX+0MhrB#HKCcbST~|WLc?-^MUIgI$CNa(X4e&Gclmi zYc6~lcNzUMg;l4vNs5`;Oxv)B{hatg;sjKKYrEz ztRDbn#y0>D2N_TeA+k96d7gaMGV5ZyoZ;kt)AjV}*24C10+1y5v}~=07H}Pa#B2+N zb?8eBJhv;SY<9kx18l^gno_0~|r=V>)D3xmlm!~zU@ zd2(mFM=@6*x(g1quZwg&6kG+OJfm>fW!C$Ti_z4W^M=Anniy9$@f+33-}aGq z=Pi}AaZFb_OD*n!$sx99Q!@o;_ckn#p?)}{aZ<5!X-YhI!Qnh5qp+cmb^UT-2xJvm zPof0o76_k~rjU-)c~l)1Mv}oO%4($g4*z)G)l#ORy2uXwP+24A*j_N|d)50AB$2C? znzcu?%l!oad$F#c!19v!)EbBF1H|JB%4=rs%VxML4YEViM=TgC9f^pa5|JoS79|}e zluiGVcmOv#U(Hh-4wL@#4)SejSmShAkxmMVwthJT^!-E%12u$Pc-4EZ4rOh41#vKP zHx7EO>OvRClH=yGDu6Gyse}?UY#CQ@F#(j0{f}A(Bs+8pk+*s2=g^8b&gED5nn+l% zC}F~W6WSNe^#uEbh?GPSW@!Pgfyi9^u5i{j7g&? zS&D~@@P=8^=O!7hiKSmM9c~D&JztFt7K*z#7t(j4z>|ydMYW$GL>Qve7;%5@+cQ&M z$R3mg;@ibO6_L>ilJ=J*T$0&|OqMC?iIRz&MRf?5_)Fs7{gaH%MT+ z(=c9CnMM8vr~IQn&danK2wMW6Q;7tL{r0$OhBw8V57C=T-KD(Ju{AC|BN<)xjN!4G zoQ}$;WhWOzv)G=A(dNW>I9P;)X^sq$AC@6|U-xL>2pf%dE!U;PYr2VqM$~GS9_xAw z2{Jbm>kIam85+~fX1>I{VGbkY(595dAw%7cmk7lJR=DOuTc3`q)Leg+_aScN5BVx# z{MSx#h1ypI7B(BjFV-6=VlJ2))vfk#uY%WQ0AyhD#t$yOQ9A^_qB%apaY@#vlvG`N zzku!-|37-I*Ccv?JJcSfsJM+XIXVYIpe9QiqgHjLwX|hK4g}PfH)kcD-MK>_x3k`s z%@&z!=nQ|U0g9n+oo8fZ3;@gC8yrzQa-zA0125ngKv|%S_SaVO)h|u1R>E33$`Mbe z4$XQ}UKE^zv*4AUUNaBYl{4tn`+8XTjH z4dqj~ml+(A?i#aB}h*h2e!=&ToHOxK4d_v1{SS?l&Lc()qVfei_@jp8>uLs z*F44o8CIhV?o(D%x@uxP{|df4;TuBR4Th+NXy#GjB60|kd$gCU(8yQHuCG6TV$@lP zFz9W6s#;<}(1eGin)n5+MiPWaRG?S~LXrZ<58y>1ghIF!o!^`l3E$|%?Mr!)*eYT$ zwq8_!5X-0&p=z$HvLs_`x2!>)D5j`FHoJZ!Ca^inAbuIlb|HxCOU|IdH@Uro84V4k znk7x4QE!+szfkgZZzqp!z-K(*&4*KG7!C%_>gcxvGn*dE821U@3+)67leGcgxVv$|i$g6NEq+(Q_I zUzYavEzr_z&OXS-0*YB*YuLwx7x2@~$K|^B-)jAfHy5?Cq%rNl$E5ULMaNgHzZ+R| zj}|@a>lsrL8Vg&PBu)CU+BW_u}j^g%-$EjPq zs5WHb^4`t%yjk4&H_yf|ZIAdbt|W{#jq>nSDPo3=zBvmCGCX{w-PXO#u8A{~wn%O; z2?DVlB&;ln=<72)HAM3-bmU6eFZJo>am-)1;S{Nk))n-|sm`zrYFR|okjo~pAA6n; zLhuKrBd%DwP{B4mg=vyJ(8(klZP4%h7zCHTDS?V1s!UJqLrp5{av6vDQ{Rv*adYN1H z7@+`Clzl!zSC1XabK)o9|ND|}h3r?Prdebqd? z798wSz_3T7PL+ZwPo-%!GF-*nb-TqdV{*cfW?> zKTwpsTi#Q7**?RbX#1co3~-4k)wtBIji>NTzkg@azK1sZZ7QY<)qW;$ ze#%0B>I(XgUK$!vz8}SheXTS6FazMTa!`}8NF^xBw0FJRsZ6FjtVi22H79!QmdAPW zHRjarLvco9>-i^BzzLy8!dmXdnp_=71X^a4Wnd^*zBY=PWwBmoNGbAJTiaB}1qq4& z@vb3qt%d8<@yA#Gv=O3(zBUsFlq%ePh^{CNmJhds86I$pcd4$;}gMSkq-S>Oh-wWFgF zQbbJ+m7nj&9{2k-_fG5D&x`Ud7&wv~`6>#Hd6_j_FW{V#Opwsegb47hj{@V}baawf z_g1(s-|3>%@(=T~mq5=FS$PgO5?Xn--U*$!wBCVTKo9HyZ?iS22Y8Kst^SNkzO1K9Aeu>*Y=tN&*I>g)Nbu$$x_nObc38F z@K8rq-NeTRiFpP_fbSM5EhRN!ooUsyys|<=O#ImjU1;~|D`I{Uu(KG6d`F7~(tAtV z3vNOC17?+LNiIuBc}wS&x7!t$S6_#Cxcf-GTq+8$NBhmKtmK=gXN!|(I5OI+BVeqW zD1v#gmgs{8ot(HkJ4Cfqvm<8AVB@02dYV6UZ7xQvu$zxkt!{1-vkgVo#Zd2yHJlS> z4h~gk%smiffBm%GXK>qh!;ybA3Pk-HaU(5=UNUJ_dDlDa3#REmP43da2f5h4e+w@H z``Xe{VwyI^Cd3nwpxt_B*+9f33Wun`*?IALxV*I&QX=Ed>iO7O$W*gkR#u-JTPk;o z#?qu=`;6ZJRRcTRbN3F*>1$}umE*9G?%B343$?dwV?%Ry6C)%$bo|>xw>x1wpB@@E zonnRW;vMgJK0oBT_w`oleV??kD<%Tdkl(8liUQbCEh zSu`m=yji1{tx>Tt(p#mKt35T!z8#%*e7WfH!sObqWmJpkB{3D1#I@b-^X(HS((iK3 zmzw)wIHPjKDP)d^(0^E8fJNsNg&9B1*DuubKCXx@al*Y|n8@~RZ=fbm(lQ_4tjT&M ztj4Xmnc3zXm&7Q32?E)@>A*7lGZ?QYe|Q;6w3_*Xc3FG7IKr{mr^GHgP~AWTcc+F!+pHG_`y-6Pb0hq{&;c%)k|LAUL_R#k5}F# zdy*#lf46VNd9zyD2!?0-eAQDXw_&SSuNS7BGg+pbl8 zkj8UzPwDy4#cp(MR&Tvi%=fjWap)e{&&q=3UVfIN8u)A*TRiN7x=={8A>(-q_UCJh zK<*+Euy>YiZc?$EwE3S7INDD15OKSKvSpu1to22wnX1r@1uAXizO~o8daf_2w|%Yc z3g`4pRN(#^`)q&8@AlS0sR&QSWHzpbnt|byxF@?*5EbLA!ENrc{}%;p8nS;deRU!h zDxxAXk~j4)^@BzX?YvMW15c-ZnJVmr>7c>@)vw+9Qbx@}K3Q`jtEH%jLFK4OlFK5u zP(G9D{+Fo#9BAOc3km$Ku|j%s7ocC*0BVOT@TVyGE^c;1Z(i-0|H@$)I7FU!6>Sg~ zppa)vfQ99~x#KkzF#G*#>R{fR(4t|XnnFUUSS<+TKrZ^Es<7J25YBAak+@rKhDyCY)0Sy- zgfnA}GvogAfl0XHuv;CXgp0R()y4{LI?^Zv@%cJQ=?!}IXcW<#$ysi7=AP52tLJW& zEweQ(nX4ERRqO4tVO;a-1!M%x5kI;H2fGrAZfP zG2v+k-MZRUNtBxJBi8R&b-r={JN5Qx9)Z0_HNk*Rsb~O6=jK_&2a_ex1O_IiY{tSf zDc1|4>=!pkW4rN@TjTNYm1YxA38z#37Q-lS325FMH)M7)H1g4Ue zP`XxDR{V%Dgw}x2%z#Z4{|K1R^T$Zn*JnG&tJ78QH(r3;lALeO&GS`dIqaB-Mi!OH z&;^@tah<>@uu)Km=>?m5IyKdY`wlaRFUg7N%9Eqqd)2( zt){SXS@Me6c2ZRwu#+$C7idqrlHzUBRk1`dHkOuNvE|5iFIyTI0Cn8yBDr*N#m~jUpW4^^NizDp;;1F2x{q( z2EnVCW1qF8?~WTkjnL9ik>Wz4RNQU@@6~0H8XubiIro|9V~h;Hz!mP9<`Mt(<=K187EP~Qa4Th#9=d_*aF`MuJoBI(JN zYxTR?^b%KwBRw_f=Il&FY_pw*cPa2HQ^*ZMm2!<6tL5{u8s~0VI^z8@Q%m?N7+*G& zZP9Scb~~fPEFCB}k)td{#vN>$50?z*An6Z#avF#apL&Cnw4yh6`mK`W*YYJ9yv?aq z>yDO;T9}=oMm>~C$|IP(Sz*f_^fMWC#1K~LHX6%Jo>X3e@5T#YkRi2L=fIA!Px+K= zv{u7xn@C=q`tG6as)!rl}faHU;X1p%gFvy*;f4Z|rmY?3b5=+wSv17A9eS&HzaYC z`s*x`zQ2DOZVXP3^DK_IaHHe)rML~H4s@#mLWT2HRD^Vp;ZFb{2pp{6Miavn)#z`q zzU@9F6JIp85@JK-Kk4_aPQWAJgmEZ>|7kB{ zwguGa{zjkh7yrQ}9>2cws7LdClZ5@_mHS~|PvE;_+8Jc1OAm`IjDTM_N(K>c#7U+b zE`WzUmq5*?K)-SrQjmxI!@a%JrJo1~HYdo2lJHW;$gzV~f|$3C0|{C<6r~~%{-D*z zF@Yg8u`JXJ4gTz>-w#4wKEa|8hYDT&*M|~|Z-y!03daYWU=z5r#xJe%4VU?dogW)p zY6mo(z6mPA^Y^AVK}tuNOEVEZFTQY6cs^Wd2aTsU4(E6LxZ8O}z`ox66yZ(A^ZPG; z9-mM=2}V09!jD|r)jXuI$^SlYxP||Gi7ISR@q=`7NOIv+mLtVBSe6<)q5q{5%bRj5 zM#isNI@0JaFINeUM@~!I_BzIuZGsRfuvXBSV=DZ68+5ly|D=o)8*|kt>w36Mf7osPqMGbxuCI0UAe0C9PqdD zSkjvUZM(tsu+a@9=T~;E28`8)#Lk=y71^Dq0^oYB4RhRX+S9SQwYr61G z1=*s5R(g0YSQZh01|ouEU9OIGzu<)TYn4h>+bp5$f}^mo4LMDOavz@x3ak|)tlQ?! zLd~KK^e=tNA3CZ;L(Lx*#d!S9hRmcdxz7|!d`5nYLR{vR)H~Boq+ZG^F#*aOxV`Zk zG52EsSpAt@Y z%>~D3C_>k@!se19dNiu|sP1P!->Sr8dg*{D~ zm>!62cBd`nlMYDl%<>0iG}+soxn-ce>lovGj%xR*_!@!J6frw97t+bqb!CB_&Ucn# zC*Hd!cfvF<6($58CQk#~n_^8j9dpFED0|p8nKsW4t$?O7)Q6Gogmv$tC2K`;_DTQ(NT6!Kh{ z$((1}#2PzUcFbZRjX>&tXbyT(;+667wQ4SCJfDD*f7IMe2E71m!pKB z4{r$N&R~3XZB|>q-1DLc{w{8J;eZR_#S~xXYySwB&8aqLw>q@IQQT8}rXUi*-@XU) zEum;4;w%5Z_RW7@*pa@<=+-iSfBzR2<2CX(4k#obA{qwsmq^_(wCxbZgd*dkPpM+P ztQWT^{3@p~;6p6&_dF+-38^OxpEAXeFQ1Fr(B0uszWy%@!kCgU zchA7ze&zLFjo1G5Rq!vtzg%MI(<*I8(EhJ4^T*mO{4u_c%0EAO|EIhD&+GVLsMS}D z5N-U+JAW628rKD7I0l%19!39&YU@(HQM>N_KMaii>UCSYol>#;(3`*khRi?&Hu0Im z7A2DeKRE>x6BPQt_^#+Y-j6Z<<8$Orn4SXPBRd0raVT6148!}cq7!Qg{U!LLtN!O? zRPi9H`^)d|Ck8!oi8_U+|MJyXVd&Et&0vAx|LW=F0-?A5e?M?~KP?jO|A5Bf7M8FU zGBG!Iyz~EJ;k7ryqKjV>^3Z$pq%ipus+34|@DthZ^;16RKe^2+S5eUX#f<&nD}_TB zhc?GLWtl0IkLms85;8eCX>uhR71)D@MGn?_+X?rVk3K7yE;cF;+8;zHR4i&N7S`0% zEZo$Luv)G+=dKBkgu1l<8JGS2dOL_OqME|xAK39*%Kc;M-*500yB-{-J^fh}6ci}w z*?Z)|iJbuSlnI-gXhscCn-ijS{|SSFo>E-kbqjbaWmO>;0qFM*$+FXj(G6gMBkp4j9 zs`0%`=`?5CmRi(Q^KMDW(bLPHKj$=~wmdaO7D|ed$Wy^uj;dIB0tFx(h$#QQ_~y@x z5`_vm)NjJsmk(TO!{McbbDJK)B;3WPdGT-gjSl>-##G(8hO^oWKu z(#EctT-d*)EY)qhC>IqJw_Tu%^T;%MLRe->wP*l8E@N|4WS zEuT6aFUzbn-ZFuQ7?+xbgPkLQoRQ@HumP zIW<-!Lk=Apv~j&(WM`p?$3E3d;{L;zh9e1lsp}&3o8{e(>Fd~~C$oTC2g;mdqiPQ~ zw;4%u&pR-ARqAHXgpw(keC?fWX-?eIUr3_I#O)J$BnWs7Xp(J+S1tJ*!YW@UXy+Ykv!Qwb*Dtm%`?tW8E}6jDmF7 zw40Y`EIdW9)JwV!p$HF4;Yy;MfR8Jkz?6^s8!D#iI6jMxn)~Q+K@$7IX%p=nRy{uc zZLtX=mJ308CNLhrO|@1J$6oo`bel#!XSL_i>*ptW!2SK|r<&f+h=_^m$F{D@728L} zuJ4d3kmYAvs#nfh>*Y92_*>PTssQG<&uL0oRzOH>Y3$OSf!3Slid6PTCkZL3SpC_jwpgPi?O2qE?#EJ zNUm3GsWN$|{&up9S5(`ciEIK-k`=6XB;I1;mxuw@QD8H%fA46zS8PcJ_Jp1!@-Zz5 ziPW>#b))6xSMP&_5OC5!kz~qik5gWWS1<95hkY)aD|ZqB3)CrL9_~wZa~H>%ejtV&bnex58GUk`Qfj zwD!wlU3M&c3;#t7FL&VCZCiI{qF8kWAE?#gV)qREmW4)mbAbUqkAAZ(taks{zsx%sa5N9p-N3jHv72gX6ybt&y2{!s+V&;W0Q-3uGMsUs=Mfh2WIyuJPHR1Npg25^`tG> zJqnqzt4GvF22WGb=-d-V^$vzOlX$;J&jad_&$#tMlXU5PL>4P^=cz*u-2`?rsckYj zLn%2dn+f?Vm?3U%7@oNiZ?5+qiW57n;V~7vllxJWLQAtFP?@Y$Pu5dpUceoxcUMD0}ste%brgSaeG>s0;rOk(d>Ta^7JLMAuTml=Jo3ir8*e|_U3$}s$K>U z#HQ1B`a-$V;yVzsgjbh79$6TSh@-Dr4@dr-@`%&|`d=Wc{n$+vgLb%d1xN0ci8yKa$x4Cmz zZL#xyBK2@UsO)|PQ-!Cfzb+Wb#l>~9+S)VI*H`EQWpggq((NO!fmjEjw<_?9(5TGk zA>1nG5#YKSiJq!tb(W;+)A;Ns1*R8%%%^L(U(|D!IXWw8U!f^cuC-7g^LxeV+m|l# z^Kf0wbK2=vX*&m84C-jK+Y$Xr{Gn+1lJZ`l{FK5}zM;5vB9D2PhLU`m?=JzOb^=p1 zk_{vai*t+9b-o>;ls(t6m3oJ|r~WO)(rDaH=gS-J6w3-ZhF~!VR9*8DJ22hUC3kAq zr4%{Q<;C<&DO&&p0Q}lr7M6Kz|xH6`zl@?Iys;Xj; z=shb8=PEqlCs3@V%UapQ;vMhzLy=PbBy}eynYZ`%`K58@^78kvO*aoVH>IL_=BzpC z8_v=o#o<3C{4R|0l?G5J4}=CLmdcRw5If%#NEhwepHC|H;I#Qk{SYo35qQ##@~Yia z(7L6?E4Zw(>`4|p7bvdAz%+Q?QN_11u-O&ez#P*y$eBCVkcvgNlW0pkWfiF;I=MAb^qoqn7-?`30GSH*+}E#i zm74=zQbKjOAT~&C;}n+zq~R%5q*%p~vzKr<$`AO7oEA^P+bNyIrs63yK7$F*TPMa( zR4yUN_dUd@nUl&80FDD!H_-_7@r*eQM4M_`!avtb1xhu(%^*R#TOctz7*5;2jtdz4 z5ZFr5+`_d(#L9|Aucuwvs>^->_Gj`K%u{Mq68|z^_u(8K7BaUJ?B*s3mCVTvren3~ zB`w#xq}8*uPwH)Dl^`1iPR}EJK5MS#JGd2aYP_%?uH{NU@9XH$`81&br&B7RCN43$ z=8%QL%u+?vF1Yn_yZ^`pel)!ZNn+?jMhel#y4;3yaW=H?jB$*Wu4c0kdIOLV5fUl@ zTj*DTPD1xVCgzR#@w3)5jWnAfrpBhynRMh5Ow4%Gp1geaj+)HY#XL!Igfi$K-SybjJIXTywyo<@vOlbUeE5x<7nJr(eoVY8mgLDODZrte)9!>=8C@`IeqkYqj`iFY zgySV8s(X{n+as5_!tj>M_!H+yhE?;J-N-VQ9W}H*O=9D6et_`^!B_-_E5xOrZVpQM zh_(|u|A_PpXC{taNRu%ucrpSb75VvRdHUf@iDGP)bE^@*J}MIQfaX%FwmSX-njC{cl|vaq!5=F;-JwK7CS#*E*Sq3<|x;vI>bEg8_?yn~^aI^UmWP?zWu>?u+z znF!iX6!rP0t2(cukc_P= zf-#iqdTvRa){7ed?;`?snTpcCCx9ZaqtO3-hY1in1) zitXn;Mc_Fo<^If)^ZIaoN_qfBs@NRS*(72Ue18>-_JhGQ=i{=kQD=zY<3t{saeuSY zO@Ugzi@>(a*KZHUai+6JE|XM&;12BTLAlQ;iyEuWUk;0v^;dmYxf=~D$T}`Z)R@CP zIR2cT`T3ipfw$-uzkEvuG5Q2ZkQ^&gmNI%YbUn)xd>%R*6VF>_kkG$xurD9GH*d?jyURTu$E*p8w;~v0oT{J; zjfM{9WA?IDjl*g66!+vey(G!JVfc~-(4aq49oWhn4JIWki)x97TV5KfHtz$r9*_e> zakJSCJ;g6wS4G3paygv{{op zj;=24@BC?Ao|gfaAuQhG<8tclk)({n6$`^xdqIpKXB@hg5fz1dhnL@PD4Dp5`4&qv z%u~qexoCFNY%%rWWvL3;bVQ!&{ev-h8E>4ivnR5QA-cKJfbdor%(nw;5 z{0qGZa|}MQn{-R#%|3_v5Y&#B4EBmy$O)Sf&NpXMLE}zI~9f7|7WVM{@rD_>DWPXWl>Oo6> z94y?1Q+I;;dw-;C%BjS9p)~-L4oIz{W}B5mJvS7DAPF0Bz7B0aX)<6op(8ovKf;-_ zBR4}8vmF@^9KDl=jV9fjUbxiH1hz><34&SE*a-dsWL^mJDN<}WjnQzvpcQRYM-d>f zuL36ud=K@H>uH(++MIUT%rQtiJx@lLmq}?LRIP5HiVfSLo8Y!8JCNeH#WtYr4#-00~R3#Noe7N zO788dyLv2GktlJw;WpgeeQ*NGjAgpbE6X;y=%VuqPb&wQPN(Dh{hesKW0<|KKchGL zwhSh73@8%HOBnw4jr;_CwfoHb1{lYLJhT_6zZ>ESELW0IDArnIwYGIDqFQ=i7M@Y0 zoxJvS2bV;(Y$g3qI0Frl4p8@+W|44t#HYx@qGE|=3RR#FH7YM{3tU$Qtztx7T?8Z7 zn5*Rc(!7;3t~lCkd3>49Q^h)1sS43b*-1faBc%OWEHRz`4{C|-cNk1s9m+J*#RY}b zoLZLJt72y-8alGc7gYexh$O)CKL+c=Akw?VG40x?W|zm(>T*MKaO;>; zj$ogxyt7)i)^UY<0|SG&_Gz2@kCN7!wSwyw2!{and_g&eNc!G)5WI$@x4u1jU`K)Elwpz)}CQ>L1Y>OsRH=}qS9HmoAc@+LBvpd9L1c_`V%ui%CK!Tkb2 z)EFHH?5aCnChs~+`<3LRNV-9Q_w1YNbz5{b7el~f0|jO^+KkAVEw$2)n8*~i0_Fp< zfKgx&IWq&5gd?i;a=oOoJ9Qzs_Exi2BS_Fc>F>;6`@PbKmFSj*-irF{@30~ zots&W$e8F6zOwt11u4jKy-q8r^B!o^~IS5__+PwenUo&aEORm3B1F~ zdG33A;tlT7(CBop$l8lcr;~x0I5^h}lH{C0{S~-P=Jo8OmHKOG14{nvhMD70Z;jq> zoON;55i-n17ia6x&@UKHWO1CXTSv`I-ke=)?op~ z)omJ5M%dM8*(fC~nSVufljn*(+~+h)$vB#oDF-geKA8M?S)=@E4f z9XLQsEYKC47g{`9nt}qNB#PJhRvN3Z`j)25zkUeOp0=|j?4&`zVEi%J-g=KO;OG9o6VNxMLy0|k9Dk({j~C#-JP(;bS7G)g+r<}9}27W zZ_m4$#XAoilKICmTV8$AuFp@D?G_D;@97EARt6HVpN@?z-5NUAuImpW)!t3+FqK{Z zAzfi@Rb%wg1rufH4VFF`g_IhQkD}5E7VqCJ1Hp8tvpRI9t_C>&Fww)oujt6mHXh5S zp8SR=ICg_LtO3bTTdT$cbaV7jQ6ro~nN3yQ3Fvtn@O#MS17b@0DBfbfOY;@CQ&A9@ z$tx6hz6^^!Xa@YyGXBf|(~%oQE4;DsK9Rt2q>J|-q@9?kkzlsZnyhM zLPjd@E|AG}WAQi}O)^_#3_i+EWQ!3-Fed-7-)CB`-ntoVE=6%jyDJ54aKjQ$;3WTE zJB+;Q;Uw=Kw1Zc$pS*&sJ-)4HyN}_GJKY+h@mQWY@fE zc+a4LvPd6nh{@Z(Z?>|(|0b%=>sT;+?I5^6SkKBi6(%&FA>;Ui4O{ld;84!_uO_K| z1trO0_I4FKixT-p`(BcgKAF^*ii@(c`1**HlK4Xsnc=ARFt8d0?Jkzfbq+sMx-}Ae zvR_*&c>27MaG7$eY{J{SLrK`40bxfJ*!+~f^?3-oaE0)E1Kx6Dc6mFqz4F@O^?XQn zt}g(Hs!?z_Z?j21SxDvXSX|#1eeHPu0_GcCH8O3C)3$IhZb3flAG|j>~ftC>5LpG`@TvL zfuj5|mJuZa!RBg;1A)~qdr)im#H<-?o9c``dICXI+{&}`Z}WYAT3WlhC(qi6w zuXj!)lZyG!JdPJtPbGKu_cWpI4a|G^p?;flPi&IZiX&$pTFP)fNP?Q6AY?EEJG>%+i- zjM2%yH0dlQy$L;XGSTPlth$}g2CE*wT2r{=UbL&!AG`=}7AgWO#ii!!EqX*ij<)Dq zguIb2$K74}t7(!w&BPN-hV7SEBS>u%O9njTnmC*XYk5iT>1PM&iPXM}f#Ma_DKram znaJYK7ov{PMJFUPUP#AVcq!biAwz3KMP{(GqsmTj?c=Fjb}3@Z9Nz){A79-gW^ZZ8bKUQ8mFt>m)&=g7KP z?W<&Ps`AB*Vtw^LwE*t!V6H!YNi@EQ)0@kiB^OXG_xSv|CCc!(q{nKp@%%9he)a`^XVTpaM;h_CpmV~DuR`v*Oo4JXLPW_*DbG+ipB zxl^05QX1*k9-kVUx|6u;m=K#7+rvv|^qsy(T#DzzKSP>Xp&w}#0Lim}-$z=WsZG%1 z`0`SwBn8MdR1>6208<>rcjLr(xE)zA4G=lgB5h12jx-^d!W6$_lSM4r*Gf)icCxD} zq0{zwX$aPW*=6A5_+Dc&V95oG^rnHd9j$lYj@=B}h#F0Mlz(g}$s$g}QgQB{{oF?^ z5={d3?cd@mxoOxvx84IP_qXvy|26(AfJAZCs=V2MQak>2jR&L4kpA{#^M4Yx z{&ig(1&zH9i=CqXH@N~@6UO%eN&w+VZ-@V1%nRs??Hq7?6cwYcq6L4ErGEuukNiU} z^ZyR}XXgIzB>!u@{r`1I%_mjP%cgcu`UJc{>kP$BO-6@ENuIlJ04df9wG&Ozx z6yo!LNMvKZAw!c;BWbYNXHYItNHCizmT`1+e1Dmim?+WFL3EMqf1T#7rXP-p_}6?9 zzaInstL3C{AtXD4F(WD@8$T<;JN52yd9V=wa^tzfcK7v7K|AS;kPEsD2Mze5;#)z{ zyaFxbq_GXVjek$}f0T7z$Pxkop^G)AB#<twhEN`6Eq)LZe#}T{IKE{jXV7hqG8~jXGIw_zEf0tm83%#mxi%q9q0u>iDg%pJ^0`(iJc{ zY@MrkeK2#CtoM19EGerS_sn9oQaP9;Ij&T@X&l=1X>ZB8Ew4zmbmHmWZ>}R0s&0fe zwPf8Q4y~JJ`hearDhL8aS_nmaH(a?qX*z{JA4$DAS%^5iPa@5j#Ep(k)LL?yKwF?O43lq>k2jq*3-fn$*l%u&A1qXTh@n!Byz@DM z_L%EG?Ugp0tVcn>Z==XfAY+Eh0#BmwM_9|AP5EmDZAciYTuW}lry+A42FUMhdBGrFw)VTt6>*3&E zLrT?z^JLR9%w`G|+B`k-tx`B954O90^W?_TXp9fhwULaaupFC%Y;7~nxB4cI2)xKj zmv=`JCmS7b@}WB82O;`Td1*suoQ@~i_UFIpIx}~#m|pXYUNN&mMXF^vP&umbq$FwtG=viAq}gsV zo#p!ZmfIKXhliqq?c-zVKay1lYzl#jV?0aV{)nHGDSu_wPF0CIJ*@lOGGK%pZsw(V zWmpM(I$EmxUEO$p3{^+E*J&@>-j#w8SE5JP`EG!O~zPsOVj{<6a(AjZ-Ua6e`SE( zZX>|e)@!M`WAWmL-4(xZW>Jx@H*A`mP9vUAB=s|}R@a)G$f5ngG6Im9p)VM-gXxI<*6jkK$<-IG=A;PO*Tti>_v% zoidcDg+7!6+q^-|7+$2{U@mfwxZtH4H@f46$F$`g8A2zKHORVPqst-7$kPpHBG75%DtUxpwu$q%aeHq0EIO$qf3WGXP<(DLnBb0ZgP1ItSBdk+(Lgq z<1#^jf*`*{FNk=1-j@ceSV}ICED=H64^@m6{;;IYvdixiFwnbqr*yo{rnXaEQ4#S5 zE^p`;mz4bld+KRhT1kpj#3B+r68Ub~)9;XwsPERVU;j3J%0mk*NywE>qO}&I(PYVk zQgaS?b&+W_u70EQsFY|(dpsb93#5ZCzi>Zz3?!D_>iq;CS~pX6$1E{9op2>yT_vhm z1!@skB=oS>v}TrQwYrnS16wD;@HkTix~WtEk>~7>H^*@sce%rJA$i91E`qoWhV?Uu zd4q2d@&AV%lY@n+wOAoDIKC9HKA6Z#T3#*J%X<116cj-$9)NhfzwX^qZ4Op(eYsDy zhjhF>n9QlVgCu|IBPdK_F$L7c@LJfkd$c1Q&cW&#@r3EtE%J}U@B_2u$i`SN8`!CrBbgBU~kLg%O#@$@fhC2}Ca_?L3?nMxzFQ42pg zAb|I1f1k1h)0sA6e=2Vv*k~t&+I7EjCt;Mny2|)gh8;ay`cP$3fs~RmDA$WyIdxK5 zOAYd<|1)EX<|01hz3pbVxT$=n3hPp>RVH+T4K;fqHz$#WSplN-59`mjCVe+F0%v!z ztGL(xTyZ^xx2tY(gK>0pLS+(6j{&FIeuHIgBRPYe0zU&bp}H-;I(yGt&lT&k60)*m zEYgw)?Gn~Yj$?(8Du&@q6kwP8F(LuILgKJ=DpQ0+GzF0_hg;(1kZiTb(sx^J8MH!M za>~@@HZR~WUEgxljmC$)E+j)-#_#Sl0CyJTHGukS87V2HfSn9OT*ny+WgI<84C%aO z6ZMi^jt%>TE32Ks8HV@*>%c^p9+v+><5YX=9Yd`;pntOF6^_Z9;sY8#re#Cg| z16>K>CFR(*4h}i*yoR%!Ry`RtnXu?|BK1YJ^>R8(m4`4dZVzILF5)27CKFm#a|Mc; zFa80d{lFfHR>?U0>2i6+O?D+VO9S>IJlCw@6`TDFBYMojwnSDWcsa7fmWwNM=b=1| zK|$MkMJN9Fm+fv_HT+m8h7h)1p;}R4yZNSSU|=5;r&rErJwyCxvCf>@3y0Z)!t453 z&mSsR6B%%Pe4KsVU%3N8P5MqrOHY}VReD!(4VPq6aap3FcpeK4X!8W1sz6V{gQMyE zZ%xk9y$?2-Oyq!8RY6|}ws3SBKs(v$cm%p3WVQ7PXZMioA34eKB)jSIP&vLr92|K0 zqe3N>5x35^5BuTOSMr^;rYjm&RF?i227jh^Vbd2veG-km*c)aYXyMnxDx?zr0Rfj{ zQRXWtw&#C^3LnE?wWU>|yl!(lU1|gN4nO<#{U!*>pmm!$-K?`(QOFy#i-O7qCPzDY zUcWB+^$}xm=yx?2M>{l|6-oiC(pLs!bnb`ewLD`FZHrD;BmW#4@OgF-Ev9t%4NAan60&@Jn(9Y zRBSakIv&ka*4^jkefqpqZ5o0rFx3VG>hmmKcK4%!&I6>+=Fb`Qj_$~c_9fzIX`EcF z&_-PK%xN445p4G-z4BGZQlZN4kEfU0^#5HrOQH5gv->IeXkNk)(#m}Si5)3awsz)0 zc{v;NpnB4mh_0MQ;cv>uji&7EiW2<(ioe>W zNKtOSq;hSme6n}f<#9N=*=0Is)zYsnRU}uZgZFt*-U4Sxy+jyJlSL}|?wtqCuB5Ia z{z?7$b|#lOoh;u%wygn`w!}<95*3-L2k~%NbQsy#+0ZP)(~w={S@K7uZkQYZ;&yjK zLqh=uXR2=WNIYQXd_1g8I7?0o+6u+UXWhRWArsoHrjq~M)(Uy>2@sX%E^aYmx86>) zGi~A3&{0nPm1Bu(A53tGWyp~iiCkXKqY~`G;(TL>f7V@u4S}pr-qcZfQ&9aQM=U?y&oGk#*ot zA+n8q>7SpV`Uk-JH%FXLp1ggEteja~^B0EEodNl6kV`!Gm~FlLfP-k2BSDMmDvc>kXJ>?mY4>0;9fTy+r{Bp`R~XwO#_Lp|tPy z25F`gA0LC>Qh!PmS(b3z;@vnw44j~SlRaT5+E2flwt;5KKAIb}SgL`60npm) zs7m5=iB^Tur?UG%sNxRYGt{XPK_d%|yM3d$hHT{jUm_mGzU>K9eGaio6?eNn%>w%m z4n;eCW+!db1a0@&vN7!;8D}PMPGoHe^p5%nE{OJ5JrAXc3PVx*3=G?Z&cQK~Z}C@D z9d~du5+Awf0b?Qk=NG{oy*e;Gy%2dh4%u%9n!+_)r5t&F&9>Kx1TG=;B0GZxQVyU* zTxwaA2zh;V!Wn4mKW@4v8!g)teNqhV6keVVe;6pb5K zH#S>OPIh)MoG4m1l)M;>{D&C~a&E#!WHE$FDj3CW=Cg{2zPnZ~G5gW)r0zZL@km1cAo* zodP5ZrA!9-Tu*+Bn(4lxMUDUL2$|3PGPh< z%|dTKeCj7wQnxAyxBC~m_V){O5?zIi?l0b1!~eqx{AUr+t|Z|hdev@{>h`C<3h1E} zh?rNtkpev-{r`17{ymfj1VKSM$wHcKjKBJHx*QaTqf}}R#Qm#R+aqDIEnU_bRSDEk zvHto7?V)f?C7K0tAY-PC>{#ms0m@gze<7R&jc>ev6933xeJ6~1{%?!+AJ$Ec3knxv z0{tldbG5qeE}~|JA_db$6)g zum1kay@wNm5uG}weqoSmkRUA(sF{4>LOVtz5P!TN2n~c zIO;s%tMH$d@Qup*EZn5gWusMUYPADVAV_}yE4?DJGwNs2I$G}Rt7@hMu5NzC={J)w z{|Fa{{#4+B4iVWuc;ljpK?Bk7AFv>s>b%Vy?jQ?>v=)g4&>~f_(P+d|D6cP4lRggc;?JcJ zskkq$gzFM>)sG%J1q&Zad^*|F-!novRdM9V)|T-)VteCQ1Yf7La6J<+5mCV*>u_m9 z#_7hH(lbQB_R*8lZ2LY3dU9=xCnLk%4OdHE1XS1<*M3F1C*5L zQOJ3hOx8|Fwx)-pX}fR*nSkG&K1QB{&KP5$Fj{>7Nh7jVtHQ(I>|CGV$&j#AsrHE$ z6Jw{8$w~-aox0M5(7+|x0db)~MqLfpFYkNJ+YV3JvT(r>B$}Ou7#Z1~N)x~jv zZNKG^<%DZ4C@>H-3Le}@hlb|fjl+WIfc|%@5m;D`_hj7j4)IhxOFt!;3yi-7`<_v3 zx}`deP$}g&k^AUXamL3+O0aBlxA(Gaar2$B|D?&Y{JNSFT^o&!A-GSBXl$D%hJ4HB zF{+Z>Wx5Y?2iDrzM_bC`V~rVyt%)=P5A57|jq(m(qKgJX{lyzHdU3ejD$tpmzj{16WEDgyUBmqS%jBw8?bnA_Q0ZVu(>~0a7Zbj z##p{(7tp*GW5#-(Q*(JU`RnqwDp{jBl>Ao$Ggn9(?eD%@LDP}t6@^cfz#Q}zW`}f+ z`HB=QQ!v!Adk*tRQpkHfGV|!q;`rhg8g^Wtj;K&%i}B?}59uR9Xf}|%Snko>>JwU@ zIcq`Yz7fjOxp)wh$1`vB?WC!LXWJfxp=G=}W!X4F|7mh<@1lzn)aJSneD&OaTM%k& z+b|~3uMBake%z#7bl?3(LvWe%fbI0XkM>2_qqHcBaRm3AmbpwtG$pnb!E@rtaZ6#* z`62vMC)o3L(rvoC4)eIhJu$abJ^yn0S<&^tgCJBj#<)x8GI(XGGspgN#r;}AG;GN1qXG6#vlg;QLZIp_UQJJGy?6Kz;v zU3GJ%-WFFGD0%Se3l8Tf!I+XN!Sxpb!6ke7fOYfj_8GhC>t*>18tqh`0~Xe56MP*Yqxdjo%;y(I^HGVy#eSWH)K_>A%Tu#&SRV^(^JP@f{`k~k zduoT48JAJPx&g4kw_b6H?s?2IgFUIZ(l8ZwI^rB+_A;3~Lx`&kLyv6z?DN6ZW1IlrsE(S1C#tBM&ZAbaT*|I&lrRUEBUw*?uj1oE z+Ehlx+8#}=6Adujuay8XQd#9RSiH;>~A_z+}B&V0#? zjDc3O6ve8n;EWfvsP>;Ob2qwba7`bmq|^Fne&>Mjc0|0R*fkD1Iepg55t}S^d~2p% z#q(TiM>C?<7N1(OB%}cVaFlC*!~-PPvvW=be|0ly-D8r)ziJE@n>2+I0pNy0Iy3j6i&#@4Wl+$Bov>L$G-`IIRdAl#NF1YBhLGtWo$l9`0 z!~1ztzAlr_`1$hA?08LqMDO+1kv8u@t@1D9e5WWD z!+a?~cKH???Q)ZFszCKQP09o&OVE{C=%(wzOg%Hra$O82!7|YejsiCUFcIKOfGOU4 zjZf=a)Kskvi=MoeQNlUoe2=8*Xp?Fddz*oJl4|B9=rFARE(DsA=_pB!a_HQgsk%;- zEBbOhZM(M!8weXi45zsmy3Zbe=Xz(lL}jLwlUqzZy2XUh5#op1W27nzsI|dIuREC6 zaYg6g4u-u|4z7N(i?sAJP4 zU{sxG0Du~`lX&mtMsPEvfLz(LHS3c?rQS_v6)F}4L>{i)Gg`83?dbKT8A5#Sg{i9c zjnc%)pob+G1K`e4MS&cWBLPZ*tV;OTn~mGcyS9ZK-VMXoAozeDTO;Fb| zDV>(ljt0)zb9m_!p4K0HyokRD=&^B(X{=Fp*~yb)=bEdCPoknZpX=Z@&^!)8s3L-T zq85d3KEL+z*8*l%|pEt5B52biD_SsgCDE8#Vd^Tcld(dIpofmeL-Y%Uy#vP4+90mYPeqNS~x$ z#`mm2sL!si$6nr1LTvQrP`Ed4K`R?Zu93Cd2c%kkYR1;RlY z3OH9nDT{Z%v2+dzX@JSecqU7cU7&eXc$#BZm$aIJfn4mtC}!TL0-+`sAOS z9cUk#sW`!N1S@f|MBefn3KZ-vhrs|i%{Of9Y!VsUchWIwdsB+^6Bz`nwMo^m^}Akl ziUk;l{&9=9=^PkTQwLj+iIw%f?k-9-wQt*_D~cZSZY_$|X6h|a@oHe+*UYI=!5>sH z0BQ&|xQx9*)~a>BG-)&E_SRD@9bo-iq-4M6W@X=2C>~v6J}rd^pV^oB7qO0(yN%>W zQtd-l^4dzhJ{1xzo?1CQ^WWc<%_rbG4vNd&bu+r<65J*7eQTrYN+(1^JR{GKQ|}lX zLiCu9)IKHf99fzjX(}QXHQ?Zi)xCKhfb82~W5RJvn+o}8IH1Ndl;p@&LIxM41mHCN z%aOb9HP3EfKGQ+ymHM0n@rM|^o}Rv$!gY65&L{Q(KWU;iDD-8RZ*@*_xbH0JOlQec zUto4Q)?0`^(Mn{Hu+XPI)a_9OC|4lo?pGF(V}_zT3Bw9%d6ou5;5AaO-alODD|jzc z$41eW7Y_Vpa9MDb^y-a%CdYuqVK zW71u8WNKYZkTgr`RRNNvIgGw*%FE*jKB!F~_pM`$@Zazm!ypVKIr`F-?$0mD0$2VI)mGt*J zejCHeuZFod)$?l=j{C2>;Qu3Mzm@D->ne3(KGerY2u*V!f!G* zo894Rj^5EMN!fPjO}hGQm9SUGag82Xmn_oyW8tEZ-JB~`>d~+Z4Gu^$SNF*!#BX>b zwdSH;n}QAFvW2UW~s)VUK|+vj>kA0!cp4WDO( zhNVNtp)g*}pZ7P%$vtm6#v5A4cqMr%0vNKvcmQkHJ6U0+jH7@*CTy|A54L{TvanP%hUAJt{z^O*jy%2%W^f6RQW=hXFhP zo9O!`mb16|=7^Sguwxc}owU40g98nvoA`s9oL=qQmY5S8!*M@0Fm+q+MMj~41c>iP zPvE(oj(k9~&9?t?sa#3ulgDvL>w&>}MUXvse~^N7r~tq6S|eZQWDLJq=B4gUj+jDm zJ!cHEpkbxmwWeyE3h`1Lek>*yAo6aO654h&5&WL}Q`8#-&8Rb6$^~|O@Tpf4r&QQ$j=+~3BI3%RtfcnU1HskNJP73Eh7bm zxj*0#c_G9=Db0H3ST7Ef@nboT_fQ)?27j*i*sxVC5-4+&2zwZsooDB8hD&+`CB1Ez z5x?}~odY=)MfrQH_X7u;m z*S1DJ!hUDeb=##WA!z>(TW1v&chIE$0D}jI;9;D!db;a5-Ba~@s#J~_6gZMDxBU7|jR`VTA-JnQd(vtSW-`FyRGgoD zb^0jr9dPrM``cP-NI$9f*T0k7mz*OaMq=d~(ts9;Y2mZ)Q7}_j_v$8=P>4#6p z#<2xzjO5#|MyEGtuv9@lA$DyMJq7#Wdj|R=@?A-_kIjT+bow7e9y@K!*GI^>)8+;2 zMYn^htPzI(r}KC2vvt4SvMp}bN%u?@mPEEp*3hP^rH_1`eua^#4J_Sy)L}gQ>-oX? zHrhPzct2go1Ui+tI?4l%dBH^#Df^s^&fM=PlyMWjd$C^A#~E~C1wX~{H!oeLK$4>T z7_F8LISH@%K}*E-&9jeo>o*eN(PBYCOdh^#J&1+fo52u zztfw(fInfRUGw6_*uqu1gB;fyiYrmx)#<0{<M*F^D@Z8nTE{ka)<` zQ9(J>Vn{hoaVx~C#L_rdqs;FS4n0O+6){S(9Uca zUX#NT(Y-!J_`T^Nacs@r_1`0%3F7fgsUgeF{jKcCh-Llqx~RnD;lZFr>Z(g4wIZk+ z73WC30{Szq%?e?UlK#-X2QLM#)^vCoi-y7>>( z#Q;AjH8YiMBFJc1^0d2H9cFFoF-E2(uF7A!?(su0c}za0G|^0eEe!C;8ul)$>2C}i z?qwRV{VP-tLY~HdMlTT_dfCPhqcL>kn+UnYx9WbtNt@0W5*`DquWAV!KY~Mqmf~~6 zzQHMOhEpJ1K@%7(lveQ*OUK%B4tw=Mj zgyFI$vPj`CS_pg>v;HnO%^>Y9FBVvryzEsR)M{38dZ6J5%@{M;%y_kAcmO+`%95Bs zqIzV0R_806S!kN*qRd$H&XSSD$t{CFJjFq5cjnFxBcHF7S5~F>qhAjlBFViF!}HAJIhLoH(?k zj&)%jOK?8l%WO6MU|td5#$-fe4>TD{uZ;xkLLB~#nY~=A&M&(@T5=qegD1#poBK$6 z=r@Qs9AT=;DI+!Na|0R7gnaPb(~}HnnbM%d5zHw5_?~bjc&y&-{_4_^!Sxp4J7esz*o~K4Uk3cp+n{3($t#3({w_AZqCILNMRO>X}3{= zo6J=if`Nfy{}gqD#Pgx@r1pT3+`S56=$VMoutT~>z$k6>D=H{WTuq;%oQ~C6ZaRv9 zQW(D5wJllS5ft&65X;FU*Xxcr`|E7~F4~^d?Blh6f1IyDnLjE`1daK4PsTCsFjkH4 zaP&coSn{e-6#mU!?*`d?7+G{OV6??>7hhoMc3ON58t?p2yp3 zO%I0gw-idbW(PA5ynrfMw(lauWU&vV6BLy9~3nMe0|5n(PziyW`Ef zodE`BlTm77nYign_kuBdGKt!)M8~hW)CH}wsH*I_IpRCNxp(IdDttfkYd+KU;%sM1 zuazsOFqjp5j&4yLORKF;?rg(ecEiE}%EkJ;U+&$|K$S^)iltqvR2Wds)Z|jqUe`r9 z7XQKLJ3O!>Ug4#Op<>b6V3It5FK`#Z#Io!8iX#d|AZy7={8cFz+PBBnB!o;4P=5=u=M_1pNvaSkSi%BEP-uM zU^h_f+M)v0BCA`$9gl+FFGQJ=UkGdi^y6BUr#%9x6=-ljcEqJ#P514QCD zuTcKou?}Zen5(2yWNem_{ND{>^Wh{SxltWkw4ZMI*S5{RSu-L&l#TElzN_=uA7{mp zsS_=95@Eqh+GRv|tGaEsP>tf6k#^_}&E*Rs1rTAt^`VT<2J#Yb{JkwnZyA*qxIWM) znutaIv#0SC*vnD&>!&g^GinG9x+Z0sN!M*_oMzZmV3>g2l;t4OSF6X+A>f~O7H3q z|Mksc-$01~PWhg=c?EM!sdoS?K!OtBqa#lThhxSk%oq-|LP8`t6vGH;MLX3H*x8q4j%aQqx8d7vl1?R`lbMI!3r+w27A2h3r6-ougT~C<0=c|Xq0!_$81JIK zCPLECv9RGaqVAfqlsRbxq}Rt_*odvQW_iFIExFLYLJDLk5`0)ikZ#}ldIn3L$hc%k z^Lsw2uO+l4>?;g`Ku#}FB8g<8BAawF$#aJZUH@w0Nl1DUq|@pvB!o=TI(EtNhgqSS zX;7}Xnbq%esrZ7SkZJ#J^x4wJwKtX_fqEfi5pBgEPjjYk0KOZqzOISZYzsf}U$hsJ z;@Fsc<}LcKHy~KZ8wvups^<%w;|`js8_tUUJfhE{5Xpi2OlFg9W@3N?6Y-Z>el%Da zq6&%e65ITZQ)>)PR3ac8P=uoo@hvmUNCp!XA8jdrgs&nOZFcFb9%=xRWCu7V{mDQ# zf`~dc0&5WDo%43RKwy7}kO0Vk%k7~UYf^bVAa8dFWOSIgHhqzkGM^qIMYk`;Pvnk^ z;?=2(z5)3*i@(53Vx^622NPO{_H>JT_;4uuh)x_bsnKoH3%)<-9HEjbIFk1Srs8MKS?hUuQm~fWA(vaeFz@TwLRN>fXc%)Swe!RhlW@lKzigY}E zEk4TS0lbgRSSC$qyft^G6aV*$h2`ZVn*$GJKqqs^J4tPdw6hDkB`cywNOt?j@(P5u1?1hm3`h=E~)ieAR2g_qG|O%MnXBbb)o$Ojy1kw@)fk#6q``U81`(09Qyj zQLOq$m+(#Kw?xownrc8z%uJ~t##|#o=MT$p64`E_K6evPB9n-)wtS(W#5P|9N4ZMCu`i#BL3Y^QTIALA`T&` z$V+@PCO?2s`}P&aK13LTNM$RY=d2wzANaA3@k#7CEQ?kLFeFOUG35=^!rXCS%VOw< zoeGH+m6u%hLDO9^7-|BaNFMb$o**{(?$JgGywhv*il&K%kPC$xdSHE>UxJt$<~ zX>Us$ePfvKsvq*2%&ETKrdn^fxg}?ed-zZ`men;y_|o$W_z5ryWru!QMk|~y{#7K2 zoplE5$8H+(+D=o=tb;fjIh(Z6R}6CA&=St^(cEUMpD8Y|q|;GV6nx`=Ovimx99(|C!#YQ}ne4anQB zki}$nkchezf!{C9&FXr{pz>^}>Lua|92F}Z=xRTa4-BCbUEiqO^JSGBLPI4_Empb> z*-rSbDPA&#b_C^3_Tt9sE~@3k_s12CfirQVJu&pj+^X&2W>(T`ErMaBX3lrk3nCmimtyUYCT)W(A4q{lP(f8&a8SqJ0i$<_!7>h`7htXeDWrd zDvxvig~^Ko}8JJVPs>YZtSAA5Nr93yq;$;c_iA zlCm_2ZDhvc_uKC9_P5!ZC_41v%)UFpq-jbL)H&|K8|%tZnLcL#>u3s{Ps)fGCC+>4 zOmk*7yr@}ji5Y&Ph6Oqj4GFQNqFoO4Fsz}nrx~A(nwPpoPP^e*pBF+x!fg;kY$;FJ zofG}$W8?|S*pQq2Va&2@1g0T6qK_o~!}cYtb@h!7-QNj?gPvo0z~79C{<1Moy1L^D z6u~cJ_MnoVU5hfzd1O$Z+dh5|`dMi#xcogo;WO(6t0J0`+cvch1{;+MWrSKcw{fsE zxzRw5^c8=wv1)k$bB<D3(C^&trYapPYP#9zUOB1!;3&F<05pTWSC+~j3=5>~)yF>zHJ-^1K zaG0rcTfKfrMJLSTfk&jE($YROW!qvnt|+kOkA_MlebqUhY&Ry{hrH=eA_vbW!T#j; z`62O^mEfRI%sBpsDwnTNWV7XmwaWv&SmyQ)7GNrnR!m*VWDi^kph4AB!Ap@*Ow~X6 z(x?>_DpL+*l#te<7T6;xgLFhQ^JV7*$yjiFy1d|@i482Rt(8fHweyNN_;zx5M3VmX z=j|D_5_ZBg-hpE@QA8NFvA@H2RnX zN@;GmsqKmOkVJ>TAYq@%$`VsClVf-B4+nBVi+2?|8vVew$7{lZP?IF>&RCBI#T0Tb zZTSi={ptswyvs2TVv@h11PfQ65h;}1ccv$gHLP%?s5~5(o^ZzO;Ge-JQfK#Yf1T{D zQrmgS%O~_hRoV#>@G@r*dRogr{!)c-_}kAk1fUM2S#g~v{?N!*arG87!ZovKVa)6y zTUK=ir5yMjMVJR^2%gu`GMdG^fUDe&6;X;I>3@0wJlOFNuQ$2h zbnEv}5~~reEn2P1bLmRN3|}5tr&(F+g|-3_5>IPYhhVpCv!jnaTQAG4E0DDdRK%)h z@jgN;Ih~SElJ$HU2A>O5$Mb(`WYDO*SD@%7w<(~V)Zk}zyu7<3Cw#lfMI#4FAQN)) z4@T5xTUGcNg*q!}4JLDW79QlB!vg zQCs>?mh7)(?K;&@`JXYxi*}tE@cccIA$SfiTb1(h3&EM;^-#DT|Aw8{f%%V)Gj8k* zDa{K$0L(O>sL&A+mcj1E;b0KG0Nn|L1mq21c+*;gdJ+y}p3f+!>f=!pbI)bDAq&er z!0@tBQuEzhB#G=_*5~*UZUz}p;^uI2Phk>{u5^~f_OHPp&sYgY5fbF_?vv#z6cDjv zS>MWk(S^qx4YtUL2G1WB7UIdmzTEkC8(f+cCe;h|`+n4gr&%t41sRJG*sj3r^iR!2r1NG>O1asFaK-g-0vC_h3)6b7EgJ!wR(Qjc zTMX=9VxHAy_x103@n|7HL8cY0c{mp`9#3J2nNH)41j(g~F4bt46wBZ%<*Iooi9TGs z0mTooytBEuJEu7xV_jud-8p)DEzM%y=1FLK)%v{`2{*L<>&N^CZ@L+P84?fTzdrRs zzlbA@Wbv|YnY+Levhv3@Jljwuk|$Xhg_rwYP~|Lac_^POUe1WbvVPWUaCs&0OOcfY za9_NoyJ;SVV^I7sog$b|g-0fDbzJL6>Zfg*9-E55rjf^W;j#t{y|d=% z{9Dmhx$mLbnwSqjHmxzcqheRG8S~=Gq6Lt%cTOBk=7}65Yfq_6iKq6jnbc>jdqWwr z;TV@C3*c7FF08||9*oKx0#TpEx@C=)NMKc>tf%O>_v`d!(z%DagLj&Wn9 z{;1UL+CaI^C|r0!_)qAOX&bKyxH%&hP2Ah_?cc|(PjP*HeZeHF<=SwY%?^o9T_1&; zhkw@u(9j2kBVlmFlGR$Rl5`zc+zVyDe#N+6yirc(@Te^k&F3yVZ91L11TfK94SO6E zdjDY%O=W^v7JR!1A_Wf@x}PSu9Nl;%UXT>_(>m~Q4asB{VLVFa%xV;A6r!Q?JjmZ~ zf;MI!uNYgD`u`pOl`ZiXYvdONCSRJ~N4)Nww@V~`)EQF2Tkvd}$VjH5Y2{)=y_LaN6%3wAo0k59r_5ka&j zejH0_H2*=c?CU2eI5wM>J2bmkwMNO#p4P_rCxNQjdUmT#Mv7~_*?LR1m%Jf5myoio z0YY&A1ClJcd~Wdn#OVK=51#)k33fWLy(XP=Onb(J$=;14m)bVUlsn;{=$-@~FCZ1-_$D^$8YKwiMcJl)h@$4TV?7txQ z^Lw?CExvk!Zl`C)D$T}_+OySjTzLDhN?B&e@Q0MQM|6b;;H=kU&)59xGjaRc;OGC5H3Br1-DVz7r4rrMJP<(%J z9vxoG1Y782F1ub?!8Yv}i}_N~^EKyUZ_h`CqA_?MPX3OsFGlq5S9_EXp$1G`3_m+# z)jm=WMulbNFZV9~6@zp5|D*f=UAR9iGDKP}dj#XKf`SeAwf?TUsAN-i`Zi@^W>QjS zhC7i(zR~Srm2#!J!dT7*t6SaC$P}-*6`C_`eeuYj0)6F1O{|;y`@D=s3;8_|k~!%s z2tpx&&ew<2`6VijjGfqy@swy=E?yyi=y|2yl&JIiW$kVdJ5a=Nko~vX_n&|cIa-u7djPp4z@cR54gtleZttBs$onUv(mq@hhM7KW#`E`XJm!4;<7XC}PCV;H;O`x(} z=A{)LDID$@Wx{Y@bGV_0+S;yV(EIN+?`$`N0H`^jDOqfVhoa}FkhKSs;}G@B?rjZR zj2aq*=}n<|C9a}2eb*%2LQUsltjS~sjqI<-vlS_+RO%8&W2y1$wzER#$&9)sBQNA8>?g@(vMt%$t&66_ zU6neg#|N`^WXDcJL`BEvaxjw<6)o-GYxbCZr?WndHm5z0e8Zdz{?=5RWp0zqTdmlL zIF}7(jt3T^;TP?X$Y?3Mn~Ip>^)``Vx*XDqj-OTT?&o?q*7y%p8!_QUP`(rSN>WRi zD8H(QMMR`F!GBO^kFhe%wruC9=Q2?=52D*~W&WntD4aQGmaSHeWHy~&%`<5Wy;FRv zE>5f1IW+m(rCTDA>j(dF>9Eg0ZWg*4dyv8*Yvjgq`Q1;gYjj| zxy@%Eun{i9&AWauczv7c^0&`)vzV*dYVU(JQ#_x?tOC7pT4T*dY`EMgJe7bL$y*w0 zr_RW$1sA1y%D%jTI2u79vxbmYmW@uwUIQwBQY5GI-%ZN`gsZzDu9BW->ZRjjWXow{ zg%4$=?S}Z1-QLftiub9Zw~S`qBhP+rHI4O)VU8XitjEmxgzSQkLhS;j59z`8vFjW^ z)*&s#RC`2eLg*uk-8=UPcK4Lp3rT+Zve&$N=BZlI?|RO+36{yO&eMIf)Hr)P`X$y& z2_o%T3zoFQ9Wf0(!`FO=ZSU=(nwyzZRa*iTn*@T0xjvC84{tN*_>OBl+OA$M>9;#8 zj<*4)o~ayF?mR`)v`GhUIerW|bEEEj49zk%d|Gfll|zS?1B=ay$+dVTxj0Q>zmDJiYo_w8z&m;LUrB zlF{m(Oz?PnT|}3AER-CXl5p-_(qFpu6b~SQo-OoJ!JBD?b$7?SyC$^h{Mm7Arg~vu}-mm>)85(-&m!%w9M;xKtgl4SKm~buOq{ySU&@pYkpo^ zn(O(|jbpBB`;Nn-(_Z$+x)I$zBAbP7OFWN`PXwH$`kjR(so+1vQdNgDY%@F{zS+@8 zHFuy5d)&9kqkPyZ7QLrRrRx3|n=7F2s4DMq88z=Q2B-P>L65-a5>b~-E9%_kwpOkl z8%wBLD=8iyAQP()+@&4uWx8auhdoZkt^Pej4YTiUwXv4 z2tZWm)W2+{?qA?=N#Eh)wX<4OT)n+DD!^J9hgO;tsKLkM1(q}+y#~|TtWlVMPiI*b zKeZW5>`=g_otwqB+N;{Udi){vC*UIDT`tyhmO>4Qo6`~goRDjfJ?gY&e$G1Dx&liY zrfSG5@0)XaQX0RHyTjGJ(QB!ZN)9JXfWz8SH|m9eWQ4Psq;b2eV&DpK2 zu1BR&S}5G<>J`af-2_tPxn4n^YpCMZ>uh#%@&OO|8>s7hiygOEBH7(!Yh5dK^5@g9 z46FimlPKDwh_f#fCp7bBcYZ;JS&&Ch^L6)5UcD9wlu4=OT}$IBvA%Sd9K!g#-_23` zIRqu;qvdp%s_|BZkDy~^VM5KYDt~&UZ!%DaR2hEgC4VYJyJ*K zcoyKBSgMsw;IKtydAY`D9DTR{cw;~(bA%@1WkvZAaM*iJ>RrlYymDk_8N6Nzt`iW| z(-OYvT-oqmSx-sgZLb^(UEm67Me@)l)f4@aLA+Z+rc(j6cCQ{dfXiVpm8yBjUW&5g zZ;eOt&?TuCus603DkBb_w3ds$|BRxPn5LTvql8LKE`+-Q+FHQ%J^S!^04#%q9pSd4 z!dGWo?1lRH8U)_n-;tQ`BT`|IPL+++kYEnw!5KY zZrsxQ{&;LYGp`#=cD(VXu{`1=piJ}`Uhm7HssjpU?u%kGaVJjMVYOftoR#TZw4w#jN5h^+zl{y>K*JtTu z64s---FSmK?E=u5tGVq%hAaKrSZXyEjgD&utsQ%_p6jv zfaEqe;Ph3(7~6;OMw)a>*)cPQ7Et1fF{jxEi<8@(*ZO_e)Z$}l$t4k{!ocN|StG1$ zhF1=Ml;2OkE-H09F>+}P5e$R?YbAN+WV?Vh?yrb}?2vf|DU(7zg^s69nXcqIN8z)< zG@c`D;BLs&s=(`O%rkrE7$te54CCO3FCcYbfu!px5U`)j6M8)GmJA+aCz>B!->@Wx ziS3+7PyDr9Yih5FKXEv*W35XP_zMFoC*-EEb^QNe;R2vrPW9zSzLytI!0#(zWH}8W89dx9 zWOVslp2Tgdb>t7%#+#%9FAF{-9&?3V<`xuw1m-{S$DTvd-||T?f-zYliOrtF@;mY7bo(aRn>>I`FXqv1RhQjihal>ng#1Jtmd5GO+ zmGtf|u0n?)Q(KF7ZUd>+l*7-(uJHIXaB42Rq5ijb-Tip(fhMBK?*8fyhLicQ59iep zALh&0oXw@B=nfd(xt|nfxv({nsPLR?MdB*NyQ^Tv5GtdY%F%Y?t@QA&Rff(d-0M-2 z7_A?7@JhqeyN}VAELLNI1a}2P6K?QVmFPsDY7`^LQ{E_lKPM&YFQdY4DRyXxX5j&D;Pa3O4=ozLnj>y$emdmWs=RIol(;wI`0r zRT8r$*jQeQ*T-C5*-tACnWJi5G;k7tmj|!8Xx!?8$#71Rlt|TOp!s??lpTai~ybE2yvN>_umu;ym+ZgJO3H^A+Yht?Y-jHtgU2>j=X{8(Tn-hP-eXG7B!nE`gpZDqxfbIL6X@PX^nZ`)B-t0w*?F4&neTxBYEF2LKH-E zq>Gg4)194T^6u-vNJRjK&P&ZrYu|ItO*i%rrRp(>{x zoTr7~yRobV3%0(a12fj;EKf*~_D$YTU{Nbnn_`b?^UNF1B4rXl8y67?+Pxo2Nh5_WHpWfS$Hpmx;W~u->E4GUrp1^ zz%>i$?{<70BLfB=bacICPR$Q6XpRoooScl-d2zM=B8c*ETb@~HdrPTU{O^ZwKWj~<)=c-{Th zNWmnn)h^u|HLqLu8-sHgGdi8aQ)oz10>mkoA%(HKvU7z`|{ z)%bcr^RCba#`8Z_nj4vMyR%bJ4UYRn4qF{A|61Zk(*99F5-p8gR>fks^w^^YKs*hV=mpsIec*;bNHH3Z@N@{NgAe4`)3{T{za zujEOuoHh=Fe95I;Y*QAt*PG~8u=}kO6TDU&&?hwb6ZrY%2WoXO#Cr)^|2Ygezt~?( zuXKSY+oh=Txn69dSz{HtU)KE1PfpvsTE+*9-;8 zL@<(D@oi-G%`vmPGJJrp-ndETH~)njN!mmOovz!8OoU!tvCj7Vcx1^l&nO~`we(Zo z5B-NxztocrzK=<|P2M*HRelgV)vJ%_q|c{d7rMz;@fj-tAGk1d@s~T?{R0BleYd|Z zUL2{yqi-wpdSt!x09`rKr$OXm>9jAZUhf+1=yEg~6uR|+KT}yAsG<|dtzP_U3je7s zJnA$k39+GbRZ_mbO*}im`xm|tct4j5*svS@SqnnoA}duC^i&R@9z+~fvo9Uo6X8;l zcX>95*?St(eyngMD`UzRjxKrMvm(p;IoBcVjw-FCC?&FfLLh_zq1$p@#A`X4&v-o) zWVD2WQTih0O&RjuvF&!3Y-f%QDp?Ns1}R?HM{_cwW)sJiW)`UTrPbfjhTP`%hP`(m z$GUf5`)ejU|IK_gnUr)KFzpLrPMiD?M}sc`OFmhAe{6fl)!#q2uiZuyJ8b~{ZOTy| zxgMk^YkedNFr=!N0JgYAl~q{L##JdR9OKUl8j6P7%CoMqOs-1erYS4zR?Gd&t}n9h z+@Gc)Q^QF_Lp6&KsH`@0HPk`aCX!Af#%?;h4+GOw$m_9oa{cUnetHbz-@3YMylrtZ zo3m4H0S>n#cOnL~2)pQjtr)bugRX=sBeY)Ub1vP8A6bk=Lh1CsevJn~UNER^`AVGh z@gR~x0p8o|9_ce1qJUzzRMH*9(3y(~8*OobqzNwv$-g(FA*E4MkVx)Ms~ma>IBZ^V`)zks1B!vA1?ugffaKL! zORQ-Ga);c*=*lSkfjLL&aP7AqqDaPgp#<2{c3bS1l}e+?ZP5=PoUX>G4TPCp(6+%V#KVgvAp^847jsI;H@8UQi?1^|EJY84#XDe6(A?$ArgJRkrZu_%AtD|wj|zE?m*%;8|0vtjZKH!4h2aBw=-78*y7Mf zD{Z|Tu@e-OcLhu6+LpcZHrFYJB7!;I15BHSyN-YFj28xt6dB3?!hJYW#tt`v2I(s zpO%qgM5DNRGa}eE8MJG`;SqR(ZC{LZN{_yB)rO{n8IM1d5JmhlVmW@PAtzzs0w|JZ z-~#==_OpMHfSkn%+9Y&=>pClnU17FNexmn(MlEEGHP51AFADjFdI9?(4JY9Ddg7Bi zUdR1fIHpt|a2Co(DK1_!tdW?P7w0=;5-^mLzR%NY7G2oiIj*p+?97u$Ra&sG6pNFg z4-~$NZQAt-mFPNu8_op`2PCvazrHHca?$HJUf8^KqJjj0gjBVnS;vGJmZkE+mhsbNNkTGz7;T^~WpXJ;$M-?yHZosf7fuLwepOI9c%nb%ih2kQ~{ zpuPJV_Y-OSSk&snhvu=sZoRCfd^B-O0KY0_ADB^piv!kuCE4bW1WajfJkv@@;7{HM z;+XS{i5?ap&5*d)h^#K=CN+JU3d7^U_Z67^*_AM_k*xq1k<@`->QnwAmY{{jfeC5b zLS-Ls#yZVgq8gux{eCbBt;d;?^GQrWn_U8-?IFLgTXY*N%$^BLPd=t_A>_-OdjbfP% z7KZS%;F)|g@n3!HCT=ZX4NKsDgERq2+T5rKNy{&&jh`7uz$@f~zO2wyRU9jWrY`T7|-uF$qQBtg!7Inde9bTH|x*@wvg=kCxLvg{B1^2oz z=7x^Xe0kq6Ab$c?F#&rYM;tv3UHSYI-BPX6ga~OIK9Te(P=QF|#Oos^%G)bE_!CDjXM{z#x(&@mG(vEr$gQuU0l$`s{HRR*wOBCWH-T0nY8VSh5nroE#NP<#HES;;EZ1JiS&mtb4eFM(|+}DzOwxf1G-D#mw#3BckfWlkLRy zA(6he9=a#s^z$a!5tQZ^W0drV`wdE$8!SET*CIW@IpNrRAy=r=Y*4L@=#>{YBG@_COr6?OI zy1ga*B?wxW=5w+QM`}7OvM9xIMe}xGV^b0X4YA9bltKFkZuLkc<-0b@6Q3`iFpjlf$%j{R&DZ zMv0th=00-nE8FBoQ;g=Hp;3J6?`#zI?VDwyLLLpAuK{|uzw?-UOM>3q4cwB_09^ zO1ePRMb6~d|dx`N~d-xDRtFnLqZYr4~;5NL0zS|!K$;=^3 zr^}zT{tYz6jmZJw!2TbISR9;&{2-^xWDs!-!cAM-(F|@y7-4(z^rs^v|Hs5k$dAgb zKfC~pyDs|fka$@zv+e&4fea&)=Lbi>{zx73(UHHIAf>-@$WNZ6eX}>|~RS#_{@0amnbe2vDW5fFUAYZoRaW ze`|`}@YCMbFI^#8?j<6H9FBtqT(9rx4D|y^UUWL<|0+ZiXM}8*CCGcEc%ytq#WHyr zO0N5knU=h2w~r@W`)qkng4d{rU~NKC1x8|v1UVd)Hmx|+9m#lz@sJz%QB_3I$Vc{M zz1TICZxI%Pd!9TV0Bw^Xr;-{i^!nVd+{7P__ktM>Hf5NJbe^cux(vFDw zx%_n#uc?kCJW;YZ1PIIj^w)DkuN$}1#q>8rWtnCaeW}^FK3-5ML`AZRz3O>Wl= z^BUFs?6s4)&;{18qXa<-z~zVQk=Q#OD*7n!lE0$bL+f(q;rd}u3HeU%(Y5Y4QGJY4 z<#Pfxg^sJwMXGRCu_U3OjF7DMu33;UP{j%4;{(LH_TCA4+Y8~Qbp%B93KuLGAyX0Pit2oLz(X3MaCvmpx~G=@>klG! z{Lm`57%!Tg@HZ5#hZ5UH4oyOR67ZAcJMnL0Q*PuTH>mtM9OOVH*TCP`6K<|Zb~7O| z%?XS8jUg9DZn>`X8Scw73y^PSAznCl&BOZ)i`p z^2Xq+04f3tDHo0M2hzNcnI^xGMZXy705f!=b`;dpgB^vcyTCG*jlwjg!CXm`d`)9W z$LLNA#+dA=J0pT?onjhAYuZ-9!pg4&K6pWWU0BL%TlE9T)oY+=HU zc5vL7+QaHab19u)_)rQ)H-iJ=-aii5k2G@P=p8A<$HxU*Z`w!iETSNfAwIw(irk1; z!4+Ax`bOqD+IKe_Ambv$PzU9!b~vYRyeyM{k+e)zM!>bcb4=BR4CT^6eIyIwPOO-; zhHAiAa$PU@9N;lM(p+5K67ke)auh8rATO%`GQnRFx=>#?&X{vDp+dFu6V(F_0{ ze&SzG5#@Dg*AC?8PXeOLPJ__}Kq7yV zjQu<_4h*Ig7!mMVPzgx&io*g*(rYju4H_Y=xhW*UA!NZ|zzT=?>tgN;X*{)sOCacc zBfb*arDWkS=qc{y!vRzHIz81J)IZ-CNrK7#rPYEkeOv!SYyaiqkS2_<&74F}m&g||X{_(~Jl#HRe zCbMnDZkyTEEr}@5NP?OzcUnSLBqLDlYxtU|9_22b0lrqG2qp|VDkOqieNbuB?*iso?7XCsJR2!=VL_)5 z&xs^4nwT-};E2BnOUSpzm)Iu_;^w_NqW*!mhnOKBlR&GZq;d|+0av%S!tt=bX#@`b zZ+}f(7%Se?dynL>e7fk_2XKxaR^lxB3XnRu-xKTEDbU8FMr1+P_ z{56?%*W|2o!EpmGx<@GN3o~!NfqD^((r&7BkNutr=Cg-qq-}g*AJi?5xCO^A5sg|j zvCK|s4EQtO8R*1Q^%%+BGLP48f7r7UeRLz%XoY)0C>ZOeSzbR!g<7CRK5<0`&)lDjdPv!5nxfH_R`;4%S z!VB2@`?H2lJa+IY1_v@PInX)5(a`E;dJ2U9=Hea7QeCGAex7qk8MLDOKi=LkPO|1n z18v)$wr$(yw5M&`wr$(fwrz9Tc2C>Zt#@^I@9zKW{ZzlIijx_UdGchQh$o(Sc9PZg zX?S6=NN`{9<>5}%cRiRM#RD%jw1Khbt!f!P#k>6>X6|W(neDqH?Ls;KWX%72-%-ETI>wjJ`Z`PV|w zfWAn9VY^HJCk*qysnsVE3s4#V4miKF_FoG9|2sVHe21SaTPskTX;8SFu2((Qt+q}7 z+r)TRsATF)ic1*3aOtm=a1_3JuW<2{tBU_E`H!_9=TN-X_gB;=uqDtV-`I+YYIu^U zD$WJ}dJ1@xq09-$5RWWYa+d$|HvR{m``^aSU%c-JU=kccBe%=`<=FL!MEo9}eBOCex0z=RL|p!UrB|7!aGwuDIb z&y7Q=(0TQLjOu?{H-mKJ*rI&>=RYk6LTdB=;>O$b5bhh(BMpa187m5yhvJ=s(&qNc zLAYEt`U>D5?{NCB;j|9|7`+KpjQDSBB_Qlaz$E5?#m+Kg0HKjM1Hg`{pgp2fua{;h z?z&H~t#&5~&#LkMu*0Eq+y7YLfWZw0v>~hiS2d;&G_FslP^;b{d4BY3q1S;gvPLH| zKi^wpoFmDN7;B(bT0+9@Bg)B{y}b_ow&RC`VBOFZ(fu4!2v5 z;~@+w0mUOWbhVoH1GI+i=vHa?O;#{;kDh<6qV#6#PSXUu_9e9-yhlT_b;q;p(N@G`ZK>Uo;{ zV#i;tdgrq{@QJ;=kcL-CQf^-|;_Mpn&HO+vr=-?20NYco{l|g_%+#TTP=Ll|reoOX%vxpIDaJGKs{WQPR|fS+pWa=!xW-D z&+zabs`u%&Pj7F^q}Di(v<(-t1JI1Bw_+HvcmG~&fjthAAA=ibb@ig1jW28VRBGhC z(ZeMy>^P%*I&1u<%qBFt;UKU_C7;R|Kbu!N64gtCy=HYrI6sECCU!5yGVUQ1x#56P zwU8CjF!7RpXGUkR%;VW!U#72$j@FUz#fjw6e#ysiZA82k)oPc)0VshluTN;DDlR*_ zt|{@d+lMG?1uvyl>U>p=c$(D~DiknXapRp5YsJki*&cH#ArGdaW_u|dd7dzaLnY$V z@)%4W4&Etu!fbVW#7|$^!)$P!sIgXFPHvB7nN5%DN5hz|#5k+%mIb9x_BAf9a4AX@ zVlUeVpCNfGZ)=CPT&fnh=!I%@V`QVHVu3dJ@K3k4?D*Pixt1$ia`>JXnJSNtK1cuV zMh~le#+X^m>N!yo`q5Lbcg3n=9Q=~L!w&h29@EDc>3`q4?A27?p#fMqf_F%5_HWcS zzdFL$Y1iaza%*IoGeabWm^h41(`LU5NW2tqz*{dh)3BSWX*beWzn_k9*Bf7dTL=Ag z|GJd;Eqg>P?&(J3X1i0su=5cVk&dJ7hG)6h6KSl`s81nB(78FbU8U?|dFw7`w6PUg z$)9mA_oFeIoo+*>{|IJIhCqNi%+-!t+7B*If>4GqBSY}?RS1&$Cu^Fu)@L@KL&k_V zdypWmkRbNs#ZEwE+O*x|2{j%8Dq(=^0`V%kYCZ{Or@K2`60@*~ZmyD5Pl_S%6< zh1#Zgi#|x_`4CfPuMMBvMqQ$57fbq`@ie^!Q^qBqDb^*g@6Z^}N4t8t>A0h~jv5UM zdrcwYH@+3AN7<+HVzaN4W}6X7_w$Ovi0}Qxae+WP836#hBy|13pGj;~NM>cex6c~+ zo=n#mL+BVX%6oMHiR#C$Zr0j!e!gS=JZ`jja$*NHgiv*u#6=vtsjIid@>dBzvbPPVMPCmGL#$cp^6h+vl|Y2B6c?!$z;-kZdP zK_l2vo%%o#pEQ!!PwH;#$P8$RLq;$YiER8diFIsxw&B}H%-m~~YKJ@`+EMw!&k@V$ zYB96g+4u>j1K%~1TmEyo$TeHHHD~#570z}gyrSm~ZdiP~I76XF?CaH0aU4O;{QMbJ zJ2k1Fr-*484>g2$BeyGq)?q5IOq#3WaXTvF#?>`834la|709E%;FXj(uE|HGVOPx3 z<4@u*ch%GxrH*MN3%_#B>rMMR7hCI#4zhmcdp_<%r`TVLSCi{iN=mP8m(5G_TxnVB zQdBo=^~%j~&ZL-_*hP<1jA#yag$&q~9pkd0w%}p}HHmIE)Sb+q#W#Zg)W>G@R-+{r z>)&poDRpDfr8fn9z51}JTKo+C0A-m^O?eL?4OkWn(Im4Ne~=Sq_P(2pqGzMRJ^#h* z(-=>B{E0cMjh+Z5Dzahw2&HF>DYqqALXA;MTymG0#I4hMmNbFnx?2@bYKb$+<94<1 zV&DXQI87o870{)@X9p?w=F8OmdZc_@EWhH1&#Ww&SP>mpo7Z}n!)Qt5bMtxsQ4;ev z=)_Nd`p1c$?>Bz;FUiESm`TNLVJ@%}sjgbbEv4~=1&8%MKL-j)(0I~er<05mJ>ff@(&tD%A$IstNtR9+(z7ph(GnpUn6CunF zcDe=FOHlMOfSb7J`}38g8jEv4!?Du`vqleKV$xGuW^>Uk4dxss%Xgt?i3nA(KGWOp z`$qA%@W1BR?C*Be%K3F#iHC+SY(&h0N?osG2Tk8o&_uu^wZ8<@KeYCc2Zn^cB|4?M z|FGAf4S*U8UD2)uLjhCW^anEuC;IoT4xzq+Zvb4MN=M})kDd=~Mv#eMU=jf2qQ%&Q zz~5T#i=&bbMq!^|160pX?D)V9CVLBWk723YWiOA&ur23tU|~0B|8R zc{~qcF@Ck89;@A49qNLgb*`Mmlk(|D2$h+C%*$ZE+ZQe!>3Ac&mXd!h zK}@DV41~h_79sA8Za1k35Ca(&;uVDvX!Z4&>asPj1zJF~EYScCvc z25{2>iom2uu6K{;GPaLtB7A9l{C@AWq4G}~Ma(Vg){2b)RX`$xbj^-86@o4Cj@j?> z$(G0KCN!n-fH}6`Fy;i&VYKimbgs}gPs_In&|vw~R(mq{)C|c-EM4^$JYnmU=Vw-p zED_O(E|H^aE()yi`P(|B(3yr@ek>MNcC#(%H_p8Egp-7~Gw*y^25DFe%oqj~xf>&$ zG8F$cCf8z#2V^ReVeI=)yQ2cZke;tO~iX4IUC|0)Cz?LNb}{7R~0$lKU@t z_bb*XMP5bADzUu}-_4%LczbX9*opnc_%<^|%WgS!-QI5HOYyl?8!A)uf(zD&Jfy`z zuO$uxnPiEV?V;5wu4$7-m^0FT8_a7r-bHHG%T7|^C>LSB_JH@Hf>DgMRt<>wG*zpF z$nMdTeddUTzViz}n2SB_e`q@Cx9UR_7L$Cp{{E>${sO=wm=e<8IKnlOLN(cQd#~v& zk3M*A%=HLm=((MXs79rspym~w%)+z>+=CSw)2)C8EXOcp-2>tlTc$r6joClj%u}1L zXL|@Hh|(E{8`=T2IHVucHYkjD4qYZMXO3>8PN1==XW1;NM){a*goSfQf5ig!#>h^m zEKiPWLBiJ3Dm{9aN&+NtY1g}7z*2$iu6CQ6m-6$>R`noNM2T@-pe)MEh2U^5UrCiM zV=IpXF;+i4zA_PP_~I#~J4IDBt5kgkhUOLTR;ma)U1Rd7CL0vmS0)^2Nv=$zWko?@ zkB`Q!(N8s+OB)WGpqd_ocX?Vbe@{8W}| z3`;Ni5(b2dM26MNC5_o!xqp^`3RXBI;AhJmrzMtrSdJ}xlxr%dI^v*ot{cHxnVoZx z{19QsAdFGaGYCkdSPY?Yy&Mj$Jm*vt4#UHI$pr-%_0;k?R)MD`@M>K~|^8N?NAvn?| z(>mH}-`xY_zI4oJQiXOiVSrP{Q@^$Os?a& zM2MLU7|}ey9>Dj60L-9G!V+_p39v(07^&l}Qv_20P?`)!jZANSb&veAi4E4+0A7~) zbvYxER6cl8+-EIiz-;1xkjGz?XMu1w)#PN8j~m4Ov%G1m3};Q+u!<3@oa|0lF-HII zbh~5OL?c4msbaKnIw&Y`GT;k|;b=(Nuo=Bx!*n$wfr)-U^WGEaOwKr!ayh$Jzl9sj z!U;$1KsW$f%GDd|P5qV9VeKSJQb`59`FIzBUFhR!62s3Cxbl1M#hZKI3K+|ATQxm$A7)Vpz(^rKBrkF} z!=UrAl!jsz6AoZd#bkCqw5K8&nL39vA>Sz&kU+|nYDdR)I#nEM-oO_68Pr{=1e|iS z7s%sf%}*kqdkXB?*~Uf>QCYnPFlteiejoGj6|Y7|^SpUJ)?JDKOIADIqKD@3N+g`n z&&Sp)r_aHpO7S(>%;~u$$spm)RRu^%$1V&9J8OQt>3ce#K|Qe@h@EHTb4?Z_hvO{z zd7naPKAe>;dOVqT_+B&}c__JaY8_YnjLeK_O87laCM}q{r_F=nHFG9&)f3KwNm^O- zjb?VjNd|!7tX$19l+Yuk&xE6>uhe(;h{#PiQEXXSqY z48&D z9C%ZTfg;wZH71QMbb``Z zVzD`6V`>x2U?!*kC*z{3Iq~I#XK--Lx*h~R zOkU4tEEA_?obsb99sEl$nOCthBIjOSx5Fp=)I2!gqsnjgVSE-5B0AA_T+z z%QgEQ3l$={3?awVLXV~n5tlZyDq(@{w@b0{>B^IX#y~k;UGEPZxtO&F7+=jV-Ogkf zrXP#dLaE#pE-38e} z>wQ^u*^m_2!zHQ4BN5{1=LSX41HecpZ7k3o-h{G}aK%+Lpq&5 z1%@>8>IhKg_%TCR7T-$Evl}9N z{g8L;u8^Lz~n6jlgCRatk9NN(49FKaJ%vxDYq{&vF=%@ofYhnp*lNdsF>4DF27?%y~@ z-WANk9nD3=a+c+C-HTAX@&CB_19+=Dl(B(lk^8{zRv1j9TA;>4Omix6GLX?B_J?Dk zcW_>-UY1s8NCP^@`I?kVKf7d`q-u1#gu-0&k^ywX82plvsWTGQxxdBk$!m&U{c1T1 zXTVAVU5E2XFeG&{)|}0cvTYg={$x(mJRy5W3BsgJ$q;T(H@smzZ67>h^uw8y ze11Fih(U2y2`>AoEEb8t)eHtlf8@0M=MP>^JMSW=Y3|O=ybBi+FENPp?YhASlU9c9^u??-{0nvAB*SJqR7VDdj)qqS{3Ke zri3DSS7L0^$tL@!&7zhYH}fEuNgNrBukH&BiS&N1?@amjZdH&+1H30V{OWTzqiv|6}0Nlndvu@>s+oCOiU7QomB>@ zXt##nI7mCz0S(bk$SINtBj5f=0f2KFahl#w_KLfS zKPUwwsJtp%7WKj7SW|_DB*Yf|GN8)MFru@!vzVgo)G4Ka)A70mNjuMI`FgwxWffi0 z+>5$n1{;_GHS`~8UJ?gAXSZIt8K3E-lUz$>$JB78}*} z_fNR9Co3?eaG>yz&y6_cahQ<5rz_SyU@8e~fj21bnb>Ys;u;O_e_oSXYU4DV-YQ8O zczthZiEQ*+rW)Xh1;tVVlGMoT>pbH>bNwkT?#$WfTPu(d4p#Rr3Unw!Sbtj7i~blz z%qapHc3cZVXD@Tm7I4~pV(v(lvq~nEp3Z#bDHnYWWVIXMrmD5Agt>4V)|&`{hW|)O zA0+2_f;JIzO3p{V{+=%7QAFu46Hh`?4cQpfxC_>ETrvNp^wVP;3^MFW+Lkk>CQ-YegUDiaiC@RG1-B8xDcdtG~ zTuvw0C1g`8Or=ARiqMM@iz0|J-U|X%E=8{*yd*MbZiqnohjr{?{N?c;Zr3f<(g{>>LH7tK6>D8WlIUOnN$3xNVBFUN8u$yg0m%E85YKP|H&iVC?G zR*MUhRC~uC@F9ETFlTQrz-||jLMZ`RN@uuljOLR2$am6y_QcE8Ld4d}(m;juRs_|% zNQ;B)qAjK`J;TM`dI^yw-M=G~N(}uhdVjm93kmF%I&G(Gvm_;t5{d6%z!cR~l95Fn1Ii(YTcWl2 z^FlxGIjoQ`id-O{!=)X+te>!vX5Mt`C86gj0f|Zk<-&XVBtzB#?s`9F?tc5AN1~-I z^{y$>cBD~{3>zq+2*j` zXJ~+cnHlt54lbY6BxUpq=yM<}c6gl-PA2rO2fT<1BGvcP_Q4|CSk^6%&&ncE1yCV1 zvFMY7JLTkIe3OLjDv)RS0m*4Ms(ch?cR2^V8+XnwQfsK0q#gYsfq*^*Ed<{y;X`)w zX`ns`b5FuSGMjv|PVy^$etaU&9&JJ~x6yY*C`*%B<&bz%61!l@&_csb zhjmO}P~<?A^5_4U`V0vNjAVT-A zoEBG8xD3t(*dag|_*M*yA+#sMx?-I3_{gSn$@tI&!nZzDv;i6x3YwEOL@(Ji2SwJG z6!^Q(8)E;&uJ(?KM^50FzW`6#dw;{cfb3U4?6hyGramreVBqnUgi zH{ydD3UcI+V$KRvOF9I__lo7u=3FK$@;?g8$t8PGjlfi>NcKyR#SM@gXL-zu7=eIF zgva%Oa_`!@f{qXkX0;cFmBZtV3|ZWR67$hqPf84sJrry(ZdoA(^#J8^c`e-Y$Jm&A z>3@}Y$O%yPMNI^MC#YNs$FKbZRvBt+CJe4g8*qWUEIoBFsFPPU0bCE-|BBmfADV!+ zN>zCHmIAeG%wvTs6N4Ts9ikVt#QP&O4&@_=66*5ncd(+W3m{IUQ$2x_beW7oHfIR* z3M|o3*sfnelupv2Z6r}}17AqIPIzJUYGyOUoH!6C2?!nq3;qm-k`+oOK#3<`MI?s8 zCYP=u;2|RoU+-}^<3&X}A=^iQN+2KnlCTnZR~#VC`!zF*G*ZMEh8hZ>nO4n|xnQ1{J%lNXa$l|`WSH`!gWJGJWaa@GF)!iSh zZBTJ*Dls?D>-ewuu~BYKrCIvI6Z7-vA7<@R7QIDz6u@arzG3w;Fi1Olqf?fhN|~w? ztQ6ktWZrr8U@0xDwX71E13(rr=Db-c;8j@mLLo$?_Pmk2xw6Uk%zNc8{~G{2Sta@p zN=J?9S^%Y^E967yzhOjvLhV+nIjg`~C9Q_THtW%m*wuZ*k&~f87d~mx8HB|$_Fmly zI)N5MU2bz$!#v$!dB^w*GNIBOR{;VFT)mYp=5>U!^)$3PNAI;y1jb3fmz->pIO5IN zvOH~VgV_hINtlmKiS_VvA0QK?3c0}OSm_g~8C9X<_Ui{x?afm+89?#~G64Sh%-}w2 zQueD<8Cs*4)#^4*o_nk%JJHtw4S6*`zo0pl(K^w!Hgd&Q7GMYP0aC7C16>g0Jks!6 z+P=~wVV(RL=TZ|L9#d(1OnNjC0J26Ms3=$#*z~mz97oSfc5;YPMakADmAanpmiP*S z6aKe5HuiVucqm%SUJvN7ChEhQH38rzS;6FgHom&_d(G-1?ewjWyzXM7 z0Ge^nNxKTUm!l1+Dukj0iS#Fq=LTDRAa`lApcNAYv~3FwR!1!3Kb(DQmntrJ z-gO;EP?>T_g(|K}a8XPeaa~v9A^F0qs0fAz47f&83rwYm)aG_^@!!4z)cfbx|NcP; zN)pcndZN=<^Y2~e|L+gMOyYb|smy`$2&#XS`oAQ^#RYwmjStJpJbFFBN*_tN8>qQ* z3cCQ=8G4CvE(-sn$N%VmH&s}WP1?46v^qrff2;NHLJClniu=%b-KGCqsejj_6%EAF z(@BQ!%1ZlJdi{_D#SSSWrsA#I_^2s^A-|$_G8gd#zI5`qm@4g|VSA^nM&dz6_qsw> z_u*yD?fAPXgJaU#eHULh&Cw$|0g{-l6u(|Rwqm~~;QH$!h{7Q-C(&dwK{=1a`8Kj= zdc6+OjK+@NJFTSH90~=G?c2Pw%p_@|=LX`wo-5?nniMtgHJKHF0owG0+ML_=l9il(cWG@&fsw$UUYXc_AqO32T~H*48Zn|+|0wJ z?TX-bq%>hay6P5Q**0@>rz$Hyd2yNXS4$gpy91nR-y2c8*L@p15~?`7(th-{3t8Vj z=WsFhv+2B-YjHOvx9M@V98IZ;FvWI7o=M*>zhe~c7T?a#Ht9GX zD!1~&CnG;s`fPrh{-C?#R2z^To?GEA5tPyo1d1(O?RLiy!!}v1Au}wC zbZ6P@MQc=4dL?1!=#{tKvma&0z7}{VLnAqXs`H_2+T<~2KfG8I1EVmU+k9X5$s%Jp zM?}>yV4!IZF(&U56w#0dt|N~$rhNB6VXV~BD)<-2iRAPU>4%5^46okP=XKUvaE5K% zZ0)qXB|8_)pDVP{C9%uuXjH`+JDs)4ZXsYwk0VlQ7Cfojb|G4jvsk4@Ffzj zrVLGPZfBR!M(YULBedIIrEwABfFHxOn^$Y5qovOunT*n+k5wo45D(ph#u=l09=;eKy#4-FZaNFW(}luSA~e}6bi`A=y}{a`bo ze2zfNi;%tFN6qM`58VbliL_v%^=4PdL^8D$I!$sBt%kNa%rEJLv7ioA3Su((>9eI| z+IoGb$!pu!H8ul>C}1c0eE{&SGw`hUff6shF`6e-^+I&~0#ks{**B8)xBT?BZ|c|i zS7g3&4A1Hkeh-gaye7+qI(Lsjm@|eV05PeRr^KsKFnM%g=jQ5G< zl+u9FN&m@loy7&%NHIDS-jn{7J$ocVuG9RwDFm&@o^6Zk4Yc8F=n)rTek_f-E$;$lEd1~x3@rPwBw6q%AgLGHqGyW&!7+Nl<8f<3!jAJx)9vX zn;y?BTa@DQ$-r*?Ry1ep=96=s#iJ+K;@(3b3|LqLpV6NXiat9}y2Zj+VPz$UET}it zd+DzWqN+!JQSCf$Xw$4T>Hl-~Y+H}kgZK6LRrnwv*!ci~v_*(37$)x?0c>x|Em+;DCGWb4u52g`*0w=WL^fhE*`8+L{`FP>=qzE~=cC2xjy{gBIU>C7 zen+F}YoqtVfvH}#+YIx){%R8!idLs1`396~zE}#CNJcPz7xK<{ES^YMO`B!_9=T3&@aT zVmKg15`okHp5rDTt-NNvn?ZfxoV`UDZru0=ysV9+a6Vt@Cz>6%3H@=gc$GZI z$7to8U)bWo7)!(Vn7EQCQ`vH-ucf;o2-XR2OSo5Uj(-)Hf6@E7SxM_pBk&%$>_it} zT=$ahVRZ9lGe%_=>FZLvc%d%OQ6D1pYL}(T7SiS~$s%F&R`*X*t|#45*pz=T=^p;>9FC3HAL7%DCnsV8^Erb3B9sMb{&nhDbr$WP9YWV zD@Cr9@1ayGa>rwR)p_(R#Y_lPzHhs{ZGsao>MY!dV1o?SSR9}8J%yG?YB#*_LEmDm zWWalw)$@yWziJ(FQs6^=;QbyF1cFqmyhTnl%5)`|t7$)p;O~`ywK3>IpxX3=g2a1L z6(22x^WMF>;^SxsOonBz{#rjF0x2}a4V{3;(j_f-Vg4l(*lB(9MtbxXRnQ*sqxEHp zOAEHmB-iplhc3tho`5;QevS)8%{q{q!Jqw)g=cXXslYCwEMpui2l{t=w5`D;WVPwW zrnad3X#6T1u_;^+EO7!4|0y1g9%fK^6IFzy_e*#HKy97!hUm>9)^(EW z6S>~nST16_(G$e~y;t7jK6L#+HiJ9J7xxnFAOlfYxlw|2dK(0uiE{OKUN2^B#4!`KKku3XA_w67sx)_(!b?>!T! z@pnn@OPZqf3RzVK4*&KxY&R%Y1Hz1Ixea5<;|X|u+H#)fCCIXv(hW@rsW?P1$Mdt* z=yY@MfO(hFP2DOjXu^jDWAc(wpA96%b!uqQdmn#;ild^EyvxPQJ7*gAw?i+*urW{& zBOI@HN>L>{GE~%Ejuww7l}cs9l(q056L?gHxxRo?p(A{DW=IwpgXy!n3SZcjamV<@x85x7Ezr8{?F-3oH*D#XRN2c@ML~zdvNT&A>vaqw1yCVuF?)r3G z7V-1mK-+W84c+T}4l_8ruX*;GCL-3Zn$J$G1xXnHjOmE{vGw}NpVWWdE;1_mUg&<` zQCJQvz(KeZTeV4gy@D)H;3I~jOFe;&Og7yn@O>0L;np-Xj^uR*`l8m`O?7>3=FT>dK9C<zz!T$ z*?d&Udq5l7r`N_$7FiCoNzwi4QP+D&zJhD06}K<=ZZXzJm{I6pfINfLhSzLSj~BG7 zc2vy{83kR_Yz{vtg8*!3_Nmvju5{7jRrjE$2BHYd{aRlM(W1ruT5LX1(5uVo1DB~} zVpNoXwLNRPWGlc03L`t7hL4)~rS9mYV3F!E0*m(gMB)&jXm5_DS3L@U*m3Yt}HRcqcTLeIR%WEu*5l4@Q%#U3s(8J<6s*tS!HxIuMU$0QHS z^%4=URQ)iGV&J=BB3Q8K==^omcqNmJ=-tZ`&>wNT4}~+>CJDtI!MZ`~v2C@5Xo?Y?M4u-)6o4ee#Qlcq<`PZFR+5Rk;7EPuiuJg!ydxy9%j zhF5m1lDtR2&$uk6(O^=Q?_M2womLuKI&I4*dr3oC?J<>r03U}RdCk5DH;2o*Y$lf# zeMkryBJE@{oty}Ni^~Nv2R(f({`q6{)*%J=8!q3CJ_C^e1fpkD&-)&Q=V{8yX{%mO znpU-LckCOYds+|n6IH;bN8`6X3=B-+N$zJ}S(S0NmHj5R$*EvyY6-Z;UH$#?;hGm3 zxdQnWRBGE+fp$i_lko5cXLeGMN^WI>JH43Z26H2w_b-{Sd+3bz4xXc7BEg0JQd;Y{ zyooMJ6nO`$wvKT&&ai$eUnJ+>+28~wQ)nU~7!`m1q6y6scm0hbCW#lTpdFUup7Qn*IFWnhEFZF}grj`UVxs`4oJmW>fv z5;!$Q0U=v=5~=uW>kB(bJlRdqzyL&bE#!DiBqT1Z{Dbx-zxFbnC?V7Gb|d(G2+J!Z zBjKPA!NQEHbo*MlL9m?9P#=P{`(wnTkiM=Vf|Peqr&Jl<_=I%2X#FmIHIP84U;ANh z$j7AbrnClmcpk~(=y$^>xKfVU_$h!pTP-~BM5alqTd zSXUgOCs7~PVLhB^x-nOaZC3X46Xbs5Bvt-{dF=Vvejfj4+((0%Ndl!-Kbyl;DKyPgLM@~kbSvFg6TCD6aFO=Wd?;`neX~u`peAy6_VYSPk%}o znr_4VE>5Q8`!mtU%`IMJk_DZ>16xqv&tEbG;eZ(+ZNCKB_p-uIET`V|7gj7K_0sr- z9B+bw*E!>r+Xy64!_%c4x#xm~vamB*6_1Zw9M_ez%v{YS@bEoxGaY=%Oc1) zA|eqwKn}N=1txf$3^FFh%KmCEm`v8c$xZP1+254^WSEGU-~(%Q;iRo6*(UuS-gcLX zn=}2Ea-KMW_sf;7|&&Tb!re2r>`9?qnD-hnEvklsA~owX*Jf^xAUT zEZbl_nJZ~k!iW$PEmO<1Y`$NjY(YA?PlEsq;XS%9f`%JE9a>BR&One}Uk%~xY#S_C zlK8un_o>ube!c*?aEKY{IayqG0SNx-VJ0v`z}a31Cf^9EdASMATtVfpV`p)W+UeU} zbWANg9DDwi_4!mgp=b{CQoPv~MLk2bob?+}Kb#K0tH2fF=woimual9PPl5=%jYV7d zCv1k1wIE+7P(xx$&~OfH#mu799{+b;*zhniqm+6Z0rM}oRM zP+ow9xHG1`~`!vB^NS z60fxtP96gn_{yKxAEQ&B|7k~P-*86DoONk9_ZN3&$-&kapRg`KhG=BMTSPmgTla*w z8JHZAXJi`55wb^f-TSFynl@|3&X(X2m%ZTGZT?%gQ{xsjfS{*dT~A zEqyb4^f+1kjQ>0SB9K)OyVd6=5efVy)&CGk(U6r@%WpX@B5^^O`QY7n8<`Yo*v0Wj z?}|I-JVyG5pfbY3)p>yMRo^Bg7-!MT+}m&LN5&ZBOo}OH)`Gw;nzyz3vRy*KiEZB!2FGdO_3fjlz9GGoPXM0O+ zq%k_$>4B6QV5OG{>hA+N=sHNscf1V3@p3QyIt32=G1N5H`y+nmi!4d!gEs#S9t9G# zK-h&E_B8Cin%`H|ltJi$&eREy+V0R+ih~@ncm*X5#j!Mr)tJDDa4#}5w9g+Gum0JM)r{11I0At;1afkb ztLp8h>}`!6AHm3#Z@lN(4H;oK3(!MakmPOUUJdSkUe418CP=MpVZ;XS(V~O?MB*I* zK2F^sm)d~&f2e!Qwm7@~-j)4sma?$-E-=&9!JNQ>Ax<~F=$ zEXF;Xg7A_>`W;uWc0h-1sr`syNj4^p#f5!ehR5uWCI;K20Q4etqdDgdqEi`(fi2ww zW_9wm@%JrT(TBF={V$yjz7{{@5x3D5uE|11!dtGKsqyFTrhmgRI|k5cYbu4*@T&T_qlpFuE_XqN22D1MBj0r@YYK`W0P(16qu2G@*ECvrjS4*_g*4VOxz}f@c8~K<(eo_y)VXflxNCwVBh4%Ny? zx!yZf$?wSn-{6jnj;MXi%vm5pX3|h}ch-->4*Bd*%?mJJDkbG)9m2!?Go8E1!$ju# zJJbv@hyO5Amn6&h1`h(xPkw`|Jg?oBb}up&lJ-uh9yWmPgWwQHAHj$Y{88U8H}U>K z0i1B{Tzk{9s7Zd3`Q9_K;P>Cu!H|B%MobyJZNyB_FTH*VVPFo0o0ebBSAcfldp`eP z-&exU9ZC2W{Yw!m$@$Zeg9FTlh(miP=?T6U31{?vy^bM1BF;@sR4N))!!p?a;TAaQ z70^tex3%0CgR(+Q`_7Ge=Y3A9P=PSM8RuIhUs8fez{FxvGKz~7^;ZWY?T_W4^MoF1 znSw>zvs;XsYYn9D8I}9$5S1z2+7vy`o42GIk@W$%RiiG#w@VDm2sDXmE?fK4Xm&>8 zW*V8jpkWB#9&?Hzm(~^&Oo$vN&6nga*Bjdcn{$}FBh9^-Q*K!p{$jE+R>WfVlM@5PVys+vKn zeQ*Qx0-ruOD*AuGyWmSi(FXF)@wom=>?Rqc+T1vpfQZ~mL{#zTBv1t&HbW)v zc}w&IxiiLh31BV{<$&$8p7(_BvJ|@8^%>zYQ-5-8pAm zQSS(WxBUoKnYWAPLBLVcI5-OL5MS>@aUbGuuGh{l7nVk{B@&zIiloMp2;YTa$2i5b ziZ(hl=F5hk{oIyZ56)_-AINY_CZTzz@hfu*ZJKMfzgnavDx18B4uj$b!O@N(@ii>8@Z#7hO+j&nNPp1Ue|_34a-}NQ5n5J)HI^gDTMk%;I3(}EA!4Ww3$BbB)32tG z3;U+nEPSIFPE2fy*RIlQTGqg!D{?SIwNYpnw>Os{WCY@leUWM{xr!CAqj~$m^UG9` zTDX`f3`Pv4*S&URt$jq!Z(0Kj>|pH}7P%>-S+T$sdW4hbSf9{mY9l!TPI_?}r|A@UyLKVNxt_Ta>Dz0L5zO-C zH*vFAVRG>p$?(JU&;cix(EA|!Bum0-jG3}Yc4hVYz6n0)W+ zrxXFE6EOv@dbPT`8DEF^`P@0DSo}I8+MPa#Z9EK{IU5~x%tg2J?LQe0jSIkKG>gj- z5_o$L(N?vyAQW6yT)v2ps`3{Z8JW)onpe zW?A({!d_|Sf*Z7qr>GBptf7RFNJ0vCz@9CHM-WpD5wgWL7>TRCfdGxl9%5*;g;q(9 z^t7fmSb+wIgJlS8dWcAOOvu+-Av`BVn6gMPkHj{D$z!tso$5Ji`d(4tT3BXT;5C9U zzJO*v1Y)2tkzKsPs+FpqX3Fx{xOs}oqN}(@@MCAQ^yR&I0`!2ez>)5vJ%K#~5}D&O@zc*xu!@Px>s&Yj#ZuVPEiZ+t(f5Bpvzf#C%r=oULHs z;C&)$p%WD4)?9NeFoun#ICy|%5kuSm8~ZMNUSGN7tfJ{EFxp0}r+^kp7eo-Yfo5NH z6}e`ojG_II^Mtun^c^n!g7V1uc5){yzLl)-;FeX=I>C}vgqRIH0?E0&5cGsJgMe8R9OyOU0}TbK2n5Z!^X?_phZ5%*)A zt0`^mw1e*EUF2|-;yEp%Bx9hxluTA=g?G=M(czFfoNV{#lJ`r!ePnRdq6Bd%UpkD} zb*K5ay-O@#>h%$7)C`d8Z4=@f@h}Q+LN}v+V8=YbwbHv`pD_sh9+ZJ~g#4g@iTPG~ zhKF?b1?z~ec*+%H1dp0wduJ8qRmVype>Bv6^ueLcCaa?{>dQPPgd-Tl+tm=WN!$7* zfDjMXG8hQYzKaZ1j&}|wBjj`dTVuds$XfB9UllFO_{W0<>g3C9R_(T6bW#EF{%#^U z50BP71HV%i{vlySvls&Vq*5iK47EBIgAM}wwT3}|^eO#BgIel{niBc6;!{EQmFn{~ zYg@_d`lzW%5OPKc{gDgaBgQZzAr5SXC(JdRZ;eOIGp7YbzO>Gp!<==OMXe^up;Vm+Z zIgIS4D}Sz?!ihu@zBMH$HAdT|s8Nd`5Mcu;#2CW1ZtdhTy-6p~NFV%655j!HMU!SX z;u5)=3iR|IntE1cDu`*(B1F!yhk!|T& z?_+&hqDF!vEho`7rg{gSxs}=q#qp9V!wU&mtG~0qp=LZ<-UAXNBcXvk`;1UNVRSK9 z0B$@x%D+5nwGQ&#tWBQhaFPu<)AGGLr0rE$wH`nN3BGiKxMDsJF z!Us^1KPIJPhxd?UJqg3IHL!WcXT9-$pG~CeKtV)5nV}WZL&$KYeL6e!F*torx;>l+ z=A4wPF=jt3>fCWP)KiOyRFV?Oc9%Gr0t9m@oTa&JH|bZQd)#jP?z}QSsKzQ;X=Ty- zSz+byL5b%jbZv`2zFcJY<5<%$SL<%keY`tQw<0DiV;=prnmgmj-PlQ+GaT|TuWzTWP8)7S{4#u zCIRA8#)6HFU?Jt{@zDVtsF$%JY6{e$S!&aHgXkPHI(_%7LCYdg7 zrzOMcHv4|N!Zx{6$6LJw`_8gEb`vC}$D_tQBelp5Tg!iYb2*zu^Y)mG#?2BS(nYiYr#= zzgf-Z)paW^us|nAe;ISTjRMFd-cDu>mdtS49Iv<{JNlH0X6v1MTT6+lksqu! zi$~ru5z>l^UJf$CBjk)Cm41WgN?;Y_W-N?$ z81=jb5e-oY?A%|Duia9)?+k)=K4^<)9;b@{`Y?1n!OqUKQHkhCd=Q})o5u-1cF`Nn z{G4#d^m30=D9*8ak5cA{aR0JDsdiU>Xxh?`eM-6FWtzKt`0}-Nzmgne4mcbw{#@^Q zY`Ue7*OxM?UA{%wCO=Iyl*UHu1Q~Im$z7p^=5kg?=itv!3#Zz?%~ze39L$LTX7Fm0 zD5OJx)WD~N7Ah)C^le3>J6)6FWTNY=hPLkRd+wiVT?_kTN?l>dF$-u2JFaG!U!*xI~Qfd-S^tfsdNDkE8Y}}~n{>$6&kIY^Re=-AG_wLBu z82ocPHzr>lV{5jQeZBlB-Q09;`P5qM6e$9)w!UIhUvqG?IZ2|2CaIhn?ZjIz#`<>j z$f$GcXze`0&dmb#6W|XoZEfYts#~J8OsTGd#AE|t4vR9M;kfTgZf(&}!j1pb3e2MI z67LGp)PZqbNSvTWT6I`pN3UXqAiG&m`*H46KM7sqHcM66AC|^HDV}-}*?D2r_JMTb zNX0eRb{!)3ij$xpdB63;q;kT-i52^eQ~{hRzga=B1;%QvJ`rx|>Isft{o-bRjcf<~ z3X}%=SMA!IMc?+Wx4SpmC$~SfF@|&>RP76Hp(~UxXLa9S(sVTY2bOVo9h$IuvXy&b%0`|xB{{5I1qb@Xm$g5xc9k6sD|kc7G$f1 zv-Q$L&N%tJVPyk~zz`8f+3BX!jLKzI!;6y)DA|71Z>Lqtd5V{)i@))Wyl|z1c16xF zQLs=$tACjCe-8%tB=vXZ9Z4Yz?Z9A5?=4D#jyTHa@tY=2u4^Z8w<@ECD^+bEilWa% zrLsTNwjAL}<=wW_t4IM_L0j$y?*@*x&TY=arx>2JdIEx(dQ~%fJA5lSjkg#pa@$+6 z0+VefG%QmHHxmlO1{5pYBKCRzgvcS5wBy;U3DBomh(W2~DgZ1d4Yr} zkX)5U@_-rPA2`BbuAK8z2V9a+scd2f-WYo1$>a#5E+`^C$-1J6iHYbuADy4Pt(c^B zotA1@excU-3CokN#TKQ$(72hEr1|6M&w~MGRPRm{|ITxd&au>uGt;MuV)L#oT||Y^ zHk>;>tcb8Pz^{8Q*773NRCDb)Z5dT#RV5=P%?1xDWlE*yLNqD>eGPH*9 zhl_}|g$)VYZargL&v6Dya$rwP;fi^N%8+1R?QjUrUr~dbgJ_YrK~#^6O!C<~RjomT&yR8nw1RZ3h2 zZ4Ko+L;llAm$;>?!uBKCE{OUD(rb7b6<2(uI#p<99~u7xFCIwglnO<=T~c9e-2MlT z{=ez;7B9>Xg}eJ+X*$^d@ep|+2dRMXlf1Y%Ae9x@Jyp*7@9A1*k@UJeqo$xeiZklW zN}{vM$okd@H^#!6>JFKj-NFw%q|JpyLNYo%8$%**3XKgQ~%#C1=L2b<(!gMlo z-*;G_LPMVb2zHf)ghH-UJSjFPe4DbD8EkJs{2qH_xS#obgR!A>vePUeC3UAQ3Came zo?r_2Y^+tWwhMXOt5QlukneH9(YMILQW~JFY5#@CFD<83_5MY{OsQ zr=HofT^8Mjt5v?PACRcWY9EE+Cp^jcBUaCDt_C|_s~|FvQn z?(1^?!563XZ^Eeue;M%I94u@e%}YvgOfzJp3x=v@Q5By)>%n0W@FBLm$1DGL^NUC+ zTdQTnqAx2&IbT<(JQN@$=l&AIKO8-fFaU*60`;xyE^zW#Fmy_W1Gx|2^5tdx-B-m3 z3-q7;_!UWR&d)D|n}T|-9)W!0A}4)Fk za%Xd4Kmk4vcw9$=`1f{eVo;V%qi}$9#@pb3I03Q|&3FxVNoQF?NgS5fFW<-wnhYFt?_UJJ>?i+u$bygmSserp{cP%*mOrD{;J>RS z&|pTY|2e+Q7gs@T9iN=mDlU7eC0PTVbh5bLI;z?6!34#yMW=z9sN*<|k z8f2&k4PH`y7D|{C$z~iXcPhc#Y7}ONUCnMVp#CyhgSUCTS$(V80ao%a&I|1~bi2c1 zoXc;6GTxwAQ`=^Fe;2$l$M-mj7DlXU*HJ!p2h96ydxFiSbM{#utQSF}0|$Q;4MbIj^71W&j9NVd^yT^?D#SknG>yhmLKo ze{KW|d{~GOkRt-g-GYN)C($ACfhmy9KWax$KMvmZWMbTF&F{#Y6k1vBno$B@gvI+% z6xN_H*E}?T{TU<9B-R!=s?KW5iKpQH<5N0RM#wOU&nbQ$wj-jTofo^edl3alK%4xj zh?)l*d$tXaqwfl%8$x!;al)K*_ zhoi*h4?6b78W(j1CimfHmP>vA!FW_UHQAg<=d~z`O!Xw9h_Y0MV(SDDaRg1a-Ejj? z)p#z%PbrC^$tU9^Fva8z7M0UBkxmsbnfX%u^GRN33?*K5i5|`84^Z4P(`Y+=kmTd9 z#WarEc?~{o{i&Dt`LU`+n!FV9iUa{oG8*=Ul~AIJxm?JKDrZWHB-s^YlTW&%m~xlg z75)#?C+K%XAU4h6d4^To+n|pWFr4X7)*4Gu%80T4xVx3>HFo+}?yGdmzQDJ&Rr1NP znq6XEF)4Nn38nA&6Y_tWK-0bP&x(-{sgro~{x98MwTg5a0&Z0)+)x&(n2Qm()Ihpg zIK@Pd@|RNiIrU#&!Lw%8*Mr1BC9ILF_^xDo81nNckERpTPuXyayIN6Xt@#1}u%Z%v zVvc10bg3ZJfC^!6k?hC?V_%LgL?~qQVF3|U@ZU5O)OEp;5fW+%)Rhrk@84Oxj+Ao4 z)4aL6y`a_g&!X31bh2A9UBm!xg5(lArEU(r@1E4Lr@R_7zpNu#ANo*9jl;uo)ShD? zr2)e$o{unet{2X?QK=0}=2EKVwfO_iX4nN9{qjzrc57v~a+=?h{k?giAGsj@l%yII z9+Un4^C`nG!s@J?=Q?AtBU1^Q?Y=!$d89N8z(|(SxT6#ch{_J2)OLUPyz z`q8`T4+{B6BiKEEjgZA!Hf-i})JY7;u&7IIsob_ymb4V#BY?ldB!sy#+BRLgXdnv$ zPR#O{zwNff^bHox=9XV8sZS&QW*`(G#+oPMmHC|WBo=o3vDP+^psoOD8>0o^^|8k6 zqM+n>3He0DSs?mYis*ZS5tzKMt{;D^BCVfHyH;iDpz_0KosK_+A<9XY>jo*d>q8jn zmG@aM1ERswsJ^j~)K9FEQu8PH8~A9(X>L}B-uD#mC+W@$d}w2g4EE}%o!wuJGq0~? zfXSt4P>*!EL@@5DkCE>pnw?S*~=!=+u;VK{Q+_? zm!+uynQziHZExamc5p)JgJ_4W7fD8^S3o1x>NPfs^&YvF_7HMwC<5)mP@zrwEpr#t z2z}REU9K9A$_uw3SwcI;-`1rMmj;+9U@^`1WY{*5#JNj@&tcIQefrre*%$chUon4L z7JE;#ZdVVGSWaS5w`;}m*?!39uhjiVP&LwnWG3Ktcb6I(3S^v&BT|RDf}kBL%m5zg zkpvi8*a|>0u9YEhAH85gyOJxIJLS<2^407Oni~jZE#mfc%$U}QCzeckf$a2TOLUQ+ z=Zq9Hd)~ZDtSfK{EG(J5<1G-ruLS)KZ?w&jZSaq9I7k-}`ety*v8<%|$0G5skcbV5 z?`X*fxgz}^LDK(;8Z)qG2R#KV!2J#F|HnK0zb1OmWDImo z;=P_- zg{$V@jmF<0TATPAt#gX#vt<3JL+-+$W9Hvm67-+$&6b5U^aYo7e`vG(@4qRmR1X`l z?g3Zl?~M^{6E!+*x^PRxm<;{LM;4O&y*_5D{6C}kuaScOv1Re^SX5#y z{{Bx_3hD8AWl0iY+3RgH7nv-pjX>hJQVED6qMRx#9FFJ zIezle&2b$0BwW9EUoQEv=zl*$yniR+n%=aULeYN(eVa&j`t^C+JJ_BzkPM=RDtT>L z=wuiBjzowO^iCH;#qDFoZma(|qu!r-voBA!7XN23w^k?W6kpxJSw1BauqSVN)}@4Saha`3_%(EXyOC-F{L<>8R3c6{m~ODfuo$gD0O82!sKPVC81d7o2tHv0M?t|RFY*!#TH1EDS!CT)brMP?I#xQ&O_G- zTm!D+vhuLxeBwME10Ox2xv|L@W9=nA{q}d{w%w1kwgeuJ_&97T1EV-^T`A&R5H5XU z#*V3bm_LsrOk8w4VR<;ST|YWeAHB^H##dT~1Dx#rrm=T)RB* z(jQ}9MZ$l&H+bD!UnA^OA8%;{u2ya4I$a?V!{1?3nH<_1u0_p_i^IMhqsQOmZ)`i0UBhtJ2RdDrfEwAt7a zFJk==O*1!zbc1)kGI;HLRdxS)crQBrm)#wfd}LHf;8wQ3wUfdA`R`>onO~}F@Nroo z#mU>pvGeq6xeTaQ2Y1UU&Atq}WXy-&eLL9A=9iY!&S{)#7H8@AOmsY_#Y!Sd`4vGy zP~SR#_}4J6UD>3_s|+l^>j$Sq09n6xyXXBJ4RY{H`B-H{;4AmdV!y0H1(KN+5L!k^ zely^L-1q{6!LXC>#`~F-0t5W()$~p=m`DH^5;kmjESY+ol4PnJ5a7~bZ~LbVDXH7Z z!Q0eR`OzzZGw=33XDVAr#zXjfiq5Ah+wOhqgSkP;l@1%WN=Ro$oK$vUuZZv-Cdt6` zn3t~g-Wp4`1ErREx~Ci7p4m-)3@3#=Yt` zLJ(eVicWUUZ>BKjs908(^Fm7v3Z5GRv$-Gy} zf^O3ypMS4m7-GsI%0BA6`L%=Sqp-#*@vu6*igS=-x$>#Na@C_YSH3nLmV1oTwV&~^ zv3K1^r8%5scL~}{Quvdfp`>s5alc!@JkRe95s`TjCOml^PYj|LO&hmHf(ln}wN4YR?j%J1j#Dz`4_%pV}(?`{F9EP4|ZN1F4mC9~IMv!sp0 za|sc7&Mo_=J?eUx)NHRp*-hjE^s_3Zf4qgn>}|jQNy|=P%H4ji-5#^?bS>y3u-FD4 zY(6p|atLkMd-{i4%R#6m!aMG6hHScx^D3ZPwO)Rqvg~O?1m8IYno||KG4xJBpU{>L zv(YS=JGHY%MGzeqd5DAl)@m%%J>0ncSnlCLNHFPXlknW}scfnqW2Vh59@)^2mWk|hf@FMY00LxRd?PfK7gLC$@2Gs!<9iw@ zV*NTnDsQU74uZmTIgxIV%&Y6>eUKuIXVUtD_T*{TCc%;q@@dr z)_@cTp8ksGn{!7P!|}JZR&Q7yjozyJG;pf>>^cNE?r=OU2%84fO481`cEXd{c0J^< z4h^aNw@KVKFnPZV4dJctBZ}zRe-`SYOyDZAh@444!)O6SC1;W@BV3l(JD;z~Es%OA ze;dIQ7L>6pL8&EMFF^5eA}%o$5~!qyYTzzRj-G+^xwpG80s-4x3s7(9o9`>Bzvbo0 zi^P?G*jpw^sUy0ZKWoJ<7RsTalWN}xnrBnjL$91NyV;@7Xkq6(p6XrSg4@9_4EmNY zmM%jQHr@76;NBqCp;{W+V4yZ{qk9L*-q0g(?4vtL_GC_tv@Eud zD7ic3ZEk)w!V?P-7>O*UUj=plpdd~%l6$n$_7+(#iHVD@@k}+oG+tZ!ny!lG%MW~J zJexO}CIS6*>*7hkgDEi_2BehuE!?i4(k>J{(xiMY!A^~s907QcameJeJ*v%Wz)O1^Jh_ZRd@ zDqg6wVIlkQBcHAGNh#!oOsVp>E z%kFg-k>!G)c@~c5W=2g9Cq=r72%kkt{D$L^_XpLX6W(QyJ8m2g%&`#mT;Uw9@Gie^)$dqG&=RQ6%+723 z-S&Oa7Fg8Sr7%65MW7Pl3QqR$9DMYQ432-9aJR3Lt;l^)W3-S5o6ulvOdNI+@Y6B( z(8Bjh@9gF=V;Xqk1nM`05$#9ZsgJkMH^iCzM)YBOOtR1IG&lg6>Fmr#3Bav}{z zsby6kN?Uj0AY6i^`P_k~+WAoGQ8j@Ws1h#;6=_OHp)#yeT%cZ)lUPNkZbA7c%$z7_ z5d|Z1E90hHA&iD`cRPxZ1jY9{TDMuP%l!Qz$OCK}g$Ca&?ANJ}FMp?P($ykNIy24} zXn%{u#)N@dv8vFGYUqcES+Ijc_LbeqBumrituN%27x7xQaOAeJ^10f6*=F2MYEgPH zuTQz^9w|3f-4d4ZGOOHvPqY3J;A#!61|YAGNP)N5(4_pKFqh5mocL>2W9|{_id8%9 zL_w-VKp}e3#w7%S>xZbn`SvJb0vdG7G=Jw<+jcws^^5S2d18jHt=dl$Zz<#)%!K{A zc$2AL-TlO5!FfAYJz03L)9*5}nwE6HQd^6nTf4LLJn^lfG-LRsO@DYWBXZ!#$!T_x zB9ov`2@2*P;RR{gc$^4jPOrMK+q!4rkMr-4t91K)xs9@cj)S|QiE6{sa}(W~5Q)5I zWPEJ;3Pmvra#2YrME5bXsaniZd3Y{up@{AI%CK0N2ybD z5gtLEB=&Nf$2X<}k}?N9c$Nze48TevPf74ZoF}u41R`dxzeldf{oMN+4%Z$=AA~IX zXQ=Xv|y;W)?y%^-c3oc(89{@Dyf<+yBLd*yB z2Sbq~lj0hQmv{QyOb23+g*;hBL8=|26g=0W8Jq2|a%0JykS0hJ63<#^+;l4jNSW*5^A2WQ%qw)e6W?Bf1Ea3w>(!X(H#v8 z5F#aSY`!T8TjfDgsdGE9kb78Y_a3?IO&&gcDK}H`N%EncOn-)E=N0);LO+l3B49b&xtK;KZ56_sA*_%wSkpCRPx>C* zg_DZArL-2oXE}O0gyhWkuv`43C|TuAt-S9C`ScR!&5zpq&^PGG**xvP^2K}Yxo~Br zR}j7kLJJ}U)*XyXsFN9OGs!6+aBd#U#Fa=WEY8yKSdVMgaxM5>8jq=WAoXUO{H^lf zb5dN)d7aTKlrS!Ces1N!M1{e}^D3aiC6%8KLOK&CN@MwwxEx90zzy;y1`m;^-_HAZ#6Q^;bPu;1u zXuZW1)id=vf*)D(vN;4s(Xuitn41ZiurYn~YqZ_i%*$~zL$RlEMxzKcS@Di-@7#d} z?xQOplWp}ivsZ_!4EYnxpGj!;T(9)kMG;r!4;ZgAW2NH{P(!dWStBC7vg|L$3>8sR z$|Y6e9>IH+ALO@($V6yL1zUI(6QEU3Sgk`+t~F>~T~kh%Rw}Q2p_v4>vQFbD(X*?) z8$#DLDY$TziA33Nmjmw_4u=C6Ztvt6@R1m;L_PbkOYK0UQ)EKSpQ?v;)0)WIN1~?(J!@Nx`^M6W%~Yqs#r4 zg$q;23J!hBlp}f4FNOgH`xZVPLPclwmsuVwa|LzSfFDgE6J60b+X%W<)Q31DksSp8a?bqw8$Yw>OB6leZ=OCy)TkV7 zG`F7z)n)|v`030|+~uJ0E57O0c|6HG&m{CS0r?Up{1SlF)l$*R%N`p0L6G}U@aXZ$ zLFZ{oC6P3n|BQZcE2X^mO}j#s(sMr#eN8E1eSw^vaJ|`s^lf`@{pWFyXm>?uwcpBK zy)zHreB_^&W|P6Eb-EoflhUMJXrS_?-GiPgQ}LwTDSX9y7W1J`9-dn|(pYGGuRiaV zLt$yT62=DQ$M9C(B-C`kTQOzzJvCXSk>tq=yozGW1qOB2za7sqL})>6a>zgT3>37y zCPLnh)&_FXf@m@VgKiNN#X&Pp&S}=invwgXoTp^QA{5Z_A%PWOKq2CNh^Rt=$t)<| z6XJQ+G@N{;8G{Ujqy|z4Wp7`7XHX0J9J-H#eYBa1dYHF|x~s#qXjhBU;1US+`-RxC zM_vStnt+suhf|w2oW#c;n`@CNX&Gmp2;4SzxIEXCZ?7#7twpo;s72ZVt)zlQGiy%x z_&U6pR&YTd0dj!Y_(DBA$8CnQ%+7S0wn}wM!CqK3a-;?;&Yp_8&qnLK>j1w$BGNTGs3+S~MG_2r?bgJF)yjSlF*M&(()@@giv9 z1wly~E>L}uZ~*sfx+?d(%xB8ok-T(D-t+C=Q>TnU>D<2tD%_lSBjYU8@3)3#EzM_i zS{&2~@5IO9y+S{WApE?3^q0?heb5`p^GzKenczccAh@u!$YbVD`hMwg1#&t*Pd1-1 z2xS)p`w+4aK5>7#bEuKXI3>cwb3ugTfz<8NLo{nbGGGzRK?b5Jc25r3R>x5EtN2Z1 zwky`~uQ>7zoMhk~Qc$Ld#a5zBsPXu%E9OTpE*q5CyQta@G&O0jmPLvd88Fm{*QW=_$rdwhm;}YM-`=XH> zSGg)(Z}=4022KlVm9YAmW%z+B%e^-p4Ply~qYqK4=ttg#4z25Tq*S^25BU_Ye(dS* z`dy+IP^lP-hOx6RDr^uM*HHig=t9PX!}~h*hMtDofxiH03Y)}or!wd!9MjSy+a@+g z|KF-$Ha1Ak#V_i)b+7EdB;7+%T^arxmt*=bRC|X8fc@;@08P7@%mqaoPad!Ix2%fg z{DLOm9?c=oV!k(FJIL{ne!5-#pla#_BB(x`)^NGeZ|5|<3lHqWx7P({q2#R8Dp&1H z;|rzv-Q{#d;I=p7y7Kv$u?ed9^zZ3Q)C6-gs_rhXqqF}-j<+)WunKDtgFTRnuJB|xkz;gh27h<>@?ukbGUO$v898on?IonWn< zP&*yi_Ov&}*K>~q`m?E4VG;+KzjIvQthHr}eYs&fW*AH7O?kNS8v3bcgRyu4Lr_W* z=5kgf7>we`@toT^(Jc^W(|{+h4F`3>}QkPFW^aJOC{KH zp^Yna#-RZ;GaTE7HBL8>ZQ2ro*oCe!E?TKrUrz_(KB2T|pwMIg!TwCw^RM2r6YG9w z>+a2N+$8uHsf2KKy`RRNXEx*^EF)Xp0obt+n?VH}-%3cYa21Qi)$Y8UX)V)$)OsDR z`Q}rnPXHUOAX&X2HTOYn*t}Y~GKQ6jD0*I8iY3&`fmF3%LoOA)c1$Ti6`@IN&WRi4 z-TwB~3{+1RFHH~ayC(L-N@y~66z%7X+?)OH2g=AZI!6J@JO zGaFFRa!kE?7bS{AHt}PuVI$Yst#WMnKd=fJ5!B?Z(yKAz{|<+AujJ-$J7v`xQZDEu!Fx2UGp8 zM-n-qCw)eEUGx>us#JfU`OXF16!V|DhBN%Mm=&t0v+WFtq~j7>*Ja!9PJb3 z=wN)x3m73WXl!%w_xR!Y=h-^)lX{9?FVfTe+;>u^sv#c6}wuJZ`!!!#A1{NwQVW3H#S#Kv> zDsUy;Y@*q4tdP3w_sjGw1e}VuaKn`sf`B)u3A70_fL62B6eYP^2SMid+Llj^;te8B zz1kAufcE>4WDQ8SXnmo$(kk=JJp`5OCE`BG;Nvd;N+*rD3A8ZeQ)Wul$L~rungK*{ zT2PhNmuZ~Ay!MjB5PTARmH#7o4k&IS9*Z2DDZSMxz4KT+zqDsV{OXVr$ zqj5yFbn*}`83VSHGv$LG8vJGcDC4px3^Dde2DR87WNGQGb2P5fqCidQ;kj@FGTH0C zDWQ}9k9M}bv0SyJk-pqxiW%nn$JAaE@jA2N(zoUNvY;}NyZ%5CRLHdN%uWDT2x6b% zbhc;!Ylc$%#-f;bNcIRJWSxRmqmsS&yO_b{{!WCqTK|>0mhBeJ<2O3mJ^;@=pBrP6 z5sw*-0EcUrgy$fkr3w521>Y;Wt-k0E+%CXh1KMGUJEq)ELbS(Y_^#`G{*Nmis*1@? z@n)x-?NLvu1lT#)^aopM435b_X0CSQpf~#C%x~?BDW^+g0B0(`KZ&&K#!I#^$!j}s za+0ZE(MT1w?#~id=CH7uj%GR4@c#7fEXgC0$Iq>w+r%XpIJ6gs!IpqZ3c~?)y*okJ zR#?hiiI zi7XlcU<=ld6krP3dysg>0TM&t$ zoiNr4v@bAFl1PXX59W|#9X}dlhwo?&1S$HM1oE@!LI||xJz9Rb!LX#7DA|l_OC<5Z z%Q;&iCC<1E?h*MaZ6UJjNG!W71qSh;IU&{pdtnFx*prOxGE{qDVF3*;&wOX2T@;KF zKU_>hu&WqpNNH?+OCPpz$KE(UsmJhtS*SdOZ%90honQ2@6Y+F5799iS((1J}Y>rPC zOpud_4i-wyJ~0~1q6EY8MGh{R+7C1w-?g2(Y@~NXgCNxdb_s1x)9wUg)QzX?vz*_t zY$|*AtVbe>N9tK@8%`H_A%DjCr?r!4BYpe&CnfrA-Y0xm911jRtmq3{_y(%FfElez zBi-00?E8*J>z>d*&Wm)3B0iJc!-fj2ET&pFnO2My3+HGbD7hsPf~dF)`bJ6#{*_0L zWOhSUfuIf)q5|)XruV-!r=TFmpS4z`2TW&oI?W$z#!-Kr+4A zsXbjBqw=_%a^N1T>{V49?GnmAby6JTW0EpHdvv^eO!z58i)P=BM5?Ykc@7s^hv)$^Md&y$9<=k33WSwFYj)c`D)|-(jW4+o zn+CiL>kM~LZcQ-*27VQcOt%$RrikDQO^k~8wVw?$u_V2i3^g1khWbm0X zy8^t(=i|?uMx`YgT4fpSkrzYNGEGnD?QhN#F{JMl1bM;iv1XTF-`M;BJVi`L95%zUgTW@oT@xCv*my5oya#<&^PdA@@rrAsEmJ3;sWac=X8ZHqx%bcCitwkTgM>WP~UELC}eEtirNb8khmy>v^WLcwfIQ0il($7F+K%`lzj(IFFx#EOJxeXo9w&`t4W)VVgPd8< zI{M}LH@5vbuSI4fy{h~)DX5O>kg<@MtqQfGl1?KqTyn)pkx(6-e_8?uX2U{(L{HPx z;$+;6hU#O1CBd~sDz6Ul9E8|180bFf>4NC_S90Y~iaMPiBdeND1WP0;!*5*-$4Sw| z*=^&+Sf7x4^tPeQXv6jn`APk8i^#`YKW(wW^A3*Qh)3g^k2TWp@w4nBfgth=IRLB* zY$Y~Q8qHKL^f2RaxTNBnnIBT9Ci2s~Qnvj9zrv%CfwagPL2BA}W=KY#{2(4DPnKzS zjDb;c?1mgRFC{r#po&AjbK*)|w4NFhB!n8w-PODJpivYc5tB6oSOjnhn}jTh`lR2} ztN^uNOC6-M0Hxv}w-0Qf5#ABBJ7)GS`-FqF4h}?UnV=IoFMpH80b%T+PcBE%o(yVy zkEVf;1A0W^C$F*esIxP|tmCiCL>!3aK(YKcZjpX1JrjL*_O+$Qww*V~3h$THGBSUk z+jl~%$d-4Cp1_?Iza&slD2X<}c{-vP!Iu>uAgC3^p5!5z#AUv?Np38)dA8cVNe0RUlozuqkIr=!~r} z&kwVfx&PrV=Fv|^#vKU5z{cbue|};9Lzm=DdJB0uPca*A%+fe1KrX`nT%AC}X-7)T zbPq?)oY(P`Mg1~Hhw-6yj>k1_J&TH3qy=U&{r+|Nh@4A7XH7f$If?&N^0 z{;U)>Y+5l)UOxIr&8lUJ;i1>4vb&j>o-uZ5#7ZrgWRdoYBRYLYOsr-F-N#ndOQOLrC*P#UCW-E8Vx2BSoVQu&9w%c+M zlBpklxyY^Mc8~9Cq7V=yw=ox_bO>tLi1@M*PboM+gCN{))eerasmprvuRDPWBpjZh zA#!|#VIgyp2B*l_Q(bK6)k`2}XFJ8%8VtlQ^!Ty`eV@ud;4Q|4hy+&#yiYWjG%if& zme;1R00(jj*Ms>&Lo_haW&1T@mw}tCGMe_KZ;D<@v6~n0CsQFsbibemY>F92Jr4~D zhe=@b!?@vK5N-BOpGpaDkO;yZl3e6o7tDBDqA9&)udj&?Kpa?#2UZTgg-Zhs8O?kf zgmWe2qYryUkfj&`s-9J))uC}^w`v&q=F0^y_^;IBX!DhaZ4r_gb<-vaK|*_?O0XQw zIf$famXOOtwiyg*Nj;{Q^gNnxLd~Nz-V7LGOxS~wA~xSxoiup9()hT1{o33sWw+_7 zthJ5sl>x{1YhVZFCZ{4yA(RdfyeG_n!h2tRhU|dGTS&O2&OED=Y~mMG~#q6O>#(ddT&1`8(7 z^BB)QD&B+Z+$bu=4=a=B3#ECqkrD@t7;X)DhL@Xd zd}bX2A`*UHa#hsm4U(2Di^x(@H#i;C&Q}jwaCHgi`xeEP+Z1F8%ZeIhq@-q{S&z7s zJW6C_Yg2cLw=XIk-~?(-?=E=}{pSfgw59Hh5w-ZPgCuS8H`=@R1*3 z8X?_XKZ=K!j7(%Hzs=MiGvsSdsXZw77;_olCrV@Kdd+Bhn?x58`Y9sfU4dH{+%_UK zBz^)f36u7RQlTQ;+!1>HZo2)OwCCb9c(teQO$SbpgSBo36X_J0HqI}L(X1krA2pN0 z5Qa?^vF|9)-2=p*Ob8I`MwA5?`@mP@eS~$7n6{30RK(~@2y~I0E*e)bkB9C#$iP@S zp$;q>Ejfft{F&?^={HCu|BJ43j?U}b7ItjgXxzB5ZKJVm+icRfv27=BY@@Ml+isHY z?eCs@$N26&=dWgr?qsjMHrJfbd}eB>APWSgB>1JLYBCwr3;4-uZfF+5FZ4etk#`_M zdQkxc0YAn`9(|4ebk3XC!^uF31UfB*HWnIS3 z^wbH=ZjBwuC{xe%cza22Fj?Z?(Nvxr`zmw}@{P%08f)rXAoVK9#*%MwQtDa^2FwRx zjR8~nSkA;c@aEB2apEY(R=^ge(Dc|MiRXsSJt6SyXgxaJt3b64b0nNZG>)Li_EEv@ zJK@FSOYPhipJjG`)hUybQzJ$la|TU+I%zcoc%;ht6W9PKl$RV-eG`}f%D8mD!f^SN zA67K-z@Q)h0U|6tqtZj?fBo0unI+X4@u%sRT}(NDo>U;Wjmv z79|RTPu(ffZ!9#ma4V{`L%~Q8N|ZH^viS*tHA;`#1{--dzepFW``z!x%h3JedR$QC zSid2RU_}wKi3fDkau1x+eFtGk2d73fc@0ng>rTg6V)1lHynvON=X-9{1fn=@uRKzA zq2?A80A&?>-@#cGAZeb}T&iF7qeEN<%9mmvw7S35!IYf^04IssLFJ(z)kCZl>8@Xh z+2PZ6;|eY@FagD99W;VPYb{jiC`5^KfspEf%fc8E3>!z4KY&jp32xMYQD^Tfv7JHT zG-fyB)axr`^F;tf!Gi?R_y?t7f{*M@n${h>Ey28N2cz1jm<5jzX8~U*xQ&77gY&Ko zKFHC6Mlm6nzl_Exv{T>~wzU>;nHBWn+nBtO`J_55hqJMn`7aU{Ld}+5_cwdLJ6|L& zI=ajbY8dtDIBq+(xBJsDJV81YauPL>cyI4$mZ_e)iHI=p0~wkL zVte2oLd0B^%Syt({6<9~kI~GUbHm2g$nCg++5&Pea{iNAtJFXnV!-nij-;H#h<1!(kPgIk?#LmB#fMgHw`n2C^{B^R0N zi{}5Bi9)*w3Y|>BH*Nx(tOBJOhZl$|$h(F8^K{&FB(dg+M*% ztY?mUx$#Hv50DW|^8`e?PP{2UrYNaIwwM+7@05TJ`$h?#HFd3TKo48nSW4l}4(^*X zvby2KTM#IKR!Xk(0aE53bbUcv{iQY=95u*&aDgYrJh8`^!1#+%beL}kvSuo$gF01U zSZen3i=1m$?87n@ZzXExqf(C0W6M{@Ag{iDnlg;AX}6u^A2$w}Q6hpC*+TFWgldPn zE=y41#F$NKO+#S-y=Mg{tkh221g0Zvjx|RQ4^A=B+G4Ix5>5uCdo z>&sYrKa_Ri?lVV!eRz-laI`pbd=C4(Z$;9|y+M#I#+R)uzebv@spLgxyTGB#%pRHhYRp>@BojLl_Za?)mt&MKzzkW>|LkYPP}gBAx?_N1!|2Gin5c(a`!ifx-o z^vrvbLdCOg+C6@=e)$(bE19|5cLMg>K$9cSy2?59l)-o@+(yha7CW0lvDc`I;l098> zRATPm)GNl}LI^4cAb<)P!N94%kPwl#kD~1ZrP?ogF=y@N6(!CeXWZVuCt{gW*Hp_j zHe)fGN~ie))ui0u=B3|0uH?9rQYC}CU&gZ^q!{)B0*P4wO(9<$H1$1CG|Tlm%lQa+ z&KB(pg^2y-aK#d-h6b;Q~i-_cAT~JPai|?An*SToF4cI11jRT?z*I_ zR|E6Kcpx0r?EogxfW{L(_ZAKj&w@Mt8hU0LjrsPRF>E?Vebbzq^3_jgT?%hRi%fy<1t%I` zV8$=)V$FTFe8JjsHL*^$#ewvzZX0*b3@gOC6cT^7Sv5(|Jp8 zt@Efq-Uu6;1^8_Cc5^Nsw?8FH{XaqPJ+Ac9zJwEeTLS<0TzC&W7zr=$FANegEPAbd z11#`4oIeKTd!w>LV?`7=OJQ56BVojT)Y=OELlRPMx?6LNyrH^JqN61_zH(VS%_Uy0 zXPhV$-jA0BaoYx@QV0Q!)(b!vk9&s5>B^nkTi4y>qV3vA9`sdXPPJ+oSk_?@X$-Nz zPFx9J-}fc}yE;xy^wUWW@Nz=lZ%R9gm8 zfSg2eyLkZfR}kxp;cF1@w}K?#PmaFUS??>|c5Kq|@$ttSPyB^T`re^^eZnjTSVTnf z?QU0&oc`NAq!HV9U6LjrJ}%eWhUL2L#i9ak=czXR{hH_^V*mH(|DyXX128RLXrhXL z%&hh}=J5M6I7%^?UH#+5(TQ^Pe5%&YhnV~>YjE>!kGg|5bv}b0EGg{ifD7hZCp7{o~VW*l6yM{(fO;Yfgf=L&h^W z$OLy=xk!3CPXEI|q9%5>PfW&Q?UC^Q0GoJa&SUjtwGqH+-}$f@quQcK`f7X(<9LbJ zgJkf%ngwEZ(nLd=s~wdyC0?2a_GcmwXZS4yuz?>%%~Uq06qnOcym3e?5RU@N0|4== z*>MI)RMK+$+=85Tid_!Be~mRRY(h>_(XeMbK|(4EQkS^KHx!!uo-j;9^>J|8AEyyW z@SBMBS21ag$I$zh-V~KC{gBfh>vV+ptyiy^N`Y$jMun=(!UO{nnmhT7*Vu#ek~3?M z8ig1o-G~MN21PG`(8=zluTh7hw_Oh8hg;KGc)>%ig!L1Y?ZEWgEaap zkxiZLB@DS_6&z~?>YWwnVu=i2hdtEPeE8;xu=F}$zPCSNz10cuc<9CH3u?d|z`59f zTbgs7-{bbNr1R7muRXXRuE(lC$0%F4B<`QlR9Do_NyN*B)q|ALp(iXs=SS&$1l~`Gu*mA&_B88 z>i6k1dUl-6PLgwVkWKI`G!np~t? ziq9hhQ|l z;~QXN9h;Ozy{&Jy2V%$y%K7nJ6Ydby4Cn{Apm@K%6T0t{shPd`9vkh$^u$EQZFiD8pa}vjE&3 zZt%43H{De~7L!%4(!6Oxd4l%5x@7aj;FW+7yX8W2|AtvcB+u_>!M6BQWS2Y;qHwN~ zVVTb%b>gwR)+%q<5lrTvw$QYUSk}Iy(Ri&c5&L7 z`fSSqe5uZk(Y<&qv~2SIS?1{dXh`?@u-w=0B?`nIl;A=pu?8zbVQ|mM7HY9Zi*|Ya zV@q$ci6#{E5!;tU1qgR<{`5uX&v)Jpk)x6HWF;dvx^w=?wrZcdz}yD~@gLD%rC%;* zwXqi~gj)>>j}w|h;3#X#4@KH+_2?8wEx`UD@QkQgmiZ%2g6xib*^?%VUR@=4Z#24X^EywjdDl(a>#P(z_@>Vh+c#1-1jtLC_@z3Hz$& zgN@IcZ%90-FzubdLopdM^HPCNp-W5n6JBH{T~vw{&sY|Wk$zbH)jtt6ABBWKfv>Yr zmbTAzJi=y*A8*LkV8w;uGL0$#Xjv$XE!2E}A8a!GB9_c3bpiFn5k}PPA+h~R@}+!p zBTXvUj%Y7KaJ_)*^KJfvP&iG?=Q-aO#C-P!07(;IZ*W8DTKb2cp5oKYUO+A^xvC^9 z;ZQnDkz*u+(XXVyx(TH#ltP>J`smwZOIUJs0T6{$hU{8A_#!Q6k~;{nXV@nmq>2xaE{$ z>BD-=oeiO_ z{m%nU;P|)q#>wtZ1^8A*casD0Ba_=~fz~$=!bA3RX@^e-Vm?@yc+DDwczfvGya^7! zP7X|Kov=5}JBtO5{&oI#fZl8P?h{eHc`Pg-LRU*AYxt@`u4P3;=PJNrg~gZoB9%3) zJ7q9L(1DO;Z-wrGY!0CP@j`sdN3YZVt&!k9B6IM~;il*6;)*D4h@Ri$*B9DlAKBfk z7T0-J@4$!+jf`ue-VlV#K^;GPU{+OQ^Zo<=R$eS<{ZE#tzUSpxj`?x>mv!AOD8m$C z!Nh=4COkaOA5cGef(8;nE$jOUpqE%=-nsSBDLF4??c#>8C(ubzlbLns2*30e>x(h6}H)54!eSn; z4SVzK)m`zd#NH1jmdO$q(kaoe;W07bZ_|P3>^WkWr)*9$bfi+1JDaoe8m-}a_>aMS zKqn&E8qx)Je4(l;s#lYUdwP>y>%9L!AMSj`cPjLWGj=9k(Orn^w`u)RWv#KOrV4K# zlLbodT7#r+v0FUibn=DE&LlWBnlqH<4|rr0KN3ix2n|SAqKi(ywWJ&d#t;Lx+LKuVwO%Wa3s2Ps%YIQj)T;;;t zrPXYHFX3H{pPK3{2e{vEZ?rG3_=a408(;9V+qA>u$=2R2dgXiZg~&DHv@cQ^vG& zXE>ZKF1?w^?REJ3>>+t#YfbIpw_k7A7x`Rnq~i{TJWh z$*>`!04BwsrkA+3w`DrE+QpDMhl-=Je6*Ws!6K?CzWz=9P@Sx-AX=yCu>4v!~P2k+)rUVfX z&TuFcdFz1#Ho2%Gi5O+-S>+pZY31uP+2U^JS%yR4Sp+`!%)vy;%Zn#{t$#43$Id6} z75tbrUmH4m>I5sdy?8vJPyk1hL7;jbqxl#;;2sDb2I+f|1e~b-c-Uem8$85$KBRdK zCp|qvu_RchAkL33~STc)=?2FBx zXw|A++lpS>#gF+9pwX!2Lby;LcO`e08Y-T$8L2MGmo0S^Npu<-zl|qAirI74KNII$ zb$%Ho3b4wC$MX%xXce?>OpS)%anCYYGCwWanv?_pKiSo~){POMCO}5KUM}{`oFwdi zq#k3Gs){#&7qW~R$opKg2}_J>YWe<&n0M^+^}P^+eM2%`BY`6vUkH|fsY@6-)TUP7 zFuzJV8uAm`>>a1y<#rcTnnLW328cgc3YcA}{S1@Wb*1#rwd=54ChwZ0%xM&1@)!h} zf7t+ay>1kU&3~_aNcvrViQ};7`%1)o(jztls{8SB6*BpCJpAkWY6KJYkSxcz$FyaP z@ocWgT$@oB$Q|GK^8wt59N^9G%T9>~8y-syMfyV08w@c`c5MjFVs~r@X>kBGxUA(O zA}(2$m&mnO`|$L7U@`dkw=ZKUM)YkGn(fpA^><&Pv8$5LvSN1J;kpY>Z}=wl>l*k7 z&D2Zy9;yjAyq`3`E|w#E^Wy zJf+q?(?=!Z)ZY4BWO9G=n5r>lkpz&qVJ4tK1CG#h?UTiS{i>$_=Q&Cy~{S5K6j5i^?>Bq&pr z91rbPHJ}6|FQNU>InxlM*_iRbEJ1NS0YCfvB&BTq@di+8R;>iB0LuR415EitCEmrQj zS1{xK?7A0V3JiJDa)aCK<>-1$9iy93a4tG9-o!lfZ}x@u=?r5c4itxZwGdZ9G9#NF zf$d+Yv?*?j|b zzQ`Sc`TF}x--kueZCe|htMx1(j{HI64raifh~0J=5DDy;m;uO9;G-IFF5pL&@j;Q8 zd{^y&js!FzjbIiA4n?5qzp_)>x!G39YxAL!OmlAJ4Oj zK<+6*VB&qIP36=0AGaEvCvVl>G36-bP15e0E=a1M|nqo8AF7W$J!Aj4@HnIRCt{%z)F zm^VYqO!n0?p{9cVPbPwYS2x7OhDpYXQw+y-jsP_|Q#euQ3)ZX8?AD`!y`?w1CB0*G zYaAcxRZlFOU%N5V+;Ne!<@_!e+Il>jl@IE;*ZS>n7+T}$MwXA1QEWm|!^prI-%tOU#Zw1k1Gwk$+^{`+Ms$HMB-U#kYWjZne=Ssc3V1(WG|OGOM~b|=1e)#+@!SU-T4aNd=yi?dOp4R z3pyM`AqZFh?vHHCk~mXPrv1yzm>%>~@w-qz_*=zuT4?H{RW*KZ@VD@qRfTYTJY7i` z(9#hRv}Y~}?O=Z*$?5=*G}xgY=!0Q{Nf@Xl3wMhOF}u>QqOjuv%mv8NxE3}B$plv^ zie0g0!k{O7jW4CAm=s&f7v76&dHEPSLAq$D! z5YnvkKq9wktQgzcqzMaq&v1qW8<O(Em_1g8hP5KHO2t80{-f(513R`!6EYr}uFP8D-PKn*8;9<@J}{452)irD!~=y3upz42 z?9`QYj~N=4hF-#ofB8JIK?9$K5}iERkIZ@;KRQlz`Z#Q4wdj~==Nfl7O|IC-Ax)6L z|G;6)QnJ3aSQIROlYN}*(!Aq%o7U^uUa^o%yUUn+PilBSL_F!BGr9vu*fvbiDgQ2F zHOBsiV!>rFgaZDcmUG{Te2x+msI4|`E~{Co?UD#rOM`4yJ(V4fZ3~IO&va)`fNHE* z@Baap))@*gA}cjNU)-4A9)u=@a;03K!@`q7NuA0yM(WttH3YNiwfkfygNJov_ujrI zkqXc+(TBPv;o+Dti4GulONZtf2gevMG#sktvIgc7nLo1CEoc*XNu)`RQ-$wfz=MG| zhm?xf6LyI=+K4|1uK{;Z?`L=C>kZup8ZhB*2rD4X1l=3Zgl1jaqgnFZr*$~X|4lH{ zD7Jl1EbYWS8?)ii{PBiY&>?4fbnAB^#-F2H078;G4EM?P62t_AKHCmC>1V6;odxa0 zmUm3D-#y?NBWMc6Wqs$WUtJEz<#}QoVX0qm4qwUXG*^xVkzdz|o zczB?<5L&+oh7yGodoqKgia@#xvwf59V%%-$%^xQr2q!#f03;8z4?;_r6B!gWEQc1I zJHdNGZ{tOKNr|-wtK(gcn{+namwp*au1erNhgW7gsJD?MdzH7LjHKs$fAYP)+x`-6 z#R$YLW>gbFSV@nU7-zk=a+(4TN3@CFBkO!H)h_N zcX>kY>!*AHuwWpzv+)H@M-7EyS`n-`E}q`zicnt$ItcCp>Z;`&%nyV|!b1jV-CxRa)pU58hR1EAiWGYTz5rGq!Luw9c z7-7%YB{nkr^|`ng8Mg2P{z*I7WGfX;*!xHtRU{~Y2~^6cfuk0Aw=cnY>AW=f;kD)Q zdZ(X48-?YnDML^co(&Ox)r;DwcMbz0_@nWn>i>05J&QyR1ZhueGHy|(t zguu0Y-zJ&o{PM$#pZm~3*aCv~RnQsSHHa(Fu{=D6T@u@Z!2^v2Cu|ftvmY$1DEPm9A7}ff#j!qS=!5w6Q4m-4{Hh z`tj3w>_RfxwQUX7_HeYs!7cA7*6dXumscw?k{YLy8UnRSLwfQ%nQtl#_SgYUre%xK zA@eSn*o9QACnQ{ez{1h2YO#~bs)N(j?8!VnVRSe=4U3c?FxQEPPNDREpU|x?AjXLF zz)m6~f-dP&onU`#gYNdwwcXH1rnzeTr1^&YX&rCEFfsEwf7+)2)KZx9AYdUc2%g^^ zvF;{9G*6Q#Nytge-t<$ZP$)kiT;E&u9%l4m}YIhIVCZsUO2#l9kF)6ILY1%}tgQ=X`FW zvW~ecYSdqp`&JjN1iwe5b^ArHBx> zO^5Ep?aNNpV!+S!0~eZAiiriv+xCc^{ue_p@dzwXoXCGEqLDSsxeefk536D+j2aw= zAt)kO<7Yg>WHY;+q6_if*% zQf?38?Kng@5=g&-SXtl*PxM{)8TQ*!m_F_uftf@a+3e5$RSx@EN%<2QO3g1U{p)jXAnX>%R|NNBvHw=k6Cm^J?Zh+d0_d< zT}r^VI$-pZY+JDy!hnkd zC8vYFe2TyBI)4-<;@o)o@{6v0P@Ze4PQ8@UV}g8uM;WBd0aBKLE(3Tsxxhp^`5Vw8 zf=wT<#%7mm8}_8qjVe%=gSJNJnUT)EHmg-MCbiy;HMu|fOt1@qMRl4~L3hOR2Cb4> zWJ6?R@+SfkC^;d%w`%qtl&av$S-G%xF20T*7&{Kcy0CnNT7zTeNbF>1eT||F#>BVa z6Dq>RBXjuC5>3cqWPmmS`03CA6AuAc#;FZ%VH!J3HvaD8s61TWVg_|Qexso@5n2OA zR}hYCfbbk+zb`~Q)>Oyhu`=UYkHBO`UsoRPtW~{#pD$WHeYCh#|J z15R!XQeCyf7pnC?xCt2p!R&qgq9S@dkm>NL(ZT)t%ihLJaQaBKQ&5-G*dxit9cb_n zEM;AA4d%J8HVqcFuUG^4$>HERba9B?v6!D2QjRwv3rr-6&2C)^heTuqh4UR8UHkG* zsq4UE`W@&CJcXwgU?Rap%9S%VbWg-0-T<%|(#uQXUP20P;sf1v}6p(SnQv zj3%29WVq!b4L$W|r$r80l1&OJ`g4{wqOC(8*3I>D;**AQPJd~r<_~tB3<{)%!kJzM zas2TJ4@zU6G>QzY-Xnm*G&{hsPzAmdQr|JZgrfKE4}VR)*x+;t;#7ZdP0Do`i{KB{ zL`SSGc*YXpZj+Le%B{yh$} z)Is3p+@J|Ro!r9Qbvcms53LYz%`f)>bE;LRjsFPEJd;O5xktz3 z-jqJxyAQs~l7`7^eyrb1hcqU>#{(TtXj>y#RL`qvN=8#xZ}^pw&6eDMP#I}8niE+W z^re>oEvDi|cf7pi&Fv+=rrpov$-m1?Z}G9Ke;=glEtQ&ycDg4DeSm*fWDJe`rv=}w z`yc9VnP~gYpoOtDxk3~qVne285$=0ZrW>Ox5hg>Uh80CO7AX{^;#9`(Go0!;V8B~0 zbOVJx<_nO08n*3nyid8{~A~$fLSE z_aRq4Ee}Pd<>m5_FHhveRy3{5272IUDN@xrnYw#ipz}$roJyu5c#iC6xpUn4t2N6B z9?tv(C@8Z~Z87Ho+QEnSI6P6ER-w?x*$@!IqsfRSO;{hK)3`Q|k1XFnq;_zL_5_hn z`?Vz$0H0AJJP41`z-M!|0|E>7NH2x;!7^w5Kmhy>6Reb6>{;d_3i`ux2Z(7e0yaT; zx;Z7kFC`(rDpM-0HFJ9}+f7vepNT));b=h}wO~=GfK{0B@0C}e2rhWto7(xkB`{EW zOs-6L^pu_L^w~-lG~tgC3Hs;=_jzBC^x=9y$&qV+7^pQIKr>45ITCL(f*oQu5(7O+ zH1iV;2Lva@wvU3FLWFs*QAqqyF+;uC9CW{+=PQ^wdpfnA#&A~o4VzF1VeVXFQDe^f zgxI;SNx<;>nZIJsukk?%g_suYlw!tw7a})yuy62+`Nw`3asO#;1K0&!|Hpylt3l#b+3Ztd4zvO4}HDQ4C@<0h8+3TGlbB8kVeNAyj?*#MdcEH8#n?D>>dsD=7nejl zM`x$n*=gSARTFz{i$WbNo<}+i>ciK3!A&Vccn}{Ew7i*DDhu8=TZZP&EI#(*&f)Z# zfo9(gCW9Zt+~E6&ZQCc=?+#1n1=mxdo{QFk)N7& zr48{SUAZ`Redn=g#_4UIxJMu7QT6e0ggD|4x#KzA&S#q) zelR1lt}a@mg%2cvMk4Bri;ovJmB#L_mo6?+0y?29z(4^Alu*TLv6~+lMBqx<-3PI* zaRQ?Zp6le4Lb+O*9NR`zeLDAGDI7cFxP7zjBwW={f%?hMb3ZYN2!vZZ5ZbDLygn<7 zr_%J81J}nj7(y9fWnk#hnXS%T81TU_!LrG$<|>FsfsG=f$k0q2zxydM)W8Ob2$v26 zS*tJB4V#A@0pP+Gm)1FTs}CZ$W;nkfy1p8y?eU_puk==e0PGpYOuuM0Y19+Y9tw_u zdk7|g2P*WhmkbX+g=%h$E%9~^ zf>VzA=o(~wACBIvJ|JMw(vm&qYPKE#2Msr$Nu@NEjC>4ikj>_SAAzA8UTgSN`6lR& z)U7j2!pgMm^j$x3bc@}-3VIdEhYvJ?R_dA;qBd4Y-SyEemT!TK_UT!<$+P3``m+5Z zr)FRCQ5E{AwsLzXQ{9bdPuDlFJNn1S=wt^VK4sWGB_#?l8#~|}F$zsNGXam4c0Umjd=B1@q=uBDf|?lQ$PL zP;=ij=Y0szX-F$m%bqOI#flHKI4q7q`mW zmG@+T+srmvtdY{z8sD#4JQ|aF2dAPWOOcG7w~JhAz0n;(W^2{*)Q$81O=k8qMho5) zyPnYTBm*^7=^s8E|TNx3-96S)_Cd_Q=4&@5EOL4OYybZ< znk8zWLRY7NL#?9dKW*{>bQb>nOtpmjk8>ja*ME)IS*Jz+pEkKB{_DRUmR0$m9sl=< z{ny;|utfk5cj-8K!RkNyuRs6#uLaD~h5ysUS1Um{=@&fA0{_GkD;O=uMSJmCNz(sS zP=BJ9YBv^s{$v${g7{#`7ln4itzAO@UnBb0zyzB}9Xg}i88Mmfb5JQ#%E49^^I6IM z({Z+3qAC(oEcv1^Kfm(74=7mB4p8tf zrF-BRdLUb5)6B};sPc<=RfS4SCReorNyFk2BA7LnQ-*-C^&MjC#L+yv|His^Rq20^ zd>bCPo9CeTA>jK7RBRhh++Z(aBhiOF6grZtOsK*tF%l>=|6$*(7LB@GcLPE(kcCBe z+FbhERv=~f|LYS#2)w?|6^~=SH~{M@lf7bM2>GR2oem0v#J*5d*;mC61n(P%$twr; z?O+h#nIPVJe(J1pEsBm<=A`lYe}H9iTjGanu>2e$w&F|lwP4AV;Zev#^<)Y04TsI0R&4O++oHLcqbo=lekR z6ZBQz2Se+hB<6)5P3Dxm4;xdHC=f-&j8FYzY^LN&LmDF5s|CZr+yD5WC@EGn$OZ}f zBexnJr}!1)GQ2=U6dT&|XmVzAPXfrMFp0HFW;i^u5-Nn3C@YCkV>iqA4m?<6+lg=3q6r@5z82hU3>K^3G;?VK~ih*N|YqawED;FPnc4Pe_H zE_o>i2YCiqph0)?663eq#uLe)59qhI0KeireoRtOs3?BGcv5AYnV4pH9nxK705T)k z$|+u62`Y_a4kJgy#H{+H{Se&_6j$0 z%P;e+t1QOMm|b~rp%@Gn^7;VnhOq$=W(*uuX&~#U3wW51_~&^Prwh|Uq-mml3Cv&u zv2r&EcDgMwe?K6?nk>i^;NPIH{#9>iQ7N6nk}dkvwyQJKwv8j#&7HlT*n55FW^Pgr z+G2D(y20(n?ey)%SGGx1GM?;BVY;LSVJyyPT7Sx6Ym0qZkIkPp`o)u-B1e09N2ka&GV zdp4-@*#RH9$PZTfX2uY^18d2&sp zZn%u^=uFzrs{@&>QZZ?h@SW$q-KtI`@re5|S3=7@*_lMtFB{lgiefcrowdmfvQZbAJNgU#PaKgy8Wi-R}n183w3YKB(h3p+kpmR=~-$ z6&;{uyA!Hyl~aN;2m_21C3RkZ<_NV4Wy3?fJ)0_=e7#w-P2w&i!+=x9@GP5 zTD{a&zlACJecfo+*>C@-_8rRpzTcI}Dqm>9Qcyw1AwEA&x*>LR?|kJ>_HR@g3~sgX zUM>*49H%!hyy=7_}KXjA{Hz zQba4JlJ;BdLMcid>^JjcN^6KU$Aw~K`2wSP?4Iq>QY_WX4^y5Eas1mEh}C+p8Vi?s zYrVAm{EaCyZj;?2`La>V`(8k|RMyycdhsNylzOVI=DkuN!I#gyxe=l^vDHUDE0o^r z;nvk$#<#gp?@YH-7>7!Nr+4l{Wy{r|09D;Rl_iZ+Yov%2PwsEQ$+vl^_UgN-N=lvn zy;`aW9y1S?7JJ6J->+63Tl6O?3L}YB+!L*?*X(`cm?hq)mTHAa^SrH1e(Sn0e%{tK zacE+Xf&WX)#9v0)N~;XY)plC;Q7E33PCwMHY$;^(^GLz#<;mXCsymj&!j)6MM>}hi z@Bu$shj)!DjiB4-OxGp7ktBEH`u+Y!mAMUK!_OEV7QAd578ymEL`u+ReWL*}T8leO zoIXva%6i@zXL&E%=HN{+=gf>%voaKS#ML#KS@t-9+)}BEedD)>4~K0B3PMkt+sWO*>xAvvX%pXYdm=f+4pgIN}l|b5FOOi$O#iURF(R%0E zVcpTD@M09{6W0l9_+0`C6%1*Aq`!(=x$aNX)At*&(Bp@-OBSi)>roB7z7V)ot;XG= ziz7f=0#A(`fP(2f-)*uO^%G7izDCyZ>p~lsXA``kdd-7gwEL z2r#}Ed|B`*&B$D1c0{r+7*J}Bna~`|137TWYc-b2G<@2>1ds0$z4Jl>J5C@>op+UkGEm>gDIonF5gPJXJlIM1rWSHvKQ`#Z&lJ zng{$O)UDq1-lhCTFvYs{REy)EkF5F-!AD;)fGUDqCGd+V1uT#?d*}Q^QU-1eTlV`| zGAY8nkm3MAM8ep`ZXj==U*y;MVhQk>uGE()r`0aQZgt@Oy_mZ#Xys|GtHo;^9LE%| z`KnKl@GWl0)>=8M81q7loHHde@i!hZdP-MeDt$zQzZJU8d+*;$8YjE zKlc8*-*?@96c5KhDe&BdJpgK^60t(mdw7SO7^Fnu(mw(iJ|{0+tS$(%T-$k%Zzh$_ z#RQAS8Hw%G|Mkt_6DNZ~NU<1NtDz+GB;5d5X3e`{j6S@8MXA;7yv77}3mqaGD^7n- zDd8PUh#7R)n|wi$PO9Np`_iLFDwVEYCU&)TmzuhcvkOD1qqd%dd)r#*|5P1z;W_qG z_5-qZMfd}bJ&09*1r0;5yp*qmaL<-p>kf2E#X*%kR9vDiZBlmelGBn(S~yZ%X`$U# zi}^9616{MLkbp=RAQm1|PnfO}_}jEn$!B$o&o*y>cCPv---jprAdsY`UKMa}MM0ZE zv{KwCxyln{e+fL_yR-Jk6SI_6!>CpXmABcDJK$zba2m2(6M^3%w3&i86WpOFxESs_ zul%@V{99!d^rc@6y+qMA!)*ze!YSOtcV7mSI#|Yoj6Brz_-EPlzR^&cJR{8xkbfaB8$u5L!f9 zAGqircCx+eV7Z|GEN*nn|E`C!HXN!hA3{O?II-I3Mx*Ub&Gwa@!Bk`j<}!l?ej-V# z&Pc9yzMv#fTkk*bJFa)~LMbgVG1Nhpw@@Y7bSQTs858F&73huE~+ zZ>-$q2%ST_pmqI8tt6V(X20hf`%4<1UD2~wU`;SorhshBHBZA6=R{hqGz^VSp<6-( zLyc=u4g@IZ9U>W1UZ5(C89sRsT>!=uu^9de#$l}I+&(AeyU&zMJP1T6z~GUXd?+*8 z`WTv$*{o8ZRLO@qGGGf;l7`YCxASIUf5r*H7G=bfeKa88K1eiFY~<0xtA(KD?3{KFj2-8A)B%5{9s(~8bJZ^O>10(Bc z2rwl-D<_N#t!`#RwtnksTlPhWvD)+^z?PfO5CqyIKRag-u4z5A__5C0~?@mpZ7C0INJ zm>gt5RRFHfh$WGM{l}Tn8>nR zol(lm`eKpD`uQQgVX)v%l6mP#$J@JXE({b&(0f$-1mW-q4gZg~cMOjtdfR;`PA1mG zHYT=h+vdbJI?2Qn+qRR5ZQHhOXZP&=f6uk|Is5&3KJ}HpD&19Gt7_GHp8NjYKtX|| zq)rzzW3A(6HvcnKn294y!SMN)j}TA_9tSiu7V>xml3q3Au`!E1`;5kBG0KGaqmTQ9 zuPdkmnfY80r%9VjQVUv$M(918nohC|ns6hL1cZcisk#hhdID}Rg zDw(h+z6)bA(6e#OvN|bkK>kIX-#b7Mo-%*!k~Fa?!tcic*u=ZV)E{FT4z^UdlXJ0H zYwd8{C?!c&Xwv)1b9BSz5PmM99;AWNs=toVl(Plb5U*%T))Z`#L9a(d!zjwvSQ}T z3|^GITxUZ8|MEc}vJLt|QhF63&yg{9-V>gwZ8814qrySVZxy`^NmcYaQj;xOt-eu2 znXQEro50FWd9!NauP^fq9D@i{16ai&C&R?b(4T|V(It|t>Pi&JA6~x8Oi2LbXx3sy7C?0JZ09Vu<}ja0J4eTF143R z&I}*}-#1(8F&@mj$kZq*Iljo^MG4VgUHtqzGhY$qOk;@ZKgm*_1q8UzCX=`Dp_XOd zx1fZW3=c?1>;+)|przFNHvm=^yw14`u+!VR_sO`y)1;d984}Ah8iGt~Dw!7{p*!AvZd$06> z58pgoA51ZhwVadV$$Un$eML9sEDB{CUa;wg&gfq>lx?xV0Ql04?av0UQ&6qf8~Vcr zA20V8$eFsD?CngR9>KW5j5f<{*oqSc$@kFn^!i8ydTn{28w}|uRR2ryo0F0)>Q-yz zN;$Xc#Y!v!t-lhn7RjYj#DU(?}Crn{reBYEwqCT4ofktjR0S;8@Lhd=~A0hpT}K z3`%`{)(&`puRsTjr$_%!5$|6~ZWkX1UJ<+s3tUPyvWUI&O!Tdhpm2*XRfHb_QyR?I zPbeu+lx!#G{>04=1Jt;meGYHjgb5b(J!;#W6rkP>*oq1CimE;NW1}$BYQ^h-i-V&a z0m=74W20|(=AFipy3)H2?YISt*Uv8HOKvUp!4TnE!-+f|T}OPhybpED!fi1yDoCM8 z0@bPXcomvE>S7%vAzh{1x45u^YuWKki}mn9>-aY<(uosAj!X#&F|8sl1ggd`H%k(w zU!KQ@OL)~t6z?xW#mj3wB6CPc=Z64rvby(O=`@n6!fga$ZD0`Vyk^5Q$wq-~tf;T{ z+&{s-4guLB!VE%eK2vmvdWA>44*8iP_q1ig{I~lXJ1Il8Fq?AOU3+1ZcZwXKq`Os zeNzk)m?z&U6NY&lc+iafA_|BDqu1WAM?)j8;K6DQ$|x7uBCGjtG%3s8gD=8+1)7Oz z^R;p$AyyiaDBuF9rpNVm%X@_MNE+oD++@Hpz3w#ZBjbI=dPMX^8??1Mby3B2?YVlg~V)y>Pys2Bi|JUr51 zAxW_humofI0km*gQAimWfz82@cnDcv%;B1w!ZLvwJ&?qq*^!9!hX42>iyGAQ*+9=m zEapTS&dN%-2>6?EeG7GgjzppcXbe@AaW`o}X?L7t;&NISGt=H{UYo)*!8z^=f(%&j zj`T+hNczq&F-G&w5#fM+>CIO^R6+xt;=Xw4?+X8@NC3@Zri3Ct#y3d>C$a*O1@}!8 zREM`PF$n)Nhe)OU1YQWU#~ONHI;_Yg)&AFU%=cC10qmt%r^zR#C{{y(c|ddhuLBN~ z9H{@4i(P@8g<9cU?(puvAp+jk#IpE6azHg$f#{#$Tr|uCaqpmReMysq$~(<^Ll1}6 zR=y2E>IT6I(78-Ib0+HQ7N=*GVL(bk+Bb>)C1^in$R=t_lr@Hd}QYLSr{u*OsYI}9of!nn;7H-~QrKRa35 z^)l0f^j*iYQb=Ut+UZw5-$nGP$9!2L(WKaCEVRo3DKnT`gqRJUsLz-HAPKpX#{e6M z*7oIrQ@jOAc67~9{RY`E0Vi_BIJRguKSXGI$54f98faxq^tvv5@hP(l+q&Gvy){%Q zm1KH%zV_0^^f-!SInmP$h99d;G2;^W%>| z4GNO4*midV-d?N8nwUfX+c#8&=|M}yzl|L28_89PhP%RGd-E&IDs*@h86jKo18Zyw z7>l1Ej7Ab^PVaDUBOgxOOhWGCP$U%zsE-s=N|PK zw1gR+0x*@S?jnyQ-MqPc_aP_5{)+|hA~cg_sa%i$xB7x3hGl8^@+ag0CbaQ4c$+{m zAN(R9sbDS+(bsXhuGau(tlq4x<`B9HYA#!dmHyXvpuqe(-UytJUuhWw5_0Ss2b9x= zK}^k$(ZPE|NEsZPBCFqm4jX7g9Z|;C?==tt@9F;P0>a41R<=eUiKwME)QZq7 zDkM2g=QIG4axSiM-{&w>wiAAtS_Nj!=Dh<07ZyX1Y}T^`>M%Jc4h7L|Evd?Z!cu5H z34`z;vYgsqarB^mT>tdW#8Ud+(Qk2bd;hcTVc+o&qW|D|^mlU!0@OaH^;eG?R(D{7 z{|GE@>ERxTUsm_JN~b4GkKsW3&%Ck@$4xU%wpC=v0zvvu!D4x`8>V(y=qMSVSY}+m zjW|4Tr^Ikp>Di*hHc{Ao@OU=NeZcd#S|pULidT7#tcS$Q!O_#AUuI}Bwqpz4ddhcarnJDj(ww;Lu%UuH4QON{Sfxjm`g7(OX0u(_k*;basAKyHwpNMKQunT5BW48F||V% zx<=R*%lu#9)Vu(a-y5j5L;BK93gtF$AJIC^rVu=Dn(Rowt7S6MocZeghv(Bb^2>#F}+I{MNmL zIuWN!`?=ze%iNDBClVYy;odO zYe6F@r0I0LR%&cY;HU8dg-w|(Mg3qwW5#Mfs+lWI^Qc%$)mI3#ljSAq!vl+RPbY2k zOsxn+odo?gc5u%-ltXgD7v~HVQ$1H&&(9paX5VS?|l5)1XusMbs66KplHZ-k@nrCi+9j-oEFdl^Q z%V}DNt?^uDV<-8X`~O-RH$m&Lh;`Z$O^4HfF42M7AFh^9{oJK7*(_KPQbVKuAsOAd zC`$cj!T!>xs^gqKvjyOTrjxUVZ`*@SP?2beTu%(|ZR?IwUgor<$F7)&Bej;94haD@ z-FF^@-YG0Fd+&S4_B|Rdx8?l#e)v_{Vhd~C$nGv&I1_AuXaP9E#^Tb#`D~y zTnWqyP8BO$~hjL@V3=@c19EbkHt4q9Pl_D$oAtx2GT z4$C`9!^@&pD^g(Ta9bilff(B*_N&0YBdo62jc9io>Z>FEjyo(A0eXmO^K+7`wros6 zkGL7ms{H-lonVINhHMLX^G<%>7yu0ZMvftcJep~5s8;PwB@OVWWdi+)Xfcwa|IKP% zAOH;Xx3@ncB8R^2XgR1Mj9vxy{daoP^%O}6k`_%=FcC;nyVhv<^FH}unx;oIifWA+ zXv;U3t}Xg{9AiH8B=%)4-{i+z*f(@Q3VPta|Chp#icYXzAi~8ssG#q=lv@!ubnqg) z+AU{%25qMkO8g{}Ork);h4CMply!km!#eBhhT6xi$3Ccio==1D8h^28&iPJv3UAWMVivYucR`0@McyRlL$HJHJQ}_N z2@C-=XYqQ&f(ZswM?x(czpf{Wt11GU!z}>BD?yJ-+T(T|5htN+@6c0NeeVTaKrC*T z-}US6KBLXl{(`&h^?+7`U*)qcI>-4*#JSCX=7o7=AOt#80#Tk+U%hF(Ym`p1Au^TW z#K(4&*+e;3`XSEroN|gAmfJdq(ZymHt-EDr0TzbUz^Co z4%^!^uvAo3Dn<7ToM$H;;n>1Jd4d18_n3W{;h%x8aH00{csoQpf^^(E8c|QqWm0B?;pxTb2)36EnCxf_vQuaE-I}sH57Pig!6}n$H@hD-6{H zLUG(qHZq~`&8JA$@S3&u02TtNg161(@vNVTHT?Hur3vFt(6`-VneWu>?}DTmh8Z4& z)-ti)m8i2qP7q@Qy(WYDfT=(2GSD2w17%d#rbfC-i`nh>Cn$iOdFC@zFk;&AnutKNFQa!pzrU%>g6Q@2Mg!RpkwnH<{56*#Tey&_R)1pvp7} zBPkyo#o}*a&@c{~6i3aA#vyE9M&hoHr+zCHFPcv`2ok`mx0)n~ojLLWAu#@J`k`VFWrY*|Xrt z+|wtw+G<*$Ja4){^Wnmtda0Ik!EXmd62I#RN!IuN51gi<<_^x+lSS~|iVvs_#c!YL zoQq}@OKl3d)zu%|hY#x0kOsT?|LOd1|7-fU8y7JCPh~=L5we7=Wc^wn)blayVH%_e zjoSo?!72|6ya1toHK>sJc_uxV3W4;r>*q%xTu``hLHYBy@^6)|W+^dZC1MeXdJS*p zlHBS2(pRf$A$4lVV{b;LIR9C`0nYv<#aCr}RkHr?N%7qv0Px53I;T-@#*tz5R?Nh! z^?=);I`U0c>g#$?ii&G0r7~3#>ecH!k{zpt(f`uN0A&6Jd65guk^Wz`7r-~|ZHQxd z2lJN5*|cc>I~7RtB#;ig&(*f0rTgD)V*gJ=bXhxt^xtjp|J!E>*ggqj|IhQ*T`0cY z`*MfY^@MbQ0GBhJ_Zye4`7k8bnT>7Jw@NWPgi2ga+?V}fTyvG(oDDxu~J8bUN!c@y;IJXxA6RRCjlQgJgN_R(pQ+tNIq>c&2Dp509$hnIu%6D?C- zHhvGc#Ys^?1XD2z_tC!I>CqkcU_3q@6gi8oo9IFY1>z7kKchvrYjrLzjtYqB`c9?O zO;kCuC$*8q=a`|;70NV#6&2}@tI?ds2A?TV9G#W3-Xl2wI@gJYoA_0ya&%qy&|toZ zLcMiD9$uz6bH(&Ld&q0*`FGP;-i67qMEln+)^}*wT%GsMVL8bi?DSjWmaR19A0GZFE=+}6Zk_6=-iWmpiX8Ky|GLmbcyD7N&{`CM+VM2 zM6%XKpaW!Cc_*7&bDw z$3|nxYgPgHq5`e*n)|XuzBl?e`a6jI1*i5mKTc$1Dg+ct#kI@k-sHG(f!*^0<{_h& zK1aPtpce$gjq<#wuHI>ur+54IKV5NLFkW0kg$}z(rcwP`7W69R0pamTLG8~h>LnH; zi1NhZB!W)T%tV-{``D;4AdHEv2SGal{RG%SuLoQ3EC|7!bpQ0>a@j6{iL(K6HcE+> zXvFEX2lk$D3r3WVM_pP(^o8ffcV& zz`0uJYj!|Fx*A`3E3OKsSL;pvaz!{nM}*=y_Us{{*`lK{N-mqwu8!S!J7(VgNE;UM zX9wm&O*d!Jj|GVwZEYs!$#|XWp4c^fJi@0v?zh=SsOS9R=TJ)MLhZl`UtUH>bkQ$+V@a- zn^`NxMZFV?s#p~nV!zCxZfZiUUqHny*e9`2fSBafCL~RoLWeq=NT@MMoA`0IVDu9-3Ck+Na<i=|V7|`b#O!{0u z4UXllH$}C@W%IQVpA7zl>Y%(O@$)5I@NZ=2?+1xsa9)eonu1A%M-fVTqjOaoIk%rOg$Ms5~<@(eoI~+OEpjYV*=&2ffuSJo2>@K$- zN@lyN(n`L?&+pjr5M1lP6@dv&18%C671O>V7niZ_;}5gK(aQ`iTX~M=Tt{@k_4?#{ zs|GpHhn#x`6Fu(RRuKwBSKD<=CbkmvW0SKIoRSZ4*Ez;}t26W<=}tZJPK;rP4PY-O zT)T9=lW3#rv*@R?03%Dh#{d-MdSs|uQPSW zjiyU?2^P7|ET&+{KLm1HypK#59FG2%AGf?P;za|nBAojdXCSX$F#`OxB56Q6jA!Cl zguvq?G@YI9{b_i&ON78~E@s-s6KXi6ZX_#86oW&I01&)V2y9eR5LlO(RpIjp@l{!l zjHu)&VU@j|cLZU%50B`+nX=K@4(YK0UVScEj2Dz^ zxmc=QM?dhbqYHU?kh*0~%Irdv1tb^@W1{Q2?{h|V@nY92Q=)`wajYU<;2X#z4};c3 zPC#nc9;bWVpw{wx-pSevD)~50O6Bf0pJ(~BgC^l2w_*_Z+b0PA60W#CHTk^L!j!$; z^9t4Foc}`-g~6wfM7B8t=dE2_7+WCxfZAJFwYOrS0$AZ+m`r7oh!^-Qch<&X+z<@0 z2J+6J@r+5lRx0|SB~bOl;u7xVuvQ0xw}wXi=k^2N+75@hG*z3JcQ)~lQXBq>q6+P7 z$4wM4h)NZrNNCt*J=7w8uR3K?c-94rJB$zmWQ*0jUnqe0NfI*&RWH}Nsn+gs3#O?> zj51YC8DCc>$Wrt8k_~pd?=Oa<+rMC)a3oY7zPm2$^7MEd=!~ycM!q4+Gy1nl{=^Jds#_1tiYDZb0^GtiTV4vMDtEbSxRp0OC znWyiXheX^kS}zX@GuQ!a13;lxYQwPjgMRZ?Rm<)PJ_(rH6U@`U?)UEus|QH}MhflQ znJH)M54P5w(l#o<+SVgX;|fnnxqNeVbwY7Z1Y$T_Qj=Gt*WcGRKub0Bt*ovML*37A3E>U#sl z7Ez;H4v%%GJCMTWJC$67qwh0sE7t0>F07{nMQ z&>{^l+uHga&fXyyu;CMZQz@u>cI!nRD@%KWZ};_~&GHb|G~ivg!aaqwSvdBL6X8b1 zB2X_ZfUk0Jg$HiNb`0iE%6L?rhpZL51g$IONZGq%y z2t2E`8(&vM zbbUal@IySl-P~_%^)fkNKk_&C(x5&e9u$4KLmJug04!T$4xny(Gt(+yq5HaMgT{H@cLZG#L_Ex~3Dj zBRSb`Y?Tt?6TSBf9L}RDeF2e@d$$-!?8=?O@Yf6;8cUzfP_g#?e=>y;qD5Gs1PLDm zj%Q~GgumoHkaC696l87fC|)z(g+Dq;(39`+<{S452@U%!5Ei4D+{IT2`<|HgIsR>p zu)x@f9221?e8&h2cZ+4)gADmW%m?=E_<7^GOT3gL-Piiv3Dhtc+;Pt;y5(LlmI#awL)OL0KB`M)d=qHfek^FC&bSYGH;{yVE{H5 zNHbu5LPJ9hQ$4yECHlzd7z8_8wT8(#kh22~o&)1wDn2)atnHDF;( z7)OXnnjYo&Z7p=KvnL8S1^PshCA>ErBeuEwyNi^xRP5edNc0HfDbNsw`yK#$aK!Ta zH*PQC{-flULwb1pD-nLfpXsnc=4o4dzW~>W;zs}rk_9Nb;Vi`dw?|kNYFYHwh9q-4 z->>RIJwpE+a$X>&a6a+ODifmNVD}mEi>U+bKmviuX~RA}*= zN>a8Dl5mMR7TXhwEO`};nd(j(*cCbuU3@uy7tr|a#yOhNBJJT;Jg$l~9)bZ;o86=# z#;j0_wZJs{o%o7+C=G?xyD&M^S{QTFJVsj3?A)-Dp`rfRbKwAc3Kn_kkkaX*~W(O9JSt{+*1HE%9@i zWuCff)f-nnWt%su$3?*;sQu}%>jnMq$D?e(6DP9*1lQWAb`DU zfjzXebfmk_Cw4@;8%4f*QNm*yEQbdK|LjWb5QI2NqhBLeFn-|s{NUKWRp4n=Vv)gl zoR7ee`s}|tn)wA^7l<=!eqXyt9~RyjxERKjkzv+@Kz)c~z(=q@rDm5M22heh{ZAvj z(n}Bu>=uyrWna-N9@*9%Sjs{H1EFr<^f>}&C$mxKGJ26;N~LP!cI^s)4%1zE2-CEV z88KX!DzAJK#d;IX*W28qij|kY`Uz`HzDR*>)mSEEmDNkr?!Zf$Op1236SE1WKRj>^CHfI(%?2x$QT5NjRq!a0XzvInNr9Cw2EJr zjekG|fKWETQ@hv+1GVinYyu4&h@zO*Ho1QT^w%dpI7~@Ep20L;&DNl#<%+%p+rAk= z9xe|NR;!E!8=;`6wIe0kW-{XKVujJFD?wJJ^aO~7s7~H&W12dsQ&>oLo4M(A(Q9}W zwZe^7oJcnsIAu9QMK0diF9vIJL1zRDNrM!CfUlyb7(S6=+6y@rmOu4T;qL4FDzly- zXz+{lXBk#63c^jZ>S>aoqk~oPjJ8>}U7}>L)Um0=>*tEz67_H&gwY};EN>4Za-ZfC z2ucKkbGb9Zz(X3Zkpm}PG#`-z5wI`$?KgU`p(j`At|OEZxL1x|Hba>w?=W;45lfhb z1vI`ntxG#kpYb|XJ9jhQX?%2Qm)=-)SPo$LLBoWuaF)NsHE|K)27YS$ekn9g$1#}1 zVmU9k*WjqO71#41+7n_=5IRDOKjvvr7Yk!PbgTvvN-71b(MARc^~ z1!!0$+ELirm9<4OLO=)xv~fFh4q+a%`gSxSnPYkzUIz-o4pShJDYy;6mDUHL*H0+y z^7KAU=@WrtXT6=HSs(xy2E0a*3Re=pY{`cSP3u>RBX)P(L#oJlfZ{(AQW)sxbVwcw z8^7Ja>RT_@DkL)eE?t=-f6|`%wUcDPZD#5Sc7!B_JmF|7cv z)B*_IqlP&$G736VB%U$J-O0ylB$=lJOIWGT zFr7rQ@*|+T1vNe~OV+N))0D<^7{LT@|01?)dNMzx#50U3?*n8Gi^IStVyce^GL48( zrcOGq_bv=_?B0duxIT=8Yz-*6ceNjF{Stxe;5vtTBjc_=9PuM^(tne|J<_UH{rJ@G zc+{`Farqh*1G?a7-aai(=omriC-CL8_iPBtT5V;1jT;cu z7c#^y4|Bf(G+B7&myt>EuybCnk=F%IEX`Ww|`?JKJ4S+F|#$Jg>#81-o#Alf#(VT z>~iktjL)aFtEz0X)zFy1;+Stg92FEYpa({=hZ-I_b0lYb8U7CpWWqQ()7j=jn09*+ z;!cXk8tvvg@-Q$Drt;J1k)YnMK(s?(&S>B1s#z@#5%Rcf0R@hrZR_!HY`q&Q>nV*` zheo$DPW=cHaTpBTQ4j_)YKdNJlAL;6sq9Wew>Ib}*tLe>1CF3}fFSKYIA(Oh%It4p zzdIMCJklm56_xnXDd<&PB(fOIvpVjN#557egLywyA`0ug*B%!Ub^KZMSdCa{#f#kB zyh7B3hrFA(vSTkj&0)UKxIaRaWHfs!qcF<6n+^pdmK!2x`M=6EZ+Ch}F=fLGnR3#| z9>98~Mb#5ZC_mkL8-8k}O8z!CL8_zh&KGDPK6&MsZ6{mJbCm!1zL+VpqugQUzAsY7 zu#;<+goMaJth%!{D!^*JKo8$%fJdcX9=sG|#4oePsF}IMrucVpdN~j-^-+|cf26mq zB#*rK=fL=nO5t(omm7Fny8XX#kT;z}_p*e8OQGa6T6X7i*#h?Aqi#QP5+A6kno_%dQ*^c(MT&AgKyRx^>jD0x!O|7r9 z6*iNJ)N8%bU<-DAcv`Oo0R6QAnLcA3L^0gpjp$T6i?)Ai_6zzQ1b>*mGlmE-(Ih-* z%McMtw(|RgWZ(3>2Si~KaP%^13|9C%-9be^23`pwehy{67jg8&f#4GOK^BdR>=*|K zVv+MaGv?;|x6+;-ATgiMtr#*uS@w1qLrj3<@yuUsZd#Sr#KAU>O8jKJ8U91+MLxT@ zVl1!KzixfJSN+?yNFn(rg|9-2sc{i3R2~m(xz;(_MW{)D8p479go}+PA7(FD*k7;0 z_>t}o+oQ%T${z6GIzz%}2CEV#aa<*sNom4F6htwkbX3}{%A_#K<2nxGnxS zZC<<#MS`kaXXh?HfBC2jOL|;b98B3j{*_pryN-AS)CwsWcz+khu6lvznc3z&h2qCG zGRnJR6%YG?b?R|k#ywMFSlY+{lD&d)mveZ>m3V z<>$o}2;r@g^MBqaXRF@PHzW&fVfKu91;V9(jPF&6|;fr-|& zXP!9|53!5lja0CBo+I&}X48zZSHabrQ4YP2=|(7}wu_(1@j(=eSl(2UC|7HuZDH10 zSVS``LqP~zq85=Jk~^uyAOl^26&xYcX0q-_PSuvd{85W}mh4jF_bJQMPw-3-PLpsW zVA!@CWngi{EyOkv zycnW|BG_ei6CE^`Yn;MX{cEmUc#HWY^geg)ERK`&&*y&Znz|fBGu_K9T-9U!gJZ(e%Y$rCI5@ zi3roF%rK@|XIA*69;fL&^>{K<$3(Rby>Ant*j!szEFI8&0Y(f~ZBR4HcvkIH={{rB zL)fy}^>KZUAV65?7kz@k5q@rqLLpx|tepQ^ghG43VE7`<>6ixMU@;U{ddGabw;NQG$1|@<)+}aOB_lEkJ<&ZB)Z2n^ zoXbH+)Z0}+!61H$mN7scb~sgIN3Tp4;GuwZgWAK%rR|*btMLyKSp{jJkAqrc4npgQFFvx?vk1cIZx_2+q8p#U_=XPF>+^)@b?t83KRZ@u7iP-fj+Ves~t z0Hr!5k1GrGcnrwI=SXN+@z(sT=or3p5-45IG%Mf9n@t#sC?>4?iSeunTi?yFSb>$V zl>Y5dS#@W@a`UK)=YZ{g_&W-d?v5!Bc;rxwM9GdW2h+FcX<@rf1wC(j!o986`Gt$s zMPoP+Ax&n9a>7n4Bs0(xmC0A%9R5Q@TBz_7=s@@k(A^_Q*~kkNf-N-osH^QUK;a$J zXyW4%v79pf&7s6hkdQ0kZSN`6J`OhPJOpGq#~cmCL0)}CiZvLS!BJ_ey@P~$m=cR`A$%l%KYsH9c(Y+Jz zJVAq|HD`C`>dU@O75@8aLek0XtMdHrPJ<{%c&zTP^LbAs(-Ex z#&x7Xpo9SUP@%Q^#ijE2#0tsbc@&i-fffveU%O!_o3OWtBg1arexklYuQuJVPaXLI zf2;-TAuBMYKiRg;pNPCit|s!&kznOk=tU3KGo82T6Sr_1LCPp)5AI#cv-&HBZ% zNn~ymuZ8Yb>Sfdjs@3+08E;3&Kil}xUerF{1*(r*Ha093+W^t8_ZS_#oPmSiXGM~} zernehyjfWIb(KxzsnXyc3dfM9KwMbH^_%y8e&+=hOF(-i-thxQ%}oeaZnYa zR=)ScPNQv%vuYrCY@#Jrn#7vfvSeJVp7_Aa0(WClzlr*wxs)%YsH3>anT}yW02BPo z@$a*1_YF34n={vODC4#!vpO#Ps8YGjmqUx&z62DEpsH%>?I06_{!hL2+E}p&P(fHh zyx?5N?}|#Q-Z?SkJM%l_X=LxaF!jpun_pT<Ntk`i-q#ciN6OyXNu$g-VFj~0dMnwb-VZ0?^vL0VYWI7*gwke zot$!bdT&!@>blg{o1r7CecS0wz!<9N4M3w(nzwTa&eZ(H@@@4U_-y#Gg@3zrU6^w^ z?!rxQ3AI>OCi86p;RbMk_y-Ph-#P2Vq$*aE53)VwE$5@J`|rrf22XCU52KIJT8La7 z29`jcEE90JyfZsRc@uc7>9>!7^O0OjGrp%bLI?OS*zTNhigm9?}4}&u(?C?TMF=X?g zK0u+8T? zprAlEdyQYI>vW7=mTaae0)1inaqhs_@{60-IZ*6Rn)qP(9k>pQV}O2Z(v`>%RKI*I zG|ln^MkUvK+;txeTmRqAAq#)ONtu^tsFxSYs#QGlWF=V=_MLyTWLoVOeQ&=NSnux9Kua7MQ{G4db?nKLbf}n^*`tSy zZWZ?q?Gu6K3M2s;?ccZgLcb>^k!9KKjd)>X$uYs9(ZS*B=$0jIKJBnlPdm3~02}E`yOtTE${pN`$n>#tQwe zo{3EMtxBy9EsgQvbLVy*w8Z2ZrGfA&y$!A^V4T}cz{-nHXt(SK|EN;{kt#7Uf5_Rw z!#b}Xb-CI21DK^*JlB{MYl?zNC}LzzPTi_bNMF!`W4LJ&^aIxRUW7gz0sk77 zr3Us%mhm?*tbp*Ztm9=;Px9MvvoW=qvJteq-_ADDlIc-46{|kfn9t^N0>p)JVy%WL zyyhOq?)&Hu!3f$s${^#e(@3Eh1Q(<%3ccQP1?fu`?xjuX;72ku43bUW5`il+EV{j1 zc{5(5%QJ4|Ng9$!WCzmo1dyO`i%PM+ZafzwRjB$N!&8mHyy|sKhkPwm6kna;Nf?bQ zC-YvXi;uK7VF|Ky1-I=%SWjE>@8Md&z!~y^K{9#G+3Xyf@2CvOg+3#8Be=;u@y%td z@q0#(g6+-NNv|M^WPg&gZbj6-+B{p+gplxvNzHk3ZIdXKnHuzlyvX}V%(03Cpq@h# zF!AzZAAqtMw+(QB^NR z>U77yCDG{~noVZyt>V(wcZwyE23Te5Fz1m9u?@ztd8Jc^=|b9Pt3bAu5*a}6bAk%y ziKs^m-=%8=1p5=!=o2H6Np*VJbb0%FSqK~W2^w5)_e2pCh=d^E<(a^c!tBE=5z;)O z84A7zLc)i~5$^+2IfJb5xLwzcpX7@(l+y>LCPMRxfIkK#Uj5ig=3K9U{EKI5@X1NhD9-S6ZSd_m#ngLRO2w>$bN-&WO>c_++846<)u96c<;1aw%<*TMijvM zU_T*#v`+II3wjDA{wi1HlD|NVq~F#_Bt0|FxZ<1PAiaks`bY|!BD zO@VK5pa4=y@)-0Euct}nI*}_x$vBzjFDL@JKCCYZ7B4skEc zFcBE8mxamtZe1U2le}wpFm7WLOD*E~UZe1DE+QHV+!%q~*tPQK{C-;ZL$zVRQ-lc$ zJof+nMc`A25FI`?X9{WDQ3Z^YJ_|fP%~=Am7e(ABWnUD3R@OM%GNB-Sh8NlQY_ak( z80Yg4!P2Ql{xfn;-qm<0%IzZBx{bot+!A;U|K}(FufM$D0Vbp{CjBu)!aP(Ug1Kf4 z){F~=={P%|&v=5K_s6j;R1b=A>QC~XeHy`%j3Vqb?`E~{>*yffp= zQUAw2|3BXo0|mWZ!K#)(ICB?6Dp-lwAVsL)NV6_J*Ks$=tt=PCF(Q$bfV%d_|84x< zjQzHCD6i&x**KbiuS~7-H0os2GM`$`ZhTx+9< z6(CX2%jioOyEQ0<#$!B1`&_C-KUw`jfjBu(-*hGsi*mgB+&ZhW7;e47o^1TT{usdm zf`WvR1q!n83#;4DQQViyR?%o?0r}+YUO!PKZ5y^w$vWP=&p)4bC@wFW^c)hYRb@bv zb=kmY#SLb|2iin_X_Ealt#u2tp!kjp%H3$=BpPw`Bx?hpX)?iTbd(K_(cQv<*5F;o zp~R^0(#WLLI52Ht1qU9=4U5<`wP3GWA5m1=_&#}d85RnuwGv~`imq(J`aUbBTi0cW z-P>CFgWMY{gsi$cSaf79VgnhA}oHiu5}tK`wKoUVUS< zdCVN|n-6{$H-Cr!B^o`qveNGO2T`xi5u$4%&dYAAolG3%^_^30kh7cAu7hVzPBXV$ zrz5ROB9_=eXpo=xvMal_uuIl;=<&4}vB7fS*Ac1itp=&K7cdkh$;(8I5@SGCd7b=) zUXQ8W`xq`hxG3Mj)x1qNNoq=~jnC2tnr3gKMPF}7lgl+6tXxaH5kWSsZoS4Ll}5YV zGwO`H(bmc8=;sgO@)R2NVlf?Bb~^0?rqPi$6v_w!JNNm86ZdBBWBKAk3Fd`BoAk!! zN*uP}B(E~d{@}NZg)dJ1>^k~}uD#LbDYVEjukXIJ%$=qikfr%@x2lUaTAiaylBZ_G zSSx3EelMZvbQ@&LlNa0t9h!ULFs@jp(r;&;U3pk!I%Y3*u}(PbEiE77&8rt{&rin5 zK}sCRYmnAkaR+toS^m>(5ZNK-1-!Jn9pQe50@KG;joGQ_V{fe}9WfRmkHV+xjT4$x z-W_1OafR#pDw?{b=dLu0aXnV;^973GVqsoc-E%Sg&1P;Z?AI8f`}(Z4w(I&l3HyXm$L<#+3L-5@RyjMngX3 ztjvFf1Fv7)ms@3fM3Ohuin<6%i_bbU@#+w2&vpk@QYtbp`nu$O2YfK>NwFmxcH4|&uJ_o@SVIrGDdBcGB+1O$Q`Bn$hO}x%4%l9dBz*Beag{4Wl*vIy3M`-l?dg$P6aa=HgHk*ZH=mBzL z?dpf3koZnLtnE$a*j`rG(3aJ8m!7jUC@CC8dbU>p_kP;l$AgF;9JX)k38T0;gdvjC zc)i;N)3jW|UK~(!kxCFyV!H4tR9^XWtU2{JxXGgj=r%U78PHTv6tdZyj zR!8;?9vLKay&vvrk>7@XP00lppZx|wQ!GnTRQjoz_gzH#+ZeRlXnJ%}Vlh9;XbbyZ zI*9GP-=^D7dcK9fpJSSw^pH`#qa5}g*%yy(cb57?ldmP}Q9X1T2tMzuL;f%=*F)@i z9y)BkWoLfs@>>pvq?z-^UK@A=@mz0fRs^jl`j2;pQ70beQ6RklCIf#$N-qIb^{yzZIrpoy9&l`}U?@m0pu;RUd!# zP39{-eM_J5>g8frvlxX~`}Wkcr+?tFCecs^;`fVHF(S0IEEntb9t#Z|hKmSaz6k>@ zbeu&8iq6-Vt}lPD&x9NhRdp9=i~|J~>?oL~L?^c8TW2dgL5`gJyE*J_Gd+|p42e|ls=w;o(W{-&!QjJP z1|>*SHUw&CIkXMO12?T*DNk`QAR)igPP4%izKf$6p5x zoP7F7951PqFPEopA6{;o$@HRXKV-6yP$V! zyE7jg=sOaeao*r}J}y`Hl9~%FtOF95ZLSvK(;dCNh`jweFQ|xaFkUDPKM+qJW5o3z zue=V(9}e(3`Pp8k_e5-nk&C?F199#gvn_PU8xcC+$B%0-&~(6o86eau!hyyt61&Kx zuLb=huuiy_#nK;xo2aN6?&R$KlA?Dacj-%Ozz64TSd%vAig0wAq(x?Ait6{!`?EI} zt*6Fr;B+q_z$(HdYzCV2JvKLRu-!LF?Uu1})-iy>nB^iaag-bK+xW1b!;Ot6SE~)p zD*Zbq?KIY=Zf+j{*WIz$0tF|j;`;3;9S4=?rGFn{_$9^a%S9qz)^rJ3{hCGYGs1+^ zRV%P&9!IHlzlxArh)0&jqKfznm#jPm`Ip;SwrTfGL;CfjdDTs+?z#q6C`pVe+{J!8n%v}Zpmb6cnLSh82t8`1T7;WIQCyoQJV9! z3p8zzL#{~hmDrrS?0kRAV<9l<}aJ_66d5_w4C)y~QfV1>K*)#s(Zp=A(YOhdgwm zZhrJ4LKCX)POOGBf~<&8q`5SRLf01zCq#EXkxCwz!5`?JQy277*d8{4b%^OGycrxD zSHE7LybE><#IbNx1uo^KzMjb2YD6z>oLq?xL(U47A1)Pd%22FWXh1qUy}`RdeZA1i z7m3k>1MPx>aSZ-ft9y&h^~WN)7m5MSHzkrngK{^4J89w~t7F^NtTtm@Grg?kJ0p{jlj6M^OClaTJonIIE=bA`wo*#?{SECQQU79!VHaQtW?#*9D;@kz}ZR zYP8pxGP?vh?&Rlwi*tRAe6O&=?2>-K1nxp5m(UrD>NAQkf8np0IzaPIJ zWf2V+w_T{i2hv9K=!}IF^ZTJg=y%Ud zrsC3hVYsW)c_TVw$@_N}q-geXe>Pz>umrfnye4m=pf_v2U^~QP7)?Lh2*)+al6-u4 zS-A+EX)C4*kQ97IB5^VyFvz=63Tf;qZyS`uuG<4|2NWyI@P=Uk+{p@6ez-R^XgBDG zlGs5*$R2x{4m+-JPsjL`#hKINva%@*6QQYLInBiz0n1c56g$F_tL{I!3G^}gJ1NvO zIXqJXD$N`uZr>_dyq)fzu*%+NQ~rj>VaF<9W)BJ+1(_7d5A=wub>yGAAyR~M2GUq- zrTS!>r95J#UB3r&6=VN8fPXUWX?%X&q~|+_>s) zo6b#+ZZye%6<{+IfCleY!{};OklEn+^;2OGCzd}Vp^V~qx7UR%H=EZSGS@7OhS9`i zDYWh!mIjld1A);)FAw8jyzK9h4EdBI=hWy9o0W$wE~D#8{k*Zm9a|&oWVP6bUI#}+m>7?x26-#W=^9HkfYT-*U8l`=;cYh`SLH)I5tr|nQ{(a#S)r*Ryi zk-c@FwLIUv7rq$KheIVEJ*6K4J}bGtsBsWD6lW`(T$br%Z1BAlb9UUX*2$V(wuk%F>NB#c^lQq@UVX&mNNnz`B-Ox6`WWZa0@ zleP(pPFb8*oSgjaUzELD=8!%*nax=PO{E+D&)%@7!$puf#b5LTNMso^37T%K3}eg zBlK6?9<=AmZqx92sd_xxw*#Wn$NBrh3wD3~mPFL~nr^+E!g3kH9(W|In5J%80cq)+ z-FfvsB@7qAeN>9wO{oK|3dA#4je6)55~Q%LQw1;v_Q&x#OYm7a9p#79vv(iiZRb>5 z^y`qkD+?NyBZ53mzfZmD;*K1rzm6rShK5M?e`5IXIkDEsvz;mVwF;9uuyQ_thvo-; zouj_o)XcsWUMZaOO`e?pk!bzu6@{a;xQME-1gT|EDdcJ;WhJEGS-^?w!MBHeJJ4O4 zm+he-ORzB}`Vznb@c(A&2NV(j6=q6;iFcGZY{LomYFZo@AS4;DjYg;M0^S-#!fw-Itk?S#$DOY8{P>(d z3+IYMEuEB28?*+q?6c*vPbtJ%V5?raj|z*AEb2*J479lKgiP?JJsIoE-%ZvR3yTYn zDm{k<+1pfk%&V&K-s=x{A@SCtCE-Ay?WM)%cG2Uspy#&5Zwr(_+i_3- z9qY2UtNj(imQUP+hpq)<2!;%XWN_=}+A84JvMGinKJD)eJa%#$cA9;C>T%347}S?T({%cLv(60WDyu1~m%EpRrZ)*Ufw5NL5DiF9)R$^A#29(scNG;a!NO+tasT4KSnWg9!4oR|;b z@dYVy>)BDy>Fkq6opxV2$+Fi`;-zvJ4%6mw4uNW2^A)fHP4*th=I>u42ng|_=dtfg zc!kDGMv|Du5O_2VMl5jV{*s%D2+4A zcOKE#$S}5^+KTxY?;)>*o#vuNUOR{JbMV~I`b5A8b&~?iUXLy&!k}6B+ogRCGTWUY zp}aHH_q~JNK^yBeMPt)O7!&ET3UgILTz2dYHBfBkzd=7G#ow*tPe?uo^z@!=!395$MqoX$36*wM6|SNd>qaQN>Cg<-lQ zeaeG7ykoO+RIA@nUnhSSKYPgBVFRx4*x1SDrgA{Hm7R5A(+Ixo+vw)f>A}5;)8Fwf zVNK-R!R90*Mkzb2mLpAQw_mX5qqEn9*51JG;=S(?nS2znTjEibMI|HF(u>v-xW$Cl zI@LL-<+bB&9wEgADdIACb3I)DSkbu46Rm{bQjfZrtgn>dlE!asXSu}tPe(wg(airfmIlGSAnv;g>e$J|%6_wqH|eNdOvx$It>Jpfv*j6F4k3lvFxkM! zEo8w5eC+k27+JN1wO=o%g}3>E_nP~skf-O=I0@A$S+%TGx`s&jX=}xo3ozL|%FsQ2 zZv{oN<2@7qeY>Ss48&YIIB$(;#oU&)W#~2HZn8}^)Am)}6*g&4R2tti>ETx2FI((b zc+Uzl;v_}iS}{_4a~j03yIuVEaG%TSH61OGM2lNzkF&2sgFYBu zpE9?6*K+O1UTJ1|OWMVwfVw`{NuB9t2ll7CIZS_cBsxJg&+bJA3_%YWY9&uI#@TTd zXzad(1f7{JW@~<-vD_zs4Hia%^^8j@GJU1Wq)*s0%q;cm4dOi$SCv!n6b=#!H3D#u zlypyZ)6q}?h200ZVlwo-dA!|D=<^{mip8;$=zC2iIx_ZIV5XWz=x$2M$)y(i!Zi){ zbWV=H*h)Pc{>x*xw%0pSTjgl$>?ct|5PsI@QD4-JcPfH+?=5!XJ}ngmp5Mw->Awr^ z;)n0*g$dQQAIt#W1^hO1-rxVS>^tJUgLC9S$4hF;3iGbeo87QgdDPqD?Ob;Se)pY? z!peau3qc$Z#}Qsiq|BE1N?Md7?yL(Rb4f7;gtff+1uO_J ztT07(m$;keVoQW~mEv0xO`<+#X)$%En=5>18vgCsj0whkQ81~#>?5wnoD4UwH zsDCwK<4QZ24j+sV=qj=N&9=OiTk_`2Hm_Ga^7SHOu^a&zS6E}V@~yibeq}Z9qzS<~ z1qL&Z_~$HU#oIWHqFEl%M8oDTbWrDa+Mz)YX#rKxT!yRMa&R#dk%tc_FJ#W{o;iPs z3wPpXB1;QCS^nsA9m&sc8`^jbh)?^qg+=6gqpA=1Q>Vu3?BPQ1DBs23zY{Z}00~Au z2Jt`7w7=R8babixa^91_i@ho@w@A8?WVcia!N1+ka}E0}*ZaHSm}zrFHkHb-KPQlL z|7T3S`*A7~GD;ERMnt9(tYFlc*2%Nzpk6nZ5=T775_5aXEZwOjU7xqY;PH{Fprr5+ z#_GxOkptMv`BXK-IRlHT$Yi?v&&XaQos_a#O5#-4R#j$F<78uK_nuPr!RB>rr+8;) z)qlX0$T~SB(Idtu;~rabrmEPN#>`Fx;oGNX*I=X=73QKXd_A*oG)K>a-Oo6Yy9S16 z8oiwXx&G+22xOJg|B0mV7XBLvhsd7J78ywvyLbrauO#|GSl*4ty;+Hmyh8__=aU_J zd;P7m%O!?6s~GvXm=Wr}uK2Sm8BTVDd|MJ;Ii;%oZFiw1bjestFmsptHUv6~^@&PZ zYMJ{}(JQqEa&b6?%q7jF5Z=xsL=bg^JpJ#mgrnxJ>Ov8+Qz?`BoXPb%w}+ZOcLsl6 z_GBQv8NZs%Tqm@eL0(T-@4b3-^3jB?##?(09k!Iz3!1IR{Z0fQm|}}@Qc1bg;n~82 zU)xH%rmRDqKX|3n6y9*(#D7|evhBk#ZBBdF+!Y&XMwC_m!(579nd9L}O_>az<_nRp zz)K|!_{{jnfxtG27oPE)>yo9msi=G;N z!7TaO4-*&3W(1S%>m*crGU87H`soGKUwf0zZg%OgsajRExW5rG=z6T|WEjWs1iih7 zl$^}I9Acs>*NTVkDQACVpFV`0PXEXe?GpAQ=o^7F$A)LCnEUz4=;-Bm9nK7qE_pJq zUj^b*{<(Z%MTOgsTyKxFI#pRD0}eqmA<}#|cCuoO!SD5(h=^H&4(JDDOTwOdq*!F+ zcki~iX$$E-wp-MipCAqgkbIr8OplWPou;+TxwT-r=$PwtPT=j@Ue-52I;ud*z5ThOr&PVm1+6;)XpQ0vk7^W6`)!`9K3>bTOe@bAPz7dx`+qbEQFNmb7Gln;sXvCnF2u5{g3{B>{>!nY513Hx&#Q= z(W(ILCwM5lE~2@VbQ|ecgH|0!3j^obz9-CEzlL^r9?U14YJI?H;Y^@NW=6XnK>iK! zS%}rx!p;-%9-Vs6XB%*B*~{ZwBfPccPVQq26)>TxoGO^@pKN2ivnAKiXVW z9gPVJ7cs59ize49RNcdI?T5!`A0AM8hg3g~;BeY|? z?ls}D2}6RD__64bUK|KzK0=&4F3`tdQh7z!tHTgR-W)olKnoMguHUH&et3}RNEsg{ zhiEHavdYmkj?rolbABi*i97v~&Y1g!gYRKMKWcSN-82`3+-oVs!RSo5@?z&(tiEYG zRVi#pTkoAoHK@<5M3h;?#rNPww%4c$_&Fg%BU7)myAvuxW%C{r2i6u_nCaoCual!7 zEE^tpv%#I`uDg;pPI|g72^AiYxD6t;4iAr0J%k9jCEud#ZE>%1cO#;dy7a6$gdp#Okj5iRg1y)XjB;cky#WCzs^8h(N5eX24VmrY|H$%KED*L!e2Z9EupY z0W{8EUBU@2bc8>#v*#8@zjII%Pa)q+@FPGtDtTh@I2-(qohHKDiIgVCTft+pOrM5V zem*6+HwxLZGL6qACQ2}rMcwNam1n)oheMs#U}wk<8xb`5;DlvaHz94n3b%INb@;>< z!9yvwnt@itdrrZeZLz@bp|~{I8AI^4Qa_#`)~~1HMTJ$W+v`lsNpVz=7=&;!m^H7n z-f*xBUoHNG0(njM9Aw^Dis!7E>L*H?%K(%hU_DUqGNq*7TJWYb(oxhP2p#9528QQ} z6&e9R_&DsOAv_ioOMIiBvE#dB>D@A+eFBP#6t)4q^J9(5-;!Na(WBd9{_)b|syIa9 zEx30yO<+_hQ!t+rC#{13JQjZkfw$3vQlG{ zK;aoPTSKggiG=~g=YMaOb<%fVEi91k`m=drnCW2FF}c;X%8j*C^bCG_KkHC8m`B}c zQF1)zg9??$x`KBU3R|I}en{Mii*Pa{Gic}%C8?@_nH{OqN;+S-DNc-4H#_GPjHnq& zz>auPTJk9izV|$N5py$eu&hrf@&b-RO8X$@Q!AJ6p>CdTz)_YbnQ@VaB-p3y$8gI) zXCUv7Q}Wpj`#4#?E?>BrH_%ijw)W@Jn4Y^D=D<*EAzJQ07}?skINm|NA^ndt#wAN^ zM+Nj4F12|U@tNmgILJ=>fQOuu_9eY!S`&e&Sr4tvI+Cw?!=Sa!=&y;>Z)yrE@3Xv# zu*g?tYP1tP@*)Ywac{$Cb;u5SOHD5f1)A~trJ>zE%hlo~-<`fAOo)mt zZSJ!W0h*BgB2{$GhB58CHl_msGCn}OU|E*%)(kyAiC7@OqsGaLmXbl@$TG^9`Fb9x zvUGD$*W1KYWH?zkyrI#>a}7dba?I{zPj&)Wn8AnAifWr{!7l5wRit!*{>s z(t)8$N@i;`EI!bt!p_AH*Nh7hI}?()Nc1ne_5}i>e1St$zvgD_KwiKD^#&SaHEyyM zyJQ6cQk(GC3Ug*Q%dTzkggO;S?t zAD%F!CzAln)-Kz=yB<=}884XD)s!F0$b3o!P)!e?CG!+IYh8MiyM&;R(j&}xBp`8U z9S&Kc4Z2g6B`CN6Mm47wE=4pJ<&wM!<{h!XHxjd*{U3+$PGoli29fWaeb6eOKp zPp6bZ>r!n~a|K^i19Ij)`rd;GTck;dUrsHmD{ypy1y=|D;= z6X!V{@{}0nDd<-`^R8NY)n$29QZI4jF6*+_$X?S*1GorIT5!uY5@|gQ9UmCip+OKh?I1|YyLUB z0+ad<0S@L9$&cl_z$nC@c+aRk&|p53@_hb`j?4=gIbPjM-5h{@K?W&T$Y^({+AxAJ z-pq~T+5qg7$E=)1lFpf+k~VH^OE-gpZe7;9_5B<1~ftlLhlp4E6TVqBD~$m)D^+fe(Q#tFm7SlKI#n@A%sE!(B-EBq5)EFL z@ozU|;^?-+66p6Qj#rvy%JeE{ttXZahUbcR!emxh7i&F#LNU5#<(~|Jx@ZCohRZGu zE+^#D>^(orG{>6AKe`}8uW>aPU-PPSdonao9$zX?p9jL@0w^J5GX0_9P)VG zs=K*_{8y6>W;A=QNvky-gc7g`S#)<79B6N9mo41-a zlL0J{N+`T@1rVwF{ylD!`gN_vy$<(L=zNe<(QkR5m;K50ON8%EV(+~A>Y9&$^9R#2 zUWr{VU#FM|*gr_RA$=1o{{Sx2Yn*-ZT#mKbVj~j~Ckre+Dv^rmx$|yTN)?&FXr_g?g zY!P|Z>e=EG@5x;BkD|e)^7i(+??|UKcT%RQC}P|BDQE*>e{sHUA=wWL4Mwb1<52FT zB3^8?GLF;OXlE!GzcCtvGzd9D1tabpMcdc~9x;?($xUc#JPCZLbF7Sr92e10{~P}# z%^;8Ryoys`w^{tNAPQk6;8KCTYlYn?@gi-Z@g8|EN3wON2tZUlecE`oH=E) z9M4q#sV4a3jEKeFERvC!ukY#pDn*pH^y=Kin{RUL$vAL6#?19l@3F}|zOcjv_TzwTHIiM0*wJ|nt1*KTd&qGrk!Ox=r%PYHnOm^&4g^(91CXA$Rb;Pk35g zau4sdGHX%@L88!en@HIf$Cd?|UVnElH|o16@3NP?+tuOr34OR{d2zBdVfohI&uBWB z!y@@3fbU~CuA^CIT(Pp!8DvY-A7lmoiFK9c&5Kb|d`O)d(d zofLu4=(1pJ@-}Jqkj=w(jS2AIcZ~{vwrs`v9OJycc7m4;+9P za$obY^9k@_F#k>1Jh@0LfP^aT#W|;h`I-H|MX)=T42tg@ag}Lo#VaJAAb+#YzJqa} z-pH75jBZ;yH~JKQsc^M%oxgoBYxf78QZrMO91OM=e79eb%I1M5Spkg@t^LAcGY-Lc z8$~d9&a!qY9mK-iE*HCE%qKR8mg{Hst#G}!PI>FAXtmXO?qDfNNTWNPWYfj9MRUN5 zXFS5Cx8_ym{^CFr`DQIHO^H|^7eQ#^mF@$yXt`}-?W$GFE2FI1X3jjiBnU4Om^YNs>hq*7oFpqkVZ`*w3|Tr z2r+FpWwQ7u^kp-TQIbc)g)J4(X zfY5h7UC)1ga5Fo}6l*)T7uc+z@7zMl+H}iZJ`w734L~L&<#8%=u~X@=cpc#OHd!>r z$>$!;b>oNaH*-1X41{)pn4v&d!CNhQ9@Z{<1rl;TsyQ-33rO8|a zsNN8&ifvI}^34Z0khH$h?B!`w^hC#@m!GQn+N7Gfd!|r_&9gy+!G&zcMA!%Dkeoif zafIQ{PJNYh~J=(2ymHM zWUyxV=a}w))9UafFf+7t5Mwh1eIy8#??C%`6%kXrlm;{282YGT)J3*=wU?!MjzKvD zRuihB?Wkp*cljnE%{Ik4(y!nc`*NGsLxY4>qJ+hgrnIT(eAqwse9^zn&<7s!fMRS~ z5_Jl3R)sW#6e3*-C^85WB>Y;boy-^VrcGaJbS+7Mmt^t8Yu{_MpyfvwG<@0}W)RAu zY{kx*^u^F3_r0a5&qXTu0NkLywmWIoHUF)=w8s6H*6kMR4>#a@nPefi?=P4IV`{sN zj)GnyZa;|yLpf{SG-lX%uYjg!p;;F=H2>%={zpUbFZW9rM&gfCq~jLvEGCRuIGfwf zci-OOAw&`T;CZNE8qadLwCWv{I2Y$6xndXE1H+(&@i7edI#QDiX>O37BMK| zrQ=qe!Xkqx)_TUE+g82Y=#&>gDI8;-w=Sg?^vjxOt(|HFo65|f6lW~DI2%>eJD|Jx zJuyk^ms-%8or=)YkY4f3IjgH;eZXuay3Q`b+Doh6P)ImWjle}cL-qvrlu&5y;3p0q zMfpv^l?nv`rs;1YacTkOWS3<`A)6YHo^J%Il<`GOhmZYKr>%S)@JiZ_K zB_88q($AmUgkd=n*ifg17J_7@S+f>PMj#3cfRDwkWq~FcfVxG9=7IW!kcY$~oQcs< z5u9H1w56Z$qMhG8F0tpKXC@9jQ4tYiZS2GG$Yb2UU-t&zV}wSe?BS24lwK3@Q-^jh za{lEJE%;!tW*fcGS$Zh{_20im7*hVi^2866e#g~+t)~AoR)YwjOACtQ{!$I}P~m^~ z=6^h0tv{~U8=W@`e|@t4J)cq7{|Hrgrt3`E|4aSxp9$|*3pJLKsgberpDe*KfiCZK zqj{DSCVx$&f7@kFrY|n7Wv8kCPwz`R3bj-@QD#1U?4L}X7KIMb+V$$r|NC8i$rKYY zS+jFl6Uqfr{>jwbAn1<9yvx|{FOTQn@|R3j3aF(ZW?c`ie==3-HMH5M{YPN`+xPpA zUBaM0Q>k00`Nrx$m;SqVqTayv&7fHSF@sc(l+|K-#WNaxB=9e@f0F>vY&BV4jPhUY z8dYFYaaA&O*7a7WpJG%Zu!3G11UQ-L*?hWU(lj+S%RvFW53Pz! xaQ|eCKGKm4U{rFbT^xL3{ZBo3hvN5wc%FO7!4Q&3_zL=y{wObAE~@YU{{VpIlz#vK literal 0 HcmV?d00001 diff --git a/docs/user/ml/index.asciidoc b/docs/user/ml/index.asciidoc index c58408d85d37b..7467d99ca22ef 100644 --- a/docs/user/ml/index.asciidoc +++ b/docs/user/ml/index.asciidoc @@ -118,8 +118,8 @@ Examine the histogram chart of the log rates for a given {data-source}, and find the reason behind a particular change possibly in millions of log events across multiple fields and values. -You can find explain log rate spikes under **{ml-app}** > **AIOps** where you -can select the {data-source} or saved search that you want to analyze. +You can find explain log rate spikes under **{ml-app}** > **AIOps Labs** where +you can select the {data-source} or saved search that you want to analyze. [role="screenshot"] image::user/ml/images/ml-explain-log-rate-before.png[Log event histogram chart] @@ -142,3 +142,27 @@ deviation and rerun the analysis with the modified values. [role="screenshot"] image::user/ml/images/ml-explain-log-rate.png[Log rate spike explained] + +[discrete] +[[log-pattern-analysis]] +=== Log pattern analysis + +preview::[] + +Log pattern analysis helps you to find patterns in unstructured log messages and +makes it easier to examine your data. It performs categorization analysis on a +selected field of a {data-source}, creates categories based on the data and +displays them together with a chart that shows the distribution of each category +and an example document that matches the category. + +You can find log pattern analysis under **{ml-app}** > **AIOps Labs** where you +can select the {data-source} or saved search that you want to analyze. + +[role="screenshot"] +image::user/ml/images/ml-log-pattern-analysis.png[Log pattern analysis UI] + +Select a field for categorization and optionally apply any filters that you +want, then start the analysis. The analysis uses the same algorithms as a {ml} +categorization job. The results of the analysis are shown in a table that makes +it possible to open **Discover** and show or filter out the given category +there, which helps you to further examine your log messages. \ No newline at end of file From 17089a2808a94e5d11077b76fc95480b4990a705 Mon Sep 17 00:00:00 2001 From: Philippe Oberti Date: Thu, 29 Sep 2022 10:40:03 -0500 Subject: [PATCH 18/72] [TIP] FilterIn FilterOut component cleanup (#141525) - rework FilterIn and FilterOut components and extract logic to hook - rework InvestigateInTimeline components and extract logic to hook - rework AddToTimeline components and extract logic to hook - rename DataGrid components to CellAction - replace prop as by Component to stay consistent with Eui library - remove all ...props usage and replace with ['data-test-subj']: dataTestSubj - add missing translations --- .../common/types/component_type.ts | 14 - .../mocks/mock_indicators_filters_context.tsx | 2 +- .../flyout/fields_table/fields_table.tsx | 19 +- .../indicators/components/flyout/flyout.tsx | 2 +- .../indicator_value_actions.tsx | 33 +- .../flyout/overview_tab/block/block.tsx | 14 +- .../highlighted_values_table.tsx | 4 +- .../indicator_barchart_legend_action.tsx | 30 +- .../indicators_table/actions_row_cell.tsx | 2 +- .../indicators_table/cell_actions.tsx | 21 +- .../__snapshots__/filter_in.test.tsx.snap | 18 +- .../filter_in/filter_in.stories.tsx | 55 ++- .../components/filter_in/filter_in.test.tsx | 39 +-- .../components/filter_in/filter_in.tsx | 151 +++++---- .../__snapshots__/filter_out.test.tsx.snap | 18 +- .../filter_out/filter_out.stories.tsx | 55 ++- .../components/filter_out/filter_out.test.tsx | 40 +-- .../components/filter_out/filter_out.tsx | 151 +++++---- .../query_bar/hooks/use_filter_in_out.test.ts | 56 ++++ .../query_bar/hooks/use_filter_in_out.ts | 66 ++++ .../add_to_timeline.stories.tsx | 22 +- .../add_to_timeline/add_to_timeline.test.tsx | 14 +- .../add_to_timeline/add_to_timeline.tsx | 144 +++++--- .../investigate_in_timeline.test.tsx.snap | 313 ++++++++++++++++++ .../index.ts | 2 +- .../investigate_in_timeline.stories.tsx} | 15 +- .../investigate_in_timeline.test.tsx | 77 +++++ .../investigate_in_timeline.tsx | 90 +++++ ...vestigate_in_timeline_button.test.tsx.snap | 155 --------- ...investigate_in_timeline_button.stories.tsx | 27 -- .../investigate_in_timeline_button.test.tsx | 45 --- .../investigate_in_timeline_button.tsx | 50 --- ...gate_in_timeline_button_icon.test.tsx.snap | 159 --------- .../index.ts | 8 - ...vestigate_in_timeline_button_icon.test.tsx | 46 --- .../investigate_in_timeline_button_icon.tsx | 62 ---- .../public/modules/timeline/hooks/index.ts | 1 + .../hooks/use_add_to_timeline.test.tsx | 62 ++++ .../timeline/hooks/use_add_to_timeline.ts | 61 ++++ .../use_investigate_in_timeline.test.tsx | 9 +- .../hooks/use_investigate_in_timeline.ts | 9 +- 41 files changed, 1262 insertions(+), 899 deletions(-) delete mode 100644 x-pack/plugins/threat_intelligence/common/types/component_type.ts create mode 100644 x-pack/plugins/threat_intelligence/public/modules/query_bar/hooks/use_filter_in_out.test.ts create mode 100644 x-pack/plugins/threat_intelligence/public/modules/query_bar/hooks/use_filter_in_out.ts create mode 100644 x-pack/plugins/threat_intelligence/public/modules/timeline/components/investigate_in_timeline/__snapshots__/investigate_in_timeline.test.tsx.snap rename x-pack/plugins/threat_intelligence/public/modules/timeline/components/{investigate_in_timeline_button => investigate_in_timeline}/index.ts (83%) rename x-pack/plugins/threat_intelligence/public/modules/timeline/components/{investigate_in_timeline_button_icon/investigate_in_timeline_button_icon.stories.tsx => investigate_in_timeline/investigate_in_timeline.stories.tsx} (67%) create mode 100644 x-pack/plugins/threat_intelligence/public/modules/timeline/components/investigate_in_timeline/investigate_in_timeline.test.tsx create mode 100644 x-pack/plugins/threat_intelligence/public/modules/timeline/components/investigate_in_timeline/investigate_in_timeline.tsx delete mode 100644 x-pack/plugins/threat_intelligence/public/modules/timeline/components/investigate_in_timeline_button/__snapshots__/investigate_in_timeline_button.test.tsx.snap delete mode 100644 x-pack/plugins/threat_intelligence/public/modules/timeline/components/investigate_in_timeline_button/investigate_in_timeline_button.stories.tsx delete mode 100644 x-pack/plugins/threat_intelligence/public/modules/timeline/components/investigate_in_timeline_button/investigate_in_timeline_button.test.tsx delete mode 100644 x-pack/plugins/threat_intelligence/public/modules/timeline/components/investigate_in_timeline_button/investigate_in_timeline_button.tsx delete mode 100644 x-pack/plugins/threat_intelligence/public/modules/timeline/components/investigate_in_timeline_button_icon/__snapshots__/investigate_in_timeline_button_icon.test.tsx.snap delete mode 100644 x-pack/plugins/threat_intelligence/public/modules/timeline/components/investigate_in_timeline_button_icon/index.ts delete mode 100644 x-pack/plugins/threat_intelligence/public/modules/timeline/components/investigate_in_timeline_button_icon/investigate_in_timeline_button_icon.test.tsx delete mode 100644 x-pack/plugins/threat_intelligence/public/modules/timeline/components/investigate_in_timeline_button_icon/investigate_in_timeline_button_icon.tsx create mode 100644 x-pack/plugins/threat_intelligence/public/modules/timeline/hooks/use_add_to_timeline.test.tsx create mode 100644 x-pack/plugins/threat_intelligence/public/modules/timeline/hooks/use_add_to_timeline.ts diff --git a/x-pack/plugins/threat_intelligence/common/types/component_type.ts b/x-pack/plugins/threat_intelligence/common/types/component_type.ts deleted file mode 100644 index d5982b15c3518..0000000000000 --- a/x-pack/plugins/threat_intelligence/common/types/component_type.ts +++ /dev/null @@ -1,14 +0,0 @@ -/* - * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one - * or more contributor license agreements. Licensed under the Elastic License - * 2.0; you may not use this file except in compliance with the Elastic License - * 2.0. - */ - -/** - * Used in multiple component to drive the render of the component depending on where they're used. - */ -export enum ComponentType { - EuiDataGrid = 'EuiDataGrid', - ContextMenu = 'ContextMenu', -} diff --git a/x-pack/plugins/threat_intelligence/public/common/mocks/mock_indicators_filters_context.tsx b/x-pack/plugins/threat_intelligence/public/common/mocks/mock_indicators_filters_context.tsx index 4b7832631fd16..baad954a44663 100644 --- a/x-pack/plugins/threat_intelligence/public/common/mocks/mock_indicators_filters_context.tsx +++ b/x-pack/plugins/threat_intelligence/public/common/mocks/mock_indicators_filters_context.tsx @@ -11,7 +11,7 @@ import { IndicatorsFiltersContextValue } from '../../modules/indicators/containe export const mockIndicatorsFiltersContext: IndicatorsFiltersContextValue = { filterManager: { getFilters: () => [], - setFilters: () => {}, + setFilters: () => window.alert('setFilters'), } as unknown as FilterManager, filters: [], filterQuery: { diff --git a/x-pack/plugins/threat_intelligence/public/modules/indicators/components/flyout/fields_table/fields_table.tsx b/x-pack/plugins/threat_intelligence/public/modules/indicators/components/flyout/fields_table/fields_table.tsx index e670d6b90e02a..eb5b2d0ca2589 100644 --- a/x-pack/plugins/threat_intelligence/public/modules/indicators/components/flyout/fields_table/fields_table.tsx +++ b/x-pack/plugins/threat_intelligence/public/modules/indicators/components/flyout/fields_table/fields_table.tsx @@ -22,7 +22,7 @@ export interface IndicatorFieldsTableProps { export const IndicatorFieldsTable: VFC = ({ fields, indicator, - ...rest + 'data-test-subj': dataTestSubj, }) => { const columns = useMemo( () => @@ -49,15 +49,26 @@ export const IndicatorFieldsTable: VFC = ({ actions: [ { render: (field: string) => ( - + ), width: '72px', }, ], }, ] as Array>, - [indicator, rest] + [indicator, dataTestSubj] ); - return ; + return ( + + ); }; diff --git a/x-pack/plugins/threat_intelligence/public/modules/indicators/components/flyout/flyout.tsx b/x-pack/plugins/threat_intelligence/public/modules/indicators/components/flyout/flyout.tsx index 24fe1cc0082ec..11102df797017 100644 --- a/x-pack/plugins/threat_intelligence/public/modules/indicators/components/flyout/flyout.tsx +++ b/x-pack/plugins/threat_intelligence/public/modules/indicators/components/flyout/flyout.tsx @@ -21,7 +21,7 @@ import { useGeneratedHtmlId, } from '@elastic/eui'; import { FormattedMessage } from '@kbn/i18n-react'; -import { InvestigateInTimelineButton } from '../../../timeline/components/investigate_in_timeline_button'; +import { InvestigateInTimelineButton } from '../../../timeline/components/investigate_in_timeline'; import { DateFormatter } from '../../../../components/date_formatter/date_formatter'; import { Indicator, RawIndicatorFieldId } from '../../../../../common/types/indicator'; import { IndicatorsFlyoutJson } from './json_tab'; diff --git a/x-pack/plugins/threat_intelligence/public/modules/indicators/components/flyout/indicator_value_actions/indicator_value_actions.tsx b/x-pack/plugins/threat_intelligence/public/modules/indicators/components/flyout/indicator_value_actions/indicator_value_actions.tsx index 919b39da28c31..0ee9ae050aa98 100644 --- a/x-pack/plugins/threat_intelligence/public/modules/indicators/components/flyout/indicator_value_actions/indicator_value_actions.tsx +++ b/x-pack/plugins/threat_intelligence/public/modules/indicators/components/flyout/indicator_value_actions/indicator_value_actions.tsx @@ -5,13 +5,12 @@ * 2.0. */ -import type { EuiButtonEmpty, EuiButtonIcon } from '@elastic/eui'; -import { EuiFlexGroup } from '@elastic/eui'; import React, { VFC } from 'react'; +import { EuiFlexGroup } from '@elastic/eui'; import { Indicator } from '../../../../../../common/types/indicator'; -import { FilterIn } from '../../../../query_bar/components/filter_in'; -import { FilterOut } from '../../../../query_bar/components/filter_out'; -import { AddToTimeline } from '../../../../timeline/components/add_to_timeline'; +import { FilterInButtonIcon } from '../../../../query_bar/components/filter_in'; +import { FilterOutButtonIcon } from '../../../../query_bar/components/filter_out'; +import { AddToTimelineButtonIcon } from '../../../../timeline/components/add_to_timeline'; import { fieldAndValueValid, getIndicatorFieldAndValue } from '../../../utils/field_value'; export const TIMELINE_BUTTON_TEST_ID = 'TimelineButton'; @@ -27,10 +26,6 @@ interface IndicatorValueActions { * Indicator field used for the filter in/out and add to timeline feature. */ field: string; - /** - * Only used with `EuiDataGrid` (see {@link AddToTimelineButtonProps}). - */ - Component?: typeof EuiButtonEmpty | typeof EuiButtonIcon; /** * Used for unit and e2e tests. */ @@ -40,28 +35,22 @@ interface IndicatorValueActions { export const IndicatorValueActions: VFC = ({ indicator, field, - Component, - ...props + 'data-test-subj': dataTestSubj, }) => { const { key, value } = getIndicatorFieldAndValue(indicator, field); if (!fieldAndValueValid(key, value)) { return null; } - const filterInTestId = `${props['data-test-subj']}${FILTER_IN_BUTTON_TEST_ID}`; - const filterOutTestId = `${props['data-test-subj']}${FILTER_OUT_BUTTON_TEST_ID}`; - const timelineTestId = `${props['data-test-subj']}${TIMELINE_BUTTON_TEST_ID}`; + const filterInTestId = `${dataTestSubj}${FILTER_IN_BUTTON_TEST_ID}`; + const filterOutTestId = `${dataTestSubj}${FILTER_OUT_BUTTON_TEST_ID}`; + const timelineTestId = `${dataTestSubj}${TIMELINE_BUTTON_TEST_ID}`; return ( - - - + + + ); }; diff --git a/x-pack/plugins/threat_intelligence/public/modules/indicators/components/flyout/overview_tab/block/block.tsx b/x-pack/plugins/threat_intelligence/public/modules/indicators/components/flyout/overview_tab/block/block.tsx index dd8d4335feca1..0866edde505bf 100644 --- a/x-pack/plugins/threat_intelligence/public/modules/indicators/components/flyout/overview_tab/block/block.tsx +++ b/x-pack/plugins/threat_intelligence/public/modules/indicators/components/flyout/overview_tab/block/block.tsx @@ -50,10 +50,14 @@ export interface IndicatorBlockProps { /** * Renders indicator field value in a rectangle, to highlight it even more */ -export const IndicatorBlock: VFC = ({ field, indicator, ...props }) => { +export const IndicatorBlock: VFC = ({ + field, + indicator, + 'data-test-subj': dataTestSubj, +}) => { return ( - + @@ -61,7 +65,11 @@ export const IndicatorBlock: VFC = ({ field, indicator, ... - + diff --git a/x-pack/plugins/threat_intelligence/public/modules/indicators/components/flyout/overview_tab/highlighted_values_table/highlighted_values_table.tsx b/x-pack/plugins/threat_intelligence/public/modules/indicators/components/flyout/overview_tab/highlighted_values_table/highlighted_values_table.tsx index 6ce9c332d6323..7ccbbdf2f1c99 100644 --- a/x-pack/plugins/threat_intelligence/public/modules/indicators/components/flyout/overview_tab/highlighted_values_table/highlighted_values_table.tsx +++ b/x-pack/plugins/threat_intelligence/public/modules/indicators/components/flyout/overview_tab/highlighted_values_table/highlighted_values_table.tsx @@ -34,7 +34,7 @@ interface HighlightedValuesTableProps { */ export const HighlightedValuesTable: VFC = ({ indicator, - ...props + 'data-test-subj': dataTestSubj, }) => { const indicatorType = unwrapValue(indicator, RawIndicatorFieldId.Type); @@ -48,7 +48,7 @@ export const HighlightedValuesTable: VFC = ({ search={false} indicator={indicator} fields={highlightedFields} - {...props} + data-test-subj={dataTestSubj} /> ); }; diff --git a/x-pack/plugins/threat_intelligence/public/modules/indicators/components/indicator_barchart_legend_action/indicator_barchart_legend_action.tsx b/x-pack/plugins/threat_intelligence/public/modules/indicators/components/indicator_barchart_legend_action/indicator_barchart_legend_action.tsx index c87f812da76fb..fa573e981f6ca 100644 --- a/x-pack/plugins/threat_intelligence/public/modules/indicators/components/indicator_barchart_legend_action/indicator_barchart_legend_action.tsx +++ b/x-pack/plugins/threat_intelligence/public/modules/indicators/components/indicator_barchart_legend_action/indicator_barchart_legend_action.tsx @@ -8,10 +8,9 @@ import React, { useState, VFC } from 'react'; import { EuiButtonIcon, EuiContextMenuPanel, EuiPopover, EuiToolTip } from '@elastic/eui'; import { i18n } from '@kbn/i18n'; -import { ComponentType } from '../../../../../common/types/component_type'; -import { FilterIn } from '../../../query_bar/components/filter_in'; -import { FilterOut } from '../../../query_bar/components/filter_out'; -import { AddToTimeline } from '../../../timeline/components/add_to_timeline'; +import { FilterInContextMenu } from '../../../query_bar/components/filter_in'; +import { FilterOutContextMenu } from '../../../query_bar/components/filter_out'; +import { AddToTimelineContextMenu } from '../../../timeline/components/add_to_timeline'; export const POPOVER_BUTTON_TEST_ID = 'tiBarchartPopoverButton'; export const TIMELINE_BUTTON_TEST_ID = 'tiBarchartTimelineButton'; @@ -28,7 +27,7 @@ export interface IndicatorBarchartLegendActionProps { */ data: string; /** - * Indicator field selected in the IndicatorFieldSelector component, passed to the {@link AddToTimeline} to populate the timeline. + * Indicator field selected in the IndicatorFieldSelector component, passed to the {@link AddToTimelineContextMenu} to populate the timeline. */ field: string; } @@ -40,24 +39,9 @@ export const IndicatorBarchartLegendAction: VFC, - , - , + , + , + , ]; return ( diff --git a/x-pack/plugins/threat_intelligence/public/modules/indicators/components/indicators_table/actions_row_cell.tsx b/x-pack/plugins/threat_intelligence/public/modules/indicators/components/indicators_table/actions_row_cell.tsx index 1744bf8ac06ce..2f84b14db0c30 100644 --- a/x-pack/plugins/threat_intelligence/public/modules/indicators/components/indicators_table/actions_row_cell.tsx +++ b/x-pack/plugins/threat_intelligence/public/modules/indicators/components/indicators_table/actions_row_cell.tsx @@ -7,7 +7,7 @@ import React, { useContext, VFC } from 'react'; import { EuiFlexGroup } from '@elastic/eui'; -import { InvestigateInTimelineButtonIcon } from '../../../timeline/components/investigate_in_timeline_button_icon'; +import { InvestigateInTimelineButtonIcon } from '../../../timeline/components/investigate_in_timeline'; import { Indicator } from '../../../../../common/types/indicator'; import { OpenIndicatorFlyoutButton } from '../open_indicator_flyout_button/open_indicator_flyout_button'; import { IndicatorsTableContext } from './context'; diff --git a/x-pack/plugins/threat_intelligence/public/modules/indicators/components/indicators_table/cell_actions.tsx b/x-pack/plugins/threat_intelligence/public/modules/indicators/components/indicators_table/cell_actions.tsx index d10ba709bfa2f..9cca631ac3b5f 100644 --- a/x-pack/plugins/threat_intelligence/public/modules/indicators/components/indicators_table/cell_actions.tsx +++ b/x-pack/plugins/threat_intelligence/public/modules/indicators/components/indicators_table/cell_actions.tsx @@ -7,12 +7,11 @@ import React, { VFC } from 'react'; import { EuiDataGridColumnCellActionProps } from '@elastic/eui/src/components/datagrid/data_grid_types'; -import { ComponentType } from '../../../../../common/types/component_type'; import { Indicator } from '../../../../../common/types/indicator'; -import { AddToTimeline } from '../../../timeline/components/add_to_timeline'; +import { AddToTimelineCellAction } from '../../../timeline/components/add_to_timeline'; +import { FilterInCellAction } from '../../../query_bar/components/filter_in'; +import { FilterOutCellAction } from '../../../query_bar/components/filter_out'; import { fieldAndValueValid, getIndicatorFieldAndValue } from '../../utils/field_value'; -import { FilterIn } from '../../../query_bar/components/filter_in'; -import { FilterOut } from '../../../query_bar/components/filter_out'; import type { Pagination } from '../../services/fetch_indicators'; export const CELL_TIMELINE_BUTTON_TEST_ID = 'tiIndicatorsTableCellTimelineButton'; @@ -52,24 +51,22 @@ export const CellActions: VFC = ({ return ( <> - - - diff --git a/x-pack/plugins/threat_intelligence/public/modules/query_bar/components/filter_in/__snapshots__/filter_in.test.tsx.snap b/x-pack/plugins/threat_intelligence/public/modules/query_bar/components/filter_in/__snapshots__/filter_in.test.tsx.snap index 34e37aaf1dd40..b9a31b09a40e8 100644 --- a/x-pack/plugins/threat_intelligence/public/modules/query_bar/components/filter_in/__snapshots__/filter_in.test.tsx.snap +++ b/x-pack/plugins/threat_intelligence/public/modules/query_bar/components/filter_in/__snapshots__/filter_in.test.tsx.snap @@ -1,6 +1,6 @@ // Jest Snapshot v1, https://goo.gl/fbAQLP -exports[` should render an empty component (wrong data input) 1`] = ` +exports[` should render an empty component (wrong data input) 1`] = ` Object { "asFragment": [Function], "baseElement": @@ -61,7 +61,7 @@ Object { } `; -exports[` should render an empty component (wrong field input) 1`] = ` +exports[` should render an empty component (wrong field input) 1`] = ` Object { "asFragment": [Function], "baseElement": @@ -122,7 +122,7 @@ Object { } `; -exports[` should render one Component (for EuiDataGrid use) 1`] = ` +exports[` should render one Component (for EuiDataGrid use) 1`] = ` Object { "asFragment": [Function], "baseElement": @@ -223,7 +223,7 @@ Object { } `; -exports[` should render one EuiButtonIcon 1`] = ` +exports[` should render one EuiButtonIcon 1`] = ` Object { "asFragment": [Function], "baseElement": @@ -320,7 +320,7 @@ Object { } `; -exports[` should render one EuiContextMenuItem (for EuiContextMenu use) 1`] = ` +exports[` should render one EuiContextMenuItem (for EuiContextMenu use) 1`] = ` Object { "asFragment": [Function], "baseElement": @@ -340,7 +340,9 @@ Object { - Filter In + + Filter In + @@ -362,7 +364,9 @@ Object { - Filter In + + Filter In + diff --git a/x-pack/plugins/threat_intelligence/public/modules/query_bar/components/filter_in/filter_in.stories.tsx b/x-pack/plugins/threat_intelligence/public/modules/query_bar/components/filter_in/filter_in.stories.tsx index 08297774e51f6..d32adf70ee103 100644 --- a/x-pack/plugins/threat_intelligence/public/modules/query_bar/components/filter_in/filter_in.stories.tsx +++ b/x-pack/plugins/threat_intelligence/public/modules/query_bar/components/filter_in/filter_in.stories.tsx @@ -7,23 +7,70 @@ import React from 'react'; import { Story } from '@storybook/react'; +import { EuiContextMenuPanel, EuiDataGrid, EuiDataGridColumn } from '@elastic/eui'; +import { EuiDataGridColumnVisibility } from '@elastic/eui/src/components/datagrid/data_grid_types'; import { mockIndicatorsFiltersContext } from '../../../../common/mocks/mock_indicators_filters_context'; import { generateMockIndicator, Indicator } from '../../../../../common/types/indicator'; +import { FilterInButtonIcon, FilterInContextMenu, FilterInCellAction } from '.'; import { IndicatorsFiltersContext } from '../../../indicators/containers/indicators_filters/context'; -import { FilterIn } from '.'; export default { - component: FilterIn, title: 'FilterIn', }; -export const Default: Story = () => { +export const ButtonIcon: Story = () => { const mockIndicator: Indicator = generateMockIndicator(); const mockField: string = 'threat.feed.name'; return ( - + + + ); +}; + +export const ContextMenu: Story = () => { + const mockIndicator: Indicator = generateMockIndicator(); + const mockField: string = 'threat.feed.name'; + const items = []; + + return ( + + + + ); +}; + +export const DataGrid: Story = () => { + const mockIndicator: Indicator = generateMockIndicator(); + const mockField: string = 'threat.feed.name'; + const columnId: string = '1'; + const columns: EuiDataGridColumn[] = [ + { + id: columnId, + cellActions: [ + ({ Component }) => ( + + ), + ], + }, + ]; + const columnVisibility: EuiDataGridColumnVisibility = { + visibleColumns: [columnId], + setVisibleColumns: () => window.alert('setVisibleColumns'), + }; + const rowCount: number = 1; + const renderCellValue = () => <>; + + return ( + + ); }; diff --git a/x-pack/plugins/threat_intelligence/public/modules/query_bar/components/filter_in/filter_in.test.tsx b/x-pack/plugins/threat_intelligence/public/modules/query_bar/components/filter_in/filter_in.test.tsx index 788ac9b2e4427..0abfa06522301 100644 --- a/x-pack/plugins/threat_intelligence/public/modules/query_bar/components/filter_in/filter_in.test.tsx +++ b/x-pack/plugins/threat_intelligence/public/modules/query_bar/components/filter_in/filter_in.test.tsx @@ -11,8 +11,7 @@ import { EuiButtonIcon } from '@elastic/eui'; import { generateMockIndicator, Indicator } from '../../../../../common/types/indicator'; import { useIndicatorsFiltersContext } from '../../../indicators/hooks/use_indicators_filters_context'; import { mockIndicatorsFiltersContext } from '../../../../common/mocks/mock_indicators_filters_context'; -import { FilterIn } from '.'; -import { ComponentType } from '../../../../../common/types/component_type'; +import { FilterInButtonIcon, FilterInContextMenu, FilterInCellAction } from '.'; jest.mock('../../../indicators/hooks/use_indicators_filters_context'); @@ -22,48 +21,46 @@ const mockField: string = 'threat.feed.name'; const mockTestId: string = 'abc'; -describe('', () => { +describe(' ', () => { beforeEach(() => { ( useIndicatorsFiltersContext as jest.MockedFunction ).mockReturnValue(mockIndicatorsFiltersContext); }); - it('should render one EuiButtonIcon', () => { - const component = render( - - ); + it('should render an empty component (wrong data input)', () => { + const component = render(); - expect(component.getByTestId(mockTestId)).toBeInTheDocument(); expect(component).toMatchSnapshot(); }); - it('should render one Component (for EuiDataGrid use)', () => { - const mockType: ComponentType = ComponentType.EuiDataGrid; - const mockComponent: FunctionComponent = () => ; + it('should render an empty component (wrong field input)', () => { + const component = render(); + + expect(component).toMatchSnapshot(); + }); + it('should render one EuiButtonIcon', () => { const component = render( - + ); + expect(component.getByTestId(mockTestId)).toBeInTheDocument(); expect(component).toMatchSnapshot(); }); it('should render one EuiContextMenuItem (for EuiContextMenu use)', () => { - const mockType: ComponentType = ComponentType.ContextMenu; - const component = render(); + const component = render(); expect(component).toMatchSnapshot(); }); - it('should render an empty component (wrong data input)', () => { - const component = render(); - - expect(component).toMatchSnapshot(); - }); + it('should render one Component (for EuiDataGrid use)', () => { + const mockComponent: FunctionComponent = () => ; - it('should render an empty component (wrong field input)', () => { - const component = render(); + const component = render( + + ); expect(component).toMatchSnapshot(); }); diff --git a/x-pack/plugins/threat_intelligence/public/modules/query_bar/components/filter_in/filter_in.tsx b/x-pack/plugins/threat_intelligence/public/modules/query_bar/components/filter_in/filter_in.tsx index d6d62b3e35380..af6b608c1fb9e 100644 --- a/x-pack/plugins/threat_intelligence/public/modules/query_bar/components/filter_in/filter_in.tsx +++ b/x-pack/plugins/threat_intelligence/public/modules/query_bar/components/filter_in/filter_in.tsx @@ -5,22 +5,20 @@ * 2.0. */ -import React, { useCallback, VFC } from 'react'; +import React, { VFC } from 'react'; import { i18n } from '@kbn/i18n'; import { EuiButtonEmpty, EuiButtonIcon, EuiContextMenuItem, EuiToolTip } from '@elastic/eui'; -import { Filter } from '@kbn/es-query'; -import { ComponentType } from '../../../../../common/types/component_type'; -import { useIndicatorsFiltersContext } from '../../../indicators/hooks/use_indicators_filters_context'; -import { - fieldAndValueValid, - getIndicatorFieldAndValue, -} from '../../../indicators/utils/field_value'; -import { FilterIn as FilterInConst, updateFiltersArray } from '../../utils/filter'; +import { FormattedMessage } from '@kbn/i18n-react'; +import { useFilterInOut } from '../../hooks/use_filter_in_out'; +import { FilterIn } from '../../utils/filter'; import { Indicator } from '../../../../../common/types/indicator'; import { useStyles } from './styles'; const ICON_TYPE = 'plusInCircle'; -const ICON_TITLE = i18n.translate('xpack.threatIntelligence.queryBar.filterInButton', { +const ICON_TITLE = i18n.translate('xpack.threatIntelligence.queryBar.filterInButtonIcon', { + defaultMessage: 'Filter In', +}); +const CELL_ACTION_TITLE = i18n.translate('xpack.threatIntelligence.queryBar.filterInCellAction', { defaultMessage: 'Filter In', }); @@ -33,70 +31,36 @@ export interface FilterInProps { * Value used to filter in /out in the KQL bar. */ field: string; - /** - * Dictates the way the FilterIn component is rendered depending on the situation in which it's used - */ - type?: ComponentType; - /** - * Display component for when the FilterIn component is used within a DataGrid - */ - as?: typeof EuiButtonEmpty | typeof EuiButtonIcon | typeof EuiContextMenuItem; /** * Used for unit and e2e tests. */ ['data-test-subj']?: string; } +export interface FilterInCellActionProps extends FilterInProps { + /** + * Display component for when the FilterIn component is used within an {@link EuiDataGrid}. + */ + Component: typeof EuiButtonEmpty | typeof EuiButtonIcon; +} + /** * Retrieves the indicator's field and value, then creates a new {@link Filter} and adds it to the {@link FilterManager}. * - * The component has 3 renders depending on where it's used: within a EuiContextMenu, a EuiDataGrid or not. + * This component renders an {@link EuiButtonIcon}. * - * @returns filter in button + * @returns filter in button icon */ -export const FilterIn: VFC = ({ data, field, type, as: Component, ...props }) => { - const styles = useStyles(); - - const { filterManager } = useIndicatorsFiltersContext(); - - const { key, value } = - typeof data === 'string' ? { key: field, value: data } : getIndicatorFieldAndValue(data, field); - - const filterIn = useCallback((): void => { - const existingFilters = filterManager.getFilters(); - const newFilters: Filter[] = updateFiltersArray(existingFilters, key, value, FilterInConst); - filterManager.setFilters(newFilters); - }, [filterManager, key, value]); - - if (!fieldAndValueValid(key, value)) { +export const FilterInButtonIcon: VFC = ({ + data, + field, + 'data-test-subj': dataTestSub, +}) => { + const { filterFn } = useFilterInOut({ indicator: data, field, filterType: FilterIn }); + if (!filterFn) { return <>; } - if (type === ComponentType.EuiDataGrid) { - return ( - -

- {/* @ts-ignore*/} - -
-
- ); - } - - if (type === ComponentType.ContextMenu) { - return ( - - Filter In - - ); - } - return ( = ({ data, field, type, as: Component, iconSize="s" size="xs" color="primary" - onClick={filterIn} - {...props} + onClick={filterFn} + data-test-subj={dataTestSub} /> ); }; + +/** + * Retrieves the indicator's field and value, then creates a new {@link Filter} and adds it to the {@link FilterManager}. + * + * This component is to be used in an EuiContextMenu. + * + * @returns filter in item for a context menu + */ +export const FilterInContextMenu: VFC = ({ + data, + field, + 'data-test-subj': dataTestSub, +}) => { + const { filterFn } = useFilterInOut({ indicator: data, field, filterType: FilterIn }); + if (!filterFn) { + return <>; + } + + return ( + + + + ); +}; + +/** + * Retrieves the indicator's field and value, then creates a new {@link Filter} and adds it to the {@link FilterManager}. + * + * This component is to be used in an EuiDataGrid. + * + * @returns filter in button for data grid + */ +export const FilterInCellAction: VFC = ({ + data, + field, + Component, + 'data-test-subj': dataTestSub, +}) => { + const styles = useStyles(); + + const { filterFn } = useFilterInOut({ indicator: data, field, filterType: FilterIn }); + if (!filterFn) { + return <>; + } + + return ( + +
+ {/* @ts-ignore*/} + +
+
+ ); +}; diff --git a/x-pack/plugins/threat_intelligence/public/modules/query_bar/components/filter_out/__snapshots__/filter_out.test.tsx.snap b/x-pack/plugins/threat_intelligence/public/modules/query_bar/components/filter_out/__snapshots__/filter_out.test.tsx.snap index bfee4c6363ba7..686e543636d00 100644 --- a/x-pack/plugins/threat_intelligence/public/modules/query_bar/components/filter_out/__snapshots__/filter_out.test.tsx.snap +++ b/x-pack/plugins/threat_intelligence/public/modules/query_bar/components/filter_out/__snapshots__/filter_out.test.tsx.snap @@ -1,6 +1,6 @@ // Jest Snapshot v1, https://goo.gl/fbAQLP -exports[` should render an empty component (wrong data input) 1`] = ` +exports[` should render an empty component (wrong data input) 1`] = ` Object { "asFragment": [Function], "baseElement": @@ -61,7 +61,7 @@ Object { } `; -exports[` should render an empty component (wrong field input) 1`] = ` +exports[` should render an empty component (wrong field input) 1`] = ` Object { "asFragment": [Function], "baseElement": @@ -122,7 +122,7 @@ Object { } `; -exports[` should render one Component (for EuiDataGrid use) 1`] = ` +exports[` should render one Component (for EuiDataGrid use) 1`] = ` Object { "asFragment": [Function], "baseElement": @@ -223,7 +223,7 @@ Object { } `; -exports[` should render one EuiButtonIcon 1`] = ` +exports[` should render one EuiButtonIcon 1`] = ` Object { "asFragment": [Function], "baseElement": @@ -320,7 +320,7 @@ Object { } `; -exports[` should render one EuiContextMenuItem (for EuiContextMenu use) 1`] = ` +exports[` should render one EuiContextMenuItem (for EuiContextMenu use) 1`] = ` Object { "asFragment": [Function], "baseElement": @@ -340,7 +340,9 @@ Object { - Filter Out + + Filter Out + @@ -362,7 +364,9 @@ Object { - Filter Out + + Filter Out + diff --git a/x-pack/plugins/threat_intelligence/public/modules/query_bar/components/filter_out/filter_out.stories.tsx b/x-pack/plugins/threat_intelligence/public/modules/query_bar/components/filter_out/filter_out.stories.tsx index cf625c23754a3..463b249998eb2 100644 --- a/x-pack/plugins/threat_intelligence/public/modules/query_bar/components/filter_out/filter_out.stories.tsx +++ b/x-pack/plugins/threat_intelligence/public/modules/query_bar/components/filter_out/filter_out.stories.tsx @@ -7,23 +7,70 @@ import React from 'react'; import { Story } from '@storybook/react'; +import { EuiContextMenuPanel, EuiDataGrid, EuiDataGridColumn } from '@elastic/eui'; +import { EuiDataGridColumnVisibility } from '@elastic/eui/src/components/datagrid/data_grid_types'; import { mockIndicatorsFiltersContext } from '../../../../common/mocks/mock_indicators_filters_context'; import { generateMockIndicator, Indicator } from '../../../../../common/types/indicator'; +import { FilterOutButtonIcon, FilterOutContextMenu, FilterOutCellAction } from '.'; import { IndicatorsFiltersContext } from '../../../indicators/containers/indicators_filters/context'; -import { FilterOut } from '.'; export default { - component: FilterOut, title: 'FilterOut', }; -export const Default: Story = () => { +export const ButtonIcon: Story = () => { const mockIndicator: Indicator = generateMockIndicator(); const mockField: string = 'threat.feed.name'; return ( - + + + ); +}; + +export const ContextMenu: Story = () => { + const mockIndicator: Indicator = generateMockIndicator(); + const mockField: string = 'threat.feed.name'; + const items = []; + + return ( + + + + ); +}; + +export const DataGrid: Story = () => { + const mockIndicator: Indicator = generateMockIndicator(); + const mockField: string = 'threat.feed.name'; + const columnId: string = '1'; + const columns: EuiDataGridColumn[] = [ + { + id: columnId, + cellActions: [ + ({ Component }) => ( + + ), + ], + }, + ]; + const columnVisibility: EuiDataGridColumnVisibility = { + visibleColumns: [columnId], + setVisibleColumns: () => window.alert('setVisibleColumns'), + }; + const rowCount: number = 1; + const renderCellValue = () => <>; + + return ( + + ); }; diff --git a/x-pack/plugins/threat_intelligence/public/modules/query_bar/components/filter_out/filter_out.test.tsx b/x-pack/plugins/threat_intelligence/public/modules/query_bar/components/filter_out/filter_out.test.tsx index 6a65ff5036921..fa25a095191d4 100644 --- a/x-pack/plugins/threat_intelligence/public/modules/query_bar/components/filter_out/filter_out.test.tsx +++ b/x-pack/plugins/threat_intelligence/public/modules/query_bar/components/filter_out/filter_out.test.tsx @@ -11,8 +11,7 @@ import { EuiButtonIcon } from '@elastic/eui'; import { generateMockIndicator, Indicator } from '../../../../../common/types/indicator'; import { useIndicatorsFiltersContext } from '../../../indicators/hooks/use_indicators_filters_context'; import { mockIndicatorsFiltersContext } from '../../../../common/mocks/mock_indicators_filters_context'; -import { FilterOut } from '.'; -import { ComponentType } from '../../../../../common/types/component_type'; +import { FilterOutButtonIcon, FilterOutContextMenu, FilterOutCellAction } from '.'; jest.mock('../../../indicators/hooks/use_indicators_filters_context'); @@ -22,49 +21,46 @@ const mockField: string = 'threat.feed.name'; const mockTestId: string = 'abc'; -describe('', () => { +describe(' ', () => { beforeEach(() => { ( useIndicatorsFiltersContext as jest.MockedFunction ).mockReturnValue(mockIndicatorsFiltersContext); }); - it('should render one EuiButtonIcon', () => { - const component = render( - - ); + it('should render an empty component (wrong data input)', () => { + const component = render(); - expect(component.getByTestId(mockTestId)).toBeInTheDocument(); expect(component).toMatchSnapshot(); }); - it('should render one Component (for EuiDataGrid use)', () => { - const mockType: ComponentType = ComponentType.EuiDataGrid; - const mockComponent: FunctionComponent = () => ; + it('should render an empty component (wrong field input)', () => { + const component = render(); + + expect(component).toMatchSnapshot(); + }); + it('should render one EuiButtonIcon', () => { const component = render( - + ); + expect(component.getByTestId(mockTestId)).toBeInTheDocument(); expect(component).toMatchSnapshot(); }); it('should render one EuiContextMenuItem (for EuiContextMenu use)', () => { - const mockType: ComponentType = ComponentType.ContextMenu; - - const component = render(); + const component = render(); expect(component).toMatchSnapshot(); }); - it('should render an empty component (wrong data input)', () => { - const component = render(); - - expect(component).toMatchSnapshot(); - }); + it('should render one Component (for EuiDataGrid use)', () => { + const mockComponent: FunctionComponent = () => ; - it('should render an empty component (wrong field input)', () => { - const component = render(); + const component = render( + + ); expect(component).toMatchSnapshot(); }); diff --git a/x-pack/plugins/threat_intelligence/public/modules/query_bar/components/filter_out/filter_out.tsx b/x-pack/plugins/threat_intelligence/public/modules/query_bar/components/filter_out/filter_out.tsx index afa1bc02a6ba9..3f77c14285f97 100644 --- a/x-pack/plugins/threat_intelligence/public/modules/query_bar/components/filter_out/filter_out.tsx +++ b/x-pack/plugins/threat_intelligence/public/modules/query_bar/components/filter_out/filter_out.tsx @@ -5,22 +5,20 @@ * 2.0. */ -import React, { useCallback, VFC } from 'react'; +import React, { VFC } from 'react'; import { i18n } from '@kbn/i18n'; import { EuiButtonEmpty, EuiButtonIcon, EuiContextMenuItem, EuiToolTip } from '@elastic/eui'; -import { Filter } from '@kbn/es-query'; -import { ComponentType } from '../../../../../common/types/component_type'; -import { useIndicatorsFiltersContext } from '../../../indicators/hooks/use_indicators_filters_context'; -import { - fieldAndValueValid, - getIndicatorFieldAndValue, -} from '../../../indicators/utils/field_value'; -import { FilterOut as FilterOutConst, updateFiltersArray } from '../../utils/filter'; +import { FormattedMessage } from '@kbn/i18n-react'; +import { useFilterInOut } from '../../hooks/use_filter_in_out'; +import { FilterOut } from '../../utils/filter'; import { Indicator } from '../../../../../common/types/indicator'; import { useStyles } from './styles'; const ICON_TYPE = 'minusInCircle'; -const ICON_TITLE = i18n.translate('xpack.threatIntelligence.queryBar.filterOutButton', { +const ICON_TITLE = i18n.translate('xpack.threatIntelligence.queryBar.filterOutButtonIcon', { + defaultMessage: 'Filter Out', +}); +const CELL_ACTION_TITLE = i18n.translate('xpack.threatIntelligence.queryBar.filterOutCellAction', { defaultMessage: 'Filter Out', }); @@ -33,70 +31,36 @@ export interface FilterOutProps { * Value used to filter in /out in the KQL bar. */ field: string; - /** - * Dictates the way the FilterOut component is rendered depending on the situation in which it's used - */ - type?: ComponentType; - /** - * Display component for when the FilterIn component is used within a DataGrid - */ - as?: typeof EuiButtonEmpty | typeof EuiButtonIcon; /** * Used for unit and e2e tests. */ ['data-test-subj']?: string; } +export interface FilterOutCellActionProps extends FilterOutProps { + /** + * Display component for when the FilterIn component is used within an {@link EuiDataGrid}. + */ + Component: typeof EuiButtonEmpty | typeof EuiButtonIcon; +} + /** * Retrieves the indicator's field and value, then creates a new {@link Filter} and adds it to the {@link FilterManager}. * - * The component has 3 renders depending on where it's used: within a EuiContextMenu, a EuiDataGrid or not. + * This component renders an {@link EuiButtonIcon}. * - * @returns filter out button + * @returns filter out button icon */ -export const FilterOut: VFC = ({ data, field, type, as: Component, ...props }) => { - const styles = useStyles(); - - const { filterManager } = useIndicatorsFiltersContext(); - - const { key, value } = - typeof data === 'string' ? { key: field, value: data } : getIndicatorFieldAndValue(data, field); - - const filterOut = useCallback(() => { - const existingFilters: Filter[] = filterManager.getFilters(); - const newFilters: Filter[] = updateFiltersArray(existingFilters, key, value, FilterOutConst); - filterManager.setFilters(newFilters); - }, [filterManager, key, value]); - - if (!fieldAndValueValid(key, value)) { +export const FilterOutButtonIcon: VFC = ({ + data, + field, + 'data-test-subj': dataTestSub, +}) => { + const { filterFn } = useFilterInOut({ indicator: data, field, filterType: FilterOut }); + if (!filterFn) { return <>; } - if (type === ComponentType.EuiDataGrid) { - return ( - -
- {/* @ts-ignore*/} - -
-
- ); - } - - if (type === ComponentType.ContextMenu) { - return ( - - Filter Out - - ); - } - return ( = ({ data, field, type, as: Componen iconSize="s" size="xs" color="primary" - onClick={filterOut} - {...props} + onClick={filterFn} + data-test-subj={dataTestSub} /> ); }; + +/** + * Retrieves the indicator's field and value, then creates a new {@link Filter} and adds it to the {@link FilterManager}. + * + * This component is to be used in an EuiContextMenu. + * + * @returns filter in item for a context menu + */ +export const FilterOutContextMenu: VFC = ({ + data, + field, + 'data-test-subj': dataTestSub, +}) => { + const { filterFn } = useFilterInOut({ indicator: data, field, filterType: FilterOut }); + if (!filterFn) { + return <>; + } + + return ( + + + + ); +}; + +/** + * Retrieves the indicator's field and value, then creates a new {@link Filter} and adds it to the {@link FilterManager}. + * + * This component is to be used in an EuiDataGrid. + * + * @returns filter in button for data grid + */ +export const FilterOutCellAction: VFC = ({ + data, + field, + Component, + 'data-test-subj': dataTestSub, +}) => { + const styles = useStyles(); + + const { filterFn } = useFilterInOut({ indicator: data, field, filterType: FilterOut }); + if (!filterFn) { + return <>; + } + + return ( + +
+ {/* @ts-ignore*/} + +
+
+ ); +}; diff --git a/x-pack/plugins/threat_intelligence/public/modules/query_bar/hooks/use_filter_in_out.test.ts b/x-pack/plugins/threat_intelligence/public/modules/query_bar/hooks/use_filter_in_out.test.ts new file mode 100644 index 0000000000000..6099ed8486670 --- /dev/null +++ b/x-pack/plugins/threat_intelligence/public/modules/query_bar/hooks/use_filter_in_out.test.ts @@ -0,0 +1,56 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import { renderHook, RenderHookResult, Renderer } from '@testing-library/react-hooks'; +import { + generateMockIndicator, + generateMockUrlIndicator, + Indicator, +} from '../../../../common/types/indicator'; +import { TestProvidersComponent } from '../../../common/mocks/test_providers'; +import { useFilterInOut, UseFilterInValue } from './use_filter_in_out'; +import { FilterIn } from '../utils/filter'; + +describe('useFilterInOut()', () => { + let hookResult: RenderHookResult<{}, UseFilterInValue, Renderer>; + + it('should return empty object if Indicator is incorrect', () => { + const indicator: Indicator = generateMockIndicator(); + indicator.fields['threat.indicator.name'] = ['wrong']; + const field: string = 'field'; + const filterType = FilterIn; + + hookResult = renderHook(() => useFilterInOut({ indicator, field, filterType }), { + wrapper: TestProvidersComponent, + }); + expect(hookResult.result.current).toEqual({}); + }); + + it('should return filterFn for Indicator', () => { + const indicator: Indicator = generateMockUrlIndicator(); + const field: string = 'threat.indicator.name'; + const filterType = FilterIn; + + hookResult = renderHook(() => useFilterInOut({ indicator, field, filterType }), { + wrapper: TestProvidersComponent, + }); + + expect(hookResult.result.current).toHaveProperty('filterFn'); + }); + + it('should return filterFn for string', () => { + const indicator: string = '0.0.0.0'; + const field: string = 'threat.indicator.name'; + const filterType = FilterIn; + + hookResult = renderHook(() => useFilterInOut({ indicator, field, filterType }), { + wrapper: TestProvidersComponent, + }); + + expect(hookResult.result.current).toHaveProperty('filterFn'); + }); +}); diff --git a/x-pack/plugins/threat_intelligence/public/modules/query_bar/hooks/use_filter_in_out.ts b/x-pack/plugins/threat_intelligence/public/modules/query_bar/hooks/use_filter_in_out.ts new file mode 100644 index 0000000000000..d44bb8528afab --- /dev/null +++ b/x-pack/plugins/threat_intelligence/public/modules/query_bar/hooks/use_filter_in_out.ts @@ -0,0 +1,66 @@ +/* + * 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 { useCallback } from 'react'; +import { Filter } from '@kbn/es-query'; +import { useIndicatorsFiltersContext } from '../../indicators/hooks/use_indicators_filters_context'; +import { fieldAndValueValid, getIndicatorFieldAndValue } from '../../indicators/utils/field_value'; +import { FilterIn, FilterOut, updateFiltersArray } from '../utils/filter'; +import { Indicator } from '../../../../common/types/indicator'; + +export interface UseFilterInParam { + /** + * Indicator used to retrieve the field and value then use to update the filters + */ + indicator: Indicator | string; + /** + * Value used to filter in /out in the KQL bar. + */ + field: string; + /** + * To filter in or out. + */ + filterType: typeof FilterIn | typeof FilterOut; +} + +export interface UseFilterInValue { + /** + * Filter function to run on click event. + */ + filterFn: (() => void) | undefined; +} + +/** + * Custom hook that uses an indicator, a field and a type (FilterIn or FilterOut) and returns the filter function. + * + */ +export const useFilterInOut = ({ + indicator, + field, + filterType, +}: UseFilterInParam): UseFilterInValue => { + const { filterManager } = useIndicatorsFiltersContext(); + + const { key, value } = + typeof indicator === 'string' + ? { key: field, value: indicator } + : getIndicatorFieldAndValue(indicator, field); + + const filterFn = useCallback((): void => { + const existingFilters = filterManager.getFilters(); + const newFilters: Filter[] = updateFiltersArray(existingFilters, key, value, filterType); + filterManager.setFilters(newFilters); + }, [filterManager, filterType, key, value]); + + if (!fieldAndValueValid(key, value)) { + return {} as unknown as UseFilterInValue; + } + + return { + filterFn, + }; +}; diff --git a/x-pack/plugins/threat_intelligence/public/modules/timeline/components/add_to_timeline/add_to_timeline.stories.tsx b/x-pack/plugins/threat_intelligence/public/modules/timeline/components/add_to_timeline/add_to_timeline.stories.tsx index ee3f2d67ed91c..beefdafd9d59f 100644 --- a/x-pack/plugins/threat_intelligence/public/modules/timeline/components/add_to_timeline/add_to_timeline.stories.tsx +++ b/x-pack/plugins/threat_intelligence/public/modules/timeline/components/add_to_timeline/add_to_timeline.stories.tsx @@ -9,13 +9,12 @@ import React from 'react'; import { Story } from '@storybook/react'; import { CoreStart } from '@kbn/core/public'; import { createKibanaReactContext } from '@kbn/kibana-react-plugin/public'; +import { EuiContextMenuPanel } from '@elastic/eui'; import { mockKibanaTimelinesService } from '../../../../common/mocks/mock_kibana_timelines_service'; -import { EMPTY_VALUE } from '../../../../../common/constants'; import { generateMockIndicator, Indicator } from '../../../../../common/types/indicator'; -import { AddToTimeline } from './add_to_timeline'; +import { AddToTimelineButtonIcon, AddToTimelineContextMenu } from './add_to_timeline'; export default { - component: AddToTimeline, title: 'AddToTimeline', }; @@ -25,28 +24,23 @@ const KibanaReactContext = createKibanaReactContext({ timelines: mockKibanaTimelinesService, } as unknown as CoreStart); -export const Default: Story = () => { +export const ButtonIcon: Story = () => { const mockData: Indicator = generateMockIndicator(); return ( - + ); }; -export const WithIndicator: Story = () => { - const mockData: string = 'ip'; +export const ContextMenu: Story = () => { + const mockData: Indicator = generateMockIndicator(); + const items = []; return ( - + ); }; - -export const EmptyValue: Story = () => ( - - - -); diff --git a/x-pack/plugins/threat_intelligence/public/modules/timeline/components/add_to_timeline/add_to_timeline.test.tsx b/x-pack/plugins/threat_intelligence/public/modules/timeline/components/add_to_timeline/add_to_timeline.test.tsx index b8ca854613b08..85e581bc8dc17 100644 --- a/x-pack/plugins/threat_intelligence/public/modules/timeline/components/add_to_timeline/add_to_timeline.test.tsx +++ b/x-pack/plugins/threat_intelligence/public/modules/timeline/components/add_to_timeline/add_to_timeline.test.tsx @@ -9,7 +9,7 @@ import React from 'react'; import { render } from '@testing-library/react'; import { generateMockIndicator, Indicator } from '../../../../../common/types/indicator'; import { EMPTY_VALUE } from '../../../../../common/constants'; -import { AddToTimeline } from './add_to_timeline'; +import { AddToTimelineButtonIcon } from './add_to_timeline'; import { TestProvidersComponent } from '../../../../common/mocks/test_providers'; describe('', () => { @@ -19,7 +19,7 @@ describe('', () => { const component = render( - + ); expect(component).toMatchSnapshot(); @@ -31,7 +31,7 @@ describe('', () => { const component = render( - + ); expect(component).toMatchSnapshot(); @@ -43,7 +43,7 @@ describe('', () => { const component = render( - + ); expect(component).toMatchSnapshot(); @@ -56,7 +56,7 @@ describe('', () => { const component = render( - + ); expect(component).toMatchSnapshot(); @@ -69,7 +69,7 @@ describe('', () => { const component = render( - + ); expect(component).toMatchSnapshot(); @@ -81,7 +81,7 @@ describe('', () => { const component = render( - + ); expect(component).toMatchSnapshot(); diff --git a/x-pack/plugins/threat_intelligence/public/modules/timeline/components/add_to_timeline/add_to_timeline.tsx b/x-pack/plugins/threat_intelligence/public/modules/timeline/components/add_to_timeline/add_to_timeline.tsx index 5b33a3bfeaa35..44f9df4225ba2 100644 --- a/x-pack/plugins/threat_intelligence/public/modules/timeline/components/add_to_timeline/add_to_timeline.tsx +++ b/x-pack/plugins/threat_intelligence/public/modules/timeline/components/add_to_timeline/add_to_timeline.tsx @@ -13,7 +13,6 @@ import { EuiContextMenuItem, EuiFlexItem, EuiToolTip } from '@elastic/eui'; import { i18n } from '@kbn/i18n'; import { FormattedMessage } from '@kbn/i18n-react'; import { generateDataProvider } from '../../utils/data_provider'; -import { ComponentType } from '../../../../../common/types/component_type'; import { fieldAndValueValid, getIndicatorFieldAndValue, @@ -21,6 +20,18 @@ import { import { useKibana } from '../../../../hooks/use_kibana'; import { Indicator } from '../../../../../common/types/indicator'; import { useStyles } from './styles'; +import { useAddToTimeline } from '../../hooks/use_add_to_timeline'; + +const BUTTON_ICON_TOOLTIP = i18n.translate( + 'xpack.threatIntelligence.timeline.addToTimelineButtonIcon', + { defaultMessage: 'Add to Timeline' } +); +const CELL_ACTION_TOOLTIP = i18n.translate( + 'xpack.threatIntelligence.timeline.addToTimelineCellAction', + { + defaultMessage: 'Add to Timeline', + } +); export interface AddToTimelineProps { /** @@ -32,30 +43,61 @@ export interface AddToTimelineProps { */ field: string; /** - * Dictates the way the FilterIn component is rendered depending on the situation in which it's used + * Used for unit and e2e tests. */ - type?: ComponentType; + ['data-test-subj']?: string; +} + +export interface AddToTimelineCellActionProps extends AddToTimelineProps { /** * Only used with `EuiDataGrid` (see {@link AddToTimelineButtonProps}). */ - as?: typeof EuiButtonEmpty | typeof EuiButtonIcon; - /** - * Used for unit and e2e tests. - */ - ['data-test-subj']?: string; + Component: typeof EuiButtonEmpty | typeof EuiButtonIcon; } /** - * Add to timeline button, used in many places throughout the TI plugin. - * Support being passed a {@link Indicator} or a string, can be used in a `EuiDataGrid` or as a normal button. - * Leverages the built-in functionality retrieves from the timeLineService (see ThreatIntelligenceSecuritySolutionContext in x-pack/plugins/threat_intelligence/public/types.ts) + * Add to timeline feature, leverages the built-in functionality retrieves from the timeLineService (see ThreatIntelligenceSecuritySolutionContext in x-pack/plugins/threat_intelligence/public/types.ts) * Clicking on the button will add a key-value pair to an Untitled timeline. * - * The component has 2 renders depending on where it's used: within a EuiContextMenu or not. + * This component is renders an {@link EuiButtonIcon}. * - * @returns add to timeline button or an empty component. + * @returns add to timeline button or an empty component */ -export const AddToTimeline: VFC = ({ data, field, type, as, ...props }) => { +export const AddToTimelineButtonIcon: VFC = ({ + data, + field, + 'data-test-subj': dataTestSubj, +}) => { + const addToTimelineButton = + useKibana().services.timelines.getHoverActions().getAddToTimelineButton; + + const { addToTimelineProps } = useAddToTimeline({ indicator: data, field }); + if (!addToTimelineProps) { + return <>; + } + + return ( + + + {addToTimelineButton(addToTimelineProps)} + + + ); +}; + +/** + * Add to timeline feature, leverages the built-in functionality retrieves from the timeLineService (see ThreatIntelligenceSecuritySolutionContext in x-pack/plugins/threat_intelligence/public/types.ts) + * Clicking on the button will add a key-value pair to an Untitled timeline. + * + * This component is to be used in an EuiContextMenu. + * + * @returns add to timeline item for a context menu + */ +export const AddToTimelineContextMenu: VFC = ({ + data, + field, + 'data-test-subj': dataTestSubj, +}) => { const styles = useStyles(); const contextMenuRef = useRef(null); @@ -81,37 +123,55 @@ export const AddToTimeline: VFC = ({ data, field, type, as, // Use case is for the barchart legend (for example). // We can't use the addToTimelineButton directly because the UI doesn't work in a EuiContextMenu. // We hide it and use the defaultFocusedButtonRef props to programmatically click it. - if (type === ComponentType.ContextMenu) { - addToTimelineProps.defaultFocusedButtonRef = contextMenuRef; - - return ( - <> -
{addToTimelineButton(addToTimelineProps)}
- contextMenuRef.current?.click()} - {...props} - > - - - - ); - } + addToTimelineProps.defaultFocusedButtonRef = contextMenuRef; + + return ( + <> +
{addToTimelineButton(addToTimelineProps)}
+ contextMenuRef.current?.click()} + data-test-subj={dataTestSubj} + > + + + + ); +}; - if (as) addToTimelineProps.Component = as; +/** + * Add to timeline feature, leverages the built-in functionality retrieves from the timeLineService (see ThreatIntelligenceSecuritySolutionContext in x-pack/plugins/threat_intelligence/public/types.ts) + * Clicking on the button will add a key-value pair to an Untitled timeline. + * + * This component is to be used as a cellAction in an {@link EuiDataGrid}. + * + * @returns add to timeline button or an empty component + */ +export const AddToTimelineCellAction: VFC = ({ + data, + field, + Component, + 'data-test-subj': dataTestSubj, +}) => { + const addToTimelineButton = + useKibana().services.timelines.getHoverActions().getAddToTimelineButton; + + const { addToTimelineProps } = useAddToTimeline({ indicator: data, field }); + if (!addToTimelineProps) { + return <>; + } + addToTimelineProps.Component = Component; return ( - - {addToTimelineButton(addToTimelineProps)} + + + {addToTimelineButton(addToTimelineProps)} + ); }; diff --git a/x-pack/plugins/threat_intelligence/public/modules/timeline/components/investigate_in_timeline/__snapshots__/investigate_in_timeline.test.tsx.snap b/x-pack/plugins/threat_intelligence/public/modules/timeline/components/investigate_in_timeline/__snapshots__/investigate_in_timeline.test.tsx.snap new file mode 100644 index 0000000000000..0db32e3424f55 --- /dev/null +++ b/x-pack/plugins/threat_intelligence/public/modules/timeline/components/investigate_in_timeline/__snapshots__/investigate_in_timeline.test.tsx.snap @@ -0,0 +1,313 @@ +// Jest Snapshot v1, https://goo.gl/fbAQLP + +exports[` should render button when Indicator data is correct 1`] = ` +Object { + "asFragment": [Function], + "baseElement": +
+ +
+ , + "container":
+ +
, + "debug": [Function], + "findAllByAltText": [Function], + "findAllByDisplayValue": [Function], + "findAllByLabelText": [Function], + "findAllByPlaceholderText": [Function], + "findAllByRole": [Function], + "findAllByTestId": [Function], + "findAllByText": [Function], + "findAllByTitle": [Function], + "findByAltText": [Function], + "findByDisplayValue": [Function], + "findByLabelText": [Function], + "findByPlaceholderText": [Function], + "findByRole": [Function], + "findByTestId": [Function], + "findByText": [Function], + "findByTitle": [Function], + "getAllByAltText": [Function], + "getAllByDisplayValue": [Function], + "getAllByLabelText": [Function], + "getAllByPlaceholderText": [Function], + "getAllByRole": [Function], + "getAllByTestId": [Function], + "getAllByText": [Function], + "getAllByTitle": [Function], + "getByAltText": [Function], + "getByDisplayValue": [Function], + "getByLabelText": [Function], + "getByPlaceholderText": [Function], + "getByRole": [Function], + "getByTestId": [Function], + "getByText": [Function], + "getByTitle": [Function], + "queryAllByAltText": [Function], + "queryAllByDisplayValue": [Function], + "queryAllByLabelText": [Function], + "queryAllByPlaceholderText": [Function], + "queryAllByRole": [Function], + "queryAllByTestId": [Function], + "queryAllByText": [Function], + "queryAllByTitle": [Function], + "queryByAltText": [Function], + "queryByDisplayValue": [Function], + "queryByLabelText": [Function], + "queryByPlaceholderText": [Function], + "queryByRole": [Function], + "queryByTestId": [Function], + "queryByText": [Function], + "queryByTitle": [Function], + "rerender": [Function], + "unmount": [Function], +} +`; + +exports[` should render empty component when Indicator data is incorrect 1`] = ` +Object { + "asFragment": [Function], + "baseElement": +
+ , + "container":
, + "debug": [Function], + "findAllByAltText": [Function], + "findAllByDisplayValue": [Function], + "findAllByLabelText": [Function], + "findAllByPlaceholderText": [Function], + "findAllByRole": [Function], + "findAllByTestId": [Function], + "findAllByText": [Function], + "findAllByTitle": [Function], + "findByAltText": [Function], + "findByDisplayValue": [Function], + "findByLabelText": [Function], + "findByPlaceholderText": [Function], + "findByRole": [Function], + "findByTestId": [Function], + "findByText": [Function], + "findByTitle": [Function], + "getAllByAltText": [Function], + "getAllByDisplayValue": [Function], + "getAllByLabelText": [Function], + "getAllByPlaceholderText": [Function], + "getAllByRole": [Function], + "getAllByTestId": [Function], + "getAllByText": [Function], + "getAllByTitle": [Function], + "getByAltText": [Function], + "getByDisplayValue": [Function], + "getByLabelText": [Function], + "getByPlaceholderText": [Function], + "getByRole": [Function], + "getByTestId": [Function], + "getByText": [Function], + "getByTitle": [Function], + "queryAllByAltText": [Function], + "queryAllByDisplayValue": [Function], + "queryAllByLabelText": [Function], + "queryAllByPlaceholderText": [Function], + "queryAllByRole": [Function], + "queryAllByTestId": [Function], + "queryAllByText": [Function], + "queryAllByTitle": [Function], + "queryByAltText": [Function], + "queryByDisplayValue": [Function], + "queryByLabelText": [Function], + "queryByPlaceholderText": [Function], + "queryByRole": [Function], + "queryByTestId": [Function], + "queryByText": [Function], + "queryByTitle": [Function], + "rerender": [Function], + "unmount": [Function], +} +`; + +exports[` should render button icon when Indicator data is correct 1`] = ` +Object { + "asFragment": [Function], + "baseElement": +
+ + + +
+ , + "container":
+ + + +
, + "debug": [Function], + "findAllByAltText": [Function], + "findAllByDisplayValue": [Function], + "findAllByLabelText": [Function], + "findAllByPlaceholderText": [Function], + "findAllByRole": [Function], + "findAllByTestId": [Function], + "findAllByText": [Function], + "findAllByTitle": [Function], + "findByAltText": [Function], + "findByDisplayValue": [Function], + "findByLabelText": [Function], + "findByPlaceholderText": [Function], + "findByRole": [Function], + "findByTestId": [Function], + "findByText": [Function], + "findByTitle": [Function], + "getAllByAltText": [Function], + "getAllByDisplayValue": [Function], + "getAllByLabelText": [Function], + "getAllByPlaceholderText": [Function], + "getAllByRole": [Function], + "getAllByTestId": [Function], + "getAllByText": [Function], + "getAllByTitle": [Function], + "getByAltText": [Function], + "getByDisplayValue": [Function], + "getByLabelText": [Function], + "getByPlaceholderText": [Function], + "getByRole": [Function], + "getByTestId": [Function], + "getByText": [Function], + "getByTitle": [Function], + "queryAllByAltText": [Function], + "queryAllByDisplayValue": [Function], + "queryAllByLabelText": [Function], + "queryAllByPlaceholderText": [Function], + "queryAllByRole": [Function], + "queryAllByTestId": [Function], + "queryAllByText": [Function], + "queryAllByTitle": [Function], + "queryByAltText": [Function], + "queryByDisplayValue": [Function], + "queryByLabelText": [Function], + "queryByPlaceholderText": [Function], + "queryByRole": [Function], + "queryByTestId": [Function], + "queryByText": [Function], + "queryByTitle": [Function], + "rerender": [Function], + "unmount": [Function], +} +`; + +exports[` should render empty component when calculated value is - 1`] = ` +Object { + "asFragment": [Function], + "baseElement": +
+ , + "container":
, + "debug": [Function], + "findAllByAltText": [Function], + "findAllByDisplayValue": [Function], + "findAllByLabelText": [Function], + "findAllByPlaceholderText": [Function], + "findAllByRole": [Function], + "findAllByTestId": [Function], + "findAllByText": [Function], + "findAllByTitle": [Function], + "findByAltText": [Function], + "findByDisplayValue": [Function], + "findByLabelText": [Function], + "findByPlaceholderText": [Function], + "findByRole": [Function], + "findByTestId": [Function], + "findByText": [Function], + "findByTitle": [Function], + "getAllByAltText": [Function], + "getAllByDisplayValue": [Function], + "getAllByLabelText": [Function], + "getAllByPlaceholderText": [Function], + "getAllByRole": [Function], + "getAllByTestId": [Function], + "getAllByText": [Function], + "getAllByTitle": [Function], + "getByAltText": [Function], + "getByDisplayValue": [Function], + "getByLabelText": [Function], + "getByPlaceholderText": [Function], + "getByRole": [Function], + "getByTestId": [Function], + "getByText": [Function], + "getByTitle": [Function], + "queryAllByAltText": [Function], + "queryAllByDisplayValue": [Function], + "queryAllByLabelText": [Function], + "queryAllByPlaceholderText": [Function], + "queryAllByRole": [Function], + "queryAllByTestId": [Function], + "queryAllByText": [Function], + "queryAllByTitle": [Function], + "queryByAltText": [Function], + "queryByDisplayValue": [Function], + "queryByLabelText": [Function], + "queryByPlaceholderText": [Function], + "queryByRole": [Function], + "queryByTestId": [Function], + "queryByText": [Function], + "queryByTitle": [Function], + "rerender": [Function], + "unmount": [Function], +} +`; diff --git a/x-pack/plugins/threat_intelligence/public/modules/timeline/components/investigate_in_timeline_button/index.ts b/x-pack/plugins/threat_intelligence/public/modules/timeline/components/investigate_in_timeline/index.ts similarity index 83% rename from x-pack/plugins/threat_intelligence/public/modules/timeline/components/investigate_in_timeline_button/index.ts rename to x-pack/plugins/threat_intelligence/public/modules/timeline/components/investigate_in_timeline/index.ts index d562e618a664e..34bd1d7d56277 100644 --- a/x-pack/plugins/threat_intelligence/public/modules/timeline/components/investigate_in_timeline_button/index.ts +++ b/x-pack/plugins/threat_intelligence/public/modules/timeline/components/investigate_in_timeline/index.ts @@ -5,4 +5,4 @@ * 2.0. */ -export * from './investigate_in_timeline_button'; +export * from './investigate_in_timeline'; diff --git a/x-pack/plugins/threat_intelligence/public/modules/timeline/components/investigate_in_timeline_button_icon/investigate_in_timeline_button_icon.stories.tsx b/x-pack/plugins/threat_intelligence/public/modules/timeline/components/investigate_in_timeline/investigate_in_timeline.stories.tsx similarity index 67% rename from x-pack/plugins/threat_intelligence/public/modules/timeline/components/investigate_in_timeline_button_icon/investigate_in_timeline_button_icon.stories.tsx rename to x-pack/plugins/threat_intelligence/public/modules/timeline/components/investigate_in_timeline/investigate_in_timeline.stories.tsx index 15c5bc0c23ed4..08fe4b782c2c0 100644 --- a/x-pack/plugins/threat_intelligence/public/modules/timeline/components/investigate_in_timeline_button_icon/investigate_in_timeline_button_icon.stories.tsx +++ b/x-pack/plugins/threat_intelligence/public/modules/timeline/components/investigate_in_timeline/investigate_in_timeline.stories.tsx @@ -9,16 +9,23 @@ import React from 'react'; import { Story } from '@storybook/react'; import { StoryProvidersComponent } from '../../../../common/mocks/story_providers'; import { generateMockUrlIndicator } from '../../../../../common/types/indicator'; -import { InvestigateInTimelineButtonIcon } from './investigate_in_timeline_button_icon'; +import { InvestigateInTimelineButton, InvestigateInTimelineButtonIcon } from '.'; export default { - component: InvestigateInTimelineButtonIcon, - title: 'InvestigateInTimelineButtonIcon', + title: 'InvestigateInTimeline', }; const mockIndicator = generateMockUrlIndicator(); -export const Default: Story = () => { +export const Button: Story = () => { + return ( + + + + ); +}; + +export const ButtonIcon: Story = () => { return ( diff --git a/x-pack/plugins/threat_intelligence/public/modules/timeline/components/investigate_in_timeline/investigate_in_timeline.test.tsx b/x-pack/plugins/threat_intelligence/public/modules/timeline/components/investigate_in_timeline/investigate_in_timeline.test.tsx new file mode 100644 index 0000000000000..cd7aba14fff5e --- /dev/null +++ b/x-pack/plugins/threat_intelligence/public/modules/timeline/components/investigate_in_timeline/investigate_in_timeline.test.tsx @@ -0,0 +1,77 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import React from 'react'; +import { render } from '@testing-library/react'; +import { + generateMockIndicator, + generateMockUrlIndicator, + Indicator, +} from '../../../../../common/types/indicator'; +import { TestProvidersComponent } from '../../../../common/mocks/test_providers'; +import { InvestigateInTimelineButton, InvestigateInTimelineButtonIcon } from '.'; +import { EMPTY_VALUE } from '../../../../../common/constants'; + +describe('', () => { + describe('', () => { + it('should render button when Indicator data is correct', () => { + const mockData: Indicator = generateMockUrlIndicator(); + const mockId = 'mockId'; + + const component = render( + + + + ); + + expect(component.getByTestId(mockId)).toBeInTheDocument(); + expect(component).toMatchSnapshot(); + }); + + it('should render empty component when Indicator data is incorrect', () => { + const mockData: Indicator = generateMockIndicator(); + mockData.fields['threat.indicator.first_seen'] = ['']; + + const component = render( + + + + ); + + expect(component).toMatchSnapshot(); + }); + }); + + describe('', () => { + it('should render button icon when Indicator data is correct', () => { + const mockData: Indicator = generateMockUrlIndicator(); + const mockId = 'mockId'; + + const component = render( + + + + ); + + expect(component.getByTestId(mockId)).toBeInTheDocument(); + expect(component).toMatchSnapshot(); + }); + + it(`should render empty component when calculated value is ${EMPTY_VALUE}`, () => { + const mockData: Indicator = generateMockIndicator(); + mockData.fields['threat.indicator.first_seen'] = ['']; + + const component = render( + + + + ); + + expect(component).toMatchSnapshot(); + }); + }); +}); diff --git a/x-pack/plugins/threat_intelligence/public/modules/timeline/components/investigate_in_timeline/investigate_in_timeline.tsx b/x-pack/plugins/threat_intelligence/public/modules/timeline/components/investigate_in_timeline/investigate_in_timeline.tsx new file mode 100644 index 0000000000000..cd1f7ce2a2d97 --- /dev/null +++ b/x-pack/plugins/threat_intelligence/public/modules/timeline/components/investigate_in_timeline/investigate_in_timeline.tsx @@ -0,0 +1,90 @@ +/* + * 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, { VFC } from 'react'; +import { EuiButton, EuiButtonIcon, EuiToolTip } from '@elastic/eui'; +import { FormattedMessage } from '@kbn/i18n-react'; +import { i18n } from '@kbn/i18n'; +import { useInvestigateInTimeline } from '../../hooks/use_investigate_in_timeline'; +import { Indicator } from '../../../../../common/types/indicator'; + +const BUTTON_ICON_LABEL: string = i18n.translate( + 'xpack.threatIntelligence.timeline.investigateInTimelineButtonIcon', + { + defaultMessage: 'Investigate in Timeline', + } +); + +export interface InvestigateInTimelineButtonProps { + /** + * Value passed to the timeline. Used in combination with field if is type of {@link Indicator}. + */ + data: Indicator; + /** + * Used for unit and e2e tests. + */ + ['data-test-subj']?: string; +} + +/** + * Investigate in timeline button, uses the InvestigateInTimelineAction component (x-pack/plugins/security_solution/public/detections/components/alerts_table/timeline_actions/investigate_in_timeline_action.tsx) + * retrieved from the SecuritySolutionContext. + * + * This component renders an {@link EuiButton}. + * + * @returns add to timeline button + */ +export const InvestigateInTimelineButton: VFC = ({ + data, + 'data-test-subj': dataTestSub, +}) => { + const { investigateInTimelineFn } = useInvestigateInTimeline({ indicator: data }); + if (!investigateInTimelineFn) { + return <>; + } + + return ( + + + + ); +}; + +/** + * Investigate in timeline button uses the InvestigateInTimelineAction component (x-pack/plugins/security_solution/public/detections/components/alerts_table/timeline_actions/investigate_in_timeline_action.tsx) + * retrieved from the SecuritySolutionContext. + * + * This component renders an {@link EuiButtonIcon}. + * + * @returns add to timeline button icon + */ +export const InvestigateInTimelineButtonIcon: VFC = ({ + data, + 'data-test-subj': dataTestSub, +}) => { + const { investigateInTimelineFn } = useInvestigateInTimeline({ indicator: data }); + if (!investigateInTimelineFn) { + return <>; + } + + return ( + + + + ); +}; diff --git a/x-pack/plugins/threat_intelligence/public/modules/timeline/components/investigate_in_timeline_button/__snapshots__/investigate_in_timeline_button.test.tsx.snap b/x-pack/plugins/threat_intelligence/public/modules/timeline/components/investigate_in_timeline_button/__snapshots__/investigate_in_timeline_button.test.tsx.snap deleted file mode 100644 index a01cfb51e66d4..0000000000000 --- a/x-pack/plugins/threat_intelligence/public/modules/timeline/components/investigate_in_timeline_button/__snapshots__/investigate_in_timeline_button.test.tsx.snap +++ /dev/null @@ -1,155 +0,0 @@ -// Jest Snapshot v1, https://goo.gl/fbAQLP - -exports[` should render button when Indicator data is correct 1`] = ` -Object { - "asFragment": [Function], - "baseElement": -
- -
- , - "container":
- -
, - "debug": [Function], - "findAllByAltText": [Function], - "findAllByDisplayValue": [Function], - "findAllByLabelText": [Function], - "findAllByPlaceholderText": [Function], - "findAllByRole": [Function], - "findAllByTestId": [Function], - "findAllByText": [Function], - "findAllByTitle": [Function], - "findByAltText": [Function], - "findByDisplayValue": [Function], - "findByLabelText": [Function], - "findByPlaceholderText": [Function], - "findByRole": [Function], - "findByTestId": [Function], - "findByText": [Function], - "findByTitle": [Function], - "getAllByAltText": [Function], - "getAllByDisplayValue": [Function], - "getAllByLabelText": [Function], - "getAllByPlaceholderText": [Function], - "getAllByRole": [Function], - "getAllByTestId": [Function], - "getAllByText": [Function], - "getAllByTitle": [Function], - "getByAltText": [Function], - "getByDisplayValue": [Function], - "getByLabelText": [Function], - "getByPlaceholderText": [Function], - "getByRole": [Function], - "getByTestId": [Function], - "getByText": [Function], - "getByTitle": [Function], - "queryAllByAltText": [Function], - "queryAllByDisplayValue": [Function], - "queryAllByLabelText": [Function], - "queryAllByPlaceholderText": [Function], - "queryAllByRole": [Function], - "queryAllByTestId": [Function], - "queryAllByText": [Function], - "queryAllByTitle": [Function], - "queryByAltText": [Function], - "queryByDisplayValue": [Function], - "queryByLabelText": [Function], - "queryByPlaceholderText": [Function], - "queryByRole": [Function], - "queryByTestId": [Function], - "queryByText": [Function], - "queryByTitle": [Function], - "rerender": [Function], - "unmount": [Function], -} -`; - -exports[` should render empty component when Indicator data is incorrect 1`] = ` -Object { - "asFragment": [Function], - "baseElement": -
- , - "container":
, - "debug": [Function], - "findAllByAltText": [Function], - "findAllByDisplayValue": [Function], - "findAllByLabelText": [Function], - "findAllByPlaceholderText": [Function], - "findAllByRole": [Function], - "findAllByTestId": [Function], - "findAllByText": [Function], - "findAllByTitle": [Function], - "findByAltText": [Function], - "findByDisplayValue": [Function], - "findByLabelText": [Function], - "findByPlaceholderText": [Function], - "findByRole": [Function], - "findByTestId": [Function], - "findByText": [Function], - "findByTitle": [Function], - "getAllByAltText": [Function], - "getAllByDisplayValue": [Function], - "getAllByLabelText": [Function], - "getAllByPlaceholderText": [Function], - "getAllByRole": [Function], - "getAllByTestId": [Function], - "getAllByText": [Function], - "getAllByTitle": [Function], - "getByAltText": [Function], - "getByDisplayValue": [Function], - "getByLabelText": [Function], - "getByPlaceholderText": [Function], - "getByRole": [Function], - "getByTestId": [Function], - "getByText": [Function], - "getByTitle": [Function], - "queryAllByAltText": [Function], - "queryAllByDisplayValue": [Function], - "queryAllByLabelText": [Function], - "queryAllByPlaceholderText": [Function], - "queryAllByRole": [Function], - "queryAllByTestId": [Function], - "queryAllByText": [Function], - "queryAllByTitle": [Function], - "queryByAltText": [Function], - "queryByDisplayValue": [Function], - "queryByLabelText": [Function], - "queryByPlaceholderText": [Function], - "queryByRole": [Function], - "queryByTestId": [Function], - "queryByText": [Function], - "queryByTitle": [Function], - "rerender": [Function], - "unmount": [Function], -} -`; diff --git a/x-pack/plugins/threat_intelligence/public/modules/timeline/components/investigate_in_timeline_button/investigate_in_timeline_button.stories.tsx b/x-pack/plugins/threat_intelligence/public/modules/timeline/components/investigate_in_timeline_button/investigate_in_timeline_button.stories.tsx deleted file mode 100644 index c3c8e65001a3a..0000000000000 --- a/x-pack/plugins/threat_intelligence/public/modules/timeline/components/investigate_in_timeline_button/investigate_in_timeline_button.stories.tsx +++ /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 React from 'react'; -import { Story } from '@storybook/react'; -import { StoryProvidersComponent } from '../../../../common/mocks/story_providers'; -import { generateMockUrlIndicator } from '../../../../../common/types/indicator'; -import { InvestigateInTimelineButton } from './investigate_in_timeline_button'; - -export default { - component: InvestigateInTimelineButton, - title: 'InvestigateInTimelineButton', -}; - -const mockIndicator = generateMockUrlIndicator(); - -export const Default: Story = () => { - return ( - - - - ); -}; diff --git a/x-pack/plugins/threat_intelligence/public/modules/timeline/components/investigate_in_timeline_button/investigate_in_timeline_button.test.tsx b/x-pack/plugins/threat_intelligence/public/modules/timeline/components/investigate_in_timeline_button/investigate_in_timeline_button.test.tsx deleted file mode 100644 index b064ead7e645e..0000000000000 --- a/x-pack/plugins/threat_intelligence/public/modules/timeline/components/investigate_in_timeline_button/investigate_in_timeline_button.test.tsx +++ /dev/null @@ -1,45 +0,0 @@ -/* - * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one - * or more contributor license agreements. Licensed under the Elastic License - * 2.0; you may not use this file except in compliance with the Elastic License - * 2.0. - */ - -import React from 'react'; -import { render } from '@testing-library/react'; -import { - generateMockIndicator, - generateMockUrlIndicator, - Indicator, -} from '../../../../../common/types/indicator'; -import { TestProvidersComponent } from '../../../../common/mocks/test_providers'; -import { InvestigateInTimelineButton } from './investigate_in_timeline_button'; - -describe('', () => { - it('should render button when Indicator data is correct', () => { - const mockData: Indicator = generateMockUrlIndicator(); - const mockId = 'mockId'; - - const component = render( - - - - ); - - expect(component.getByTestId(mockId)).toBeInTheDocument(); - expect(component).toMatchSnapshot(); - }); - - it('should render empty component when Indicator data is incorrect', () => { - const mockData: Indicator = generateMockIndicator(); - mockData.fields['threat.indicator.first_seen'] = ['']; - - const component = render( - - - - ); - - expect(component).toMatchSnapshot(); - }); -}); diff --git a/x-pack/plugins/threat_intelligence/public/modules/timeline/components/investigate_in_timeline_button/investigate_in_timeline_button.tsx b/x-pack/plugins/threat_intelligence/public/modules/timeline/components/investigate_in_timeline_button/investigate_in_timeline_button.tsx deleted file mode 100644 index 479f175275625..0000000000000 --- a/x-pack/plugins/threat_intelligence/public/modules/timeline/components/investigate_in_timeline_button/investigate_in_timeline_button.tsx +++ /dev/null @@ -1,50 +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, { VFC } from 'react'; -import { EuiButton } from '@elastic/eui'; -import { FormattedMessage } from '@kbn/i18n-react'; -import { useInvestigateInTimeline } from '../../hooks/use_investigate_in_timeline'; -import { Indicator } from '../../../../../common/types/indicator'; - -export interface InvestigateInTimelineButtonProps { - /** - * Value passed to the timeline. Used in combination with field if is type of {@link Indicator}. - */ - data: Indicator; - /** - * Used for unit and e2e tests. - */ - ['data-test-subj']?: string; -} - -/** - * Investigate in timeline button, supports being passed a {@link Indicator}. - * This implementation uses the InvestigateInTimelineAction component (x-pack/plugins/security_solution/public/detections/components/alerts_table/timeline_actions/investigate_in_timeline_action.tsx) - * retrieved from the SecuritySolutionContext. - * - * @returns add to timeline button or an empty component. - */ -export const InvestigateInTimelineButton: VFC = ({ - data, - ...props -}) => { - const { onClick } = useInvestigateInTimeline({ indicator: data }); - - if (!onClick) { - return <>; - } - - return ( - - - - ); -}; diff --git a/x-pack/plugins/threat_intelligence/public/modules/timeline/components/investigate_in_timeline_button_icon/__snapshots__/investigate_in_timeline_button_icon.test.tsx.snap b/x-pack/plugins/threat_intelligence/public/modules/timeline/components/investigate_in_timeline_button_icon/__snapshots__/investigate_in_timeline_button_icon.test.tsx.snap deleted file mode 100644 index 263e893f3f8b6..0000000000000 --- a/x-pack/plugins/threat_intelligence/public/modules/timeline/components/investigate_in_timeline_button_icon/__snapshots__/investigate_in_timeline_button_icon.test.tsx.snap +++ /dev/null @@ -1,159 +0,0 @@ -// Jest Snapshot v1, https://goo.gl/fbAQLP - -exports[` should render button icon when Indicator data is correct 1`] = ` -Object { - "asFragment": [Function], - "baseElement": -
- - - -
- , - "container":
- - - -
, - "debug": [Function], - "findAllByAltText": [Function], - "findAllByDisplayValue": [Function], - "findAllByLabelText": [Function], - "findAllByPlaceholderText": [Function], - "findAllByRole": [Function], - "findAllByTestId": [Function], - "findAllByText": [Function], - "findAllByTitle": [Function], - "findByAltText": [Function], - "findByDisplayValue": [Function], - "findByLabelText": [Function], - "findByPlaceholderText": [Function], - "findByRole": [Function], - "findByTestId": [Function], - "findByText": [Function], - "findByTitle": [Function], - "getAllByAltText": [Function], - "getAllByDisplayValue": [Function], - "getAllByLabelText": [Function], - "getAllByPlaceholderText": [Function], - "getAllByRole": [Function], - "getAllByTestId": [Function], - "getAllByText": [Function], - "getAllByTitle": [Function], - "getByAltText": [Function], - "getByDisplayValue": [Function], - "getByLabelText": [Function], - "getByPlaceholderText": [Function], - "getByRole": [Function], - "getByTestId": [Function], - "getByText": [Function], - "getByTitle": [Function], - "queryAllByAltText": [Function], - "queryAllByDisplayValue": [Function], - "queryAllByLabelText": [Function], - "queryAllByPlaceholderText": [Function], - "queryAllByRole": [Function], - "queryAllByTestId": [Function], - "queryAllByText": [Function], - "queryAllByTitle": [Function], - "queryByAltText": [Function], - "queryByDisplayValue": [Function], - "queryByLabelText": [Function], - "queryByPlaceholderText": [Function], - "queryByRole": [Function], - "queryByTestId": [Function], - "queryByText": [Function], - "queryByTitle": [Function], - "rerender": [Function], - "unmount": [Function], -} -`; - -exports[` should render empty component when calculated value is - 1`] = ` -Object { - "asFragment": [Function], - "baseElement": -
- , - "container":
, - "debug": [Function], - "findAllByAltText": [Function], - "findAllByDisplayValue": [Function], - "findAllByLabelText": [Function], - "findAllByPlaceholderText": [Function], - "findAllByRole": [Function], - "findAllByTestId": [Function], - "findAllByText": [Function], - "findAllByTitle": [Function], - "findByAltText": [Function], - "findByDisplayValue": [Function], - "findByLabelText": [Function], - "findByPlaceholderText": [Function], - "findByRole": [Function], - "findByTestId": [Function], - "findByText": [Function], - "findByTitle": [Function], - "getAllByAltText": [Function], - "getAllByDisplayValue": [Function], - "getAllByLabelText": [Function], - "getAllByPlaceholderText": [Function], - "getAllByRole": [Function], - "getAllByTestId": [Function], - "getAllByText": [Function], - "getAllByTitle": [Function], - "getByAltText": [Function], - "getByDisplayValue": [Function], - "getByLabelText": [Function], - "getByPlaceholderText": [Function], - "getByRole": [Function], - "getByTestId": [Function], - "getByText": [Function], - "getByTitle": [Function], - "queryAllByAltText": [Function], - "queryAllByDisplayValue": [Function], - "queryAllByLabelText": [Function], - "queryAllByPlaceholderText": [Function], - "queryAllByRole": [Function], - "queryAllByTestId": [Function], - "queryAllByText": [Function], - "queryAllByTitle": [Function], - "queryByAltText": [Function], - "queryByDisplayValue": [Function], - "queryByLabelText": [Function], - "queryByPlaceholderText": [Function], - "queryByRole": [Function], - "queryByTestId": [Function], - "queryByText": [Function], - "queryByTitle": [Function], - "rerender": [Function], - "unmount": [Function], -} -`; diff --git a/x-pack/plugins/threat_intelligence/public/modules/timeline/components/investigate_in_timeline_button_icon/index.ts b/x-pack/plugins/threat_intelligence/public/modules/timeline/components/investigate_in_timeline_button_icon/index.ts deleted file mode 100644 index 6ed30045b29b4..0000000000000 --- a/x-pack/plugins/threat_intelligence/public/modules/timeline/components/investigate_in_timeline_button_icon/index.ts +++ /dev/null @@ -1,8 +0,0 @@ -/* - * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one - * or more contributor license agreements. Licensed under the Elastic License - * 2.0; you may not use this file except in compliance with the Elastic License - * 2.0. - */ - -export * from './investigate_in_timeline_button_icon'; diff --git a/x-pack/plugins/threat_intelligence/public/modules/timeline/components/investigate_in_timeline_button_icon/investigate_in_timeline_button_icon.test.tsx b/x-pack/plugins/threat_intelligence/public/modules/timeline/components/investigate_in_timeline_button_icon/investigate_in_timeline_button_icon.test.tsx deleted file mode 100644 index 3cdaa0528ca5e..0000000000000 --- a/x-pack/plugins/threat_intelligence/public/modules/timeline/components/investigate_in_timeline_button_icon/investigate_in_timeline_button_icon.test.tsx +++ /dev/null @@ -1,46 +0,0 @@ -/* - * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one - * or more contributor license agreements. Licensed under the Elastic License - * 2.0; you may not use this file except in compliance with the Elastic License - * 2.0. - */ - -import React from 'react'; -import { render } from '@testing-library/react'; -import { - generateMockIndicator, - generateMockUrlIndicator, - Indicator, -} from '../../../../../common/types/indicator'; -import { EMPTY_VALUE } from '../../../../../common/constants'; -import { TestProvidersComponent } from '../../../../common/mocks/test_providers'; -import { InvestigateInTimelineButtonIcon } from './investigate_in_timeline_button_icon'; - -describe('', () => { - it('should render button icon when Indicator data is correct', () => { - const mockData: Indicator = generateMockUrlIndicator(); - const mockId = 'mockId'; - - const component = render( - - - - ); - - expect(component.getByTestId(mockId)).toBeInTheDocument(); - expect(component).toMatchSnapshot(); - }); - - it(`should render empty component when calculated value is ${EMPTY_VALUE}`, () => { - const mockData: Indicator = generateMockIndicator(); - mockData.fields['threat.indicator.first_seen'] = ['']; - - const component = render( - - - - ); - - expect(component).toMatchSnapshot(); - }); -}); diff --git a/x-pack/plugins/threat_intelligence/public/modules/timeline/components/investigate_in_timeline_button_icon/investigate_in_timeline_button_icon.tsx b/x-pack/plugins/threat_intelligence/public/modules/timeline/components/investigate_in_timeline_button_icon/investigate_in_timeline_button_icon.tsx deleted file mode 100644 index 888f420a3cac7..0000000000000 --- a/x-pack/plugins/threat_intelligence/public/modules/timeline/components/investigate_in_timeline_button_icon/investigate_in_timeline_button_icon.tsx +++ /dev/null @@ -1,62 +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, { VFC } from 'react'; -import { EuiButtonIcon, EuiToolTip } from '@elastic/eui'; -import { i18n } from '@kbn/i18n'; -import { useInvestigateInTimeline } from '../../hooks/use_investigate_in_timeline'; -import { Indicator } from '../../../../../common/types/indicator'; - -const BUTTON_LABEL: string = i18n.translate( - 'xpack.threatIntelligence.investigateInTimelineButtonIcon', - { - defaultMessage: 'Investigate in Timeline', - } -); - -export interface InvestigateInTimelineButtonIconProps { - /** - * Value passed to the timeline. Used in combination with field if is type of {@link Indicator}. - */ - data: Indicator; - /** - * Used for unit and e2e tests. - */ - ['data-test-subj']?: string; -} - -/** - * Investigate in timeline button, supports being passed a {@link Indicator}. - * This implementation uses the InvestigateInTimelineAction component (x-pack/plugins/security_solution/public/detections/components/alerts_table/timeline_actions/investigate_in_timeline_action.tsx) - * retrieved from the SecuritySolutionContext. - * - * @returns add to timeline button or an empty component. - */ -export const InvestigateInTimelineButtonIcon: VFC = ({ - data, - ...props -}) => { - const { onClick } = useInvestigateInTimeline({ indicator: data }); - - if (!onClick) { - return <>; - } - - return ( - - - - ); -}; diff --git a/x-pack/plugins/threat_intelligence/public/modules/timeline/hooks/index.ts b/x-pack/plugins/threat_intelligence/public/modules/timeline/hooks/index.ts index b4e2c354c6df9..fa81297901292 100644 --- a/x-pack/plugins/threat_intelligence/public/modules/timeline/hooks/index.ts +++ b/x-pack/plugins/threat_intelligence/public/modules/timeline/hooks/index.ts @@ -5,4 +5,5 @@ * 2.0. */ +export * from './use_add_to_timeline'; export * from './use_investigate_in_timeline'; diff --git a/x-pack/plugins/threat_intelligence/public/modules/timeline/hooks/use_add_to_timeline.test.tsx b/x-pack/plugins/threat_intelligence/public/modules/timeline/hooks/use_add_to_timeline.test.tsx new file mode 100644 index 0000000000000..a92c75227310e --- /dev/null +++ b/x-pack/plugins/threat_intelligence/public/modules/timeline/hooks/use_add_to_timeline.test.tsx @@ -0,0 +1,62 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import { EMPTY_VALUE } from '../../../../common/constants'; +import { renderHook, RenderHookResult, Renderer } from '@testing-library/react-hooks'; +import { + generateMockIndicator, + generateMockUrlIndicator, + Indicator, +} from '../../../../common/types/indicator'; +import { TestProvidersComponent } from '../../../common/mocks/test_providers'; +import { useAddToTimeline, UseAddToTimelineValue } from './use_add_to_timeline'; + +describe('useInvestigateInTimeline()', () => { + let hookResult: RenderHookResult<{}, UseAddToTimelineValue, Renderer>; + + xit('should return empty object if Indicator is incorrect', () => { + const indicator: Indicator = generateMockIndicator(); + indicator.fields['threat.indicator.name'] = ['wrong']; + const field = 'threat.indicator.name'; + + hookResult = renderHook(() => useAddToTimeline({ indicator, field }), { + wrapper: TestProvidersComponent, + }); + expect(hookResult.result.current).toEqual({}); + }); + + it(`should return empty object if indicator string is ${EMPTY_VALUE}`, () => { + const indicator: string = EMPTY_VALUE; + const field = 'threat.indicator.ip'; + + hookResult = renderHook(() => useAddToTimeline({ indicator, field }), { + wrapper: TestProvidersComponent, + }); + expect(hookResult.result.current).toEqual({}); + }); + + xit('should return empty object if field is incorrect', () => { + const indicator: Indicator = generateMockIndicator(); + const field = 'abc'; + + hookResult = renderHook(() => useAddToTimeline({ indicator, field }), { + wrapper: TestProvidersComponent, + }); + expect(hookResult.result.current).toEqual({}); + }); + + xit('should return addToTimelineProps', () => { + const indicator: Indicator = generateMockUrlIndicator(); + const field = 'threat.indicator.ip'; + + hookResult = renderHook(() => useAddToTimeline({ indicator, field }), { + wrapper: TestProvidersComponent, + }); + + expect(hookResult.result.current).toHaveProperty('addToTimelineProps'); + }); +}); diff --git a/x-pack/plugins/threat_intelligence/public/modules/timeline/hooks/use_add_to_timeline.ts b/x-pack/plugins/threat_intelligence/public/modules/timeline/hooks/use_add_to_timeline.ts new file mode 100644 index 0000000000000..ab69481d3b528 --- /dev/null +++ b/x-pack/plugins/threat_intelligence/public/modules/timeline/hooks/use_add_to_timeline.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; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import { DataProvider } from '@kbn/timelines-plugin/common'; +import { AddToTimelineButtonProps } from '@kbn/timelines-plugin/public'; +import { generateDataProvider } from '../utils/data_provider'; +import { fieldAndValueValid, getIndicatorFieldAndValue } from '../../indicators/utils/field_value'; +import { Indicator } from '../../../../common/types/indicator'; + +export interface UseAddToTimelineParam { + /** + * Indicator used to retrieve the field and value then passed to the Investigate in Timeline logic + */ + indicator: Indicator | string; + /** + * Indicator's field to retrieve indicator's value + */ + field: string; +} + +export interface UseAddToTimelineValue { + /** + * Props to pass to the addToTimeline feature. + */ + addToTimelineProps: AddToTimelineButtonProps | undefined; +} + +/** + * Custom hook that gets an {@link Indicator}, retrieves the field (from the RawIndicatorFieldId.Name) + * and value, then creates DataProviders used to do the Investigate in Timeline logic + * (see /kibana/x-pack/plugins/security_solution/public/threat_intelligence/use_investigate_in_timeline.ts) + */ +export const useAddToTimeline = ({ + indicator, + field, +}: UseAddToTimelineParam): UseAddToTimelineValue => { + const { key, value } = + typeof indicator === 'string' + ? { key: field, value: indicator } + : getIndicatorFieldAndValue(indicator, field); + + if (!fieldAndValueValid(key, value)) { + return {} as unknown as UseAddToTimelineValue; + } + + const dataProvider: DataProvider[] = [generateDataProvider(key, value as string)]; + + const addToTimelineProps: AddToTimelineButtonProps = { + dataProvider, + field: key, + ownFocus: false, + }; + + return { + addToTimelineProps, + }; +}; diff --git a/x-pack/plugins/threat_intelligence/public/modules/timeline/hooks/use_investigate_in_timeline.test.tsx b/x-pack/plugins/threat_intelligence/public/modules/timeline/hooks/use_investigate_in_timeline.test.tsx index cbc040a936dc3..30c42d7096f2f 100644 --- a/x-pack/plugins/threat_intelligence/public/modules/timeline/hooks/use_investigate_in_timeline.test.tsx +++ b/x-pack/plugins/threat_intelligence/public/modules/timeline/hooks/use_investigate_in_timeline.test.tsx @@ -13,6 +13,7 @@ import { import { generateMockIndicator, generateMockUrlIndicator, + Indicator, } from '../../../../common/types/indicator'; import { TestProvidersComponent } from '../../../common/mocks/test_providers'; @@ -20,7 +21,7 @@ describe('useInvestigateInTimeline()', () => { let hookResult: RenderHookResult<{}, UseInvestigateInTimelineValue, Renderer>; it('should return empty object if Indicator is incorrect', () => { - const indicator = generateMockIndicator(); + const indicator: Indicator = generateMockIndicator(); indicator.fields['threat.indicator.name'] = ['wrong']; hookResult = renderHook(() => useInvestigateInTimeline({ indicator }), { @@ -29,13 +30,13 @@ describe('useInvestigateInTimeline()', () => { expect(hookResult.result.current).toEqual({}); }); - it('should return ', () => { - const indicator = generateMockUrlIndicator(); + it('should return investigateInTimelineFn', () => { + const indicator: Indicator = generateMockUrlIndicator(); hookResult = renderHook(() => useInvestigateInTimeline({ indicator }), { wrapper: TestProvidersComponent, }); - expect(hookResult.result.current).toHaveProperty('onClick'); + expect(hookResult.result.current).toHaveProperty('investigateInTimelineFn'); }); }); diff --git a/x-pack/plugins/threat_intelligence/public/modules/timeline/hooks/use_investigate_in_timeline.ts b/x-pack/plugins/threat_intelligence/public/modules/timeline/hooks/use_investigate_in_timeline.ts index 4f79990d00c34..efae8b441a673 100644 --- a/x-pack/plugins/threat_intelligence/public/modules/timeline/hooks/use_investigate_in_timeline.ts +++ b/x-pack/plugins/threat_intelligence/public/modules/timeline/hooks/use_investigate_in_timeline.ts @@ -26,7 +26,10 @@ export interface UseInvestigateInTimelineParam { } export interface UseInvestigateInTimelineValue { - onClick: (() => Promise) | undefined; + /** + * Investigate in Timeline function to run on click event. + */ + investigateInTimelineFn: (() => Promise) | undefined; } /** @@ -51,13 +54,13 @@ export const useInvestigateInTimeline = ({ const to = unwrapValue(indicator, RawIndicatorFieldId.TimeStamp) as string; const from = moment(to).subtract(10, 'm').toISOString(); - const investigateInTimelineClick = securitySolutionContext?.getUseInvestigateInTimeline({ + const investigateInTimelineFn = securitySolutionContext?.getUseInvestigateInTimeline({ dataProviders, from, to, }); return { - onClick: investigateInTimelineClick, + investigateInTimelineFn, }; }; From 3ca18d9fe6df54fd2f82b08d60776690560241aa Mon Sep 17 00:00:00 2001 From: Ashokaditya <1849116+ashokaditya@users.noreply.github.com> Date: Thu, 29 Sep 2022 17:45:49 +0200 Subject: [PATCH 19/72] [Security Solution][Endpoint][Response Actions] Add comment to expand section on actions log table (#141938) fixes elastic/security-team/issues/5058 --- .../response_actions_log.test.tsx | 1 + .../endpoint_response_actions_list/translations.tsx | 6 ++++++ .../use_response_actions_log_table.tsx | 5 +++++ 3 files changed, 12 insertions(+) diff --git a/x-pack/plugins/security_solution/public/management/components/endpoint_response_actions_list/response_actions_log.test.tsx b/x-pack/plugins/security_solution/public/management/components/endpoint_response_actions_list/response_actions_log.test.tsx index 556c765296337..b7f529e03edfc 100644 --- a/x-pack/plugins/security_solution/public/management/components/endpoint_response_actions_list/response_actions_log.test.tsx +++ b/x-pack/plugins/security_solution/public/management/components/endpoint_response_actions_list/response_actions_log.test.tsx @@ -408,6 +408,7 @@ describe('Response actions history', () => { 'Execution completed', 'Input', 'Parameters', + 'Comment', 'Output:', ] ); diff --git a/x-pack/plugins/security_solution/public/management/components/endpoint_response_actions_list/translations.tsx b/x-pack/plugins/security_solution/public/management/components/endpoint_response_actions_list/translations.tsx index a90f12bc2d246..36dfc76dc1d9e 100644 --- a/x-pack/plugins/security_solution/public/management/components/endpoint_response_actions_list/translations.tsx +++ b/x-pack/plugins/security_solution/public/management/components/endpoint_response_actions_list/translations.tsx @@ -65,6 +65,12 @@ export const OUTPUT_MESSAGES = Object.freeze({ defaultMessage: 'Execution completed', } ), + comment: i18n.translate( + 'xpack.securitySolution.responseActionsList.list.item.expandSection.comment', + { + defaultMessage: 'Comment', + } + ), }, }); diff --git a/x-pack/plugins/security_solution/public/management/components/endpoint_response_actions_list/use_response_actions_log_table.tsx b/x-pack/plugins/security_solution/public/management/components/endpoint_response_actions_list/use_response_actions_log_table.tsx index e4dd30b468127..443eac84c6b18 100644 --- a/x-pack/plugins/security_solution/public/management/components/endpoint_response_actions_list/use_response_actions_log_table.tsx +++ b/x-pack/plugins/security_solution/public/management/components/endpoint_response_actions_list/use_response_actions_log_table.tsx @@ -126,6 +126,7 @@ export const useResponseActionsLogTable = ({ wasSuccessful, isExpired, command: _command, + comment, parameters, } = item; @@ -157,6 +158,10 @@ export const useResponseActionsLogTable = ({ title: OUTPUT_MESSAGES.expandSection.parameters, description: parametersList ? parametersList : emptyValue, }, + { + title: OUTPUT_MESSAGES.expandSection.comment, + description: comment ? comment : emptyValue, + }, ].map(({ title, description }) => { return { title: {title}, From b41a07f85a94cdc76f1bd1db0cd3d31bb892a5c0 Mon Sep 17 00:00:00 2001 From: Spencer Date: Thu, 29 Sep 2022 11:48:49 -0500 Subject: [PATCH 20/72] [eslint/imports/no-boundary-crossing] don't allow package tests to import outside of packages (#142166) --- .../src/rules/no_boundary_crossing.ts | 37 ++++++++++++---- .../src/pkg_info.ts | 2 + .../src/repo_path.ts | 1 + .../header/header.test.tsx | 2 +- .../src/exception_item_card/index.test.tsx | 4 +- .../exception_item_card/meta/meta.test.tsx | 2 +- .../exception_items/exception_items.test.tsx | 2 +- .../src/test_helpers/comments.mock.ts | 18 ++++++++ .../exception_list_item_schema.mock.ts | 42 +++++++++++++++++++ 9 files changed, 96 insertions(+), 14 deletions(-) create mode 100644 packages/kbn-securitysolution-exception-list-components/src/test_helpers/comments.mock.ts create mode 100644 packages/kbn-securitysolution-exception-list-components/src/test_helpers/exception_list_item_schema.mock.ts diff --git a/packages/kbn-eslint-plugin-imports/src/rules/no_boundary_crossing.ts b/packages/kbn-eslint-plugin-imports/src/rules/no_boundary_crossing.ts index 4f3defc21d296..832b4d2e3c67e 100644 --- a/packages/kbn-eslint-plugin-imports/src/rules/no_boundary_crossing.ts +++ b/packages/kbn-eslint-plugin-imports/src/rules/no_boundary_crossing.ts @@ -19,15 +19,17 @@ import { getSourcePath } from '../helpers/source'; import { getRepoSourceClassifier } from '../helpers/repo_source_classifier'; import { getImportResolver } from '../get_import_resolver'; -const IMPORTABLE_FROM: Record = { +const ANY_FILE_IN_BAZEL = Symbol(); + +const IMPORTABLE_FROM: Record = { 'non-package': ['non-package', 'server package', 'browser package', 'common package', 'static'], 'server package': ['common package', 'server package', 'static'], 'browser package': ['common package', 'browser package', 'static'], 'common package': ['common package', 'static'], static: [], - 'tests or mocks': '*', - tooling: '*', + 'tests or mocks': ANY_FILE_IN_BAZEL, + tooling: ANY_FILE_IN_BAZEL, }; const toList = (strings: string[]) => { @@ -87,6 +89,7 @@ export const NoBoundaryCrossingRule: Rule.RuleModule = { }, messages: { TYPE_MISMATCH: `"{{importedType}}" code can not be imported from "{{ownType}}" code.{{suggestion}}`, + FILE_OUTSIDE_OF_PACKAGE: `"{{ownType}}" code can import any code already within packages, but not files outside of packages.`, }, }, create(context) { @@ -98,12 +101,7 @@ export const NoBoundaryCrossingRule: Rule.RuleModule = { const self = classifier.classify(sourcePath); const importable = IMPORTABLE_FROM[self.type]; - if (importable === '*') { - // don't check imports in files which can import anything - return {}; - } - - return visitAllImportStatements((req, { node, importer }) => { + return visitAllImportStatements((req, { node, importer, type }) => { if ( req === null || // we can ignore imports using the raw-loader, they will need to be resolved but can be managed on a case by case basis @@ -121,6 +119,27 @@ export const NoBoundaryCrossingRule: Rule.RuleModule = { const imported = classifier.classify(result.absolute); + if (importable === ANY_FILE_IN_BAZEL) { + if (type === 'jest' && imported.repoRel === 'package.json') { + // we allow jest.mock() calls to mock out the `package.json` file... it's a very + // specific exception for a very specific implementation + return; + } + + if (self.pkgInfo?.isBazelPackage ? imported.pkgInfo?.isBazelPackage : true) { + return; + } + + context.report({ + node: node as ESTree.Node, + messageId: 'FILE_OUTSIDE_OF_PACKAGE', + data: { + ownType: self.type, + }, + }); + return; + } + if (!importable.includes(imported.type)) { context.report({ node: node as ESTree.Node, diff --git a/packages/kbn-repo-source-classifier/src/pkg_info.ts b/packages/kbn-repo-source-classifier/src/pkg_info.ts index 89d66092737b4..a7f7100ba959f 100644 --- a/packages/kbn-repo-source-classifier/src/pkg_info.ts +++ b/packages/kbn-repo-source-classifier/src/pkg_info.ts @@ -13,4 +13,6 @@ export interface PkgInfo { rel: string; /** Absolute path to the package directory */ pkgDir: string; + /** Is the package a bazel package? If false, then the package is a "synthetic" plugin package */ + isBazelPackage: boolean; } diff --git a/packages/kbn-repo-source-classifier/src/repo_path.ts b/packages/kbn-repo-source-classifier/src/repo_path.ts index 05eef7105a717..cd13adf0cb824 100644 --- a/packages/kbn-repo-source-classifier/src/repo_path.ts +++ b/packages/kbn-repo-source-classifier/src/repo_path.ts @@ -93,6 +93,7 @@ export class RepoPath { pkgDir, pkgId, rel, + isBazelPackage: this.resolver.isBazelPackage(pkgId), }; } } diff --git a/packages/kbn-securitysolution-exception-list-components/src/exception_item_card/header/header.test.tsx b/packages/kbn-securitysolution-exception-list-components/src/exception_item_card/header/header.test.tsx index 78feab598c145..7f7f20dfc234d 100644 --- a/packages/kbn-securitysolution-exception-list-components/src/exception_item_card/header/header.test.tsx +++ b/packages/kbn-securitysolution-exception-list-components/src/exception_item_card/header/header.test.tsx @@ -7,8 +7,8 @@ */ import React from 'react'; -import { getExceptionListItemSchemaMock } from '@kbn/lists-plugin/common/schemas/response/exception_list_item_schema.mock'; +import { getExceptionListItemSchemaMock } from '../../test_helpers/exception_list_item_schema.mock'; import * as i18n from '../translations'; import { ExceptionItemCardHeader } from './header'; import { fireEvent, render } from '@testing-library/react'; diff --git a/packages/kbn-securitysolution-exception-list-components/src/exception_item_card/index.test.tsx b/packages/kbn-securitysolution-exception-list-components/src/exception_item_card/index.test.tsx index e97b03607bb6a..87a8a3bd3b527 100644 --- a/packages/kbn-securitysolution-exception-list-components/src/exception_item_card/index.test.tsx +++ b/packages/kbn-securitysolution-exception-list-components/src/exception_item_card/index.test.tsx @@ -10,8 +10,8 @@ import React from 'react'; import { fireEvent, render } from '@testing-library/react'; import { ExceptionItemCard } from '.'; -import { getExceptionListItemSchemaMock } from '@kbn/lists-plugin/common/schemas/response/exception_list_item_schema.mock'; -import { getCommentsArrayMock } from '@kbn/lists-plugin/common/schemas/types/comment.mock'; +import { getExceptionListItemSchemaMock } from '../test_helpers/exception_list_item_schema.mock'; +import { getCommentsArrayMock } from '../test_helpers/comments.mock'; import { ExceptionListTypeEnum } from '@kbn/securitysolution-io-ts-list-types'; const ruleReferences: unknown[] = [ diff --git a/packages/kbn-securitysolution-exception-list-components/src/exception_item_card/meta/meta.test.tsx b/packages/kbn-securitysolution-exception-list-components/src/exception_item_card/meta/meta.test.tsx index 14bdef771d6b3..c5ad9bd7af313 100644 --- a/packages/kbn-securitysolution-exception-list-components/src/exception_item_card/meta/meta.test.tsx +++ b/packages/kbn-securitysolution-exception-list-components/src/exception_item_card/meta/meta.test.tsx @@ -8,7 +8,7 @@ import React from 'react'; import { render } from '@testing-library/react'; -import { getExceptionListItemSchemaMock } from '@kbn/lists-plugin/common/schemas/response/exception_list_item_schema.mock'; +import { getExceptionListItemSchemaMock } from '../../test_helpers/exception_list_item_schema.mock'; import { ExceptionItemCardMetaInfo } from './meta'; import { RuleReference } from '../../types'; diff --git a/packages/kbn-securitysolution-exception-list-components/src/exception_items/exception_items.test.tsx b/packages/kbn-securitysolution-exception-list-components/src/exception_items/exception_items.test.tsx index 3fe2d7eb6d0b3..39c429dd1f1dd 100644 --- a/packages/kbn-securitysolution-exception-list-components/src/exception_items/exception_items.test.tsx +++ b/packages/kbn-securitysolution-exception-list-components/src/exception_items/exception_items.test.tsx @@ -8,7 +8,7 @@ import React from 'react'; -import { getExceptionListItemSchemaMock } from '@kbn/lists-plugin/common/schemas/response/exception_list_item_schema.mock'; +import { getExceptionListItemSchemaMock } from '../test_helpers/exception_list_item_schema.mock'; import { ExceptionListTypeEnum } from '@kbn/securitysolution-io-ts-list-types'; import { ExceptionItems } from './exception_items'; diff --git a/packages/kbn-securitysolution-exception-list-components/src/test_helpers/comments.mock.ts b/packages/kbn-securitysolution-exception-list-components/src/test_helpers/comments.mock.ts new file mode 100644 index 0000000000000..3e83aa53f0f23 --- /dev/null +++ b/packages/kbn-securitysolution-exception-list-components/src/test_helpers/comments.mock.ts @@ -0,0 +1,18 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0 and the Server Side Public License, v 1; you may not use this file except + * in compliance with, at your election, the Elastic License 2.0 or the Server + * Side Public License, v 1. + */ + +import type { Comment, CommentsArray } from '@kbn/securitysolution-io-ts-list-types'; + +export const getCommentsMock = (): Comment => ({ + comment: 'some old comment', + created_at: '2020-04-20T15:25:31.830Z', + created_by: 'some user', + id: 'uuid_here', +}); + +export const getCommentsArrayMock = (): CommentsArray => [getCommentsMock(), getCommentsMock()]; diff --git a/packages/kbn-securitysolution-exception-list-components/src/test_helpers/exception_list_item_schema.mock.ts b/packages/kbn-securitysolution-exception-list-components/src/test_helpers/exception_list_item_schema.mock.ts new file mode 100644 index 0000000000000..40f6d5292f317 --- /dev/null +++ b/packages/kbn-securitysolution-exception-list-components/src/test_helpers/exception_list_item_schema.mock.ts @@ -0,0 +1,42 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0 and the Server Side Public License, v 1; you may not use this file except + * in compliance with, at your election, the Elastic License 2.0 or the Server + * Side Public License, v 1. + */ + +import type { ExceptionListItemSchema } from '@kbn/securitysolution-io-ts-list-types'; + +export const getExceptionListItemSchemaMock = ( + overrides?: Partial +): ExceptionListItemSchema => ({ + _version: undefined, + comments: [], + created_at: '2020-04-20T15:25:31.830Z', + created_by: 'some user', + description: 'some description', + entries: [ + { + entries: [ + { field: 'nested.field', operator: 'included', type: 'match', value: 'some value' }, + ], + field: 'some.parentField', + type: 'nested', + }, + { field: 'some.not.nested.field', operator: 'included', type: 'match', value: 'some value' }, + ], + id: '1', + item_id: 'endpoint_list_item', + list_id: 'endpoint_list_id', + meta: {}, + name: 'some name', + namespace_type: 'single', + os_types: [], + tags: ['user added string for a tag', 'malware'], + tie_breaker_id: '6a76b69d-80df-4ab2-8c3e-85f466b06a0e', + type: 'simple', + updated_at: '2020-04-20T15:25:31.830Z', + updated_by: 'some user', + ...(overrides || {}), +}); From 5d31e88c5dbe5bfa9337938d91accef7b9d10106 Mon Sep 17 00:00:00 2001 From: "Quynh Nguyen (Quinn)" <43350163+qn895@users.noreply.github.com> Date: Thu, 29 Sep 2022 12:28:24 -0500 Subject: [PATCH 21/72] [ML] Fix links to Discover and Maps and custom URLs for jobs with a query in the datafeed (#141871) Co-authored-by: Dima Arnautov --- .../get_filters_for_datafeed_query.test.ts | 94 +++++++++++++++++++ .../get_filters_for_datafeed_query.ts | 45 +++++++++ .../components/anomalies_table/links_menu.tsx | 27 +++++- .../components/custom_url_editor/utils.js | 17 +++- .../functional/services/ml/custom_urls.ts | 4 +- 5 files changed, 177 insertions(+), 10 deletions(-) create mode 100644 x-pack/plugins/ml/public/application/components/anomalies_table/get_filters_for_datafeed_query.test.ts create mode 100644 x-pack/plugins/ml/public/application/components/anomalies_table/get_filters_for_datafeed_query.ts diff --git a/x-pack/plugins/ml/public/application/components/anomalies_table/get_filters_for_datafeed_query.test.ts b/x-pack/plugins/ml/public/application/components/anomalies_table/get_filters_for_datafeed_query.test.ts new file mode 100644 index 0000000000000..20b52a773d032 --- /dev/null +++ b/x-pack/plugins/ml/public/application/components/anomalies_table/get_filters_for_datafeed_query.test.ts @@ -0,0 +1,94 @@ +/* + * 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 { getFiltersForDSLQuery } from './get_filters_for_datafeed_query'; + +describe('getFiltersForDSLQuery', () => { + describe('when DSL query contains match_all', () => { + test('returns empty array when query contains a must clause that contains match_all', () => { + const actual = getFiltersForDSLQuery( + { bool: { must: [{ match_all: {} }] } }, + 'dataview-id', + 'test-alias' + ); + expect(actual).toEqual([]); + }); + + test('returns empty array when query contains match_all', () => { + const actual = getFiltersForDSLQuery({ match_all: {} }, 'dataview-id', 'test-alias'); + expect(actual).toEqual([]); + }); + }); + + describe('when DSL query is valid', () => { + const query = { + bool: { + must: [], + filter: [ + { + range: { + '@timestamp': { + format: 'strict_date_optional_time', + gte: '2007-09-29T15:05:14.509Z', + lte: '2022-09-29T15:05:14.509Z', + }, + }, + }, + { + match_phrase: { + response_code: '200', + }, + }, + ], + should: [], + must_not: [], + }, + }; + + test('returns filters with alias', () => { + const actual = getFiltersForDSLQuery(query, 'dataview-id', 'test-alias'); + expect(actual).toEqual([ + { + $state: { store: 'appState' }, + meta: { + alias: 'test-alias', + disabled: false, + index: 'dataview-id', + negate: false, + type: 'custom', + value: + '{"bool":{"must":[],"filter":[{"range":{"@timestamp":{"format":"strict_date_optional_time","gte":"2007-09-29T15:05:14.509Z","lte":"2022-09-29T15:05:14.509Z"}}},{"match_phrase":{"response_code":"200"}}],"should":[],"must_not":[]}}', + }, + query, + }, + ]); + }); + + test('returns empty array when dataViewId is invalid', () => { + const actual = getFiltersForDSLQuery(query, null, 'test-alias'); + expect(actual).toEqual([]); + }); + + test('returns filter with no alias if alias is not provided', () => { + const actual = getFiltersForDSLQuery(query, 'dataview-id'); + expect(actual).toEqual([ + { + $state: { store: 'appState' }, + meta: { + disabled: false, + index: 'dataview-id', + negate: false, + type: 'custom', + value: + '{"bool":{"must":[],"filter":[{"range":{"@timestamp":{"format":"strict_date_optional_time","gte":"2007-09-29T15:05:14.509Z","lte":"2022-09-29T15:05:14.509Z"}}},{"match_phrase":{"response_code":"200"}}],"should":[],"must_not":[]}}', + }, + query, + }, + ]); + }); + }); +}); diff --git a/x-pack/plugins/ml/public/application/components/anomalies_table/get_filters_for_datafeed_query.ts b/x-pack/plugins/ml/public/application/components/anomalies_table/get_filters_for_datafeed_query.ts new file mode 100644 index 0000000000000..08ff962449d2d --- /dev/null +++ b/x-pack/plugins/ml/public/application/components/anomalies_table/get_filters_for_datafeed_query.ts @@ -0,0 +1,45 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import { isPopulatedObject } from '@kbn/ml-is-populated-object'; +import type { SerializableRecord } from '@kbn/utility-types'; +import { FilterStateStore } from '@kbn/es-query'; +import type { QueryDslQueryContainer } from '@elastic/elasticsearch/lib/api/typesWithBodyKey'; +import { isEqual } from 'lodash'; + +const defaultEmptyQuery = { bool: { must: [{ match_all: {} }] } }; + +export const getFiltersForDSLQuery = ( + datafeedQuery: QueryDslQueryContainer, + dataViewId: string | null, + alias?: string +) => { + if ( + datafeedQuery && + !isPopulatedObject(datafeedQuery, ['match_all']) && + !isEqual(datafeedQuery, defaultEmptyQuery) && + dataViewId !== null + ) { + return [ + { + meta: { + index: dataViewId, + ...(!!alias ? { alias } : {}), + negate: false, + disabled: false, + type: 'custom', + value: JSON.stringify(datafeedQuery), + }, + query: datafeedQuery as SerializableRecord, + $state: { + store: FilterStateStore.APP_STATE, + }, + }, + ]; + } + return []; +}; diff --git a/x-pack/plugins/ml/public/application/components/anomalies_table/links_menu.tsx b/x-pack/plugins/ml/public/application/components/anomalies_table/links_menu.tsx index aa6c80ee5b92d..6ad828bc39661 100644 --- a/x-pack/plugins/ml/public/application/components/anomalies_table/links_menu.tsx +++ b/x-pack/plugins/ml/public/application/components/anomalies_table/links_menu.tsx @@ -53,6 +53,7 @@ import { useMlKibana } from '../../contexts/kibana'; import { getFieldTypeFromMapping } from '../../services/mapping_service'; import type { AnomaliesTableRecord } from '../../../../common/types/anomalies'; import { getQueryStringForInfluencers } from './get_query_string_for_influencers'; +import { getFiltersForDSLQuery } from './get_filters_for_datafeed_query'; interface LinksMenuProps { anomaly: AnomaliesTableRecord; bounds: TimeRangeBounds; @@ -78,7 +79,14 @@ export const LinksMenuUI = (props: LinksMenuProps) => { services: { data, share, application }, } = kibana; + const job = useMemo(() => { + return mlJobService.getJob(props.anomaly.jobId); + }, [props.anomaly.jobId]); + const getAnomaliesMapsLink = async (anomaly: AnomaliesTableRecord) => { + const index = job.datafeed_config.indices[0]; + const dataViewId = await getDataViewIdFromName(index); + const initialLayers = getInitialAnomaliesLayers(anomaly.jobId); const anomalyBucketStartMoment = moment(anomaly.source.timestamp).tz(getDateFormatTz()); const anomalyBucketStart = anomalyBucketStartMoment.toISOString(); @@ -104,6 +112,7 @@ export const LinksMenuUI = (props: LinksMenuProps) => { }, } : {}), + filters: getFiltersForDSLQuery(job.datafeed_config.query, dataViewId, job.job_id), }); return location; }; @@ -112,6 +121,9 @@ export const LinksMenuUI = (props: LinksMenuProps) => { anomaly: AnomaliesTableRecord, sourceIndicesWithGeoFields: SourceIndicesWithGeoFields ) => { + const index = job.datafeed_config.indices[0]; + const dataViewId = await getDataViewIdFromName(index); + // Create a layer for each of the geoFields const initialLayers = getInitialSourceIndexFieldLayers( sourceIndicesWithGeoFields[anomaly.jobId] @@ -138,10 +150,18 @@ export const LinksMenuUI = (props: LinksMenuProps) => { ); const locator = share.url.locators.get(MAPS_APP_LOCATOR); + const filtersFromDatafeedQuery = getFiltersForDSLQuery( + job.datafeed_config.query, + dataViewId, + job.job_id + ); const location = await locator?.getLocation({ initialLayers, timeRange, - filters: data.query.filterManager.getFilters(), + filters: + filtersFromDatafeedQuery.length > 0 + ? filtersFromDatafeedQuery + : data.query.filterManager.getFilters(), ...(anomaly.entityName && anomaly.entityValue ? { query: { @@ -175,7 +195,6 @@ export const LinksMenuUI = (props: LinksMenuProps) => { } const getDataViewId = async () => { - const job = mlJobService.getJob(props.anomaly.jobId); const index = job.datafeed_config.indices[0]; const dataViewId = await getDataViewIdFromName(index); @@ -246,6 +265,7 @@ export const LinksMenuUI = (props: LinksMenuProps) => { language: 'kuery', query: kqlQuery, }, + filters: getFiltersForDSLQuery(job.datafeed_config.query, dataViewId, job.job_id), sort: [['timestamp, asc']], }); @@ -440,7 +460,6 @@ export const LinksMenuUI = (props: LinksMenuProps) => { const categoryId = props.anomaly.entityValue; const record = props.anomaly.source; - const job = mlJobService.getJob(props.anomaly.jobId); if (job === undefined) { // eslint-disable-next-line no-console console.log(`viewExamples(): no job found with ID: ${props.anomaly.jobId}`); @@ -545,7 +564,7 @@ export const LinksMenuUI = (props: LinksMenuProps) => { const appStateProps: RisonValue = { index: dataViewId, - filters: [], + filters: getFiltersForDSLQuery(job.datafeed_config.query, dataViewId, job.job_id), }; if (query !== null) { appStateProps.query = query; diff --git a/x-pack/plugins/ml/public/application/jobs/components/custom_url_editor/utils.js b/x-pack/plugins/ml/public/application/jobs/components/custom_url_editor/utils.js index 1824d8e91e740..9c2fa8383b7a5 100644 --- a/x-pack/plugins/ml/public/application/jobs/components/custom_url_editor/utils.js +++ b/x-pack/plugins/ml/public/application/jobs/components/custom_url_editor/utils.js @@ -20,6 +20,7 @@ import { getSavedObjectsClient, getDashboard } from '../../../util/dependency_ca import { setStateToKbnUrl } from '@kbn/kibana-utils-plugin/public'; import { cleanEmptyKeys } from '@kbn/dashboard-plugin/public'; import { isFilterPinned } from '@kbn/es-query'; +import { getFiltersForDSLQuery } from '../../../components/anomalies_table/get_filters_for_datafeed_query'; export function getNewCustomUrlDefaults(job, dashboards, dataViews) { // Returns the settings object in the format used by the custom URL editor @@ -50,6 +51,11 @@ export function getNewCustomUrlDefaults(job, dashboards, dataViews) { const indicesName = datafeedConfig.indices.join(); const defaultDataViewId = dataViews.find((dv) => dv.title === indicesName)?.id; kibanaSettings.discoverIndexPatternId = defaultDataViewId; + kibanaSettings.filters = getFiltersForDSLQuery( + job.datafeed_config.query, + defaultDataViewId, + job.job_id + ); } return { @@ -133,16 +139,18 @@ async function buildDashboardUrlFromSettings(settings) { const response = await savedObjectsClient.get('dashboard', dashboardId); - // Use the filters from the saved dashboard if there are any. - let filters = []; + // Query from the datafeed config will be saved as custom filters + // Use them if there are set. + let filters = settings.kibanaSettings.filters; // Use the query from the dashboard only if no job entities are selected. let query = undefined; + // Override with filters and queries from saved dashboard if they are available. const searchSourceJSON = response.get('kibanaSavedObjectMeta.searchSourceJSON'); if (searchSourceJSON !== undefined) { const searchSourceData = JSON.parse(searchSourceJSON); - if (searchSourceData.filter !== undefined) { + if (Array.isArray(searchSourceData.filter) && searchSourceData.filter.length > 0) { filters = searchSourceData.filter; } query = searchSourceData.query; @@ -196,7 +204,7 @@ async function buildDashboardUrlFromSettings(settings) { } function buildDiscoverUrlFromSettings(settings) { - const { discoverIndexPatternId, queryFieldNames } = settings.kibanaSettings; + const { discoverIndexPatternId, queryFieldNames, filters } = settings.kibanaSettings; // Add time settings to the global state URL parameter with $earliest$ and // $latest$ tokens which get substituted for times around the time of the @@ -212,6 +220,7 @@ function buildDiscoverUrlFromSettings(settings) { // Add the index pattern and query to the appState part of the URL. const appState = { index: discoverIndexPatternId, + filters, }; // If partitioning field entities have been configured add tokens diff --git a/x-pack/test/functional/services/ml/custom_urls.ts b/x-pack/test/functional/services/ml/custom_urls.ts index 1695b575e1f05..46e145cda1c3c 100644 --- a/x-pack/test/functional/services/ml/custom_urls.ts +++ b/x-pack/test/functional/services/ml/custom_urls.ts @@ -111,7 +111,7 @@ export function MachineLearningCustomUrlsProvider({ ); expect(actualLabel).to.eql( expectedLabel, - `Expected custom url item to be '${expectedLabel}' (got '${actualLabel}')` + `Expected custom url label to be '${expectedLabel}' (got '${actualLabel}')` ); }, @@ -123,7 +123,7 @@ export function MachineLearningCustomUrlsProvider({ ); expect(actualUrl).to.eql( expectedUrl, - `Expected custom url item to be '${expectedUrl}' (got '${actualUrl}')` + `Expected custom url value to be '${expectedUrl}' (got '${actualUrl}')` ); }, From 4cdd74dfcd71edaeae536220400310c271ee8a41 Mon Sep 17 00:00:00 2001 From: Pierre Gayvallet Date: Thu, 29 Sep 2022 19:41:06 +0200 Subject: [PATCH 22/72] Fix SO export sorting algorithm (#142078) * Fix SO export sorting algorithm * improve var name * adapt another unit test Co-authored-by: Kibana Machine <42973632+kibanamachine@users.noreply.github.com> --- .../src/export/saved_objects_exporter.test.ts | 6 ++- .../src/export/sort_objects.test.ts | 37 +++++++++++++++++++ .../src/export/sort_objects.ts | 21 ++++++----- 3 files changed, 53 insertions(+), 11 deletions(-) diff --git a/packages/core/saved-objects/core-saved-objects-import-export-server-internal/src/export/saved_objects_exporter.test.ts b/packages/core/saved-objects/core-saved-objects-import-export-server-internal/src/export/saved_objects_exporter.test.ts index 614c9e3680acc..fed06cbf2f740 100644 --- a/packages/core/saved-objects/core-saved-objects-import-export-server-internal/src/export/saved_objects_exporter.test.ts +++ b/packages/core/saved-objects/core-saved-objects-import-export-server-internal/src/export/saved_objects_exporter.test.ts @@ -146,16 +146,18 @@ describe('getSortedObjectsForExport()', () => { attributes = {}, sort = [], type = 'index-pattern', + idPrefix = '', }: { attributes?: Record; sort?: string[]; type?: string; + idPrefix?: string; } = {} ) { const hits = []; for (let i = 1; i <= hitCount; i++) { hits.push({ - id: `${i}`, + id: `${idPrefix}${i}`, type, attributes, sort, @@ -247,7 +249,7 @@ describe('getSortedObjectsForExport()', () => { describe('>1k hits', () => { const firstMockHits = generateHits(1000, { sort: ['a', 'b'] }); - const secondMockHits = generateHits(500); + const secondMockHits = generateHits(500, { idPrefix: 'second-hit-' }); test('requests multiple pages', async () => { savedObjectsClient.find.mockResolvedValueOnce({ diff --git a/packages/core/saved-objects/core-saved-objects-import-export-server-internal/src/export/sort_objects.test.ts b/packages/core/saved-objects/core-saved-objects-import-export-server-internal/src/export/sort_objects.test.ts index 1f663ea5dbc56..27fbb09a37018 100644 --- a/packages/core/saved-objects/core-saved-objects-import-export-server-internal/src/export/sort_objects.test.ts +++ b/packages/core/saved-objects/core-saved-objects-import-export-server-internal/src/export/sort_objects.test.ts @@ -6,7 +6,9 @@ * Side Public License, v 1. */ +import { range } from 'lodash'; import { sortObjects } from './sort_objects'; +import type { SavedObject } from '@kbn/core-saved-objects-common'; describe('sortObjects()', () => { test('should return on empty array', () => { @@ -309,6 +311,7 @@ describe('sortObjects()', () => { ] `); }); + test('should not fail on complex circular dependencies', () => { const docs = [ { @@ -424,4 +427,38 @@ describe('sortObjects()', () => { ] `); }); + + test('should not fail on large graph of objects', () => { + // create an object that references all objects with a higher `index` up to `depth`. + const createComplexNode = (index: number, depth: number): SavedObject => { + return { + type: 'test', + id: `${index}`, + attributes: {}, + references: range(index + 1, depth).map((refIndex) => ({ + type: 'test', + id: `${refIndex}`, + name: `test-${refIndex}`, + })), + }; + }; + + const createComplexGraph = (depth: number): SavedObject[] => { + const nodes: SavedObject[] = []; + for (let i = 0; i < depth; i++) { + nodes.push(createComplexNode(i, depth)); + } + return nodes; + }; + + const depth = 100; + const graph = createComplexGraph(depth); + const sorted = sortObjects(graph); + + expect(sorted.map(({ type, id }) => `${type}:${id}`)).toEqual( + range(depth) + .reverse() + .map((index) => `test:${index}`) + ); + }); }); diff --git a/packages/core/saved-objects/core-saved-objects-import-export-server-internal/src/export/sort_objects.ts b/packages/core/saved-objects/core-saved-objects-import-export-server-internal/src/export/sort_objects.ts index 487622877e25c..551ba3989e527 100644 --- a/packages/core/saved-objects/core-saved-objects-import-export-server-internal/src/export/sort_objects.ts +++ b/packages/core/saved-objects/core-saved-objects-import-export-server-internal/src/export/sort_objects.ts @@ -8,27 +8,29 @@ import type { SavedObject } from '@kbn/core-saved-objects-common'; +const getId = (object: { type: string; id: string }) => `${object.type}:${object.id}`; + export function sortObjects(savedObjects: SavedObject[]): SavedObject[] { - const path = new Set(); + const traversed = new Set(); const sorted = new Set(); const objectsByTypeId = new Map( - savedObjects.map((object) => [`${object.type}:${object.id}`, object] as [string, SavedObject]) + savedObjects.map((object) => [getId(object), object] as [string, SavedObject]) ); function includeObjects(objects: SavedObject[]) { for (const object of objects) { - if (path.has(object)) { + const objectId = getId(object); + if (traversed.has(objectId)) { continue; } - const refdObjects = object.references - .map((ref) => objectsByTypeId.get(`${ref.type}:${ref.id}`)) + const objectRefs = object.references + .map((ref) => objectsByTypeId.get(getId(ref))) .filter((ref): ref is SavedObject => !!ref); - if (refdObjects.length) { - path.add(object); - includeObjects(refdObjects); - path.delete(object); + traversed.add(objectId); + if (objectRefs.length) { + includeObjects(objectRefs); } sorted.add(object); @@ -36,5 +38,6 @@ export function sortObjects(savedObjects: SavedObject[]): SavedObject[] { } includeObjects(savedObjects); + return [...sorted]; } From d8948bf9bccbec47d9b2fe50504946ae879aa344 Mon Sep 17 00:00:00 2001 From: Kibana Machine <42973632+kibanamachine@users.noreply.github.com> Date: Thu, 29 Sep 2022 12:50:42 -0600 Subject: [PATCH 23/72] skip failing test suite (#141002) --- .../test_suites/task_manager/task_management.ts | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/x-pack/test/plugin_api_integration/test_suites/task_manager/task_management.ts b/x-pack/test/plugin_api_integration/test_suites/task_manager/task_management.ts index 123259cadf0c7..fd7e07dacb477 100644 --- a/x-pack/test/plugin_api_integration/test_suites/task_manager/task_management.ts +++ b/x-pack/test/plugin_api_integration/test_suites/task_manager/task_management.ts @@ -54,7 +54,8 @@ export default function ({ getService }: FtrProviderContext) { const supertest = getService('supertest'); const testHistoryIndex = '.kibana_task_manager_test_result'; - describe('scheduling and running tasks', () => { + // Failing: See https://github.com/elastic/kibana/issues/141002 + describe.skip('scheduling and running tasks', () => { beforeEach(async () => { // clean up before each test return await supertest.delete('/api/sample_tasks').set('kbn-xsrf', 'xxx').expect(200); From 1530d1720a84f43d948925ddba0830892048e063 Mon Sep 17 00:00:00 2001 From: Ashokaditya <1849116+ashokaditya@users.noreply.github.com> Date: Thu, 29 Sep 2022 21:05:10 +0200 Subject: [PATCH 24/72] [Security Solution][Endpoint][Response Actions] Show correct number of items in response actions history (#142221) * Show correct number of items in page when status filters are selected When there are more items than the page size, the API was returning one less item when a status filter was selected. This commit fixes that. * Tests * some unrelated test cleanup --- .../response_actions_log.test.tsx | 30 +++++----- .../services/actions/action_list.test.ts | 58 ++++++++++++++++++- .../endpoint/services/actions/action_list.ts | 6 +- .../server/endpoint/services/actions/mocks.ts | 21 ++++--- 4 files changed, 86 insertions(+), 29 deletions(-) diff --git a/x-pack/plugins/security_solution/public/management/components/endpoint_response_actions_list/response_actions_log.test.tsx b/x-pack/plugins/security_solution/public/management/components/endpoint_response_actions_list/response_actions_log.test.tsx index b7f529e03edfc..0133e09ac7202 100644 --- a/x-pack/plugins/security_solution/public/management/components/endpoint_response_actions_list/response_actions_log.test.tsx +++ b/x-pack/plugins/security_solution/public/management/components/endpoint_response_actions_list/response_actions_log.test.tsx @@ -344,26 +344,20 @@ describe('Response actions history', () => { ); // should have 4 pages each of size 10. - expect(renderResult.getByTestId('pagination-button-0')).toHaveAttribute( - 'aria-label', - 'Page 1 of 4' - ); + expect(getByTestId('pagination-button-0')).toHaveAttribute('aria-label', 'Page 1 of 4'); // toggle page size popover - userEvent.click(renderResult.getByTestId('tablePaginationPopoverButton')); + userEvent.click(getByTestId('tablePaginationPopoverButton')); await waitForEuiPopoverOpen(); // click size 20 - userEvent.click(renderResult.getByTestId('tablePagination-20-rows')); + userEvent.click(getByTestId('tablePagination-20-rows')); - expect(renderResult.getByTestId(`${testPrefix}-endpointListTableTotal`)).toHaveTextContent( + expect(getByTestId(`${testPrefix}-endpointListTableTotal`)).toHaveTextContent( 'Showing 1-20 of 33 response actions' ); // should have only 2 pages each of size 20 - expect(renderResult.getByTestId('pagination-button-0')).toHaveAttribute( - 'aria-label', - 'Page 1 of 2' - ); + expect(getByTestId('pagination-button-0')).toHaveAttribute('aria-label', 'Page 1 of 2'); }); it('should show 1-1 record label when only 1 record', async () => { @@ -545,8 +539,10 @@ describe('Response actions history', () => { it('should have a search bar', () => { render(); - userEvent.click(renderResult.getByTestId(`${testPrefix}-${filterPrefix}-popoverButton`)); - const searchBar = renderResult.getByTestId(`${testPrefix}-${filterPrefix}-search`); + + const { getByTestId } = renderResult; + userEvent.click(getByTestId(`${testPrefix}-${filterPrefix}-popoverButton`)); + const searchBar = getByTestId(`${testPrefix}-${filterPrefix}-search`); expect(searchBar).toBeTruthy(); expect(searchBar.querySelector('input')?.getAttribute('placeholder')).toEqual( 'Search actions' @@ -595,10 +591,10 @@ describe('Response actions history', () => { it('should have `clear all` button `disabled` when no selected values', () => { render(); - userEvent.click(renderResult.getByTestId(`${testPrefix}-${filterPrefix}-popoverButton`)); - const clearAllButton = renderResult.getByTestId( - `${testPrefix}-${filterPrefix}-clearAllButton` - ); + const { getByTestId } = renderResult; + + userEvent.click(getByTestId(`${testPrefix}-${filterPrefix}-popoverButton`)); + const clearAllButton = getByTestId(`${testPrefix}-${filterPrefix}-clearAllButton`); expect(clearAllButton.hasAttribute('disabled')).toBeTruthy(); }); }); diff --git a/x-pack/plugins/security_solution/server/endpoint/services/actions/action_list.test.ts b/x-pack/plugins/security_solution/server/endpoint/services/actions/action_list.test.ts index f08b82a490718..67d527817abf4 100644 --- a/x-pack/plugins/security_solution/server/endpoint/services/actions/action_list.test.ts +++ b/x-pack/plugins/security_solution/server/endpoint/services/actions/action_list.test.ts @@ -14,7 +14,7 @@ import type { LogsEndpointActionResponse, } from '../../../../common/endpoint/types'; import { EndpointActionGenerator } from '../../../../common/endpoint/data_generators/endpoint_action_generator'; -import { getActionList } from './action_list'; +import { getActionList, getActionListByStatus } from './action_list'; import { CustomHttpRequestError } from '../../../utils/custom_http_request_error'; import { applyActionListEsSearchMock, @@ -650,3 +650,59 @@ describe('When using `getActionList()', () => { await expect(getActionListPromise).rejects.toBeInstanceOf(CustomHttpRequestError); }); }); + +describe('When using `getActionListByStatus()', () => { + let esClient: ElasticsearchClientMock; + let logger: MockedLogger; + // let endpointActionGenerator: EndpointActionGenerator; + let actionRequests: estypes.SearchResponse; + let actionResponses: estypes.SearchResponse; + let endpointAppContextService: EndpointAppContextService; + + beforeEach(() => { + esClient = elasticsearchServiceMock.createScopedClusterClient().asInternalUser; + logger = loggingSystemMock.createLogger(); + // endpointActionGenerator = new EndpointActionGenerator('seed'); + endpointAppContextService = new EndpointAppContextService(); + endpointAppContextService.setup(createMockEndpointAppContextServiceSetupContract()); + endpointAppContextService.start(createMockEndpointAppContextServiceStartContract()); + + actionRequests = createActionRequestsEsSearchResultsMock(undefined); + actionResponses = createActionResponsesEsSearchResultsMock(); + + applyActionListEsSearchMock(esClient, actionRequests, actionResponses); + }); + + afterEach(() => { + endpointAppContextService.stop(); + }); + + it('should return expected output `data` length for selected statuses', async () => { + actionRequests = createActionRequestsEsSearchResultsMock(undefined, true); + actionResponses = createActionResponsesEsSearchResultsMock(); + + applyActionListEsSearchMock(esClient, actionRequests, actionResponses); + // mock metadataService.findHostMetadataForFleetAgents resolved value + (endpointAppContextService.getEndpointMetadataService as jest.Mock) = jest + .fn() + .mockReturnValue({ + findHostMetadataForFleetAgents: jest.fn().mockResolvedValue([]), + }); + + const getActionListByStatusPromise = ({ page }: { page: number }) => + getActionListByStatus({ + esClient, + logger, + metadataService: endpointAppContextService.getEndpointMetadataService(), + page: page ?? 1, + pageSize: 10, + statuses: ['failed', 'pending', 'successful'], + }); + + expect(await (await getActionListByStatusPromise({ page: 1 })).data.length).toEqual(10); + + expect(await (await getActionListByStatusPromise({ page: 2 })).data.length).toEqual(10); + + expect(await (await getActionListByStatusPromise({ page: 3 })).data.length).toEqual(3); + }); +}); diff --git a/x-pack/plugins/security_solution/server/endpoint/services/actions/action_list.ts b/x-pack/plugins/security_solution/server/endpoint/services/actions/action_list.ts index eb53a6a4338a8..461f707e336b3 100644 --- a/x-pack/plugins/security_solution/server/endpoint/services/actions/action_list.ts +++ b/x-pack/plugins/security_solution/server/endpoint/services/actions/action_list.ts @@ -92,8 +92,8 @@ export const getActionListByStatus = async ({ userIds, commands, statuses, - // for size 20 -> page 1: (0, 19), page 2: (20,39) ...etc - data: actionDetailsByStatus.slice((page - 1) * size, size * page - 1), + // for size 20 -> page 1: (0, 20), page 2: (20, 40) ...etc + data: actionDetailsByStatus.slice((page - 1) * size, size * page), total: actionDetailsByStatus.length, }; }; @@ -251,7 +251,7 @@ const getActionDetailsList = async ({ }); // compute action details list for each action id - const actionDetails: ActionDetails[] = normalizedActionRequests.map((action) => { + const actionDetails: ActionListApiResponse['data'] = normalizedActionRequests.map((action) => { // pick only those responses that match the current action id const matchedResponses = categorizedResponses.filter((categorizedResponse) => categorizedResponse.type === 'response' diff --git a/x-pack/plugins/security_solution/server/endpoint/services/actions/mocks.ts b/x-pack/plugins/security_solution/server/endpoint/services/actions/mocks.ts index 80c7a5a6ff6c8..23705d6bc43be 100644 --- a/x-pack/plugins/security_solution/server/endpoint/services/actions/mocks.ts +++ b/x-pack/plugins/security_solution/server/endpoint/services/actions/mocks.ts @@ -21,17 +21,22 @@ import { } from '../../../../common/endpoint/constants'; export const createActionRequestsEsSearchResultsMock = ( - agentIds?: string[] + agentIds?: string[], + isMultipleActions: boolean = false ): estypes.SearchResponse => { const endpointActionGenerator = new EndpointActionGenerator('seed'); - return endpointActionGenerator.toEsSearchResponse([ - endpointActionGenerator.generateActionEsHit({ - EndpointActions: { action_id: '123' }, - agent: { id: agentIds ? agentIds : 'agent-a' }, - '@timestamp': '2022-04-27T16:08:47.449Z', - }), - ]); + return isMultipleActions + ? endpointActionGenerator.toEsSearchResponse( + Array.from({ length: 23 }).map(() => endpointActionGenerator.generateActionEsHit()) + ) + : endpointActionGenerator.toEsSearchResponse([ + endpointActionGenerator.generateActionEsHit({ + EndpointActions: { action_id: '123' }, + agent: { id: agentIds ? agentIds : 'agent-a' }, + '@timestamp': '2022-04-27T16:08:47.449Z', + }), + ]); }; export const createActionResponsesEsSearchResultsMock = ( From 1bf14d7ab8681dacad8fb25cc906e15cf96233f6 Mon Sep 17 00:00:00 2001 From: Devon Thomson Date: Thu, 29 Sep 2022 15:48:36 -0400 Subject: [PATCH 25/72] Fixed pinned filters being backed up into session storage (#142262) --- .../public/application/lib/diff_dashboard_state.ts | 11 ++++++++--- 1 file changed, 8 insertions(+), 3 deletions(-) diff --git a/src/plugins/dashboard/public/application/lib/diff_dashboard_state.ts b/src/plugins/dashboard/public/application/lib/diff_dashboard_state.ts index 1c57d1bd2afa9..e5432b50550ee 100644 --- a/src/plugins/dashboard/public/application/lib/diff_dashboard_state.ts +++ b/src/plugins/dashboard/public/application/lib/diff_dashboard_state.ts @@ -101,12 +101,17 @@ export const diffDashboardState = async ({ getEmbeddable ); const optionsAreEqual = getOptionsAreEqual(originalState.options, newState.options); - const filtersAreEqual = getFiltersAreEqual(originalState.filters, newState.filters, true); const controlGroupIsEqual = persistableControlGroupInputIsEqual( originalState.controlGroupInput, newState.controlGroupInput ); + const filterStateDiff = getFiltersAreEqual(originalState.filters, newState.filters, true) + ? {} + : { + filters: newState.filters.filter((f) => !isFilterPinned(f)), + }; + const timeStatediff = getTimeSettingsAreEqual({ currentTimeRestore: newState.timeRestore, lastSaved: { ...pick(originalState, ['timeRange', 'timeRestore', 'refreshInterval']) }, @@ -117,9 +122,9 @@ export const diffDashboardState = async ({ return { ...commonStateDiff, ...(panelsAreEqual ? {} : { panels: newState.panels }), - ...(filtersAreEqual ? {} : { filters: newState.filters }), ...(optionsAreEqual ? {} : { options: newState.options }), ...(controlGroupIsEqual ? {} : { controlGroupInput: newState.controlGroupInput }), + ...filterStateDiff, ...timeStatediff, }; }; @@ -174,7 +179,7 @@ const getFiltersAreEqual = ( ignorePinned?: boolean ): boolean => { return compareFilters( - filtersA, + ignorePinned ? filtersA.filter((f) => !isFilterPinned(f)) : filtersA, ignorePinned ? filtersB.filter((f) => !isFilterPinned(f)) : filtersB, COMPARE_ALL_OPTIONS ); From 907c1059ba65b9aeb1318416fa9a0885cf515031 Mon Sep 17 00:00:00 2001 From: Terrance DeJesus <99630311+terrancedejesus@users.noreply.github.com> Date: Thu, 29 Sep 2022 16:05:22 -0400 Subject: [PATCH 26/72] [Detection Rules] Add 8.5 rules (#142239) Co-authored-by: Mika Ayenson --- .../collection_cloudtrail_logging_created.json | 4 ++-- .../collection_gcp_pub_sub_subscription_creation.json | 5 +++-- .../collection_gcp_pub_sub_topic_creation.json | 5 +++-- ..._drive_ownership_transferred_via_google_workspace.json | 4 ++-- ..._workspace_custom_gmail_route_created_or_modified.json | 4 ++-- .../collection_microsoft_365_new_inbox_rule.json | 4 ++-- .../collection_update_event_hub_auth_rule.json | 4 ++-- .../credential_access_attempted_bypass_of_okta_mfa.json | 4 ++-- ..._access_attempts_to_brute_force_okta_user_account.json | 4 ++-- ...credential_access_aws_iam_assume_role_brute_force.json | 4 ++-- ...access_azure_full_network_packet_capture_detected.json | 4 ++-- .../credential_access_iam_user_addition_to_group.json | 4 ++-- .../credential_access_key_vault_modified.json | 4 ++-- ...ss_microsoft_365_brute_force_user_account_attempt.json | 4 ++-- ..._microsoft_365_potential_password_spraying_attack.json | 4 ++-- ...tial_access_okta_brute_force_or_password_spraying.json | 4 ++-- ...redential_access_root_console_failure_brute_force.json | 4 ++-- .../credential_access_secretsmanager_getsecretvalue.json | 4 ++-- ...credential_access_storage_account_key_regenerated.json | 4 ++-- ...credential_access_user_excessive_sso_logon_errors.json | 4 ++-- .../credential_access_user_impersonation_access.json | 4 ++-- ...cation_removed_from_blocklist_in_google_workspace.json | 4 ++-- ...e_evasion_attempt_to_deactivate_okta_network_zone.json | 4 ++-- ...fense_evasion_attempt_to_delete_okta_network_zone.json | 4 ++-- ...evasion_azure_application_credential_modification.json | 4 ++-- .../defense_evasion_azure_automation_runbook_deleted.json | 4 ++-- .../defense_evasion_azure_blob_permissions_modified.json | 4 ++-- ...efense_evasion_azure_diagnostic_settings_deletion.json | 4 ++-- .../defense_evasion_azure_service_principal_addition.json | 4 ++-- .../defense_evasion_cloudtrail_logging_deleted.json | 4 ++-- .../defense_evasion_cloudtrail_logging_suspended.json | 4 ++-- .../defense_evasion_cloudwatch_alarm_deletion.json | 4 ++-- .../defense_evasion_config_service_rule_deletion.json | 4 ++-- .../defense_evasion_configuration_recorder_stopped.json | 4 ++-- ..._domain_added_to_google_workspace_trusted_domains.json | 4 ++-- .../defense_evasion_ec2_flow_log_deletion.json | 4 ++-- .../defense_evasion_ec2_network_acl_deletion.json | 4 ++-- ...fense_evasion_elasticache_security_group_creation.json | 4 ++-- ...on_elasticache_security_group_modified_or_deleted.json | 4 ++-- .../defense_evasion_event_hub_deletion.json | 4 ++-- .../defense_evasion_firewall_policy_deletion.json | 4 ++-- ...efense_evasion_frontdoor_firewall_policy_deletion.json | 4 ++-- .../defense_evasion_gcp_firewall_rule_created.json | 5 +++-- .../defense_evasion_gcp_firewall_rule_deleted.json | 5 +++-- .../defense_evasion_gcp_firewall_rule_modified.json | 5 +++-- .../defense_evasion_gcp_logging_bucket_deletion.json | 5 +++-- .../defense_evasion_gcp_logging_sink_deletion.json | 5 +++-- ...defense_evasion_gcp_pub_sub_subscription_deletion.json | 5 +++-- .../defense_evasion_gcp_pub_sub_topic_deletion.json | 5 +++-- ...evasion_gcp_storage_bucket_configuration_modified.json | 5 +++-- ...e_evasion_gcp_storage_bucket_permissions_modified.json | 5 +++-- ...evasion_gcp_virtual_private_cloud_network_deleted.json | 5 +++-- ...e_evasion_gcp_virtual_private_cloud_route_created.json | 5 +++-- ...e_evasion_gcp_virtual_private_cloud_route_deleted.json | 5 +++-- ...asion_google_workspace_bitlocker_setting_disabled.json | 4 ++-- ...s_for_google_marketplace_changed_to_allow_any_app.json | 4 ++-- .../defense_evasion_guardduty_detector_deletion.json | 4 ++-- .../defense_evasion_kubernetes_events_deleted.json | 4 ++-- ...evasion_microsoft_365_exchange_dlp_policy_removed.json | 4 ++-- ...osoft_365_exchange_malware_filter_policy_deletion.json | 4 ++-- ...on_microsoft_365_exchange_malware_filter_rule_mod.json | 4 ++-- ..._microsoft_365_exchange_safe_attach_rule_disabled.json | 4 ++-- ...asion_microsoft_365_mailboxauditbypassassociation.json | 4 ++-- .../defense_evasion_network_watcher_deletion.json | 4 ++-- ...se_evasion_okta_attempt_to_deactivate_okta_policy.json | 4 ++-- ...asion_okta_attempt_to_deactivate_okta_policy_rule.json | 4 ++-- ...efense_evasion_okta_attempt_to_delete_okta_policy.json | 4 ++-- ...e_evasion_okta_attempt_to_delete_okta_policy_rule.json | 4 ++-- ..._evasion_okta_attempt_to_modify_okta_network_zone.json | 4 ++-- ...efense_evasion_okta_attempt_to_modify_okta_policy.json | 4 ++-- ...e_evasion_okta_attempt_to_modify_okta_policy_rule.json | 4 ++-- .../defense_evasion_s3_bucket_configuration_deletion.json | 4 ++-- .../defense_evasion_suppression_rule_created.json | 4 ++-- ...cious_okta_user_password_reset_or_unlock_attempts.json | 4 ++-- .../defense_evasion_waf_acl_deletion.json | 4 ++-- .../defense_evasion_waf_rule_or_rule_group_deletion.json | 4 ++-- .../discovery_blob_container_access_mod.json | 4 ++-- .../discovery_denied_service_account_request.json | 4 ++-- .../execution_command_virtual_machine.json | 4 ++-- ...ltration_ec2_full_network_packet_capture_detected.json | 4 ++-- .../exfiltration_ec2_snapshot_change_activity.json | 4 ++-- .../exfiltration_ec2_vm_export_failure.json | 4 ++-- .../exfiltration_gcp_logging_sink_modification.json | 5 +++-- ...on_microsoft_365_exchange_transport_rule_creation.json | 4 ++-- ...tration_microsoft_365_exchange_transport_rule_mod.json | 4 ++-- .../exfiltration_rds_snapshot_export.json | 4 ++-- .../exfiltration_rds_snapshot_restored.json | 4 ++-- .../impact_attempt_to_revoke_okta_api_token.json | 4 ++-- .../impact_aws_eventbridge_rule_disabled_or_deleted.json | 4 ++-- .../impact_azure_service_principal_credentials_added.json | 4 ++-- .../impact_cloudtrail_logging_updated.json | 4 ++-- .../impact_cloudwatch_log_group_deletion.json | 4 ++-- .../impact_cloudwatch_log_stream_deletion.json | 4 ++-- .../impact_ec2_disable_ebs_encryption.json | 4 ++-- .../impact_efs_filesystem_or_mount_deleted.json | 4 ++-- .../prepackaged_rules/impact_gcp_iam_role_deletion.json | 5 +++-- .../impact_gcp_service_account_deleted.json | 5 +++-- .../impact_gcp_service_account_disabled.json | 5 +++-- .../impact_gcp_storage_bucket_deleted.json | 5 +++-- .../impact_google_workspace_admin_role_deletion.json | 4 ++-- .../impact_google_workspace_mfa_enforcement_disabled.json | 4 ++-- .../impact_iam_deactivate_mfa_device.json | 4 ++-- .../prepackaged_rules/impact_iam_group_deletion.json | 4 ++-- .../prepackaged_rules/impact_kubernetes_pod_deleted.json | 4 ++-- ...mpact_microsoft_365_potential_ransomware_activity.json | 4 ++-- ...act_microsoft_365_unusual_volume_of_file_deletion.json | 4 ++-- ...mpact_okta_attempt_to_deactivate_okta_application.json | 4 ++-- .../impact_okta_attempt_to_delete_okta_application.json | 4 ++-- .../impact_okta_attempt_to_modify_okta_application.json | 4 ++-- .../impact_possible_okta_dos_attack.json | 4 ++-- .../prepackaged_rules/impact_rds_group_deletion.json | 4 ++-- .../impact_rds_instance_cluster_deletion.json | 4 ++-- .../impact_rds_instance_cluster_stoppage.json | 4 ++-- .../prepackaged_rules/impact_resource_group_deletion.json | 4 ++-- .../impact_virtual_network_device_modified.json | 4 ++-- ...al_access_azure_active_directory_high_risk_signin.json | 4 ++-- ...ve_directory_high_risk_signin_atrisk_or_confirmed.json | 4 ++-- ...l_access_azure_active_directory_powershell_signin.json | 4 ++-- ...ent_grant_attack_via_azure_registered_application.json | 8 ++++---- .../initial_access_console_login_root.json | 4 ++-- .../initial_access_external_guest_user_invite.json | 4 ++-- .../initial_access_gcp_iam_custom_role_creation.json | 5 +++-- ...microsoft_365_exchange_anti_phish_policy_deletion.json | 4 ++-- ...access_microsoft_365_exchange_anti_phish_rule_mod.json | 4 ++-- ..._access_microsoft_365_exchange_safelinks_disabled.json | 4 ++-- ..._microsoft_365_user_restricted_from_sending_email.json | 4 ++-- .../initial_access_o365_user_reported_phish_malware.json | 4 ++-- ...al_access_okta_user_attempted_unauthorized_access.json | 4 ++-- .../initial_access_password_recovery.json | 4 ++-- ..._access_suspicious_activity_reported_by_okta_user.json | 4 ++-- .../initial_access_via_system_manager.json | 4 ++-- .../lateral_movement_malware_uploaded_onedrive.json | 4 ++-- .../lateral_movement_malware_uploaded_sharepoint.json | 4 ++-- .../okta_threat_detected_by_okta_threatinsight.json | 4 ++-- ...e_administrator_privileges_assigned_to_okta_group.json | 4 ++-- ...sistence_administrator_role_assigned_to_okta_user.json | 4 ++-- ...ence_application_added_to_google_workspace_domain.json | 4 ++-- .../persistence_attempt_to_create_okta_api_token.json | 4 ++-- ...e_attempt_to_deactivate_mfa_for_okta_user_account.json | 4 ++-- ...ttempt_to_reset_mfa_factors_for_okta_user_account.json | 4 ++-- .../persistence_azure_automation_account_created.json | 4 ++-- ...ence_azure_automation_runbook_created_or_modified.json | 4 ++-- .../persistence_azure_automation_webhook_created.json | 4 ++-- ...sistence_azure_conditional_access_policy_modified.json | 6 +++--- ...sistence_azure_global_administrator_role_assigned.json | 4 ++-- .../persistence_azure_pim_user_added_global_admin.json | 4 ++-- ...zure_privileged_identity_management_role_modified.json | 4 ++-- .../persistence_ec2_network_acl_creation.json | 4 ++-- ...ec2_security_group_configuration_change_detection.json | 4 ++-- ...ence_exchange_suspicious_mailbox_right_delegation.json | 4 ++-- .../persistence_gcp_iam_service_account_key_deletion.json | 5 +++-- .../persistence_gcp_key_created_for_service_account.json | 5 +++-- .../persistence_gcp_service_account_created.json | 5 +++-- .../persistence_google_workspace_2sv_policy_disabled.json | 4 ++-- ...ence_google_workspace_admin_role_assigned_to_user.json | 4 ++-- ...s_granted_via_domain_wide_delegation_of_authority.json | 4 ++-- ...stence_google_workspace_custom_admin_role_created.json | 4 ++-- .../persistence_google_workspace_policy_modified.json | 4 ++-- .../persistence_google_workspace_role_modified.json | 4 ++-- ...er_group_access_modified_to_allow_external_access.json | 4 ++-- ...google_workspace_user_organizational_unit_changed.json | 4 ++-- .../prepackaged_rules/persistence_iam_group_creation.json | 4 ++-- .../persistence_mfa_disabled_for_azure_user.json | 4 ++-- ...ce_mfa_disabled_for_google_workspace_organization.json | 4 ++-- ...crosoft_365_exchange_dkim_signing_config_disabled.json | 4 ++-- ...microsoft_365_exchange_management_role_assignment.json | 4 ++-- ...ce_microsoft_365_global_administrator_role_assign.json | 4 ++-- ...icrosoft_365_teams_custom_app_interaction_allowed.json | 4 ++-- ...tence_microsoft_365_teams_external_access_enabled.json | 4 ++-- ...sistence_microsoft_365_teams_guest_access_enabled.json | 4 ++-- ...pt_to_modify_or_delete_application_sign_on_policy.json | 4 ++-- .../persistence_rds_cluster_creation.json | 4 ++-- .../prepackaged_rules/persistence_rds_group_creation.json | 4 ++-- .../persistence_rds_instance_creation.json | 4 ++-- .../persistence_redshift_instance_creation.json | 4 ++-- ...ersistence_route_53_domain_transfer_lock_disabled.json | 4 ++-- ...ce_route_53_domain_transferred_to_another_account.json | 4 ++-- ...stence_route_53_hosted_zone_associated_with_a_vpc.json | 4 ++-- .../persistence_route_table_created.json | 4 ++-- .../persistence_route_table_modified_or_deleted.json | 4 ++-- ...istence_user_added_as_owner_for_azure_application.json | 4 ++-- ...e_user_added_as_owner_for_azure_service_principal.json | 4 ++-- ...privilege_escalation_aws_suspicious_saml_activity.json | 4 ++-- ...e_escalation_azure_kubernetes_rolebinding_created.json | 4 ++-- ...scalation_cyberarkpas_error_audit_event_promotion.json | 4 ++-- ...berarkpas_recommended_events_to_monitor_promotion.json | 4 ++-- ...on_gcp_kubernetes_rolebindings_created_or_patched.json | 5 +++-- ...lege_escalation_new_or_modified_federation_domain.json | 4 ++-- .../privilege_escalation_root_login_without_mfa.json | 4 ++-- .../privilege_escalation_sts_assumerole_usage.json | 4 ++-- .../privilege_escalation_sts_getsessiontoken_abuse.json | 4 ++-- ...spicious_assignment_of_controller_service_account.json | 4 ++-- .../privilege_escalation_updateassumerolepolicy.json | 4 ++-- 193 files changed, 413 insertions(+), 389 deletions(-) diff --git a/x-pack/plugins/security_solution/server/lib/detection_engine/rules/prepackaged_rules/collection_cloudtrail_logging_created.json b/x-pack/plugins/security_solution/server/lib/detection_engine/rules/prepackaged_rules/collection_cloudtrail_logging_created.json index dce3794eaa274..1c18ffdb366ad 100644 --- a/x-pack/plugins/security_solution/server/lib/detection_engine/rules/prepackaged_rules/collection_cloudtrail_logging_created.json +++ b/x-pack/plugins/security_solution/server/lib/detection_engine/rules/prepackaged_rules/collection_cloudtrail_logging_created.json @@ -25,7 +25,7 @@ { "integration": "cloudtrail", "package": "aws", - "version": "1.10.2" + "version": "^1.5.0" } ], "required_fields": [ @@ -81,5 +81,5 @@ ], "timestamp_override": "event.ingested", "type": "query", - "version": 100 + "version": 101 } diff --git a/x-pack/plugins/security_solution/server/lib/detection_engine/rules/prepackaged_rules/collection_gcp_pub_sub_subscription_creation.json b/x-pack/plugins/security_solution/server/lib/detection_engine/rules/prepackaged_rules/collection_gcp_pub_sub_subscription_creation.json index 170799f184f48..bde0e521ccc84 100644 --- a/x-pack/plugins/security_solution/server/lib/detection_engine/rules/prepackaged_rules/collection_gcp_pub_sub_subscription_creation.json +++ b/x-pack/plugins/security_solution/server/lib/detection_engine/rules/prepackaged_rules/collection_gcp_pub_sub_subscription_creation.json @@ -20,8 +20,9 @@ ], "related_integrations": [ { + "integration": "audit", "package": "gcp", - "version": "1.10.0" + "version": "^2.2.1" } ], "required_fields": [ @@ -72,5 +73,5 @@ ], "timestamp_override": "event.ingested", "type": "query", - "version": 100 + "version": 101 } diff --git a/x-pack/plugins/security_solution/server/lib/detection_engine/rules/prepackaged_rules/collection_gcp_pub_sub_topic_creation.json b/x-pack/plugins/security_solution/server/lib/detection_engine/rules/prepackaged_rules/collection_gcp_pub_sub_topic_creation.json index 0a81f7147a6f2..374cd565a4cdd 100644 --- a/x-pack/plugins/security_solution/server/lib/detection_engine/rules/prepackaged_rules/collection_gcp_pub_sub_topic_creation.json +++ b/x-pack/plugins/security_solution/server/lib/detection_engine/rules/prepackaged_rules/collection_gcp_pub_sub_topic_creation.json @@ -20,8 +20,9 @@ ], "related_integrations": [ { + "integration": "audit", "package": "gcp", - "version": "1.10.0" + "version": "^2.2.1" } ], "required_fields": [ @@ -72,5 +73,5 @@ ], "timestamp_override": "event.ingested", "type": "query", - "version": 100 + "version": 101 } diff --git a/x-pack/plugins/security_solution/server/lib/detection_engine/rules/prepackaged_rules/collection_google_drive_ownership_transferred_via_google_workspace.json b/x-pack/plugins/security_solution/server/lib/detection_engine/rules/prepackaged_rules/collection_google_drive_ownership_transferred_via_google_workspace.json index 7786d21c92e1b..84b930fc30b37 100644 --- a/x-pack/plugins/security_solution/server/lib/detection_engine/rules/prepackaged_rules/collection_google_drive_ownership_transferred_via_google_workspace.json +++ b/x-pack/plugins/security_solution/server/lib/detection_engine/rules/prepackaged_rules/collection_google_drive_ownership_transferred_via_google_workspace.json @@ -23,7 +23,7 @@ "related_integrations": [ { "package": "google_workspace", - "version": "1.2.0" + "version": "^1.2.0" } ], "required_fields": [ @@ -86,5 +86,5 @@ ], "timestamp_override": "event.ingested", "type": "query", - "version": 1 + "version": 2 } diff --git a/x-pack/plugins/security_solution/server/lib/detection_engine/rules/prepackaged_rules/collection_google_workspace_custom_gmail_route_created_or_modified.json b/x-pack/plugins/security_solution/server/lib/detection_engine/rules/prepackaged_rules/collection_google_workspace_custom_gmail_route_created_or_modified.json index ecf97a03e2241..f6c591d8922dd 100644 --- a/x-pack/plugins/security_solution/server/lib/detection_engine/rules/prepackaged_rules/collection_google_workspace_custom_gmail_route_created_or_modified.json +++ b/x-pack/plugins/security_solution/server/lib/detection_engine/rules/prepackaged_rules/collection_google_workspace_custom_gmail_route_created_or_modified.json @@ -23,7 +23,7 @@ "related_integrations": [ { "package": "google_workspace", - "version": "1.2.0" + "version": "^1.2.0" } ], "required_fields": [ @@ -86,5 +86,5 @@ ], "timestamp_override": "event.ingested", "type": "query", - "version": 1 + "version": 2 } diff --git a/x-pack/plugins/security_solution/server/lib/detection_engine/rules/prepackaged_rules/collection_microsoft_365_new_inbox_rule.json b/x-pack/plugins/security_solution/server/lib/detection_engine/rules/prepackaged_rules/collection_microsoft_365_new_inbox_rule.json index 2872c1aa509e9..ef67f834a05e3 100644 --- a/x-pack/plugins/security_solution/server/lib/detection_engine/rules/prepackaged_rules/collection_microsoft_365_new_inbox_rule.json +++ b/x-pack/plugins/security_solution/server/lib/detection_engine/rules/prepackaged_rules/collection_microsoft_365_new_inbox_rule.json @@ -27,7 +27,7 @@ "related_integrations": [ { "package": "o365", - "version": "1.3.0" + "version": "^1.3.0" } ], "required_fields": [ @@ -110,5 +110,5 @@ ], "timestamp_override": "event.ingested", "type": "query", - "version": 100 + "version": 101 } diff --git a/x-pack/plugins/security_solution/server/lib/detection_engine/rules/prepackaged_rules/collection_update_event_hub_auth_rule.json b/x-pack/plugins/security_solution/server/lib/detection_engine/rules/prepackaged_rules/collection_update_event_hub_auth_rule.json index f3858c18a6e24..ab64a125a5449 100644 --- a/x-pack/plugins/security_solution/server/lib/detection_engine/rules/prepackaged_rules/collection_update_event_hub_auth_rule.json +++ b/x-pack/plugins/security_solution/server/lib/detection_engine/rules/prepackaged_rules/collection_update_event_hub_auth_rule.json @@ -23,7 +23,7 @@ { "integration": "activitylogs", "package": "azure", - "version": "0.12.0" + "version": "^1.0.0" } ], "required_fields": [ @@ -89,5 +89,5 @@ ], "timestamp_override": "event.ingested", "type": "query", - "version": 100 + "version": 101 } diff --git a/x-pack/plugins/security_solution/server/lib/detection_engine/rules/prepackaged_rules/credential_access_attempted_bypass_of_okta_mfa.json b/x-pack/plugins/security_solution/server/lib/detection_engine/rules/prepackaged_rules/credential_access_attempted_bypass_of_okta_mfa.json index cdc1899aef253..854e7c05f1ee3 100644 --- a/x-pack/plugins/security_solution/server/lib/detection_engine/rules/prepackaged_rules/credential_access_attempted_bypass_of_okta_mfa.json +++ b/x-pack/plugins/security_solution/server/lib/detection_engine/rules/prepackaged_rules/credential_access_attempted_bypass_of_okta_mfa.json @@ -19,7 +19,7 @@ "related_integrations": [ { "package": "okta", - "version": "1.3.0" + "version": "^1.3.0" } ], "required_fields": [ @@ -65,5 +65,5 @@ ], "timestamp_override": "event.ingested", "type": "query", - "version": 100 + "version": 101 } diff --git a/x-pack/plugins/security_solution/server/lib/detection_engine/rules/prepackaged_rules/credential_access_attempts_to_brute_force_okta_user_account.json b/x-pack/plugins/security_solution/server/lib/detection_engine/rules/prepackaged_rules/credential_access_attempts_to_brute_force_okta_user_account.json index 5a51259d349a8..1e0e64288a25d 100644 --- a/x-pack/plugins/security_solution/server/lib/detection_engine/rules/prepackaged_rules/credential_access_attempts_to_brute_force_okta_user_account.json +++ b/x-pack/plugins/security_solution/server/lib/detection_engine/rules/prepackaged_rules/credential_access_attempts_to_brute_force_okta_user_account.json @@ -22,7 +22,7 @@ "related_integrations": [ { "package": "okta", - "version": "1.3.0" + "version": "^1.3.0" } ], "required_fields": [ @@ -73,5 +73,5 @@ "value": 3 }, "type": "threshold", - "version": 100 + "version": 101 } diff --git a/x-pack/plugins/security_solution/server/lib/detection_engine/rules/prepackaged_rules/credential_access_aws_iam_assume_role_brute_force.json b/x-pack/plugins/security_solution/server/lib/detection_engine/rules/prepackaged_rules/credential_access_aws_iam_assume_role_brute_force.json index 490b96665a83b..1ecaf2dd8bfd3 100644 --- a/x-pack/plugins/security_solution/server/lib/detection_engine/rules/prepackaged_rules/credential_access_aws_iam_assume_role_brute_force.json +++ b/x-pack/plugins/security_solution/server/lib/detection_engine/rules/prepackaged_rules/credential_access_aws_iam_assume_role_brute_force.json @@ -21,7 +21,7 @@ { "integration": "cloudtrail", "package": "aws", - "version": "1.10.2" + "version": "^1.5.0" } ], "required_fields": [ @@ -86,5 +86,5 @@ "value": 25 }, "type": "threshold", - "version": 101 + "version": 102 } diff --git a/x-pack/plugins/security_solution/server/lib/detection_engine/rules/prepackaged_rules/credential_access_azure_full_network_packet_capture_detected.json b/x-pack/plugins/security_solution/server/lib/detection_engine/rules/prepackaged_rules/credential_access_azure_full_network_packet_capture_detected.json index 7ecff1cab054f..0424bd7254237 100644 --- a/x-pack/plugins/security_solution/server/lib/detection_engine/rules/prepackaged_rules/credential_access_azure_full_network_packet_capture_detected.json +++ b/x-pack/plugins/security_solution/server/lib/detection_engine/rules/prepackaged_rules/credential_access_azure_full_network_packet_capture_detected.json @@ -23,7 +23,7 @@ { "integration": "activitylogs", "package": "azure", - "version": "0.12.0" + "version": "^1.0.0" } ], "required_fields": [ @@ -74,5 +74,5 @@ ], "timestamp_override": "event.ingested", "type": "query", - "version": 100 + "version": 101 } diff --git a/x-pack/plugins/security_solution/server/lib/detection_engine/rules/prepackaged_rules/credential_access_iam_user_addition_to_group.json b/x-pack/plugins/security_solution/server/lib/detection_engine/rules/prepackaged_rules/credential_access_iam_user_addition_to_group.json index 2140870e22d1f..70cfa845453b7 100644 --- a/x-pack/plugins/security_solution/server/lib/detection_engine/rules/prepackaged_rules/credential_access_iam_user_addition_to_group.json +++ b/x-pack/plugins/security_solution/server/lib/detection_engine/rules/prepackaged_rules/credential_access_iam_user_addition_to_group.json @@ -24,7 +24,7 @@ { "integration": "cloudtrail", "package": "aws", - "version": "1.10.2" + "version": "^1.5.0" } ], "required_fields": [ @@ -92,5 +92,5 @@ ], "timestamp_override": "event.ingested", "type": "query", - "version": 101 + "version": 102 } diff --git a/x-pack/plugins/security_solution/server/lib/detection_engine/rules/prepackaged_rules/credential_access_key_vault_modified.json b/x-pack/plugins/security_solution/server/lib/detection_engine/rules/prepackaged_rules/credential_access_key_vault_modified.json index b4cb0de511fa2..bda2c0ad53d27 100644 --- a/x-pack/plugins/security_solution/server/lib/detection_engine/rules/prepackaged_rules/credential_access_key_vault_modified.json +++ b/x-pack/plugins/security_solution/server/lib/detection_engine/rules/prepackaged_rules/credential_access_key_vault_modified.json @@ -24,7 +24,7 @@ { "integration": "activitylogs", "package": "azure", - "version": "0.12.0" + "version": "^1.0.0" } ], "required_fields": [ @@ -82,5 +82,5 @@ ], "timestamp_override": "event.ingested", "type": "query", - "version": 100 + "version": 101 } diff --git a/x-pack/plugins/security_solution/server/lib/detection_engine/rules/prepackaged_rules/credential_access_microsoft_365_brute_force_user_account_attempt.json b/x-pack/plugins/security_solution/server/lib/detection_engine/rules/prepackaged_rules/credential_access_microsoft_365_brute_force_user_account_attempt.json index b14caa11172a1..e4d55e511c982 100644 --- a/x-pack/plugins/security_solution/server/lib/detection_engine/rules/prepackaged_rules/credential_access_microsoft_365_brute_force_user_account_attempt.json +++ b/x-pack/plugins/security_solution/server/lib/detection_engine/rules/prepackaged_rules/credential_access_microsoft_365_brute_force_user_account_attempt.json @@ -24,7 +24,7 @@ "related_integrations": [ { "package": "o365", - "version": "1.3.0" + "version": "^1.3.0" } ], "required_fields": [ @@ -90,5 +90,5 @@ "value": 10 }, "type": "threshold", - "version": 100 + "version": 101 } diff --git a/x-pack/plugins/security_solution/server/lib/detection_engine/rules/prepackaged_rules/credential_access_microsoft_365_potential_password_spraying_attack.json b/x-pack/plugins/security_solution/server/lib/detection_engine/rules/prepackaged_rules/credential_access_microsoft_365_potential_password_spraying_attack.json index 58dcd2838e887..25fbb268525b3 100644 --- a/x-pack/plugins/security_solution/server/lib/detection_engine/rules/prepackaged_rules/credential_access_microsoft_365_potential_password_spraying_attack.json +++ b/x-pack/plugins/security_solution/server/lib/detection_engine/rules/prepackaged_rules/credential_access_microsoft_365_potential_password_spraying_attack.json @@ -19,7 +19,7 @@ "related_integrations": [ { "package": "o365", - "version": "1.3.0" + "version": "^1.3.0" } ], "required_fields": [ @@ -80,5 +80,5 @@ "value": 25 }, "type": "threshold", - "version": 100 + "version": 101 } diff --git a/x-pack/plugins/security_solution/server/lib/detection_engine/rules/prepackaged_rules/credential_access_okta_brute_force_or_password_spraying.json b/x-pack/plugins/security_solution/server/lib/detection_engine/rules/prepackaged_rules/credential_access_okta_brute_force_or_password_spraying.json index a9838a1be2f72..a5a2a5c4b5f66 100644 --- a/x-pack/plugins/security_solution/server/lib/detection_engine/rules/prepackaged_rules/credential_access_okta_brute_force_or_password_spraying.json +++ b/x-pack/plugins/security_solution/server/lib/detection_engine/rules/prepackaged_rules/credential_access_okta_brute_force_or_password_spraying.json @@ -22,7 +22,7 @@ "related_integrations": [ { "package": "okta", - "version": "1.3.0" + "version": "^1.3.0" } ], "required_fields": [ @@ -78,5 +78,5 @@ "value": 25 }, "type": "threshold", - "version": 100 + "version": 101 } diff --git a/x-pack/plugins/security_solution/server/lib/detection_engine/rules/prepackaged_rules/credential_access_root_console_failure_brute_force.json b/x-pack/plugins/security_solution/server/lib/detection_engine/rules/prepackaged_rules/credential_access_root_console_failure_brute_force.json index fa80873d0029a..e28873764450a 100644 --- a/x-pack/plugins/security_solution/server/lib/detection_engine/rules/prepackaged_rules/credential_access_root_console_failure_brute_force.json +++ b/x-pack/plugins/security_solution/server/lib/detection_engine/rules/prepackaged_rules/credential_access_root_console_failure_brute_force.json @@ -23,7 +23,7 @@ { "integration": "cloudtrail", "package": "aws", - "version": "1.10.2" + "version": "^1.5.0" } ], "required_fields": [ @@ -89,5 +89,5 @@ "value": 10 }, "type": "threshold", - "version": 100 + "version": 101 } diff --git a/x-pack/plugins/security_solution/server/lib/detection_engine/rules/prepackaged_rules/credential_access_secretsmanager_getsecretvalue.json b/x-pack/plugins/security_solution/server/lib/detection_engine/rules/prepackaged_rules/credential_access_secretsmanager_getsecretvalue.json index 2ec5b4d9a877b..e48cd55b3dc3d 100644 --- a/x-pack/plugins/security_solution/server/lib/detection_engine/rules/prepackaged_rules/credential_access_secretsmanager_getsecretvalue.json +++ b/x-pack/plugins/security_solution/server/lib/detection_engine/rules/prepackaged_rules/credential_access_secretsmanager_getsecretvalue.json @@ -26,7 +26,7 @@ { "integration": "cloudtrail", "package": "aws", - "version": "1.10.2" + "version": "^1.5.0" } ], "required_fields": [ @@ -79,5 +79,5 @@ ], "timestamp_override": "event.ingested", "type": "query", - "version": 101 + "version": 102 } diff --git a/x-pack/plugins/security_solution/server/lib/detection_engine/rules/prepackaged_rules/credential_access_storage_account_key_regenerated.json b/x-pack/plugins/security_solution/server/lib/detection_engine/rules/prepackaged_rules/credential_access_storage_account_key_regenerated.json index a8f3ebcb02bda..0b21f4e30fe2b 100644 --- a/x-pack/plugins/security_solution/server/lib/detection_engine/rules/prepackaged_rules/credential_access_storage_account_key_regenerated.json +++ b/x-pack/plugins/security_solution/server/lib/detection_engine/rules/prepackaged_rules/credential_access_storage_account_key_regenerated.json @@ -23,7 +23,7 @@ { "integration": "activitylogs", "package": "azure", - "version": "0.12.0" + "version": "^1.0.0" } ], "required_fields": [ @@ -74,5 +74,5 @@ ], "timestamp_override": "event.ingested", "type": "query", - "version": 100 + "version": 101 } diff --git a/x-pack/plugins/security_solution/server/lib/detection_engine/rules/prepackaged_rules/credential_access_user_excessive_sso_logon_errors.json b/x-pack/plugins/security_solution/server/lib/detection_engine/rules/prepackaged_rules/credential_access_user_excessive_sso_logon_errors.json index 08ce349cf9a29..1fe8760875987 100644 --- a/x-pack/plugins/security_solution/server/lib/detection_engine/rules/prepackaged_rules/credential_access_user_excessive_sso_logon_errors.json +++ b/x-pack/plugins/security_solution/server/lib/detection_engine/rules/prepackaged_rules/credential_access_user_excessive_sso_logon_errors.json @@ -20,7 +20,7 @@ "related_integrations": [ { "package": "o365", - "version": "1.3.0" + "version": "^1.3.0" } ], "required_fields": [ @@ -81,5 +81,5 @@ "value": 5 }, "type": "threshold", - "version": 100 + "version": 101 } diff --git a/x-pack/plugins/security_solution/server/lib/detection_engine/rules/prepackaged_rules/credential_access_user_impersonation_access.json b/x-pack/plugins/security_solution/server/lib/detection_engine/rules/prepackaged_rules/credential_access_user_impersonation_access.json index c81d9e99eb401..db1954bf32d48 100644 --- a/x-pack/plugins/security_solution/server/lib/detection_engine/rules/prepackaged_rules/credential_access_user_impersonation_access.json +++ b/x-pack/plugins/security_solution/server/lib/detection_engine/rules/prepackaged_rules/credential_access_user_impersonation_access.json @@ -20,7 +20,7 @@ "related_integrations": [ { "package": "okta", - "version": "1.3.0" + "version": "^1.3.0" } ], "required_fields": [ @@ -61,5 +61,5 @@ ], "timestamp_override": "event.ingested", "type": "query", - "version": 100 + "version": 101 } diff --git a/x-pack/plugins/security_solution/server/lib/detection_engine/rules/prepackaged_rules/defense_evasion_application_removed_from_blocklist_in_google_workspace.json b/x-pack/plugins/security_solution/server/lib/detection_engine/rules/prepackaged_rules/defense_evasion_application_removed_from_blocklist_in_google_workspace.json index 42cb730b4bd5a..24fbf972f262c 100644 --- a/x-pack/plugins/security_solution/server/lib/detection_engine/rules/prepackaged_rules/defense_evasion_application_removed_from_blocklist_in_google_workspace.json +++ b/x-pack/plugins/security_solution/server/lib/detection_engine/rules/prepackaged_rules/defense_evasion_application_removed_from_blocklist_in_google_workspace.json @@ -23,7 +23,7 @@ "related_integrations": [ { "package": "google_workspace", - "version": "1.2.0" + "version": "^1.2.0" } ], "required_fields": [ @@ -102,5 +102,5 @@ ], "timestamp_override": "event.ingested", "type": "query", - "version": 1 + "version": 2 } diff --git a/x-pack/plugins/security_solution/server/lib/detection_engine/rules/prepackaged_rules/defense_evasion_attempt_to_deactivate_okta_network_zone.json b/x-pack/plugins/security_solution/server/lib/detection_engine/rules/prepackaged_rules/defense_evasion_attempt_to_deactivate_okta_network_zone.json index 5a369c99e1e1f..48b117098e890 100644 --- a/x-pack/plugins/security_solution/server/lib/detection_engine/rules/prepackaged_rules/defense_evasion_attempt_to_deactivate_okta_network_zone.json +++ b/x-pack/plugins/security_solution/server/lib/detection_engine/rules/prepackaged_rules/defense_evasion_attempt_to_deactivate_okta_network_zone.json @@ -23,7 +23,7 @@ "related_integrations": [ { "package": "okta", - "version": "1.3.0" + "version": "^1.3.0" } ], "required_fields": [ @@ -77,5 +77,5 @@ ], "timestamp_override": "event.ingested", "type": "query", - "version": 100 + "version": 101 } diff --git a/x-pack/plugins/security_solution/server/lib/detection_engine/rules/prepackaged_rules/defense_evasion_attempt_to_delete_okta_network_zone.json b/x-pack/plugins/security_solution/server/lib/detection_engine/rules/prepackaged_rules/defense_evasion_attempt_to_delete_okta_network_zone.json index df742d5e50db7..a94413ddbd695 100644 --- a/x-pack/plugins/security_solution/server/lib/detection_engine/rules/prepackaged_rules/defense_evasion_attempt_to_delete_okta_network_zone.json +++ b/x-pack/plugins/security_solution/server/lib/detection_engine/rules/prepackaged_rules/defense_evasion_attempt_to_delete_okta_network_zone.json @@ -23,7 +23,7 @@ "related_integrations": [ { "package": "okta", - "version": "1.3.0" + "version": "^1.3.0" } ], "required_fields": [ @@ -77,5 +77,5 @@ ], "timestamp_override": "event.ingested", "type": "query", - "version": 100 + "version": 101 } diff --git a/x-pack/plugins/security_solution/server/lib/detection_engine/rules/prepackaged_rules/defense_evasion_azure_application_credential_modification.json b/x-pack/plugins/security_solution/server/lib/detection_engine/rules/prepackaged_rules/defense_evasion_azure_application_credential_modification.json index 430a6e5f760cf..15d9cfc43b4ff 100644 --- a/x-pack/plugins/security_solution/server/lib/detection_engine/rules/prepackaged_rules/defense_evasion_azure_application_credential_modification.json +++ b/x-pack/plugins/security_solution/server/lib/detection_engine/rules/prepackaged_rules/defense_evasion_azure_application_credential_modification.json @@ -22,7 +22,7 @@ "related_integrations": [ { "package": "azure", - "version": "0.12.0" + "version": "^1.0.0" } ], "required_fields": [ @@ -80,5 +80,5 @@ ], "timestamp_override": "event.ingested", "type": "query", - "version": 100 + "version": 101 } diff --git a/x-pack/plugins/security_solution/server/lib/detection_engine/rules/prepackaged_rules/defense_evasion_azure_automation_runbook_deleted.json b/x-pack/plugins/security_solution/server/lib/detection_engine/rules/prepackaged_rules/defense_evasion_azure_automation_runbook_deleted.json index 2b85723e10a17..ea752fb3e7534 100644 --- a/x-pack/plugins/security_solution/server/lib/detection_engine/rules/prepackaged_rules/defense_evasion_azure_automation_runbook_deleted.json +++ b/x-pack/plugins/security_solution/server/lib/detection_engine/rules/prepackaged_rules/defense_evasion_azure_automation_runbook_deleted.json @@ -23,7 +23,7 @@ { "integration": "activitylogs", "package": "azure", - "version": "0.12.0" + "version": "^1.0.0" } ], "required_fields": [ @@ -69,5 +69,5 @@ ], "timestamp_override": "event.ingested", "type": "query", - "version": 100 + "version": 101 } diff --git a/x-pack/plugins/security_solution/server/lib/detection_engine/rules/prepackaged_rules/defense_evasion_azure_blob_permissions_modified.json b/x-pack/plugins/security_solution/server/lib/detection_engine/rules/prepackaged_rules/defense_evasion_azure_blob_permissions_modified.json index 09c799005d1c2..d7d398b93b8c4 100644 --- a/x-pack/plugins/security_solution/server/lib/detection_engine/rules/prepackaged_rules/defense_evasion_azure_blob_permissions_modified.json +++ b/x-pack/plugins/security_solution/server/lib/detection_engine/rules/prepackaged_rules/defense_evasion_azure_blob_permissions_modified.json @@ -22,7 +22,7 @@ { "integration": "activitylogs", "package": "azure", - "version": "0.12.0" + "version": "^1.0.0" } ], "required_fields": [ @@ -73,5 +73,5 @@ ], "timestamp_override": "event.ingested", "type": "query", - "version": 100 + "version": 101 } diff --git a/x-pack/plugins/security_solution/server/lib/detection_engine/rules/prepackaged_rules/defense_evasion_azure_diagnostic_settings_deletion.json b/x-pack/plugins/security_solution/server/lib/detection_engine/rules/prepackaged_rules/defense_evasion_azure_diagnostic_settings_deletion.json index 050a8949db393..391c7550cebef 100644 --- a/x-pack/plugins/security_solution/server/lib/detection_engine/rules/prepackaged_rules/defense_evasion_azure_diagnostic_settings_deletion.json +++ b/x-pack/plugins/security_solution/server/lib/detection_engine/rules/prepackaged_rules/defense_evasion_azure_diagnostic_settings_deletion.json @@ -23,7 +23,7 @@ { "integration": "activitylogs", "package": "azure", - "version": "0.12.0" + "version": "^1.0.0" } ], "required_fields": [ @@ -81,5 +81,5 @@ ], "timestamp_override": "event.ingested", "type": "query", - "version": 100 + "version": 101 } diff --git a/x-pack/plugins/security_solution/server/lib/detection_engine/rules/prepackaged_rules/defense_evasion_azure_service_principal_addition.json b/x-pack/plugins/security_solution/server/lib/detection_engine/rules/prepackaged_rules/defense_evasion_azure_service_principal_addition.json index 8b409bdb63681..23ffd879c111c 100644 --- a/x-pack/plugins/security_solution/server/lib/detection_engine/rules/prepackaged_rules/defense_evasion_azure_service_principal_addition.json +++ b/x-pack/plugins/security_solution/server/lib/detection_engine/rules/prepackaged_rules/defense_evasion_azure_service_principal_addition.json @@ -23,7 +23,7 @@ "related_integrations": [ { "package": "azure", - "version": "0.12.0" + "version": "^1.0.0" } ], "required_fields": [ @@ -82,5 +82,5 @@ ], "timestamp_override": "event.ingested", "type": "query", - "version": 101 + "version": 102 } diff --git a/x-pack/plugins/security_solution/server/lib/detection_engine/rules/prepackaged_rules/defense_evasion_cloudtrail_logging_deleted.json b/x-pack/plugins/security_solution/server/lib/detection_engine/rules/prepackaged_rules/defense_evasion_cloudtrail_logging_deleted.json index cb0f9d549a04e..c9612870bcdd3 100644 --- a/x-pack/plugins/security_solution/server/lib/detection_engine/rules/prepackaged_rules/defense_evasion_cloudtrail_logging_deleted.json +++ b/x-pack/plugins/security_solution/server/lib/detection_engine/rules/prepackaged_rules/defense_evasion_cloudtrail_logging_deleted.json @@ -25,7 +25,7 @@ { "integration": "cloudtrail", "package": "aws", - "version": "1.10.2" + "version": "^1.5.0" } ], "required_fields": [ @@ -89,5 +89,5 @@ ], "timestamp_override": "event.ingested", "type": "query", - "version": 101 + "version": 102 } diff --git a/x-pack/plugins/security_solution/server/lib/detection_engine/rules/prepackaged_rules/defense_evasion_cloudtrail_logging_suspended.json b/x-pack/plugins/security_solution/server/lib/detection_engine/rules/prepackaged_rules/defense_evasion_cloudtrail_logging_suspended.json index 97867f74d0557..abe9271b83015 100644 --- a/x-pack/plugins/security_solution/server/lib/detection_engine/rules/prepackaged_rules/defense_evasion_cloudtrail_logging_suspended.json +++ b/x-pack/plugins/security_solution/server/lib/detection_engine/rules/prepackaged_rules/defense_evasion_cloudtrail_logging_suspended.json @@ -25,7 +25,7 @@ { "integration": "cloudtrail", "package": "aws", - "version": "1.10.2" + "version": "^1.5.0" } ], "required_fields": [ @@ -89,5 +89,5 @@ ], "timestamp_override": "event.ingested", "type": "query", - "version": 101 + "version": 102 } diff --git a/x-pack/plugins/security_solution/server/lib/detection_engine/rules/prepackaged_rules/defense_evasion_cloudwatch_alarm_deletion.json b/x-pack/plugins/security_solution/server/lib/detection_engine/rules/prepackaged_rules/defense_evasion_cloudwatch_alarm_deletion.json index 6fc0a85d8e9cc..b6945f8b9f10f 100644 --- a/x-pack/plugins/security_solution/server/lib/detection_engine/rules/prepackaged_rules/defense_evasion_cloudwatch_alarm_deletion.json +++ b/x-pack/plugins/security_solution/server/lib/detection_engine/rules/prepackaged_rules/defense_evasion_cloudwatch_alarm_deletion.json @@ -25,7 +25,7 @@ { "integration": "cloudtrail", "package": "aws", - "version": "1.10.2" + "version": "^1.5.0" } ], "required_fields": [ @@ -89,5 +89,5 @@ ], "timestamp_override": "event.ingested", "type": "query", - "version": 101 + "version": 102 } diff --git a/x-pack/plugins/security_solution/server/lib/detection_engine/rules/prepackaged_rules/defense_evasion_config_service_rule_deletion.json b/x-pack/plugins/security_solution/server/lib/detection_engine/rules/prepackaged_rules/defense_evasion_config_service_rule_deletion.json index 9113f5907dd3b..a60d5015f4c6d 100644 --- a/x-pack/plugins/security_solution/server/lib/detection_engine/rules/prepackaged_rules/defense_evasion_config_service_rule_deletion.json +++ b/x-pack/plugins/security_solution/server/lib/detection_engine/rules/prepackaged_rules/defense_evasion_config_service_rule_deletion.json @@ -26,7 +26,7 @@ { "integration": "cloudtrail", "package": "aws", - "version": "1.10.2" + "version": "^1.5.0" } ], "required_fields": [ @@ -85,5 +85,5 @@ ], "timestamp_override": "event.ingested", "type": "query", - "version": 101 + "version": 102 } diff --git a/x-pack/plugins/security_solution/server/lib/detection_engine/rules/prepackaged_rules/defense_evasion_configuration_recorder_stopped.json b/x-pack/plugins/security_solution/server/lib/detection_engine/rules/prepackaged_rules/defense_evasion_configuration_recorder_stopped.json index 6677ce569b493..17cd9c6e16003 100644 --- a/x-pack/plugins/security_solution/server/lib/detection_engine/rules/prepackaged_rules/defense_evasion_configuration_recorder_stopped.json +++ b/x-pack/plugins/security_solution/server/lib/detection_engine/rules/prepackaged_rules/defense_evasion_configuration_recorder_stopped.json @@ -25,7 +25,7 @@ { "integration": "cloudtrail", "package": "aws", - "version": "1.10.2" + "version": "^1.5.0" } ], "required_fields": [ @@ -88,5 +88,5 @@ ], "timestamp_override": "event.ingested", "type": "query", - "version": 100 + "version": 101 } diff --git a/x-pack/plugins/security_solution/server/lib/detection_engine/rules/prepackaged_rules/defense_evasion_domain_added_to_google_workspace_trusted_domains.json b/x-pack/plugins/security_solution/server/lib/detection_engine/rules/prepackaged_rules/defense_evasion_domain_added_to_google_workspace_trusted_domains.json index 75bbc1e8b3342..178c5c42f0d67 100644 --- a/x-pack/plugins/security_solution/server/lib/detection_engine/rules/prepackaged_rules/defense_evasion_domain_added_to_google_workspace_trusted_domains.json +++ b/x-pack/plugins/security_solution/server/lib/detection_engine/rules/prepackaged_rules/defense_evasion_domain_added_to_google_workspace_trusted_domains.json @@ -23,7 +23,7 @@ "related_integrations": [ { "package": "google_workspace", - "version": "1.2.0" + "version": "^1.2.0" } ], "required_fields": [ @@ -87,5 +87,5 @@ ], "timestamp_override": "event.ingested", "type": "query", - "version": 100 + "version": 101 } diff --git a/x-pack/plugins/security_solution/server/lib/detection_engine/rules/prepackaged_rules/defense_evasion_ec2_flow_log_deletion.json b/x-pack/plugins/security_solution/server/lib/detection_engine/rules/prepackaged_rules/defense_evasion_ec2_flow_log_deletion.json index 9104509c8576e..1bfe183a5a45a 100644 --- a/x-pack/plugins/security_solution/server/lib/detection_engine/rules/prepackaged_rules/defense_evasion_ec2_flow_log_deletion.json +++ b/x-pack/plugins/security_solution/server/lib/detection_engine/rules/prepackaged_rules/defense_evasion_ec2_flow_log_deletion.json @@ -25,7 +25,7 @@ { "integration": "cloudtrail", "package": "aws", - "version": "1.10.2" + "version": "^1.5.0" } ], "required_fields": [ @@ -89,5 +89,5 @@ ], "timestamp_override": "event.ingested", "type": "query", - "version": 101 + "version": 102 } diff --git a/x-pack/plugins/security_solution/server/lib/detection_engine/rules/prepackaged_rules/defense_evasion_ec2_network_acl_deletion.json b/x-pack/plugins/security_solution/server/lib/detection_engine/rules/prepackaged_rules/defense_evasion_ec2_network_acl_deletion.json index 4eb08d21f5e69..b0ec864e40857 100644 --- a/x-pack/plugins/security_solution/server/lib/detection_engine/rules/prepackaged_rules/defense_evasion_ec2_network_acl_deletion.json +++ b/x-pack/plugins/security_solution/server/lib/detection_engine/rules/prepackaged_rules/defense_evasion_ec2_network_acl_deletion.json @@ -27,7 +27,7 @@ { "integration": "cloudtrail", "package": "aws", - "version": "1.10.2" + "version": "^1.5.0" } ], "required_fields": [ @@ -90,5 +90,5 @@ ], "timestamp_override": "event.ingested", "type": "query", - "version": 100 + "version": 101 } diff --git a/x-pack/plugins/security_solution/server/lib/detection_engine/rules/prepackaged_rules/defense_evasion_elasticache_security_group_creation.json b/x-pack/plugins/security_solution/server/lib/detection_engine/rules/prepackaged_rules/defense_evasion_elasticache_security_group_creation.json index 9acd6f767b61f..405215618b17b 100644 --- a/x-pack/plugins/security_solution/server/lib/detection_engine/rules/prepackaged_rules/defense_evasion_elasticache_security_group_creation.json +++ b/x-pack/plugins/security_solution/server/lib/detection_engine/rules/prepackaged_rules/defense_evasion_elasticache_security_group_creation.json @@ -24,7 +24,7 @@ { "integration": "cloudtrail", "package": "aws", - "version": "1.10.2" + "version": "^1.5.0" } ], "required_fields": [ @@ -87,5 +87,5 @@ ], "timestamp_override": "event.ingested", "type": "query", - "version": 100 + "version": 101 } diff --git a/x-pack/plugins/security_solution/server/lib/detection_engine/rules/prepackaged_rules/defense_evasion_elasticache_security_group_modified_or_deleted.json b/x-pack/plugins/security_solution/server/lib/detection_engine/rules/prepackaged_rules/defense_evasion_elasticache_security_group_modified_or_deleted.json index 8548f32e06a08..909a8474c2080 100644 --- a/x-pack/plugins/security_solution/server/lib/detection_engine/rules/prepackaged_rules/defense_evasion_elasticache_security_group_modified_or_deleted.json +++ b/x-pack/plugins/security_solution/server/lib/detection_engine/rules/prepackaged_rules/defense_evasion_elasticache_security_group_modified_or_deleted.json @@ -24,7 +24,7 @@ { "integration": "cloudtrail", "package": "aws", - "version": "1.10.2" + "version": "^1.5.0" } ], "required_fields": [ @@ -87,5 +87,5 @@ ], "timestamp_override": "event.ingested", "type": "query", - "version": 100 + "version": 101 } diff --git a/x-pack/plugins/security_solution/server/lib/detection_engine/rules/prepackaged_rules/defense_evasion_event_hub_deletion.json b/x-pack/plugins/security_solution/server/lib/detection_engine/rules/prepackaged_rules/defense_evasion_event_hub_deletion.json index 36545e9bff9e6..5f52bf06a19d9 100644 --- a/x-pack/plugins/security_solution/server/lib/detection_engine/rules/prepackaged_rules/defense_evasion_event_hub_deletion.json +++ b/x-pack/plugins/security_solution/server/lib/detection_engine/rules/prepackaged_rules/defense_evasion_event_hub_deletion.json @@ -25,7 +25,7 @@ { "integration": "activitylogs", "package": "azure", - "version": "0.12.0" + "version": "^1.0.0" } ], "required_fields": [ @@ -83,5 +83,5 @@ ], "timestamp_override": "event.ingested", "type": "query", - "version": 100 + "version": 101 } diff --git a/x-pack/plugins/security_solution/server/lib/detection_engine/rules/prepackaged_rules/defense_evasion_firewall_policy_deletion.json b/x-pack/plugins/security_solution/server/lib/detection_engine/rules/prepackaged_rules/defense_evasion_firewall_policy_deletion.json index f1e0e99c67eca..d0ffb0a05279e 100644 --- a/x-pack/plugins/security_solution/server/lib/detection_engine/rules/prepackaged_rules/defense_evasion_firewall_policy_deletion.json +++ b/x-pack/plugins/security_solution/server/lib/detection_engine/rules/prepackaged_rules/defense_evasion_firewall_policy_deletion.json @@ -23,7 +23,7 @@ { "integration": "activitylogs", "package": "azure", - "version": "0.12.0" + "version": "^1.0.0" } ], "required_fields": [ @@ -81,5 +81,5 @@ ], "timestamp_override": "event.ingested", "type": "query", - "version": 100 + "version": 101 } diff --git a/x-pack/plugins/security_solution/server/lib/detection_engine/rules/prepackaged_rules/defense_evasion_frontdoor_firewall_policy_deletion.json b/x-pack/plugins/security_solution/server/lib/detection_engine/rules/prepackaged_rules/defense_evasion_frontdoor_firewall_policy_deletion.json index 4269f229a2ae4..8c5cfff14d6c0 100644 --- a/x-pack/plugins/security_solution/server/lib/detection_engine/rules/prepackaged_rules/defense_evasion_frontdoor_firewall_policy_deletion.json +++ b/x-pack/plugins/security_solution/server/lib/detection_engine/rules/prepackaged_rules/defense_evasion_frontdoor_firewall_policy_deletion.json @@ -23,7 +23,7 @@ { "integration": "activitylogs", "package": "azure", - "version": "0.12.0" + "version": "^1.0.0" } ], "required_fields": [ @@ -81,5 +81,5 @@ ], "timestamp_override": "event.ingested", "type": "query", - "version": 100 + "version": 101 } diff --git a/x-pack/plugins/security_solution/server/lib/detection_engine/rules/prepackaged_rules/defense_evasion_gcp_firewall_rule_created.json b/x-pack/plugins/security_solution/server/lib/detection_engine/rules/prepackaged_rules/defense_evasion_gcp_firewall_rule_created.json index 93ca073a171ae..3c9adaefa823e 100644 --- a/x-pack/plugins/security_solution/server/lib/detection_engine/rules/prepackaged_rules/defense_evasion_gcp_firewall_rule_created.json +++ b/x-pack/plugins/security_solution/server/lib/detection_engine/rules/prepackaged_rules/defense_evasion_gcp_firewall_rule_created.json @@ -21,8 +21,9 @@ ], "related_integrations": [ { + "integration": "audit", "package": "gcp", - "version": "1.10.0" + "version": "^2.2.1" } ], "required_fields": [ @@ -68,5 +69,5 @@ ], "timestamp_override": "event.ingested", "type": "query", - "version": 100 + "version": 101 } diff --git a/x-pack/plugins/security_solution/server/lib/detection_engine/rules/prepackaged_rules/defense_evasion_gcp_firewall_rule_deleted.json b/x-pack/plugins/security_solution/server/lib/detection_engine/rules/prepackaged_rules/defense_evasion_gcp_firewall_rule_deleted.json index d49edc4f123b0..f3debd68ebe0c 100644 --- a/x-pack/plugins/security_solution/server/lib/detection_engine/rules/prepackaged_rules/defense_evasion_gcp_firewall_rule_deleted.json +++ b/x-pack/plugins/security_solution/server/lib/detection_engine/rules/prepackaged_rules/defense_evasion_gcp_firewall_rule_deleted.json @@ -21,8 +21,9 @@ ], "related_integrations": [ { + "integration": "audit", "package": "gcp", - "version": "1.10.0" + "version": "^2.2.1" } ], "required_fields": [ @@ -68,5 +69,5 @@ ], "timestamp_override": "event.ingested", "type": "query", - "version": 100 + "version": 101 } diff --git a/x-pack/plugins/security_solution/server/lib/detection_engine/rules/prepackaged_rules/defense_evasion_gcp_firewall_rule_modified.json b/x-pack/plugins/security_solution/server/lib/detection_engine/rules/prepackaged_rules/defense_evasion_gcp_firewall_rule_modified.json index 3b0ca907a7e4c..da1e2ccb8925a 100644 --- a/x-pack/plugins/security_solution/server/lib/detection_engine/rules/prepackaged_rules/defense_evasion_gcp_firewall_rule_modified.json +++ b/x-pack/plugins/security_solution/server/lib/detection_engine/rules/prepackaged_rules/defense_evasion_gcp_firewall_rule_modified.json @@ -21,8 +21,9 @@ ], "related_integrations": [ { + "integration": "audit", "package": "gcp", - "version": "1.10.0" + "version": "^2.2.1" } ], "required_fields": [ @@ -68,5 +69,5 @@ ], "timestamp_override": "event.ingested", "type": "query", - "version": 100 + "version": 101 } diff --git a/x-pack/plugins/security_solution/server/lib/detection_engine/rules/prepackaged_rules/defense_evasion_gcp_logging_bucket_deletion.json b/x-pack/plugins/security_solution/server/lib/detection_engine/rules/prepackaged_rules/defense_evasion_gcp_logging_bucket_deletion.json index 41e6366756a05..8f93b61c574a6 100644 --- a/x-pack/plugins/security_solution/server/lib/detection_engine/rules/prepackaged_rules/defense_evasion_gcp_logging_bucket_deletion.json +++ b/x-pack/plugins/security_solution/server/lib/detection_engine/rules/prepackaged_rules/defense_evasion_gcp_logging_bucket_deletion.json @@ -21,8 +21,9 @@ ], "related_integrations": [ { + "integration": "audit", "package": "gcp", - "version": "1.10.0" + "version": "^2.2.1" } ], "required_fields": [ @@ -73,5 +74,5 @@ ], "timestamp_override": "event.ingested", "type": "query", - "version": 100 + "version": 101 } diff --git a/x-pack/plugins/security_solution/server/lib/detection_engine/rules/prepackaged_rules/defense_evasion_gcp_logging_sink_deletion.json b/x-pack/plugins/security_solution/server/lib/detection_engine/rules/prepackaged_rules/defense_evasion_gcp_logging_sink_deletion.json index b93701685a119..781bc1d2e9be7 100644 --- a/x-pack/plugins/security_solution/server/lib/detection_engine/rules/prepackaged_rules/defense_evasion_gcp_logging_sink_deletion.json +++ b/x-pack/plugins/security_solution/server/lib/detection_engine/rules/prepackaged_rules/defense_evasion_gcp_logging_sink_deletion.json @@ -20,8 +20,9 @@ ], "related_integrations": [ { + "integration": "audit", "package": "gcp", - "version": "1.10.0" + "version": "^2.2.1" } ], "required_fields": [ @@ -72,5 +73,5 @@ ], "timestamp_override": "event.ingested", "type": "query", - "version": 100 + "version": 101 } diff --git a/x-pack/plugins/security_solution/server/lib/detection_engine/rules/prepackaged_rules/defense_evasion_gcp_pub_sub_subscription_deletion.json b/x-pack/plugins/security_solution/server/lib/detection_engine/rules/prepackaged_rules/defense_evasion_gcp_pub_sub_subscription_deletion.json index bf1890f548c56..32e148dc25d61 100644 --- a/x-pack/plugins/security_solution/server/lib/detection_engine/rules/prepackaged_rules/defense_evasion_gcp_pub_sub_subscription_deletion.json +++ b/x-pack/plugins/security_solution/server/lib/detection_engine/rules/prepackaged_rules/defense_evasion_gcp_pub_sub_subscription_deletion.json @@ -20,8 +20,9 @@ ], "related_integrations": [ { + "integration": "audit", "package": "gcp", - "version": "1.10.0" + "version": "^2.2.1" } ], "required_fields": [ @@ -72,5 +73,5 @@ ], "timestamp_override": "event.ingested", "type": "query", - "version": 100 + "version": 101 } diff --git a/x-pack/plugins/security_solution/server/lib/detection_engine/rules/prepackaged_rules/defense_evasion_gcp_pub_sub_topic_deletion.json b/x-pack/plugins/security_solution/server/lib/detection_engine/rules/prepackaged_rules/defense_evasion_gcp_pub_sub_topic_deletion.json index 283b83874d89c..eee336c3d9b49 100644 --- a/x-pack/plugins/security_solution/server/lib/detection_engine/rules/prepackaged_rules/defense_evasion_gcp_pub_sub_topic_deletion.json +++ b/x-pack/plugins/security_solution/server/lib/detection_engine/rules/prepackaged_rules/defense_evasion_gcp_pub_sub_topic_deletion.json @@ -20,8 +20,9 @@ ], "related_integrations": [ { + "integration": "audit", "package": "gcp", - "version": "1.10.0" + "version": "^2.2.1" } ], "required_fields": [ @@ -72,5 +73,5 @@ ], "timestamp_override": "event.ingested", "type": "query", - "version": 100 + "version": 101 } diff --git a/x-pack/plugins/security_solution/server/lib/detection_engine/rules/prepackaged_rules/defense_evasion_gcp_storage_bucket_configuration_modified.json b/x-pack/plugins/security_solution/server/lib/detection_engine/rules/prepackaged_rules/defense_evasion_gcp_storage_bucket_configuration_modified.json index e0470117bd114..1bb6d123de889 100644 --- a/x-pack/plugins/security_solution/server/lib/detection_engine/rules/prepackaged_rules/defense_evasion_gcp_storage_bucket_configuration_modified.json +++ b/x-pack/plugins/security_solution/server/lib/detection_engine/rules/prepackaged_rules/defense_evasion_gcp_storage_bucket_configuration_modified.json @@ -20,8 +20,9 @@ ], "related_integrations": [ { + "integration": "audit", "package": "gcp", - "version": "1.10.0" + "version": "^2.2.1" } ], "required_fields": [ @@ -73,5 +74,5 @@ ], "timestamp_override": "event.ingested", "type": "query", - "version": 100 + "version": 101 } diff --git a/x-pack/plugins/security_solution/server/lib/detection_engine/rules/prepackaged_rules/defense_evasion_gcp_storage_bucket_permissions_modified.json b/x-pack/plugins/security_solution/server/lib/detection_engine/rules/prepackaged_rules/defense_evasion_gcp_storage_bucket_permissions_modified.json index f8f9cfad37be4..2a334c80ab68e 100644 --- a/x-pack/plugins/security_solution/server/lib/detection_engine/rules/prepackaged_rules/defense_evasion_gcp_storage_bucket_permissions_modified.json +++ b/x-pack/plugins/security_solution/server/lib/detection_engine/rules/prepackaged_rules/defense_evasion_gcp_storage_bucket_permissions_modified.json @@ -20,8 +20,9 @@ ], "related_integrations": [ { + "integration": "audit", "package": "gcp", - "version": "1.10.0" + "version": "^2.2.1" } ], "required_fields": [ @@ -72,5 +73,5 @@ ], "timestamp_override": "event.ingested", "type": "query", - "version": 100 + "version": 101 } diff --git a/x-pack/plugins/security_solution/server/lib/detection_engine/rules/prepackaged_rules/defense_evasion_gcp_virtual_private_cloud_network_deleted.json b/x-pack/plugins/security_solution/server/lib/detection_engine/rules/prepackaged_rules/defense_evasion_gcp_virtual_private_cloud_network_deleted.json index 76b058e65a1ca..54cb615d71560 100644 --- a/x-pack/plugins/security_solution/server/lib/detection_engine/rules/prepackaged_rules/defense_evasion_gcp_virtual_private_cloud_network_deleted.json +++ b/x-pack/plugins/security_solution/server/lib/detection_engine/rules/prepackaged_rules/defense_evasion_gcp_virtual_private_cloud_network_deleted.json @@ -20,8 +20,9 @@ ], "related_integrations": [ { + "integration": "audit", "package": "gcp", - "version": "1.10.0" + "version": "^2.2.1" } ], "required_fields": [ @@ -80,5 +81,5 @@ ], "timestamp_override": "event.ingested", "type": "query", - "version": 100 + "version": 101 } diff --git a/x-pack/plugins/security_solution/server/lib/detection_engine/rules/prepackaged_rules/defense_evasion_gcp_virtual_private_cloud_route_created.json b/x-pack/plugins/security_solution/server/lib/detection_engine/rules/prepackaged_rules/defense_evasion_gcp_virtual_private_cloud_route_created.json index c4f344846bd8f..5926141fdabba 100644 --- a/x-pack/plugins/security_solution/server/lib/detection_engine/rules/prepackaged_rules/defense_evasion_gcp_virtual_private_cloud_route_created.json +++ b/x-pack/plugins/security_solution/server/lib/detection_engine/rules/prepackaged_rules/defense_evasion_gcp_virtual_private_cloud_route_created.json @@ -21,8 +21,9 @@ ], "related_integrations": [ { + "integration": "audit", "package": "gcp", - "version": "1.10.0" + "version": "^2.2.1" } ], "required_fields": [ @@ -76,5 +77,5 @@ ], "timestamp_override": "event.ingested", "type": "query", - "version": 100 + "version": 101 } diff --git a/x-pack/plugins/security_solution/server/lib/detection_engine/rules/prepackaged_rules/defense_evasion_gcp_virtual_private_cloud_route_deleted.json b/x-pack/plugins/security_solution/server/lib/detection_engine/rules/prepackaged_rules/defense_evasion_gcp_virtual_private_cloud_route_deleted.json index e2b483fc9298d..ab75552f7a068 100644 --- a/x-pack/plugins/security_solution/server/lib/detection_engine/rules/prepackaged_rules/defense_evasion_gcp_virtual_private_cloud_route_deleted.json +++ b/x-pack/plugins/security_solution/server/lib/detection_engine/rules/prepackaged_rules/defense_evasion_gcp_virtual_private_cloud_route_deleted.json @@ -21,8 +21,9 @@ ], "related_integrations": [ { + "integration": "audit", "package": "gcp", - "version": "1.10.0" + "version": "^2.2.1" } ], "required_fields": [ @@ -81,5 +82,5 @@ ], "timestamp_override": "event.ingested", "type": "query", - "version": 100 + "version": 101 } diff --git a/x-pack/plugins/security_solution/server/lib/detection_engine/rules/prepackaged_rules/defense_evasion_google_workspace_bitlocker_setting_disabled.json b/x-pack/plugins/security_solution/server/lib/detection_engine/rules/prepackaged_rules/defense_evasion_google_workspace_bitlocker_setting_disabled.json index 018c8d0c9d6d6..8c0b5fbbb435e 100644 --- a/x-pack/plugins/security_solution/server/lib/detection_engine/rules/prepackaged_rules/defense_evasion_google_workspace_bitlocker_setting_disabled.json +++ b/x-pack/plugins/security_solution/server/lib/detection_engine/rules/prepackaged_rules/defense_evasion_google_workspace_bitlocker_setting_disabled.json @@ -23,7 +23,7 @@ "related_integrations": [ { "package": "google_workspace", - "version": "1.2.0" + "version": "^1.2.0" } ], "required_fields": [ @@ -92,5 +92,5 @@ ], "timestamp_override": "event.ingested", "type": "query", - "version": 1 + "version": 2 } diff --git a/x-pack/plugins/security_solution/server/lib/detection_engine/rules/prepackaged_rules/defense_evasion_google_workspace_restrictions_for_google_marketplace_changed_to_allow_any_app.json b/x-pack/plugins/security_solution/server/lib/detection_engine/rules/prepackaged_rules/defense_evasion_google_workspace_restrictions_for_google_marketplace_changed_to_allow_any_app.json index ddb123498fa8e..d69005491d5e7 100644 --- a/x-pack/plugins/security_solution/server/lib/detection_engine/rules/prepackaged_rules/defense_evasion_google_workspace_restrictions_for_google_marketplace_changed_to_allow_any_app.json +++ b/x-pack/plugins/security_solution/server/lib/detection_engine/rules/prepackaged_rules/defense_evasion_google_workspace_restrictions_for_google_marketplace_changed_to_allow_any_app.json @@ -23,7 +23,7 @@ "related_integrations": [ { "package": "google_workspace", - "version": "1.2.0" + "version": "^1.2.0" } ], "required_fields": [ @@ -102,5 +102,5 @@ ], "timestamp_override": "event.ingested", "type": "query", - "version": 1 + "version": 2 } diff --git a/x-pack/plugins/security_solution/server/lib/detection_engine/rules/prepackaged_rules/defense_evasion_guardduty_detector_deletion.json b/x-pack/plugins/security_solution/server/lib/detection_engine/rules/prepackaged_rules/defense_evasion_guardduty_detector_deletion.json index 5186e952ab841..dab57a174fc5b 100644 --- a/x-pack/plugins/security_solution/server/lib/detection_engine/rules/prepackaged_rules/defense_evasion_guardduty_detector_deletion.json +++ b/x-pack/plugins/security_solution/server/lib/detection_engine/rules/prepackaged_rules/defense_evasion_guardduty_detector_deletion.json @@ -25,7 +25,7 @@ { "integration": "cloudtrail", "package": "aws", - "version": "1.10.2" + "version": "^1.5.0" } ], "required_fields": [ @@ -88,5 +88,5 @@ ], "timestamp_override": "event.ingested", "type": "query", - "version": 100 + "version": 101 } diff --git a/x-pack/plugins/security_solution/server/lib/detection_engine/rules/prepackaged_rules/defense_evasion_kubernetes_events_deleted.json b/x-pack/plugins/security_solution/server/lib/detection_engine/rules/prepackaged_rules/defense_evasion_kubernetes_events_deleted.json index af1c51fa0a15d..c4f932ad4f6cc 100644 --- a/x-pack/plugins/security_solution/server/lib/detection_engine/rules/prepackaged_rules/defense_evasion_kubernetes_events_deleted.json +++ b/x-pack/plugins/security_solution/server/lib/detection_engine/rules/prepackaged_rules/defense_evasion_kubernetes_events_deleted.json @@ -23,7 +23,7 @@ { "integration": "activitylogs", "package": "azure", - "version": "0.12.0" + "version": "^1.0.0" } ], "required_fields": [ @@ -81,5 +81,5 @@ ], "timestamp_override": "event.ingested", "type": "query", - "version": 100 + "version": 101 } diff --git a/x-pack/plugins/security_solution/server/lib/detection_engine/rules/prepackaged_rules/defense_evasion_microsoft_365_exchange_dlp_policy_removed.json b/x-pack/plugins/security_solution/server/lib/detection_engine/rules/prepackaged_rules/defense_evasion_microsoft_365_exchange_dlp_policy_removed.json index bc5cc6202093e..bc1faac1570eb 100644 --- a/x-pack/plugins/security_solution/server/lib/detection_engine/rules/prepackaged_rules/defense_evasion_microsoft_365_exchange_dlp_policy_removed.json +++ b/x-pack/plugins/security_solution/server/lib/detection_engine/rules/prepackaged_rules/defense_evasion_microsoft_365_exchange_dlp_policy_removed.json @@ -23,7 +23,7 @@ "related_integrations": [ { "package": "o365", - "version": "1.3.0" + "version": "^1.3.0" } ], "required_fields": [ @@ -84,5 +84,5 @@ ], "timestamp_override": "event.ingested", "type": "query", - "version": 100 + "version": 101 } diff --git a/x-pack/plugins/security_solution/server/lib/detection_engine/rules/prepackaged_rules/defense_evasion_microsoft_365_exchange_malware_filter_policy_deletion.json b/x-pack/plugins/security_solution/server/lib/detection_engine/rules/prepackaged_rules/defense_evasion_microsoft_365_exchange_malware_filter_policy_deletion.json index 63901b5d86aa4..5f5974ad79b95 100644 --- a/x-pack/plugins/security_solution/server/lib/detection_engine/rules/prepackaged_rules/defense_evasion_microsoft_365_exchange_malware_filter_policy_deletion.json +++ b/x-pack/plugins/security_solution/server/lib/detection_engine/rules/prepackaged_rules/defense_evasion_microsoft_365_exchange_malware_filter_policy_deletion.json @@ -22,7 +22,7 @@ "related_integrations": [ { "package": "o365", - "version": "1.3.0" + "version": "^1.3.0" } ], "required_fields": [ @@ -83,5 +83,5 @@ ], "timestamp_override": "event.ingested", "type": "query", - "version": 100 + "version": 101 } diff --git a/x-pack/plugins/security_solution/server/lib/detection_engine/rules/prepackaged_rules/defense_evasion_microsoft_365_exchange_malware_filter_rule_mod.json b/x-pack/plugins/security_solution/server/lib/detection_engine/rules/prepackaged_rules/defense_evasion_microsoft_365_exchange_malware_filter_rule_mod.json index 3845a4e1c9a1c..92d1e2ee110f6 100644 --- a/x-pack/plugins/security_solution/server/lib/detection_engine/rules/prepackaged_rules/defense_evasion_microsoft_365_exchange_malware_filter_rule_mod.json +++ b/x-pack/plugins/security_solution/server/lib/detection_engine/rules/prepackaged_rules/defense_evasion_microsoft_365_exchange_malware_filter_rule_mod.json @@ -23,7 +23,7 @@ "related_integrations": [ { "package": "o365", - "version": "1.3.0" + "version": "^1.3.0" } ], "required_fields": [ @@ -84,5 +84,5 @@ ], "timestamp_override": "event.ingested", "type": "query", - "version": 100 + "version": 101 } diff --git a/x-pack/plugins/security_solution/server/lib/detection_engine/rules/prepackaged_rules/defense_evasion_microsoft_365_exchange_safe_attach_rule_disabled.json b/x-pack/plugins/security_solution/server/lib/detection_engine/rules/prepackaged_rules/defense_evasion_microsoft_365_exchange_safe_attach_rule_disabled.json index 8847290e99c88..098fc20b7dd0f 100644 --- a/x-pack/plugins/security_solution/server/lib/detection_engine/rules/prepackaged_rules/defense_evasion_microsoft_365_exchange_safe_attach_rule_disabled.json +++ b/x-pack/plugins/security_solution/server/lib/detection_engine/rules/prepackaged_rules/defense_evasion_microsoft_365_exchange_safe_attach_rule_disabled.json @@ -22,7 +22,7 @@ "related_integrations": [ { "package": "o365", - "version": "1.3.0" + "version": "^1.3.0" } ], "required_fields": [ @@ -83,5 +83,5 @@ ], "timestamp_override": "event.ingested", "type": "query", - "version": 100 + "version": 101 } diff --git a/x-pack/plugins/security_solution/server/lib/detection_engine/rules/prepackaged_rules/defense_evasion_microsoft_365_mailboxauditbypassassociation.json b/x-pack/plugins/security_solution/server/lib/detection_engine/rules/prepackaged_rules/defense_evasion_microsoft_365_mailboxauditbypassassociation.json index dfff4d9976356..7896aa38be705 100644 --- a/x-pack/plugins/security_solution/server/lib/detection_engine/rules/prepackaged_rules/defense_evasion_microsoft_365_mailboxauditbypassassociation.json +++ b/x-pack/plugins/security_solution/server/lib/detection_engine/rules/prepackaged_rules/defense_evasion_microsoft_365_mailboxauditbypassassociation.json @@ -22,7 +22,7 @@ "related_integrations": [ { "package": "o365", - "version": "1.3.0" + "version": "^1.3.0" } ], "required_fields": [ @@ -85,5 +85,5 @@ ], "timestamp_override": "event.ingested", "type": "query", - "version": 100 + "version": 101 } diff --git a/x-pack/plugins/security_solution/server/lib/detection_engine/rules/prepackaged_rules/defense_evasion_network_watcher_deletion.json b/x-pack/plugins/security_solution/server/lib/detection_engine/rules/prepackaged_rules/defense_evasion_network_watcher_deletion.json index 167baa27c2fe1..7124819843f76 100644 --- a/x-pack/plugins/security_solution/server/lib/detection_engine/rules/prepackaged_rules/defense_evasion_network_watcher_deletion.json +++ b/x-pack/plugins/security_solution/server/lib/detection_engine/rules/prepackaged_rules/defense_evasion_network_watcher_deletion.json @@ -23,7 +23,7 @@ { "integration": "activitylogs", "package": "azure", - "version": "0.12.0" + "version": "^1.0.0" } ], "required_fields": [ @@ -81,5 +81,5 @@ ], "timestamp_override": "event.ingested", "type": "query", - "version": 100 + "version": 101 } diff --git a/x-pack/plugins/security_solution/server/lib/detection_engine/rules/prepackaged_rules/defense_evasion_okta_attempt_to_deactivate_okta_policy.json b/x-pack/plugins/security_solution/server/lib/detection_engine/rules/prepackaged_rules/defense_evasion_okta_attempt_to_deactivate_okta_policy.json index e988bc58b4fe5..c615e34089ee6 100644 --- a/x-pack/plugins/security_solution/server/lib/detection_engine/rules/prepackaged_rules/defense_evasion_okta_attempt_to_deactivate_okta_policy.json +++ b/x-pack/plugins/security_solution/server/lib/detection_engine/rules/prepackaged_rules/defense_evasion_okta_attempt_to_deactivate_okta_policy.json @@ -23,7 +23,7 @@ "related_integrations": [ { "package": "okta", - "version": "1.3.0" + "version": "^1.3.0" } ], "required_fields": [ @@ -77,5 +77,5 @@ ], "timestamp_override": "event.ingested", "type": "query", - "version": 100 + "version": 101 } diff --git a/x-pack/plugins/security_solution/server/lib/detection_engine/rules/prepackaged_rules/defense_evasion_okta_attempt_to_deactivate_okta_policy_rule.json b/x-pack/plugins/security_solution/server/lib/detection_engine/rules/prepackaged_rules/defense_evasion_okta_attempt_to_deactivate_okta_policy_rule.json index 4ba9330f4a475..81d8782e6ce59 100644 --- a/x-pack/plugins/security_solution/server/lib/detection_engine/rules/prepackaged_rules/defense_evasion_okta_attempt_to_deactivate_okta_policy_rule.json +++ b/x-pack/plugins/security_solution/server/lib/detection_engine/rules/prepackaged_rules/defense_evasion_okta_attempt_to_deactivate_okta_policy_rule.json @@ -23,7 +23,7 @@ "related_integrations": [ { "package": "okta", - "version": "1.3.0" + "version": "^1.3.0" } ], "required_fields": [ @@ -77,5 +77,5 @@ ], "timestamp_override": "event.ingested", "type": "query", - "version": 100 + "version": 101 } diff --git a/x-pack/plugins/security_solution/server/lib/detection_engine/rules/prepackaged_rules/defense_evasion_okta_attempt_to_delete_okta_policy.json b/x-pack/plugins/security_solution/server/lib/detection_engine/rules/prepackaged_rules/defense_evasion_okta_attempt_to_delete_okta_policy.json index 040e7791483ee..86cd009618c3a 100644 --- a/x-pack/plugins/security_solution/server/lib/detection_engine/rules/prepackaged_rules/defense_evasion_okta_attempt_to_delete_okta_policy.json +++ b/x-pack/plugins/security_solution/server/lib/detection_engine/rules/prepackaged_rules/defense_evasion_okta_attempt_to_delete_okta_policy.json @@ -23,7 +23,7 @@ "related_integrations": [ { "package": "okta", - "version": "1.3.0" + "version": "^1.3.0" } ], "required_fields": [ @@ -77,5 +77,5 @@ ], "timestamp_override": "event.ingested", "type": "query", - "version": 100 + "version": 101 } diff --git a/x-pack/plugins/security_solution/server/lib/detection_engine/rules/prepackaged_rules/defense_evasion_okta_attempt_to_delete_okta_policy_rule.json b/x-pack/plugins/security_solution/server/lib/detection_engine/rules/prepackaged_rules/defense_evasion_okta_attempt_to_delete_okta_policy_rule.json index 7cdd8c780f786..295fb493e6ed2 100644 --- a/x-pack/plugins/security_solution/server/lib/detection_engine/rules/prepackaged_rules/defense_evasion_okta_attempt_to_delete_okta_policy_rule.json +++ b/x-pack/plugins/security_solution/server/lib/detection_engine/rules/prepackaged_rules/defense_evasion_okta_attempt_to_delete_okta_policy_rule.json @@ -23,7 +23,7 @@ "related_integrations": [ { "package": "okta", - "version": "1.3.0" + "version": "^1.3.0" } ], "required_fields": [ @@ -77,5 +77,5 @@ ], "timestamp_override": "event.ingested", "type": "query", - "version": 100 + "version": 101 } diff --git a/x-pack/plugins/security_solution/server/lib/detection_engine/rules/prepackaged_rules/defense_evasion_okta_attempt_to_modify_okta_network_zone.json b/x-pack/plugins/security_solution/server/lib/detection_engine/rules/prepackaged_rules/defense_evasion_okta_attempt_to_modify_okta_network_zone.json index f3a771f184e66..15a51b88c0975 100644 --- a/x-pack/plugins/security_solution/server/lib/detection_engine/rules/prepackaged_rules/defense_evasion_okta_attempt_to_modify_okta_network_zone.json +++ b/x-pack/plugins/security_solution/server/lib/detection_engine/rules/prepackaged_rules/defense_evasion_okta_attempt_to_modify_okta_network_zone.json @@ -23,7 +23,7 @@ "related_integrations": [ { "package": "okta", - "version": "1.3.0" + "version": "^1.3.0" } ], "required_fields": [ @@ -77,5 +77,5 @@ ], "timestamp_override": "event.ingested", "type": "query", - "version": 100 + "version": 101 } diff --git a/x-pack/plugins/security_solution/server/lib/detection_engine/rules/prepackaged_rules/defense_evasion_okta_attempt_to_modify_okta_policy.json b/x-pack/plugins/security_solution/server/lib/detection_engine/rules/prepackaged_rules/defense_evasion_okta_attempt_to_modify_okta_policy.json index 199d7de64979e..1a69f862b6954 100644 --- a/x-pack/plugins/security_solution/server/lib/detection_engine/rules/prepackaged_rules/defense_evasion_okta_attempt_to_modify_okta_policy.json +++ b/x-pack/plugins/security_solution/server/lib/detection_engine/rules/prepackaged_rules/defense_evasion_okta_attempt_to_modify_okta_policy.json @@ -22,7 +22,7 @@ "related_integrations": [ { "package": "okta", - "version": "1.3.0" + "version": "^1.3.0" } ], "required_fields": [ @@ -76,5 +76,5 @@ ], "timestamp_override": "event.ingested", "type": "query", - "version": 100 + "version": 101 } diff --git a/x-pack/plugins/security_solution/server/lib/detection_engine/rules/prepackaged_rules/defense_evasion_okta_attempt_to_modify_okta_policy_rule.json b/x-pack/plugins/security_solution/server/lib/detection_engine/rules/prepackaged_rules/defense_evasion_okta_attempt_to_modify_okta_policy_rule.json index 17aeae26a9836..358419263a30e 100644 --- a/x-pack/plugins/security_solution/server/lib/detection_engine/rules/prepackaged_rules/defense_evasion_okta_attempt_to_modify_okta_policy_rule.json +++ b/x-pack/plugins/security_solution/server/lib/detection_engine/rules/prepackaged_rules/defense_evasion_okta_attempt_to_modify_okta_policy_rule.json @@ -23,7 +23,7 @@ "related_integrations": [ { "package": "okta", - "version": "1.3.0" + "version": "^1.3.0" } ], "required_fields": [ @@ -77,5 +77,5 @@ ], "timestamp_override": "event.ingested", "type": "query", - "version": 100 + "version": 101 } diff --git a/x-pack/plugins/security_solution/server/lib/detection_engine/rules/prepackaged_rules/defense_evasion_s3_bucket_configuration_deletion.json b/x-pack/plugins/security_solution/server/lib/detection_engine/rules/prepackaged_rules/defense_evasion_s3_bucket_configuration_deletion.json index 1cada93687ba6..b61983f423a63 100644 --- a/x-pack/plugins/security_solution/server/lib/detection_engine/rules/prepackaged_rules/defense_evasion_s3_bucket_configuration_deletion.json +++ b/x-pack/plugins/security_solution/server/lib/detection_engine/rules/prepackaged_rules/defense_evasion_s3_bucket_configuration_deletion.json @@ -28,7 +28,7 @@ { "integration": "cloudtrail", "package": "aws", - "version": "1.10.2" + "version": "^1.5.0" } ], "required_fields": [ @@ -84,5 +84,5 @@ ], "timestamp_override": "event.ingested", "type": "query", - "version": 100 + "version": 101 } diff --git a/x-pack/plugins/security_solution/server/lib/detection_engine/rules/prepackaged_rules/defense_evasion_suppression_rule_created.json b/x-pack/plugins/security_solution/server/lib/detection_engine/rules/prepackaged_rules/defense_evasion_suppression_rule_created.json index 493e8dbbd0600..139e05bebcc54 100644 --- a/x-pack/plugins/security_solution/server/lib/detection_engine/rules/prepackaged_rules/defense_evasion_suppression_rule_created.json +++ b/x-pack/plugins/security_solution/server/lib/detection_engine/rules/prepackaged_rules/defense_evasion_suppression_rule_created.json @@ -24,7 +24,7 @@ { "integration": "activitylogs", "package": "azure", - "version": "0.12.0" + "version": "^1.0.0" } ], "required_fields": [ @@ -75,5 +75,5 @@ ], "timestamp_override": "event.ingested", "type": "query", - "version": 100 + "version": 101 } diff --git a/x-pack/plugins/security_solution/server/lib/detection_engine/rules/prepackaged_rules/defense_evasion_suspicious_okta_user_password_reset_or_unlock_attempts.json b/x-pack/plugins/security_solution/server/lib/detection_engine/rules/prepackaged_rules/defense_evasion_suspicious_okta_user_password_reset_or_unlock_attempts.json index 72a518d5542e0..f537c79c427e5 100644 --- a/x-pack/plugins/security_solution/server/lib/detection_engine/rules/prepackaged_rules/defense_evasion_suspicious_okta_user_password_reset_or_unlock_attempts.json +++ b/x-pack/plugins/security_solution/server/lib/detection_engine/rules/prepackaged_rules/defense_evasion_suspicious_okta_user_password_reset_or_unlock_attempts.json @@ -25,7 +25,7 @@ "related_integrations": [ { "package": "okta", - "version": "1.3.0" + "version": "^1.3.0" } ], "required_fields": [ @@ -106,5 +106,5 @@ "value": 5 }, "type": "threshold", - "version": 100 + "version": 101 } diff --git a/x-pack/plugins/security_solution/server/lib/detection_engine/rules/prepackaged_rules/defense_evasion_waf_acl_deletion.json b/x-pack/plugins/security_solution/server/lib/detection_engine/rules/prepackaged_rules/defense_evasion_waf_acl_deletion.json index 378a43273394a..9f34837071f79 100644 --- a/x-pack/plugins/security_solution/server/lib/detection_engine/rules/prepackaged_rules/defense_evasion_waf_acl_deletion.json +++ b/x-pack/plugins/security_solution/server/lib/detection_engine/rules/prepackaged_rules/defense_evasion_waf_acl_deletion.json @@ -25,7 +25,7 @@ { "integration": "cloudtrail", "package": "aws", - "version": "1.10.2" + "version": "^1.5.0" } ], "required_fields": [ @@ -83,5 +83,5 @@ ], "timestamp_override": "event.ingested", "type": "query", - "version": 100 + "version": 101 } diff --git a/x-pack/plugins/security_solution/server/lib/detection_engine/rules/prepackaged_rules/defense_evasion_waf_rule_or_rule_group_deletion.json b/x-pack/plugins/security_solution/server/lib/detection_engine/rules/prepackaged_rules/defense_evasion_waf_rule_or_rule_group_deletion.json index b1e136776c8d7..59eb206ec6bb9 100644 --- a/x-pack/plugins/security_solution/server/lib/detection_engine/rules/prepackaged_rules/defense_evasion_waf_rule_or_rule_group_deletion.json +++ b/x-pack/plugins/security_solution/server/lib/detection_engine/rules/prepackaged_rules/defense_evasion_waf_rule_or_rule_group_deletion.json @@ -25,7 +25,7 @@ { "integration": "cloudtrail", "package": "aws", - "version": "1.10.2" + "version": "^1.5.0" } ], "required_fields": [ @@ -88,5 +88,5 @@ ], "timestamp_override": "event.ingested", "type": "query", - "version": 100 + "version": 101 } diff --git a/x-pack/plugins/security_solution/server/lib/detection_engine/rules/prepackaged_rules/discovery_blob_container_access_mod.json b/x-pack/plugins/security_solution/server/lib/detection_engine/rules/prepackaged_rules/discovery_blob_container_access_mod.json index 59c500d798376..42671c621d45c 100644 --- a/x-pack/plugins/security_solution/server/lib/detection_engine/rules/prepackaged_rules/discovery_blob_container_access_mod.json +++ b/x-pack/plugins/security_solution/server/lib/detection_engine/rules/prepackaged_rules/discovery_blob_container_access_mod.json @@ -23,7 +23,7 @@ { "integration": "activitylogs", "package": "azure", - "version": "0.12.0" + "version": "^1.0.0" } ], "required_fields": [ @@ -89,5 +89,5 @@ ], "timestamp_override": "event.ingested", "type": "query", - "version": 100 + "version": 101 } diff --git a/x-pack/plugins/security_solution/server/lib/detection_engine/rules/prepackaged_rules/discovery_denied_service_account_request.json b/x-pack/plugins/security_solution/server/lib/detection_engine/rules/prepackaged_rules/discovery_denied_service_account_request.json index 84cafb61d094d..829a7a90c4228 100644 --- a/x-pack/plugins/security_solution/server/lib/detection_engine/rules/prepackaged_rules/discovery_denied_service_account_request.json +++ b/x-pack/plugins/security_solution/server/lib/detection_engine/rules/prepackaged_rules/discovery_denied_service_account_request.json @@ -21,7 +21,7 @@ "related_integrations": [ { "package": "kubernetes", - "version": "1.17.2" + "version": "^1.4.1" } ], "required_fields": [ @@ -70,5 +70,5 @@ ], "timestamp_override": "event.ingested", "type": "query", - "version": 1 + "version": 2 } diff --git a/x-pack/plugins/security_solution/server/lib/detection_engine/rules/prepackaged_rules/execution_command_virtual_machine.json b/x-pack/plugins/security_solution/server/lib/detection_engine/rules/prepackaged_rules/execution_command_virtual_machine.json index 1d4397fbf23dd..badcfa517ab20 100644 --- a/x-pack/plugins/security_solution/server/lib/detection_engine/rules/prepackaged_rules/execution_command_virtual_machine.json +++ b/x-pack/plugins/security_solution/server/lib/detection_engine/rules/prepackaged_rules/execution_command_virtual_machine.json @@ -25,7 +25,7 @@ { "integration": "activitylogs", "package": "azure", - "version": "0.12.0" + "version": "^1.0.0" } ], "required_fields": [ @@ -76,5 +76,5 @@ ], "timestamp_override": "event.ingested", "type": "query", - "version": 100 + "version": 101 } diff --git a/x-pack/plugins/security_solution/server/lib/detection_engine/rules/prepackaged_rules/exfiltration_ec2_full_network_packet_capture_detected.json b/x-pack/plugins/security_solution/server/lib/detection_engine/rules/prepackaged_rules/exfiltration_ec2_full_network_packet_capture_detected.json index 12b267935e024..a4bda89c20be5 100644 --- a/x-pack/plugins/security_solution/server/lib/detection_engine/rules/prepackaged_rules/exfiltration_ec2_full_network_packet_capture_detected.json +++ b/x-pack/plugins/security_solution/server/lib/detection_engine/rules/prepackaged_rules/exfiltration_ec2_full_network_packet_capture_detected.json @@ -26,7 +26,7 @@ { "integration": "cloudtrail", "package": "aws", - "version": "1.10.2" + "version": "^1.5.0" } ], "required_fields": [ @@ -97,5 +97,5 @@ ], "timestamp_override": "event.ingested", "type": "query", - "version": 100 + "version": 101 } diff --git a/x-pack/plugins/security_solution/server/lib/detection_engine/rules/prepackaged_rules/exfiltration_ec2_snapshot_change_activity.json b/x-pack/plugins/security_solution/server/lib/detection_engine/rules/prepackaged_rules/exfiltration_ec2_snapshot_change_activity.json index d8de82c5251a9..62f31b39b9628 100644 --- a/x-pack/plugins/security_solution/server/lib/detection_engine/rules/prepackaged_rules/exfiltration_ec2_snapshot_change_activity.json +++ b/x-pack/plugins/security_solution/server/lib/detection_engine/rules/prepackaged_rules/exfiltration_ec2_snapshot_change_activity.json @@ -25,7 +25,7 @@ { "integration": "cloudtrail", "package": "aws", - "version": "1.10.2" + "version": "^1.5.0" } ], "required_fields": [ @@ -78,5 +78,5 @@ ], "timestamp_override": "event.ingested", "type": "query", - "version": 101 + "version": 102 } diff --git a/x-pack/plugins/security_solution/server/lib/detection_engine/rules/prepackaged_rules/exfiltration_ec2_vm_export_failure.json b/x-pack/plugins/security_solution/server/lib/detection_engine/rules/prepackaged_rules/exfiltration_ec2_vm_export_failure.json index f8f9895aa9915..c0d9a50a8a5ca 100644 --- a/x-pack/plugins/security_solution/server/lib/detection_engine/rules/prepackaged_rules/exfiltration_ec2_vm_export_failure.json +++ b/x-pack/plugins/security_solution/server/lib/detection_engine/rules/prepackaged_rules/exfiltration_ec2_vm_export_failure.json @@ -25,7 +25,7 @@ { "integration": "cloudtrail", "package": "aws", - "version": "1.10.2" + "version": "^1.5.0" } ], "required_fields": [ @@ -96,5 +96,5 @@ ], "timestamp_override": "event.ingested", "type": "query", - "version": 100 + "version": 101 } diff --git a/x-pack/plugins/security_solution/server/lib/detection_engine/rules/prepackaged_rules/exfiltration_gcp_logging_sink_modification.json b/x-pack/plugins/security_solution/server/lib/detection_engine/rules/prepackaged_rules/exfiltration_gcp_logging_sink_modification.json index 00154239c029f..dd7a0d6c59264 100644 --- a/x-pack/plugins/security_solution/server/lib/detection_engine/rules/prepackaged_rules/exfiltration_gcp_logging_sink_modification.json +++ b/x-pack/plugins/security_solution/server/lib/detection_engine/rules/prepackaged_rules/exfiltration_gcp_logging_sink_modification.json @@ -20,8 +20,9 @@ ], "related_integrations": [ { + "integration": "audit", "package": "gcp", - "version": "1.10.0" + "version": "^2.2.1" } ], "required_fields": [ @@ -72,5 +73,5 @@ ], "timestamp_override": "event.ingested", "type": "query", - "version": 100 + "version": 101 } diff --git a/x-pack/plugins/security_solution/server/lib/detection_engine/rules/prepackaged_rules/exfiltration_microsoft_365_exchange_transport_rule_creation.json b/x-pack/plugins/security_solution/server/lib/detection_engine/rules/prepackaged_rules/exfiltration_microsoft_365_exchange_transport_rule_creation.json index 0017b57c6dbc5..62cffaebe5b00 100644 --- a/x-pack/plugins/security_solution/server/lib/detection_engine/rules/prepackaged_rules/exfiltration_microsoft_365_exchange_transport_rule_creation.json +++ b/x-pack/plugins/security_solution/server/lib/detection_engine/rules/prepackaged_rules/exfiltration_microsoft_365_exchange_transport_rule_creation.json @@ -23,7 +23,7 @@ "related_integrations": [ { "package": "o365", - "version": "1.3.0" + "version": "^1.3.0" } ], "required_fields": [ @@ -84,5 +84,5 @@ ], "timestamp_override": "event.ingested", "type": "query", - "version": 100 + "version": 101 } diff --git a/x-pack/plugins/security_solution/server/lib/detection_engine/rules/prepackaged_rules/exfiltration_microsoft_365_exchange_transport_rule_mod.json b/x-pack/plugins/security_solution/server/lib/detection_engine/rules/prepackaged_rules/exfiltration_microsoft_365_exchange_transport_rule_mod.json index 5931b6c32f0ae..4f6ac0d2e6e9c 100644 --- a/x-pack/plugins/security_solution/server/lib/detection_engine/rules/prepackaged_rules/exfiltration_microsoft_365_exchange_transport_rule_mod.json +++ b/x-pack/plugins/security_solution/server/lib/detection_engine/rules/prepackaged_rules/exfiltration_microsoft_365_exchange_transport_rule_mod.json @@ -24,7 +24,7 @@ "related_integrations": [ { "package": "o365", - "version": "1.3.0" + "version": "^1.3.0" } ], "required_fields": [ @@ -85,5 +85,5 @@ ], "timestamp_override": "event.ingested", "type": "query", - "version": 100 + "version": 101 } diff --git a/x-pack/plugins/security_solution/server/lib/detection_engine/rules/prepackaged_rules/exfiltration_rds_snapshot_export.json b/x-pack/plugins/security_solution/server/lib/detection_engine/rules/prepackaged_rules/exfiltration_rds_snapshot_export.json index 3e344f4a0b872..2da17b0259f6b 100644 --- a/x-pack/plugins/security_solution/server/lib/detection_engine/rules/prepackaged_rules/exfiltration_rds_snapshot_export.json +++ b/x-pack/plugins/security_solution/server/lib/detection_engine/rules/prepackaged_rules/exfiltration_rds_snapshot_export.json @@ -25,7 +25,7 @@ { "integration": "cloudtrail", "package": "aws", - "version": "1.10.2" + "version": "^1.5.0" } ], "required_fields": [ @@ -76,5 +76,5 @@ ], "timestamp_override": "event.ingested", "type": "query", - "version": 100 + "version": 101 } diff --git a/x-pack/plugins/security_solution/server/lib/detection_engine/rules/prepackaged_rules/exfiltration_rds_snapshot_restored.json b/x-pack/plugins/security_solution/server/lib/detection_engine/rules/prepackaged_rules/exfiltration_rds_snapshot_restored.json index 264907bd84b60..fc9a4124e2d43 100644 --- a/x-pack/plugins/security_solution/server/lib/detection_engine/rules/prepackaged_rules/exfiltration_rds_snapshot_restored.json +++ b/x-pack/plugins/security_solution/server/lib/detection_engine/rules/prepackaged_rules/exfiltration_rds_snapshot_restored.json @@ -23,7 +23,7 @@ { "integration": "cloudtrail", "package": "aws", - "version": "1.10.2" + "version": "^1.5.0" } ], "required_fields": [ @@ -87,5 +87,5 @@ ], "timestamp_override": "event.ingested", "type": "query", - "version": 100 + "version": 101 } diff --git a/x-pack/plugins/security_solution/server/lib/detection_engine/rules/prepackaged_rules/impact_attempt_to_revoke_okta_api_token.json b/x-pack/plugins/security_solution/server/lib/detection_engine/rules/prepackaged_rules/impact_attempt_to_revoke_okta_api_token.json index 59a472b0713d2..0c2c25e53bc31 100644 --- a/x-pack/plugins/security_solution/server/lib/detection_engine/rules/prepackaged_rules/impact_attempt_to_revoke_okta_api_token.json +++ b/x-pack/plugins/security_solution/server/lib/detection_engine/rules/prepackaged_rules/impact_attempt_to_revoke_okta_api_token.json @@ -22,7 +22,7 @@ "related_integrations": [ { "package": "okta", - "version": "1.3.0" + "version": "^1.3.0" } ], "required_fields": [ @@ -68,5 +68,5 @@ ], "timestamp_override": "event.ingested", "type": "query", - "version": 100 + "version": 101 } diff --git a/x-pack/plugins/security_solution/server/lib/detection_engine/rules/prepackaged_rules/impact_aws_eventbridge_rule_disabled_or_deleted.json b/x-pack/plugins/security_solution/server/lib/detection_engine/rules/prepackaged_rules/impact_aws_eventbridge_rule_disabled_or_deleted.json index 888b6b54cb17d..a8cf9c9f21d74 100644 --- a/x-pack/plugins/security_solution/server/lib/detection_engine/rules/prepackaged_rules/impact_aws_eventbridge_rule_disabled_or_deleted.json +++ b/x-pack/plugins/security_solution/server/lib/detection_engine/rules/prepackaged_rules/impact_aws_eventbridge_rule_disabled_or_deleted.json @@ -24,7 +24,7 @@ { "integration": "cloudtrail", "package": "aws", - "version": "1.10.2" + "version": "^1.5.0" } ], "required_fields": [ @@ -81,5 +81,5 @@ ], "timestamp_override": "event.ingested", "type": "query", - "version": 100 + "version": 101 } diff --git a/x-pack/plugins/security_solution/server/lib/detection_engine/rules/prepackaged_rules/impact_azure_service_principal_credentials_added.json b/x-pack/plugins/security_solution/server/lib/detection_engine/rules/prepackaged_rules/impact_azure_service_principal_credentials_added.json index 584f87b741a28..93281b57f4294 100644 --- a/x-pack/plugins/security_solution/server/lib/detection_engine/rules/prepackaged_rules/impact_azure_service_principal_credentials_added.json +++ b/x-pack/plugins/security_solution/server/lib/detection_engine/rules/prepackaged_rules/impact_azure_service_principal_credentials_added.json @@ -24,7 +24,7 @@ "related_integrations": [ { "package": "azure", - "version": "0.12.0" + "version": "^1.0.0" } ], "required_fields": [ @@ -75,5 +75,5 @@ ], "timestamp_override": "event.ingested", "type": "query", - "version": 100 + "version": 101 } diff --git a/x-pack/plugins/security_solution/server/lib/detection_engine/rules/prepackaged_rules/impact_cloudtrail_logging_updated.json b/x-pack/plugins/security_solution/server/lib/detection_engine/rules/prepackaged_rules/impact_cloudtrail_logging_updated.json index 80ad1350df659..a46154a969efb 100644 --- a/x-pack/plugins/security_solution/server/lib/detection_engine/rules/prepackaged_rules/impact_cloudtrail_logging_updated.json +++ b/x-pack/plugins/security_solution/server/lib/detection_engine/rules/prepackaged_rules/impact_cloudtrail_logging_updated.json @@ -25,7 +25,7 @@ { "integration": "cloudtrail", "package": "aws", - "version": "1.10.2" + "version": "^1.5.0" } ], "required_fields": [ @@ -104,5 +104,5 @@ ], "timestamp_override": "event.ingested", "type": "query", - "version": 101 + "version": 102 } diff --git a/x-pack/plugins/security_solution/server/lib/detection_engine/rules/prepackaged_rules/impact_cloudwatch_log_group_deletion.json b/x-pack/plugins/security_solution/server/lib/detection_engine/rules/prepackaged_rules/impact_cloudwatch_log_group_deletion.json index 5734ffe4c312a..b0519a0afa475 100644 --- a/x-pack/plugins/security_solution/server/lib/detection_engine/rules/prepackaged_rules/impact_cloudwatch_log_group_deletion.json +++ b/x-pack/plugins/security_solution/server/lib/detection_engine/rules/prepackaged_rules/impact_cloudwatch_log_group_deletion.json @@ -25,7 +25,7 @@ { "integration": "cloudtrail", "package": "aws", - "version": "1.10.2" + "version": "^1.5.0" } ], "required_fields": [ @@ -104,5 +104,5 @@ ], "timestamp_override": "event.ingested", "type": "query", - "version": 101 + "version": 102 } diff --git a/x-pack/plugins/security_solution/server/lib/detection_engine/rules/prepackaged_rules/impact_cloudwatch_log_stream_deletion.json b/x-pack/plugins/security_solution/server/lib/detection_engine/rules/prepackaged_rules/impact_cloudwatch_log_stream_deletion.json index 04870a18138e7..3b188fb8a1ad1 100644 --- a/x-pack/plugins/security_solution/server/lib/detection_engine/rules/prepackaged_rules/impact_cloudwatch_log_stream_deletion.json +++ b/x-pack/plugins/security_solution/server/lib/detection_engine/rules/prepackaged_rules/impact_cloudwatch_log_stream_deletion.json @@ -25,7 +25,7 @@ { "integration": "cloudtrail", "package": "aws", - "version": "1.10.2" + "version": "^1.5.0" } ], "required_fields": [ @@ -105,5 +105,5 @@ ], "timestamp_override": "event.ingested", "type": "query", - "version": 101 + "version": 102 } diff --git a/x-pack/plugins/security_solution/server/lib/detection_engine/rules/prepackaged_rules/impact_ec2_disable_ebs_encryption.json b/x-pack/plugins/security_solution/server/lib/detection_engine/rules/prepackaged_rules/impact_ec2_disable_ebs_encryption.json index 6f280977acbe9..78989e7934a49 100644 --- a/x-pack/plugins/security_solution/server/lib/detection_engine/rules/prepackaged_rules/impact_ec2_disable_ebs_encryption.json +++ b/x-pack/plugins/security_solution/server/lib/detection_engine/rules/prepackaged_rules/impact_ec2_disable_ebs_encryption.json @@ -26,7 +26,7 @@ { "integration": "cloudtrail", "package": "aws", - "version": "1.10.2" + "version": "^1.5.0" } ], "required_fields": [ @@ -89,5 +89,5 @@ ], "timestamp_override": "event.ingested", "type": "query", - "version": 100 + "version": 101 } diff --git a/x-pack/plugins/security_solution/server/lib/detection_engine/rules/prepackaged_rules/impact_efs_filesystem_or_mount_deleted.json b/x-pack/plugins/security_solution/server/lib/detection_engine/rules/prepackaged_rules/impact_efs_filesystem_or_mount_deleted.json index c581b4cd72b60..1ba9aa185a726 100644 --- a/x-pack/plugins/security_solution/server/lib/detection_engine/rules/prepackaged_rules/impact_efs_filesystem_or_mount_deleted.json +++ b/x-pack/plugins/security_solution/server/lib/detection_engine/rules/prepackaged_rules/impact_efs_filesystem_or_mount_deleted.json @@ -25,7 +25,7 @@ { "integration": "cloudtrail", "package": "aws", - "version": "1.10.2" + "version": "^1.5.0" } ], "required_fields": [ @@ -81,5 +81,5 @@ ], "timestamp_override": "event.ingested", "type": "query", - "version": 100 + "version": 101 } diff --git a/x-pack/plugins/security_solution/server/lib/detection_engine/rules/prepackaged_rules/impact_gcp_iam_role_deletion.json b/x-pack/plugins/security_solution/server/lib/detection_engine/rules/prepackaged_rules/impact_gcp_iam_role_deletion.json index fe9dec0ced231..4f6e6aea313a1 100644 --- a/x-pack/plugins/security_solution/server/lib/detection_engine/rules/prepackaged_rules/impact_gcp_iam_role_deletion.json +++ b/x-pack/plugins/security_solution/server/lib/detection_engine/rules/prepackaged_rules/impact_gcp_iam_role_deletion.json @@ -20,8 +20,9 @@ ], "related_integrations": [ { + "integration": "audit", "package": "gcp", - "version": "1.10.0" + "version": "^2.2.1" } ], "required_fields": [ @@ -72,5 +73,5 @@ ], "timestamp_override": "event.ingested", "type": "query", - "version": 100 + "version": 101 } diff --git a/x-pack/plugins/security_solution/server/lib/detection_engine/rules/prepackaged_rules/impact_gcp_service_account_deleted.json b/x-pack/plugins/security_solution/server/lib/detection_engine/rules/prepackaged_rules/impact_gcp_service_account_deleted.json index e8a6f08922570..640c048d79ce2 100644 --- a/x-pack/plugins/security_solution/server/lib/detection_engine/rules/prepackaged_rules/impact_gcp_service_account_deleted.json +++ b/x-pack/plugins/security_solution/server/lib/detection_engine/rules/prepackaged_rules/impact_gcp_service_account_deleted.json @@ -20,8 +20,9 @@ ], "related_integrations": [ { + "integration": "audit", "package": "gcp", - "version": "1.10.0" + "version": "^2.2.1" } ], "required_fields": [ @@ -72,5 +73,5 @@ ], "timestamp_override": "event.ingested", "type": "query", - "version": 100 + "version": 101 } diff --git a/x-pack/plugins/security_solution/server/lib/detection_engine/rules/prepackaged_rules/impact_gcp_service_account_disabled.json b/x-pack/plugins/security_solution/server/lib/detection_engine/rules/prepackaged_rules/impact_gcp_service_account_disabled.json index 23531bad359b1..f9a09d4eb6e05 100644 --- a/x-pack/plugins/security_solution/server/lib/detection_engine/rules/prepackaged_rules/impact_gcp_service_account_disabled.json +++ b/x-pack/plugins/security_solution/server/lib/detection_engine/rules/prepackaged_rules/impact_gcp_service_account_disabled.json @@ -20,8 +20,9 @@ ], "related_integrations": [ { + "integration": "audit", "package": "gcp", - "version": "1.10.0" + "version": "^2.2.1" } ], "required_fields": [ @@ -72,5 +73,5 @@ ], "timestamp_override": "event.ingested", "type": "query", - "version": 100 + "version": 101 } diff --git a/x-pack/plugins/security_solution/server/lib/detection_engine/rules/prepackaged_rules/impact_gcp_storage_bucket_deleted.json b/x-pack/plugins/security_solution/server/lib/detection_engine/rules/prepackaged_rules/impact_gcp_storage_bucket_deleted.json index ec518694a2549..8648402625a35 100644 --- a/x-pack/plugins/security_solution/server/lib/detection_engine/rules/prepackaged_rules/impact_gcp_storage_bucket_deleted.json +++ b/x-pack/plugins/security_solution/server/lib/detection_engine/rules/prepackaged_rules/impact_gcp_storage_bucket_deleted.json @@ -20,8 +20,9 @@ ], "related_integrations": [ { + "integration": "audit", "package": "gcp", - "version": "1.10.0" + "version": "^2.2.1" } ], "required_fields": [ @@ -67,5 +68,5 @@ ], "timestamp_override": "event.ingested", "type": "query", - "version": 100 + "version": 101 } diff --git a/x-pack/plugins/security_solution/server/lib/detection_engine/rules/prepackaged_rules/impact_google_workspace_admin_role_deletion.json b/x-pack/plugins/security_solution/server/lib/detection_engine/rules/prepackaged_rules/impact_google_workspace_admin_role_deletion.json index 735baec178a6f..791efdc6463e4 100644 --- a/x-pack/plugins/security_solution/server/lib/detection_engine/rules/prepackaged_rules/impact_google_workspace_admin_role_deletion.json +++ b/x-pack/plugins/security_solution/server/lib/detection_engine/rules/prepackaged_rules/impact_google_workspace_admin_role_deletion.json @@ -23,7 +23,7 @@ "related_integrations": [ { "package": "google_workspace", - "version": "1.2.0" + "version": "^1.2.0" } ], "required_fields": [ @@ -80,5 +80,5 @@ ], "timestamp_override": "event.ingested", "type": "query", - "version": 100 + "version": 101 } diff --git a/x-pack/plugins/security_solution/server/lib/detection_engine/rules/prepackaged_rules/impact_google_workspace_mfa_enforcement_disabled.json b/x-pack/plugins/security_solution/server/lib/detection_engine/rules/prepackaged_rules/impact_google_workspace_mfa_enforcement_disabled.json index 6095c3c3a3923..cf2dd80c5fd30 100644 --- a/x-pack/plugins/security_solution/server/lib/detection_engine/rules/prepackaged_rules/impact_google_workspace_mfa_enforcement_disabled.json +++ b/x-pack/plugins/security_solution/server/lib/detection_engine/rules/prepackaged_rules/impact_google_workspace_mfa_enforcement_disabled.json @@ -23,7 +23,7 @@ "related_integrations": [ { "package": "google_workspace", - "version": "1.2.0" + "version": "^1.2.0" } ], "required_fields": [ @@ -86,5 +86,5 @@ ], "timestamp_override": "event.ingested", "type": "query", - "version": 101 + "version": 102 } diff --git a/x-pack/plugins/security_solution/server/lib/detection_engine/rules/prepackaged_rules/impact_iam_deactivate_mfa_device.json b/x-pack/plugins/security_solution/server/lib/detection_engine/rules/prepackaged_rules/impact_iam_deactivate_mfa_device.json index 49c4f32551554..99bb18ad43560 100644 --- a/x-pack/plugins/security_solution/server/lib/detection_engine/rules/prepackaged_rules/impact_iam_deactivate_mfa_device.json +++ b/x-pack/plugins/security_solution/server/lib/detection_engine/rules/prepackaged_rules/impact_iam_deactivate_mfa_device.json @@ -26,7 +26,7 @@ { "integration": "cloudtrail", "package": "aws", - "version": "1.10.2" + "version": "^1.5.0" } ], "required_fields": [ @@ -83,5 +83,5 @@ ], "timestamp_override": "event.ingested", "type": "query", - "version": 101 + "version": 102 } diff --git a/x-pack/plugins/security_solution/server/lib/detection_engine/rules/prepackaged_rules/impact_iam_group_deletion.json b/x-pack/plugins/security_solution/server/lib/detection_engine/rules/prepackaged_rules/impact_iam_group_deletion.json index e5b9b9d2b3d0d..f16bdaa569c19 100644 --- a/x-pack/plugins/security_solution/server/lib/detection_engine/rules/prepackaged_rules/impact_iam_group_deletion.json +++ b/x-pack/plugins/security_solution/server/lib/detection_engine/rules/prepackaged_rules/impact_iam_group_deletion.json @@ -25,7 +25,7 @@ { "integration": "cloudtrail", "package": "aws", - "version": "1.10.2" + "version": "^1.5.0" } ], "required_fields": [ @@ -81,5 +81,5 @@ ], "timestamp_override": "event.ingested", "type": "query", - "version": 100 + "version": 101 } diff --git a/x-pack/plugins/security_solution/server/lib/detection_engine/rules/prepackaged_rules/impact_kubernetes_pod_deleted.json b/x-pack/plugins/security_solution/server/lib/detection_engine/rules/prepackaged_rules/impact_kubernetes_pod_deleted.json index 79792cad4e962..0c8c3ab14c16a 100644 --- a/x-pack/plugins/security_solution/server/lib/detection_engine/rules/prepackaged_rules/impact_kubernetes_pod_deleted.json +++ b/x-pack/plugins/security_solution/server/lib/detection_engine/rules/prepackaged_rules/impact_kubernetes_pod_deleted.json @@ -23,7 +23,7 @@ { "integration": "activitylogs", "package": "azure", - "version": "0.12.0" + "version": "^1.0.0" } ], "required_fields": [ @@ -68,5 +68,5 @@ ], "timestamp_override": "event.ingested", "type": "query", - "version": 100 + "version": 101 } diff --git a/x-pack/plugins/security_solution/server/lib/detection_engine/rules/prepackaged_rules/impact_microsoft_365_potential_ransomware_activity.json b/x-pack/plugins/security_solution/server/lib/detection_engine/rules/prepackaged_rules/impact_microsoft_365_potential_ransomware_activity.json index 1419e6c36cd2b..ae82beafce000 100644 --- a/x-pack/plugins/security_solution/server/lib/detection_engine/rules/prepackaged_rules/impact_microsoft_365_potential_ransomware_activity.json +++ b/x-pack/plugins/security_solution/server/lib/detection_engine/rules/prepackaged_rules/impact_microsoft_365_potential_ransomware_activity.json @@ -23,7 +23,7 @@ "related_integrations": [ { "package": "o365", - "version": "1.3.0" + "version": "^1.3.0" } ], "required_fields": [ @@ -84,5 +84,5 @@ ], "timestamp_override": "event.ingested", "type": "query", - "version": 100 + "version": 101 } diff --git a/x-pack/plugins/security_solution/server/lib/detection_engine/rules/prepackaged_rules/impact_microsoft_365_unusual_volume_of_file_deletion.json b/x-pack/plugins/security_solution/server/lib/detection_engine/rules/prepackaged_rules/impact_microsoft_365_unusual_volume_of_file_deletion.json index b572bfdbbaef6..0954bde765041 100644 --- a/x-pack/plugins/security_solution/server/lib/detection_engine/rules/prepackaged_rules/impact_microsoft_365_unusual_volume_of_file_deletion.json +++ b/x-pack/plugins/security_solution/server/lib/detection_engine/rules/prepackaged_rules/impact_microsoft_365_unusual_volume_of_file_deletion.json @@ -23,7 +23,7 @@ "related_integrations": [ { "package": "o365", - "version": "1.3.0" + "version": "^1.3.0" } ], "required_fields": [ @@ -84,5 +84,5 @@ ], "timestamp_override": "event.ingested", "type": "query", - "version": 100 + "version": 101 } diff --git a/x-pack/plugins/security_solution/server/lib/detection_engine/rules/prepackaged_rules/impact_okta_attempt_to_deactivate_okta_application.json b/x-pack/plugins/security_solution/server/lib/detection_engine/rules/prepackaged_rules/impact_okta_attempt_to_deactivate_okta_application.json index 70551d2c173d9..790e19aaf182c 100644 --- a/x-pack/plugins/security_solution/server/lib/detection_engine/rules/prepackaged_rules/impact_okta_attempt_to_deactivate_okta_application.json +++ b/x-pack/plugins/security_solution/server/lib/detection_engine/rules/prepackaged_rules/impact_okta_attempt_to_deactivate_okta_application.json @@ -23,7 +23,7 @@ "related_integrations": [ { "package": "okta", - "version": "1.3.0" + "version": "^1.3.0" } ], "required_fields": [ @@ -70,5 +70,5 @@ ], "timestamp_override": "event.ingested", "type": "query", - "version": 100 + "version": 101 } diff --git a/x-pack/plugins/security_solution/server/lib/detection_engine/rules/prepackaged_rules/impact_okta_attempt_to_delete_okta_application.json b/x-pack/plugins/security_solution/server/lib/detection_engine/rules/prepackaged_rules/impact_okta_attempt_to_delete_okta_application.json index bf7c616bb33ff..c816403377b76 100644 --- a/x-pack/plugins/security_solution/server/lib/detection_engine/rules/prepackaged_rules/impact_okta_attempt_to_delete_okta_application.json +++ b/x-pack/plugins/security_solution/server/lib/detection_engine/rules/prepackaged_rules/impact_okta_attempt_to_delete_okta_application.json @@ -22,7 +22,7 @@ "related_integrations": [ { "package": "okta", - "version": "1.3.0" + "version": "^1.3.0" } ], "required_fields": [ @@ -69,5 +69,5 @@ ], "timestamp_override": "event.ingested", "type": "query", - "version": 100 + "version": 101 } diff --git a/x-pack/plugins/security_solution/server/lib/detection_engine/rules/prepackaged_rules/impact_okta_attempt_to_modify_okta_application.json b/x-pack/plugins/security_solution/server/lib/detection_engine/rules/prepackaged_rules/impact_okta_attempt_to_modify_okta_application.json index 853116822a349..c6fdccd640393 100644 --- a/x-pack/plugins/security_solution/server/lib/detection_engine/rules/prepackaged_rules/impact_okta_attempt_to_modify_okta_application.json +++ b/x-pack/plugins/security_solution/server/lib/detection_engine/rules/prepackaged_rules/impact_okta_attempt_to_modify_okta_application.json @@ -23,7 +23,7 @@ "related_integrations": [ { "package": "okta", - "version": "1.3.0" + "version": "^1.3.0" } ], "required_fields": [ @@ -64,5 +64,5 @@ ], "timestamp_override": "event.ingested", "type": "query", - "version": 100 + "version": 101 } diff --git a/x-pack/plugins/security_solution/server/lib/detection_engine/rules/prepackaged_rules/impact_possible_okta_dos_attack.json b/x-pack/plugins/security_solution/server/lib/detection_engine/rules/prepackaged_rules/impact_possible_okta_dos_attack.json index 85f7502f26e0a..7fc0083fc13c6 100644 --- a/x-pack/plugins/security_solution/server/lib/detection_engine/rules/prepackaged_rules/impact_possible_okta_dos_attack.json +++ b/x-pack/plugins/security_solution/server/lib/detection_engine/rules/prepackaged_rules/impact_possible_okta_dos_attack.json @@ -19,7 +19,7 @@ "related_integrations": [ { "package": "okta", - "version": "1.3.0" + "version": "^1.3.0" } ], "required_fields": [ @@ -70,5 +70,5 @@ ], "timestamp_override": "event.ingested", "type": "query", - "version": 100 + "version": 101 } diff --git a/x-pack/plugins/security_solution/server/lib/detection_engine/rules/prepackaged_rules/impact_rds_group_deletion.json b/x-pack/plugins/security_solution/server/lib/detection_engine/rules/prepackaged_rules/impact_rds_group_deletion.json index 155afc369af24..9c7dcff92bb1b 100644 --- a/x-pack/plugins/security_solution/server/lib/detection_engine/rules/prepackaged_rules/impact_rds_group_deletion.json +++ b/x-pack/plugins/security_solution/server/lib/detection_engine/rules/prepackaged_rules/impact_rds_group_deletion.json @@ -25,7 +25,7 @@ { "integration": "cloudtrail", "package": "aws", - "version": "1.10.2" + "version": "^1.5.0" } ], "required_fields": [ @@ -81,5 +81,5 @@ ], "timestamp_override": "event.ingested", "type": "query", - "version": 100 + "version": 101 } diff --git a/x-pack/plugins/security_solution/server/lib/detection_engine/rules/prepackaged_rules/impact_rds_instance_cluster_deletion.json b/x-pack/plugins/security_solution/server/lib/detection_engine/rules/prepackaged_rules/impact_rds_instance_cluster_deletion.json index 18b277adc56db..bb3527fac3d49 100644 --- a/x-pack/plugins/security_solution/server/lib/detection_engine/rules/prepackaged_rules/impact_rds_instance_cluster_deletion.json +++ b/x-pack/plugins/security_solution/server/lib/detection_engine/rules/prepackaged_rules/impact_rds_instance_cluster_deletion.json @@ -29,7 +29,7 @@ { "integration": "cloudtrail", "package": "aws", - "version": "1.10.2" + "version": "^1.5.0" } ], "required_fields": [ @@ -85,5 +85,5 @@ ], "timestamp_override": "event.ingested", "type": "query", - "version": 100 + "version": 101 } diff --git a/x-pack/plugins/security_solution/server/lib/detection_engine/rules/prepackaged_rules/impact_rds_instance_cluster_stoppage.json b/x-pack/plugins/security_solution/server/lib/detection_engine/rules/prepackaged_rules/impact_rds_instance_cluster_stoppage.json index 15e02efcb8e4c..dc5ce6e246bf6 100644 --- a/x-pack/plugins/security_solution/server/lib/detection_engine/rules/prepackaged_rules/impact_rds_instance_cluster_stoppage.json +++ b/x-pack/plugins/security_solution/server/lib/detection_engine/rules/prepackaged_rules/impact_rds_instance_cluster_stoppage.json @@ -27,7 +27,7 @@ { "integration": "cloudtrail", "package": "aws", - "version": "1.10.2" + "version": "^1.5.0" } ], "required_fields": [ @@ -83,5 +83,5 @@ ], "timestamp_override": "event.ingested", "type": "query", - "version": 100 + "version": 101 } diff --git a/x-pack/plugins/security_solution/server/lib/detection_engine/rules/prepackaged_rules/impact_resource_group_deletion.json b/x-pack/plugins/security_solution/server/lib/detection_engine/rules/prepackaged_rules/impact_resource_group_deletion.json index 453c189f75d16..f7603f5b2f8e7 100644 --- a/x-pack/plugins/security_solution/server/lib/detection_engine/rules/prepackaged_rules/impact_resource_group_deletion.json +++ b/x-pack/plugins/security_solution/server/lib/detection_engine/rules/prepackaged_rules/impact_resource_group_deletion.json @@ -23,7 +23,7 @@ { "integration": "activitylogs", "package": "azure", - "version": "0.12.0" + "version": "^1.0.0" } ], "required_fields": [ @@ -96,5 +96,5 @@ ], "timestamp_override": "event.ingested", "type": "query", - "version": 100 + "version": 101 } diff --git a/x-pack/plugins/security_solution/server/lib/detection_engine/rules/prepackaged_rules/impact_virtual_network_device_modified.json b/x-pack/plugins/security_solution/server/lib/detection_engine/rules/prepackaged_rules/impact_virtual_network_device_modified.json index d090ae229addd..bf74fe3509c42 100644 --- a/x-pack/plugins/security_solution/server/lib/detection_engine/rules/prepackaged_rules/impact_virtual_network_device_modified.json +++ b/x-pack/plugins/security_solution/server/lib/detection_engine/rules/prepackaged_rules/impact_virtual_network_device_modified.json @@ -23,7 +23,7 @@ { "integration": "activitylogs", "package": "azure", - "version": "0.12.0" + "version": "^1.0.0" } ], "required_fields": [ @@ -69,5 +69,5 @@ ], "timestamp_override": "event.ingested", "type": "query", - "version": 100 + "version": 101 } diff --git a/x-pack/plugins/security_solution/server/lib/detection_engine/rules/prepackaged_rules/initial_access_azure_active_directory_high_risk_signin.json b/x-pack/plugins/security_solution/server/lib/detection_engine/rules/prepackaged_rules/initial_access_azure_active_directory_high_risk_signin.json index d06a073fd504c..e92a0cc3ea63d 100644 --- a/x-pack/plugins/security_solution/server/lib/detection_engine/rules/prepackaged_rules/initial_access_azure_active_directory_high_risk_signin.json +++ b/x-pack/plugins/security_solution/server/lib/detection_engine/rules/prepackaged_rules/initial_access_azure_active_directory_high_risk_signin.json @@ -22,7 +22,7 @@ "related_integrations": [ { "package": "azure", - "version": "0.12.0" + "version": "^1.0.0" } ], "required_fields": [ @@ -79,5 +79,5 @@ ], "timestamp_override": "event.ingested", "type": "query", - "version": 101 + "version": 102 } diff --git a/x-pack/plugins/security_solution/server/lib/detection_engine/rules/prepackaged_rules/initial_access_azure_active_directory_high_risk_signin_atrisk_or_confirmed.json b/x-pack/plugins/security_solution/server/lib/detection_engine/rules/prepackaged_rules/initial_access_azure_active_directory_high_risk_signin_atrisk_or_confirmed.json index c2d57924a39e4..7d39ad47973d1 100644 --- a/x-pack/plugins/security_solution/server/lib/detection_engine/rules/prepackaged_rules/initial_access_azure_active_directory_high_risk_signin_atrisk_or_confirmed.json +++ b/x-pack/plugins/security_solution/server/lib/detection_engine/rules/prepackaged_rules/initial_access_azure_active_directory_high_risk_signin_atrisk_or_confirmed.json @@ -22,7 +22,7 @@ "related_integrations": [ { "package": "azure", - "version": "0.12.0" + "version": "^1.0.0" } ], "required_fields": [ @@ -74,5 +74,5 @@ ], "timestamp_override": "event.ingested", "type": "query", - "version": 101 + "version": 102 } diff --git a/x-pack/plugins/security_solution/server/lib/detection_engine/rules/prepackaged_rules/initial_access_azure_active_directory_powershell_signin.json b/x-pack/plugins/security_solution/server/lib/detection_engine/rules/prepackaged_rules/initial_access_azure_active_directory_powershell_signin.json index d46d34a762cce..4ea3feedaa359 100644 --- a/x-pack/plugins/security_solution/server/lib/detection_engine/rules/prepackaged_rules/initial_access_azure_active_directory_powershell_signin.json +++ b/x-pack/plugins/security_solution/server/lib/detection_engine/rules/prepackaged_rules/initial_access_azure_active_directory_powershell_signin.json @@ -23,7 +23,7 @@ "related_integrations": [ { "package": "azure", - "version": "0.12.0" + "version": "^1.0.0" } ], "required_fields": [ @@ -87,5 +87,5 @@ ], "timestamp_override": "event.ingested", "type": "query", - "version": 101 + "version": 102 } diff --git a/x-pack/plugins/security_solution/server/lib/detection_engine/rules/prepackaged_rules/initial_access_consent_grant_attack_via_azure_registered_application.json b/x-pack/plugins/security_solution/server/lib/detection_engine/rules/prepackaged_rules/initial_access_consent_grant_attack_via_azure_registered_application.json index 01a68b944d294..8828b5037ca25 100644 --- a/x-pack/plugins/security_solution/server/lib/detection_engine/rules/prepackaged_rules/initial_access_consent_grant_attack_via_azure_registered_application.json +++ b/x-pack/plugins/security_solution/server/lib/detection_engine/rules/prepackaged_rules/initial_access_consent_grant_attack_via_azure_registered_application.json @@ -22,15 +22,15 @@ { "integration": "activitylogs", "package": "azure", - "version": "0.12.0" + "version": "^1.0.0" }, { "package": "azure", - "version": "0.12.0" + "version": "^1.0.0" }, { "package": "o365", - "version": "1.3.0" + "version": "^1.3.0" } ], "required_fields": [ @@ -114,5 +114,5 @@ ], "timestamp_override": "event.ingested", "type": "query", - "version": 101 + "version": 102 } diff --git a/x-pack/plugins/security_solution/server/lib/detection_engine/rules/prepackaged_rules/initial_access_console_login_root.json b/x-pack/plugins/security_solution/server/lib/detection_engine/rules/prepackaged_rules/initial_access_console_login_root.json index 7612d79572c17..929d341001807 100644 --- a/x-pack/plugins/security_solution/server/lib/detection_engine/rules/prepackaged_rules/initial_access_console_login_root.json +++ b/x-pack/plugins/security_solution/server/lib/detection_engine/rules/prepackaged_rules/initial_access_console_login_root.json @@ -24,7 +24,7 @@ { "integration": "cloudtrail", "package": "aws", - "version": "1.10.2" + "version": "^1.5.0" } ], "required_fields": [ @@ -101,5 +101,5 @@ ], "timestamp_override": "event.ingested", "type": "query", - "version": 101 + "version": 102 } diff --git a/x-pack/plugins/security_solution/server/lib/detection_engine/rules/prepackaged_rules/initial_access_external_guest_user_invite.json b/x-pack/plugins/security_solution/server/lib/detection_engine/rules/prepackaged_rules/initial_access_external_guest_user_invite.json index 159e0bd1b9e16..c100bcc9bc97a 100644 --- a/x-pack/plugins/security_solution/server/lib/detection_engine/rules/prepackaged_rules/initial_access_external_guest_user_invite.json +++ b/x-pack/plugins/security_solution/server/lib/detection_engine/rules/prepackaged_rules/initial_access_external_guest_user_invite.json @@ -22,7 +22,7 @@ "related_integrations": [ { "package": "azure", - "version": "0.12.0" + "version": "^1.0.0" } ], "required_fields": [ @@ -93,5 +93,5 @@ ], "timestamp_override": "event.ingested", "type": "query", - "version": 100 + "version": 101 } diff --git a/x-pack/plugins/security_solution/server/lib/detection_engine/rules/prepackaged_rules/initial_access_gcp_iam_custom_role_creation.json b/x-pack/plugins/security_solution/server/lib/detection_engine/rules/prepackaged_rules/initial_access_gcp_iam_custom_role_creation.json index ad92d1b3498e5..eebc12c092152 100644 --- a/x-pack/plugins/security_solution/server/lib/detection_engine/rules/prepackaged_rules/initial_access_gcp_iam_custom_role_creation.json +++ b/x-pack/plugins/security_solution/server/lib/detection_engine/rules/prepackaged_rules/initial_access_gcp_iam_custom_role_creation.json @@ -20,8 +20,9 @@ ], "related_integrations": [ { + "integration": "audit", "package": "gcp", - "version": "1.10.0" + "version": "^2.2.1" } ], "required_fields": [ @@ -87,5 +88,5 @@ ], "timestamp_override": "event.ingested", "type": "query", - "version": 100 + "version": 101 } diff --git a/x-pack/plugins/security_solution/server/lib/detection_engine/rules/prepackaged_rules/initial_access_microsoft_365_exchange_anti_phish_policy_deletion.json b/x-pack/plugins/security_solution/server/lib/detection_engine/rules/prepackaged_rules/initial_access_microsoft_365_exchange_anti_phish_policy_deletion.json index 94ad9f0b4bb86..f071d0121932a 100644 --- a/x-pack/plugins/security_solution/server/lib/detection_engine/rules/prepackaged_rules/initial_access_microsoft_365_exchange_anti_phish_policy_deletion.json +++ b/x-pack/plugins/security_solution/server/lib/detection_engine/rules/prepackaged_rules/initial_access_microsoft_365_exchange_anti_phish_policy_deletion.json @@ -23,7 +23,7 @@ "related_integrations": [ { "package": "o365", - "version": "1.3.0" + "version": "^1.3.0" } ], "required_fields": [ @@ -84,5 +84,5 @@ ], "timestamp_override": "event.ingested", "type": "query", - "version": 100 + "version": 101 } diff --git a/x-pack/plugins/security_solution/server/lib/detection_engine/rules/prepackaged_rules/initial_access_microsoft_365_exchange_anti_phish_rule_mod.json b/x-pack/plugins/security_solution/server/lib/detection_engine/rules/prepackaged_rules/initial_access_microsoft_365_exchange_anti_phish_rule_mod.json index 7d8a1b23585e6..f9ff2bdd02b81 100644 --- a/x-pack/plugins/security_solution/server/lib/detection_engine/rules/prepackaged_rules/initial_access_microsoft_365_exchange_anti_phish_rule_mod.json +++ b/x-pack/plugins/security_solution/server/lib/detection_engine/rules/prepackaged_rules/initial_access_microsoft_365_exchange_anti_phish_rule_mod.json @@ -23,7 +23,7 @@ "related_integrations": [ { "package": "o365", - "version": "1.3.0" + "version": "^1.3.0" } ], "required_fields": [ @@ -84,5 +84,5 @@ ], "timestamp_override": "event.ingested", "type": "query", - "version": 100 + "version": 101 } diff --git a/x-pack/plugins/security_solution/server/lib/detection_engine/rules/prepackaged_rules/initial_access_microsoft_365_exchange_safelinks_disabled.json b/x-pack/plugins/security_solution/server/lib/detection_engine/rules/prepackaged_rules/initial_access_microsoft_365_exchange_safelinks_disabled.json index ac24c0321f6e3..a69b1acdaff73 100644 --- a/x-pack/plugins/security_solution/server/lib/detection_engine/rules/prepackaged_rules/initial_access_microsoft_365_exchange_safelinks_disabled.json +++ b/x-pack/plugins/security_solution/server/lib/detection_engine/rules/prepackaged_rules/initial_access_microsoft_365_exchange_safelinks_disabled.json @@ -23,7 +23,7 @@ "related_integrations": [ { "package": "o365", - "version": "1.3.0" + "version": "^1.3.0" } ], "required_fields": [ @@ -84,5 +84,5 @@ ], "timestamp_override": "event.ingested", "type": "query", - "version": 100 + "version": 101 } diff --git a/x-pack/plugins/security_solution/server/lib/detection_engine/rules/prepackaged_rules/initial_access_microsoft_365_user_restricted_from_sending_email.json b/x-pack/plugins/security_solution/server/lib/detection_engine/rules/prepackaged_rules/initial_access_microsoft_365_user_restricted_from_sending_email.json index 34722a9bed968..a6b58f03c5bfb 100644 --- a/x-pack/plugins/security_solution/server/lib/detection_engine/rules/prepackaged_rules/initial_access_microsoft_365_user_restricted_from_sending_email.json +++ b/x-pack/plugins/security_solution/server/lib/detection_engine/rules/prepackaged_rules/initial_access_microsoft_365_user_restricted_from_sending_email.json @@ -23,7 +23,7 @@ "related_integrations": [ { "package": "o365", - "version": "1.3.0" + "version": "^1.3.0" } ], "required_fields": [ @@ -84,5 +84,5 @@ ], "timestamp_override": "event.ingested", "type": "query", - "version": 100 + "version": 101 } diff --git a/x-pack/plugins/security_solution/server/lib/detection_engine/rules/prepackaged_rules/initial_access_o365_user_reported_phish_malware.json b/x-pack/plugins/security_solution/server/lib/detection_engine/rules/prepackaged_rules/initial_access_o365_user_reported_phish_malware.json index 64e64c1d919d9..b728070308848 100644 --- a/x-pack/plugins/security_solution/server/lib/detection_engine/rules/prepackaged_rules/initial_access_o365_user_reported_phish_malware.json +++ b/x-pack/plugins/security_solution/server/lib/detection_engine/rules/prepackaged_rules/initial_access_o365_user_reported_phish_malware.json @@ -22,7 +22,7 @@ "related_integrations": [ { "package": "o365", - "version": "1.3.0" + "version": "^1.3.0" } ], "required_fields": [ @@ -90,5 +90,5 @@ ], "timestamp_override": "event.ingested", "type": "query", - "version": 100 + "version": 101 } diff --git a/x-pack/plugins/security_solution/server/lib/detection_engine/rules/prepackaged_rules/initial_access_okta_user_attempted_unauthorized_access.json b/x-pack/plugins/security_solution/server/lib/detection_engine/rules/prepackaged_rules/initial_access_okta_user_attempted_unauthorized_access.json index 33d212c9c5e94..77a7e0080caba 100644 --- a/x-pack/plugins/security_solution/server/lib/detection_engine/rules/prepackaged_rules/initial_access_okta_user_attempted_unauthorized_access.json +++ b/x-pack/plugins/security_solution/server/lib/detection_engine/rules/prepackaged_rules/initial_access_okta_user_attempted_unauthorized_access.json @@ -16,7 +16,7 @@ "related_integrations": [ { "package": "okta", - "version": "1.3.0" + "version": "^1.3.0" } ], "required_fields": [ @@ -89,5 +89,5 @@ ], "timestamp_override": "event.ingested", "type": "query", - "version": 100 + "version": 101 } diff --git a/x-pack/plugins/security_solution/server/lib/detection_engine/rules/prepackaged_rules/initial_access_password_recovery.json b/x-pack/plugins/security_solution/server/lib/detection_engine/rules/prepackaged_rules/initial_access_password_recovery.json index 2e0c53cead87e..cfade77b3e429 100644 --- a/x-pack/plugins/security_solution/server/lib/detection_engine/rules/prepackaged_rules/initial_access_password_recovery.json +++ b/x-pack/plugins/security_solution/server/lib/detection_engine/rules/prepackaged_rules/initial_access_password_recovery.json @@ -24,7 +24,7 @@ { "integration": "cloudtrail", "package": "aws", - "version": "1.10.2" + "version": "^1.5.0" } ], "required_fields": [ @@ -80,5 +80,5 @@ ], "timestamp_override": "event.ingested", "type": "query", - "version": 100 + "version": 101 } diff --git a/x-pack/plugins/security_solution/server/lib/detection_engine/rules/prepackaged_rules/initial_access_suspicious_activity_reported_by_okta_user.json b/x-pack/plugins/security_solution/server/lib/detection_engine/rules/prepackaged_rules/initial_access_suspicious_activity_reported_by_okta_user.json index cf7557102e203..ce6ef31fa4a10 100644 --- a/x-pack/plugins/security_solution/server/lib/detection_engine/rules/prepackaged_rules/initial_access_suspicious_activity_reported_by_okta_user.json +++ b/x-pack/plugins/security_solution/server/lib/detection_engine/rules/prepackaged_rules/initial_access_suspicious_activity_reported_by_okta_user.json @@ -22,7 +22,7 @@ "related_integrations": [ { "package": "okta", - "version": "1.3.0" + "version": "^1.3.0" } ], "required_fields": [ @@ -113,5 +113,5 @@ ], "timestamp_override": "event.ingested", "type": "query", - "version": 100 + "version": 101 } diff --git a/x-pack/plugins/security_solution/server/lib/detection_engine/rules/prepackaged_rules/initial_access_via_system_manager.json b/x-pack/plugins/security_solution/server/lib/detection_engine/rules/prepackaged_rules/initial_access_via_system_manager.json index 78fea7b5dafe2..2cc55e2b14ffc 100644 --- a/x-pack/plugins/security_solution/server/lib/detection_engine/rules/prepackaged_rules/initial_access_via_system_manager.json +++ b/x-pack/plugins/security_solution/server/lib/detection_engine/rules/prepackaged_rules/initial_access_via_system_manager.json @@ -24,7 +24,7 @@ { "integration": "cloudtrail", "package": "aws", - "version": "1.10.2" + "version": "^1.5.0" } ], "required_fields": [ @@ -89,5 +89,5 @@ ], "timestamp_override": "event.ingested", "type": "query", - "version": 101 + "version": 102 } diff --git a/x-pack/plugins/security_solution/server/lib/detection_engine/rules/prepackaged_rules/lateral_movement_malware_uploaded_onedrive.json b/x-pack/plugins/security_solution/server/lib/detection_engine/rules/prepackaged_rules/lateral_movement_malware_uploaded_onedrive.json index 299fba09b77fc..86093446957ee 100644 --- a/x-pack/plugins/security_solution/server/lib/detection_engine/rules/prepackaged_rules/lateral_movement_malware_uploaded_onedrive.json +++ b/x-pack/plugins/security_solution/server/lib/detection_engine/rules/prepackaged_rules/lateral_movement_malware_uploaded_onedrive.json @@ -22,7 +22,7 @@ "related_integrations": [ { "package": "o365", - "version": "1.3.0" + "version": "^1.3.0" } ], "required_fields": [ @@ -78,5 +78,5 @@ ], "timestamp_override": "event.ingested", "type": "query", - "version": 100 + "version": 101 } diff --git a/x-pack/plugins/security_solution/server/lib/detection_engine/rules/prepackaged_rules/lateral_movement_malware_uploaded_sharepoint.json b/x-pack/plugins/security_solution/server/lib/detection_engine/rules/prepackaged_rules/lateral_movement_malware_uploaded_sharepoint.json index 1cbed1359e9ee..021614c0631c1 100644 --- a/x-pack/plugins/security_solution/server/lib/detection_engine/rules/prepackaged_rules/lateral_movement_malware_uploaded_sharepoint.json +++ b/x-pack/plugins/security_solution/server/lib/detection_engine/rules/prepackaged_rules/lateral_movement_malware_uploaded_sharepoint.json @@ -22,7 +22,7 @@ "related_integrations": [ { "package": "o365", - "version": "1.3.0" + "version": "^1.3.0" } ], "required_fields": [ @@ -78,5 +78,5 @@ ], "timestamp_override": "event.ingested", "type": "query", - "version": 100 + "version": 101 } diff --git a/x-pack/plugins/security_solution/server/lib/detection_engine/rules/prepackaged_rules/okta_threat_detected_by_okta_threatinsight.json b/x-pack/plugins/security_solution/server/lib/detection_engine/rules/prepackaged_rules/okta_threat_detected_by_okta_threatinsight.json index 71f2addd91d80..18fe87682f81e 100644 --- a/x-pack/plugins/security_solution/server/lib/detection_engine/rules/prepackaged_rules/okta_threat_detected_by_okta_threatinsight.json +++ b/x-pack/plugins/security_solution/server/lib/detection_engine/rules/prepackaged_rules/okta_threat_detected_by_okta_threatinsight.json @@ -19,7 +19,7 @@ "related_integrations": [ { "package": "okta", - "version": "1.3.0" + "version": "^1.3.0" } ], "required_fields": [ @@ -48,5 +48,5 @@ ], "timestamp_override": "event.ingested", "type": "query", - "version": 100 + "version": 101 } diff --git a/x-pack/plugins/security_solution/server/lib/detection_engine/rules/prepackaged_rules/persistence_administrator_privileges_assigned_to_okta_group.json b/x-pack/plugins/security_solution/server/lib/detection_engine/rules/prepackaged_rules/persistence_administrator_privileges_assigned_to_okta_group.json index e903dce0ff465..be6ab836b1c0c 100644 --- a/x-pack/plugins/security_solution/server/lib/detection_engine/rules/prepackaged_rules/persistence_administrator_privileges_assigned_to_okta_group.json +++ b/x-pack/plugins/security_solution/server/lib/detection_engine/rules/prepackaged_rules/persistence_administrator_privileges_assigned_to_okta_group.json @@ -23,7 +23,7 @@ "related_integrations": [ { "package": "okta", - "version": "1.3.0" + "version": "^1.3.0" } ], "required_fields": [ @@ -69,5 +69,5 @@ ], "timestamp_override": "event.ingested", "type": "query", - "version": 100 + "version": 101 } diff --git a/x-pack/plugins/security_solution/server/lib/detection_engine/rules/prepackaged_rules/persistence_administrator_role_assigned_to_okta_user.json b/x-pack/plugins/security_solution/server/lib/detection_engine/rules/prepackaged_rules/persistence_administrator_role_assigned_to_okta_user.json index 148ba8c09e88a..4d22e033ac124 100644 --- a/x-pack/plugins/security_solution/server/lib/detection_engine/rules/prepackaged_rules/persistence_administrator_role_assigned_to_okta_user.json +++ b/x-pack/plugins/security_solution/server/lib/detection_engine/rules/prepackaged_rules/persistence_administrator_role_assigned_to_okta_user.json @@ -23,7 +23,7 @@ "related_integrations": [ { "package": "okta", - "version": "1.3.0" + "version": "^1.3.0" } ], "required_fields": [ @@ -68,5 +68,5 @@ ], "timestamp_override": "event.ingested", "type": "query", - "version": 100 + "version": 101 } diff --git a/x-pack/plugins/security_solution/server/lib/detection_engine/rules/prepackaged_rules/persistence_application_added_to_google_workspace_domain.json b/x-pack/plugins/security_solution/server/lib/detection_engine/rules/prepackaged_rules/persistence_application_added_to_google_workspace_domain.json index 34870bf55be7d..bd21d631ba81e 100644 --- a/x-pack/plugins/security_solution/server/lib/detection_engine/rules/prepackaged_rules/persistence_application_added_to_google_workspace_domain.json +++ b/x-pack/plugins/security_solution/server/lib/detection_engine/rules/prepackaged_rules/persistence_application_added_to_google_workspace_domain.json @@ -23,7 +23,7 @@ "related_integrations": [ { "package": "google_workspace", - "version": "1.2.0" + "version": "^1.2.0" } ], "required_fields": [ @@ -74,5 +74,5 @@ ], "timestamp_override": "event.ingested", "type": "query", - "version": 100 + "version": 101 } diff --git a/x-pack/plugins/security_solution/server/lib/detection_engine/rules/prepackaged_rules/persistence_attempt_to_create_okta_api_token.json b/x-pack/plugins/security_solution/server/lib/detection_engine/rules/prepackaged_rules/persistence_attempt_to_create_okta_api_token.json index e1eec9d4e5908..66147953d146d 100644 --- a/x-pack/plugins/security_solution/server/lib/detection_engine/rules/prepackaged_rules/persistence_attempt_to_create_okta_api_token.json +++ b/x-pack/plugins/security_solution/server/lib/detection_engine/rules/prepackaged_rules/persistence_attempt_to_create_okta_api_token.json @@ -22,7 +22,7 @@ "related_integrations": [ { "package": "okta", - "version": "1.3.0" + "version": "^1.3.0" } ], "required_fields": [ @@ -68,5 +68,5 @@ ], "timestamp_override": "event.ingested", "type": "query", - "version": 100 + "version": 101 } diff --git a/x-pack/plugins/security_solution/server/lib/detection_engine/rules/prepackaged_rules/persistence_attempt_to_deactivate_mfa_for_okta_user_account.json b/x-pack/plugins/security_solution/server/lib/detection_engine/rules/prepackaged_rules/persistence_attempt_to_deactivate_mfa_for_okta_user_account.json index a5b8762ec1aaf..c0338b37b53e3 100644 --- a/x-pack/plugins/security_solution/server/lib/detection_engine/rules/prepackaged_rules/persistence_attempt_to_deactivate_mfa_for_okta_user_account.json +++ b/x-pack/plugins/security_solution/server/lib/detection_engine/rules/prepackaged_rules/persistence_attempt_to_deactivate_mfa_for_okta_user_account.json @@ -22,7 +22,7 @@ "related_integrations": [ { "package": "okta", - "version": "1.3.0" + "version": "^1.3.0" } ], "required_fields": [ @@ -68,5 +68,5 @@ ], "timestamp_override": "event.ingested", "type": "query", - "version": 100 + "version": 101 } diff --git a/x-pack/plugins/security_solution/server/lib/detection_engine/rules/prepackaged_rules/persistence_attempt_to_reset_mfa_factors_for_okta_user_account.json b/x-pack/plugins/security_solution/server/lib/detection_engine/rules/prepackaged_rules/persistence_attempt_to_reset_mfa_factors_for_okta_user_account.json index 585b74cb73e42..0d230518055f9 100644 --- a/x-pack/plugins/security_solution/server/lib/detection_engine/rules/prepackaged_rules/persistence_attempt_to_reset_mfa_factors_for_okta_user_account.json +++ b/x-pack/plugins/security_solution/server/lib/detection_engine/rules/prepackaged_rules/persistence_attempt_to_reset_mfa_factors_for_okta_user_account.json @@ -22,7 +22,7 @@ "related_integrations": [ { "package": "okta", - "version": "1.3.0" + "version": "^1.3.0" } ], "required_fields": [ @@ -68,5 +68,5 @@ ], "timestamp_override": "event.ingested", "type": "query", - "version": 100 + "version": 101 } diff --git a/x-pack/plugins/security_solution/server/lib/detection_engine/rules/prepackaged_rules/persistence_azure_automation_account_created.json b/x-pack/plugins/security_solution/server/lib/detection_engine/rules/prepackaged_rules/persistence_azure_automation_account_created.json index ccbf96ab79d0a..af6d6bfcb2c5f 100644 --- a/x-pack/plugins/security_solution/server/lib/detection_engine/rules/prepackaged_rules/persistence_azure_automation_account_created.json +++ b/x-pack/plugins/security_solution/server/lib/detection_engine/rules/prepackaged_rules/persistence_azure_automation_account_created.json @@ -23,7 +23,7 @@ { "integration": "activitylogs", "package": "azure", - "version": "0.12.0" + "version": "^1.0.0" } ], "required_fields": [ @@ -89,5 +89,5 @@ ], "timestamp_override": "event.ingested", "type": "query", - "version": 100 + "version": 101 } diff --git a/x-pack/plugins/security_solution/server/lib/detection_engine/rules/prepackaged_rules/persistence_azure_automation_runbook_created_or_modified.json b/x-pack/plugins/security_solution/server/lib/detection_engine/rules/prepackaged_rules/persistence_azure_automation_runbook_created_or_modified.json index 7518dcdf9a5fe..1fbf08e86b14f 100644 --- a/x-pack/plugins/security_solution/server/lib/detection_engine/rules/prepackaged_rules/persistence_azure_automation_runbook_created_or_modified.json +++ b/x-pack/plugins/security_solution/server/lib/detection_engine/rules/prepackaged_rules/persistence_azure_automation_runbook_created_or_modified.json @@ -23,7 +23,7 @@ { "integration": "activitylogs", "package": "azure", - "version": "0.12.0" + "version": "^1.0.0" } ], "required_fields": [ @@ -57,5 +57,5 @@ ], "timestamp_override": "event.ingested", "type": "query", - "version": 100 + "version": 101 } diff --git a/x-pack/plugins/security_solution/server/lib/detection_engine/rules/prepackaged_rules/persistence_azure_automation_webhook_created.json b/x-pack/plugins/security_solution/server/lib/detection_engine/rules/prepackaged_rules/persistence_azure_automation_webhook_created.json index a7a9e7ad8f2dc..51088c01c08e2 100644 --- a/x-pack/plugins/security_solution/server/lib/detection_engine/rules/prepackaged_rules/persistence_azure_automation_webhook_created.json +++ b/x-pack/plugins/security_solution/server/lib/detection_engine/rules/prepackaged_rules/persistence_azure_automation_webhook_created.json @@ -23,7 +23,7 @@ { "integration": "activitylogs", "package": "azure", - "version": "0.12.0" + "version": "^1.0.0" } ], "required_fields": [ @@ -57,5 +57,5 @@ ], "timestamp_override": "event.ingested", "type": "query", - "version": 100 + "version": 101 } diff --git a/x-pack/plugins/security_solution/server/lib/detection_engine/rules/prepackaged_rules/persistence_azure_conditional_access_policy_modified.json b/x-pack/plugins/security_solution/server/lib/detection_engine/rules/prepackaged_rules/persistence_azure_conditional_access_policy_modified.json index e2f81083938b4..68ba968207510 100644 --- a/x-pack/plugins/security_solution/server/lib/detection_engine/rules/prepackaged_rules/persistence_azure_conditional_access_policy_modified.json +++ b/x-pack/plugins/security_solution/server/lib/detection_engine/rules/prepackaged_rules/persistence_azure_conditional_access_policy_modified.json @@ -20,11 +20,11 @@ { "integration": "activitylogs", "package": "azure", - "version": "0.12.0" + "version": "^1.0.0" }, { "package": "azure", - "version": "0.12.0" + "version": "^1.0.0" } ], "required_fields": [ @@ -75,5 +75,5 @@ ], "timestamp_override": "event.ingested", "type": "query", - "version": 100 + "version": 101 } diff --git a/x-pack/plugins/security_solution/server/lib/detection_engine/rules/prepackaged_rules/persistence_azure_global_administrator_role_assigned.json b/x-pack/plugins/security_solution/server/lib/detection_engine/rules/prepackaged_rules/persistence_azure_global_administrator_role_assigned.json index 91c5a8b9bc20d..88329c459385f 100644 --- a/x-pack/plugins/security_solution/server/lib/detection_engine/rules/prepackaged_rules/persistence_azure_global_administrator_role_assigned.json +++ b/x-pack/plugins/security_solution/server/lib/detection_engine/rules/prepackaged_rules/persistence_azure_global_administrator_role_assigned.json @@ -19,7 +19,7 @@ "related_integrations": [ { "package": "azure", - "version": "0.12.0" + "version": "^1.0.0" } ], "required_fields": [ @@ -82,5 +82,5 @@ ], "timestamp_override": "event.ingested", "type": "query", - "version": 100 + "version": 101 } diff --git a/x-pack/plugins/security_solution/server/lib/detection_engine/rules/prepackaged_rules/persistence_azure_pim_user_added_global_admin.json b/x-pack/plugins/security_solution/server/lib/detection_engine/rules/prepackaged_rules/persistence_azure_pim_user_added_global_admin.json index 7dfc8b953a4ba..fddf8ca8bed65 100644 --- a/x-pack/plugins/security_solution/server/lib/detection_engine/rules/prepackaged_rules/persistence_azure_pim_user_added_global_admin.json +++ b/x-pack/plugins/security_solution/server/lib/detection_engine/rules/prepackaged_rules/persistence_azure_pim_user_added_global_admin.json @@ -21,7 +21,7 @@ "related_integrations": [ { "package": "azure", - "version": "0.12.0" + "version": "^1.0.0" } ], "required_fields": [ @@ -82,5 +82,5 @@ ], "timestamp_override": "event.ingested", "type": "query", - "version": 100 + "version": 101 } diff --git a/x-pack/plugins/security_solution/server/lib/detection_engine/rules/prepackaged_rules/persistence_azure_privileged_identity_management_role_modified.json b/x-pack/plugins/security_solution/server/lib/detection_engine/rules/prepackaged_rules/persistence_azure_privileged_identity_management_role_modified.json index 80720e7aff6ce..fcda83a95bed6 100644 --- a/x-pack/plugins/security_solution/server/lib/detection_engine/rules/prepackaged_rules/persistence_azure_privileged_identity_management_role_modified.json +++ b/x-pack/plugins/security_solution/server/lib/detection_engine/rules/prepackaged_rules/persistence_azure_privileged_identity_management_role_modified.json @@ -20,7 +20,7 @@ "related_integrations": [ { "package": "azure", - "version": "0.12.0" + "version": "^1.0.0" } ], "required_fields": [ @@ -87,5 +87,5 @@ ], "timestamp_override": "event.ingested", "type": "query", - "version": 101 + "version": 102 } diff --git a/x-pack/plugins/security_solution/server/lib/detection_engine/rules/prepackaged_rules/persistence_ec2_network_acl_creation.json b/x-pack/plugins/security_solution/server/lib/detection_engine/rules/prepackaged_rules/persistence_ec2_network_acl_creation.json index f510200c25a6b..f083d6bd84e5b 100644 --- a/x-pack/plugins/security_solution/server/lib/detection_engine/rules/prepackaged_rules/persistence_ec2_network_acl_creation.json +++ b/x-pack/plugins/security_solution/server/lib/detection_engine/rules/prepackaged_rules/persistence_ec2_network_acl_creation.json @@ -27,7 +27,7 @@ { "integration": "cloudtrail", "package": "aws", - "version": "1.10.2" + "version": "^1.5.0" } ], "required_fields": [ @@ -83,5 +83,5 @@ ], "timestamp_override": "event.ingested", "type": "query", - "version": 100 + "version": 101 } diff --git a/x-pack/plugins/security_solution/server/lib/detection_engine/rules/prepackaged_rules/persistence_ec2_security_group_configuration_change_detection.json b/x-pack/plugins/security_solution/server/lib/detection_engine/rules/prepackaged_rules/persistence_ec2_security_group_configuration_change_detection.json index 4d33c73f6bbe9..69734f6c2ff47 100644 --- a/x-pack/plugins/security_solution/server/lib/detection_engine/rules/prepackaged_rules/persistence_ec2_security_group_configuration_change_detection.json +++ b/x-pack/plugins/security_solution/server/lib/detection_engine/rules/prepackaged_rules/persistence_ec2_security_group_configuration_change_detection.json @@ -25,7 +25,7 @@ { "integration": "cloudtrail", "package": "aws", - "version": "1.10.2" + "version": "^1.5.0" } ], "required_fields": [ @@ -97,5 +97,5 @@ ], "timestamp_override": "event.ingested", "type": "query", - "version": 100 + "version": 101 } diff --git a/x-pack/plugins/security_solution/server/lib/detection_engine/rules/prepackaged_rules/persistence_exchange_suspicious_mailbox_right_delegation.json b/x-pack/plugins/security_solution/server/lib/detection_engine/rules/prepackaged_rules/persistence_exchange_suspicious_mailbox_right_delegation.json index 0dddfad517537..b1c3453554cf8 100644 --- a/x-pack/plugins/security_solution/server/lib/detection_engine/rules/prepackaged_rules/persistence_exchange_suspicious_mailbox_right_delegation.json +++ b/x-pack/plugins/security_solution/server/lib/detection_engine/rules/prepackaged_rules/persistence_exchange_suspicious_mailbox_right_delegation.json @@ -19,7 +19,7 @@ "related_integrations": [ { "package": "o365", - "version": "1.3.0" + "version": "^1.3.0" } ], "required_fields": [ @@ -92,5 +92,5 @@ ], "timestamp_override": "event.ingested", "type": "query", - "version": 100 + "version": 101 } diff --git a/x-pack/plugins/security_solution/server/lib/detection_engine/rules/prepackaged_rules/persistence_gcp_iam_service_account_key_deletion.json b/x-pack/plugins/security_solution/server/lib/detection_engine/rules/prepackaged_rules/persistence_gcp_iam_service_account_key_deletion.json index 3376e777cf48c..0d9d6775ef00b 100644 --- a/x-pack/plugins/security_solution/server/lib/detection_engine/rules/prepackaged_rules/persistence_gcp_iam_service_account_key_deletion.json +++ b/x-pack/plugins/security_solution/server/lib/detection_engine/rules/prepackaged_rules/persistence_gcp_iam_service_account_key_deletion.json @@ -21,8 +21,9 @@ ], "related_integrations": [ { + "integration": "audit", "package": "gcp", - "version": "1.10.0" + "version": "^2.2.1" } ], "required_fields": [ @@ -73,5 +74,5 @@ ], "timestamp_override": "event.ingested", "type": "query", - "version": 100 + "version": 101 } diff --git a/x-pack/plugins/security_solution/server/lib/detection_engine/rules/prepackaged_rules/persistence_gcp_key_created_for_service_account.json b/x-pack/plugins/security_solution/server/lib/detection_engine/rules/prepackaged_rules/persistence_gcp_key_created_for_service_account.json index 2c39c99f55123..69728373e6c44 100644 --- a/x-pack/plugins/security_solution/server/lib/detection_engine/rules/prepackaged_rules/persistence_gcp_key_created_for_service_account.json +++ b/x-pack/plugins/security_solution/server/lib/detection_engine/rules/prepackaged_rules/persistence_gcp_key_created_for_service_account.json @@ -21,8 +21,9 @@ ], "related_integrations": [ { + "integration": "audit", "package": "gcp", - "version": "1.10.0" + "version": "^2.2.1" } ], "required_fields": [ @@ -73,5 +74,5 @@ ], "timestamp_override": "event.ingested", "type": "query", - "version": 100 + "version": 101 } diff --git a/x-pack/plugins/security_solution/server/lib/detection_engine/rules/prepackaged_rules/persistence_gcp_service_account_created.json b/x-pack/plugins/security_solution/server/lib/detection_engine/rules/prepackaged_rules/persistence_gcp_service_account_created.json index c9aaa61d367e0..d30dabdd112d7 100644 --- a/x-pack/plugins/security_solution/server/lib/detection_engine/rules/prepackaged_rules/persistence_gcp_service_account_created.json +++ b/x-pack/plugins/security_solution/server/lib/detection_engine/rules/prepackaged_rules/persistence_gcp_service_account_created.json @@ -20,8 +20,9 @@ ], "related_integrations": [ { + "integration": "audit", "package": "gcp", - "version": "1.10.0" + "version": "^2.2.1" } ], "required_fields": [ @@ -72,5 +73,5 @@ ], "timestamp_override": "event.ingested", "type": "query", - "version": 100 + "version": 101 } diff --git a/x-pack/plugins/security_solution/server/lib/detection_engine/rules/prepackaged_rules/persistence_google_workspace_2sv_policy_disabled.json b/x-pack/plugins/security_solution/server/lib/detection_engine/rules/prepackaged_rules/persistence_google_workspace_2sv_policy_disabled.json index be09aceb67c9d..a2b738be6655e 100644 --- a/x-pack/plugins/security_solution/server/lib/detection_engine/rules/prepackaged_rules/persistence_google_workspace_2sv_policy_disabled.json +++ b/x-pack/plugins/security_solution/server/lib/detection_engine/rules/prepackaged_rules/persistence_google_workspace_2sv_policy_disabled.json @@ -23,7 +23,7 @@ "related_integrations": [ { "package": "google_workspace", - "version": "1.2.0" + "version": "^1.2.0" } ], "required_fields": [ @@ -70,5 +70,5 @@ ], "timestamp_override": "event.ingested", "type": "query", - "version": 1 + "version": 2 } diff --git a/x-pack/plugins/security_solution/server/lib/detection_engine/rules/prepackaged_rules/persistence_google_workspace_admin_role_assigned_to_user.json b/x-pack/plugins/security_solution/server/lib/detection_engine/rules/prepackaged_rules/persistence_google_workspace_admin_role_assigned_to_user.json index 86825d008eeac..9eba65a1e99df 100644 --- a/x-pack/plugins/security_solution/server/lib/detection_engine/rules/prepackaged_rules/persistence_google_workspace_admin_role_assigned_to_user.json +++ b/x-pack/plugins/security_solution/server/lib/detection_engine/rules/prepackaged_rules/persistence_google_workspace_admin_role_assigned_to_user.json @@ -23,7 +23,7 @@ "related_integrations": [ { "package": "google_workspace", - "version": "1.2.0" + "version": "^1.2.0" } ], "required_fields": [ @@ -92,5 +92,5 @@ ], "timestamp_override": "event.ingested", "type": "query", - "version": 101 + "version": 102 } diff --git a/x-pack/plugins/security_solution/server/lib/detection_engine/rules/prepackaged_rules/persistence_google_workspace_api_access_granted_via_domain_wide_delegation_of_authority.json b/x-pack/plugins/security_solution/server/lib/detection_engine/rules/prepackaged_rules/persistence_google_workspace_api_access_granted_via_domain_wide_delegation_of_authority.json index 3b828c3b868f8..b1d854bc74021 100644 --- a/x-pack/plugins/security_solution/server/lib/detection_engine/rules/prepackaged_rules/persistence_google_workspace_api_access_granted_via_domain_wide_delegation_of_authority.json +++ b/x-pack/plugins/security_solution/server/lib/detection_engine/rules/prepackaged_rules/persistence_google_workspace_api_access_granted_via_domain_wide_delegation_of_authority.json @@ -23,7 +23,7 @@ "related_integrations": [ { "package": "google_workspace", - "version": "1.2.0" + "version": "^1.2.0" } ], "required_fields": [ @@ -79,5 +79,5 @@ ], "timestamp_override": "event.ingested", "type": "query", - "version": 100 + "version": 101 } diff --git a/x-pack/plugins/security_solution/server/lib/detection_engine/rules/prepackaged_rules/persistence_google_workspace_custom_admin_role_created.json b/x-pack/plugins/security_solution/server/lib/detection_engine/rules/prepackaged_rules/persistence_google_workspace_custom_admin_role_created.json index e25ef8e452d7e..775470992ae53 100644 --- a/x-pack/plugins/security_solution/server/lib/detection_engine/rules/prepackaged_rules/persistence_google_workspace_custom_admin_role_created.json +++ b/x-pack/plugins/security_solution/server/lib/detection_engine/rules/prepackaged_rules/persistence_google_workspace_custom_admin_role_created.json @@ -23,7 +23,7 @@ "related_integrations": [ { "package": "google_workspace", - "version": "1.2.0" + "version": "^1.2.0" } ], "required_fields": [ @@ -79,5 +79,5 @@ ], "timestamp_override": "event.ingested", "type": "query", - "version": 100 + "version": 101 } diff --git a/x-pack/plugins/security_solution/server/lib/detection_engine/rules/prepackaged_rules/persistence_google_workspace_policy_modified.json b/x-pack/plugins/security_solution/server/lib/detection_engine/rules/prepackaged_rules/persistence_google_workspace_policy_modified.json index 7e1366d93687f..b14935910b065 100644 --- a/x-pack/plugins/security_solution/server/lib/detection_engine/rules/prepackaged_rules/persistence_google_workspace_policy_modified.json +++ b/x-pack/plugins/security_solution/server/lib/detection_engine/rules/prepackaged_rules/persistence_google_workspace_policy_modified.json @@ -20,7 +20,7 @@ "related_integrations": [ { "package": "google_workspace", - "version": "1.2.0" + "version": "^1.2.0" } ], "required_fields": [ @@ -82,5 +82,5 @@ ], "timestamp_override": "event.ingested", "type": "query", - "version": 100 + "version": 101 } diff --git a/x-pack/plugins/security_solution/server/lib/detection_engine/rules/prepackaged_rules/persistence_google_workspace_role_modified.json b/x-pack/plugins/security_solution/server/lib/detection_engine/rules/prepackaged_rules/persistence_google_workspace_role_modified.json index b9f1fe4cbd7ca..bff307fea840b 100644 --- a/x-pack/plugins/security_solution/server/lib/detection_engine/rules/prepackaged_rules/persistence_google_workspace_role_modified.json +++ b/x-pack/plugins/security_solution/server/lib/detection_engine/rules/prepackaged_rules/persistence_google_workspace_role_modified.json @@ -23,7 +23,7 @@ "related_integrations": [ { "package": "google_workspace", - "version": "1.2.0" + "version": "^1.2.0" } ], "required_fields": [ @@ -79,5 +79,5 @@ ], "timestamp_override": "event.ingested", "type": "query", - "version": 100 + "version": 101 } diff --git a/x-pack/plugins/security_solution/server/lib/detection_engine/rules/prepackaged_rules/persistence_google_workspace_user_group_access_modified_to_allow_external_access.json b/x-pack/plugins/security_solution/server/lib/detection_engine/rules/prepackaged_rules/persistence_google_workspace_user_group_access_modified_to_allow_external_access.json index 435ad2fdc4329..fdd4c46e53a2e 100644 --- a/x-pack/plugins/security_solution/server/lib/detection_engine/rules/prepackaged_rules/persistence_google_workspace_user_group_access_modified_to_allow_external_access.json +++ b/x-pack/plugins/security_solution/server/lib/detection_engine/rules/prepackaged_rules/persistence_google_workspace_user_group_access_modified_to_allow_external_access.json @@ -23,7 +23,7 @@ "related_integrations": [ { "package": "google_workspace", - "version": "1.2.0" + "version": "^1.2.0" } ], "required_fields": [ @@ -92,5 +92,5 @@ ], "timestamp_override": "event.ingested", "type": "query", - "version": 1 + "version": 2 } diff --git a/x-pack/plugins/security_solution/server/lib/detection_engine/rules/prepackaged_rules/persistence_google_workspace_user_organizational_unit_changed.json b/x-pack/plugins/security_solution/server/lib/detection_engine/rules/prepackaged_rules/persistence_google_workspace_user_organizational_unit_changed.json index e843d62e13014..76e89a5d47170 100644 --- a/x-pack/plugins/security_solution/server/lib/detection_engine/rules/prepackaged_rules/persistence_google_workspace_user_organizational_unit_changed.json +++ b/x-pack/plugins/security_solution/server/lib/detection_engine/rules/prepackaged_rules/persistence_google_workspace_user_organizational_unit_changed.json @@ -23,7 +23,7 @@ "related_integrations": [ { "package": "google_workspace", - "version": "1.2.0" + "version": "^1.2.0" } ], "required_fields": [ @@ -92,5 +92,5 @@ ], "timestamp_override": "event.ingested", "type": "query", - "version": 1 + "version": 2 } diff --git a/x-pack/plugins/security_solution/server/lib/detection_engine/rules/prepackaged_rules/persistence_iam_group_creation.json b/x-pack/plugins/security_solution/server/lib/detection_engine/rules/prepackaged_rules/persistence_iam_group_creation.json index 09d17c5f088da..d23c3db3c249b 100644 --- a/x-pack/plugins/security_solution/server/lib/detection_engine/rules/prepackaged_rules/persistence_iam_group_creation.json +++ b/x-pack/plugins/security_solution/server/lib/detection_engine/rules/prepackaged_rules/persistence_iam_group_creation.json @@ -25,7 +25,7 @@ { "integration": "cloudtrail", "package": "aws", - "version": "1.10.2" + "version": "^1.5.0" } ], "required_fields": [ @@ -88,5 +88,5 @@ ], "timestamp_override": "event.ingested", "type": "query", - "version": 100 + "version": 101 } diff --git a/x-pack/plugins/security_solution/server/lib/detection_engine/rules/prepackaged_rules/persistence_mfa_disabled_for_azure_user.json b/x-pack/plugins/security_solution/server/lib/detection_engine/rules/prepackaged_rules/persistence_mfa_disabled_for_azure_user.json index 8b21e5358f71b..b1cabdf2dc002 100644 --- a/x-pack/plugins/security_solution/server/lib/detection_engine/rules/prepackaged_rules/persistence_mfa_disabled_for_azure_user.json +++ b/x-pack/plugins/security_solution/server/lib/detection_engine/rules/prepackaged_rules/persistence_mfa_disabled_for_azure_user.json @@ -16,7 +16,7 @@ "related_integrations": [ { "package": "azure", - "version": "0.12.0" + "version": "^1.0.0" } ], "required_fields": [ @@ -68,5 +68,5 @@ ], "timestamp_override": "event.ingested", "type": "query", - "version": 101 + "version": 102 } diff --git a/x-pack/plugins/security_solution/server/lib/detection_engine/rules/prepackaged_rules/persistence_mfa_disabled_for_google_workspace_organization.json b/x-pack/plugins/security_solution/server/lib/detection_engine/rules/prepackaged_rules/persistence_mfa_disabled_for_google_workspace_organization.json index ea562c183756e..b5dde67696611 100644 --- a/x-pack/plugins/security_solution/server/lib/detection_engine/rules/prepackaged_rules/persistence_mfa_disabled_for_google_workspace_organization.json +++ b/x-pack/plugins/security_solution/server/lib/detection_engine/rules/prepackaged_rules/persistence_mfa_disabled_for_google_workspace_organization.json @@ -20,7 +20,7 @@ "related_integrations": [ { "package": "google_workspace", - "version": "1.2.0" + "version": "^1.2.0" } ], "required_fields": [ @@ -82,5 +82,5 @@ ], "timestamp_override": "event.ingested", "type": "query", - "version": 100 + "version": 101 } diff --git a/x-pack/plugins/security_solution/server/lib/detection_engine/rules/prepackaged_rules/persistence_microsoft_365_exchange_dkim_signing_config_disabled.json b/x-pack/plugins/security_solution/server/lib/detection_engine/rules/prepackaged_rules/persistence_microsoft_365_exchange_dkim_signing_config_disabled.json index 1acb6b4097abe..034dd2cca73e3 100644 --- a/x-pack/plugins/security_solution/server/lib/detection_engine/rules/prepackaged_rules/persistence_microsoft_365_exchange_dkim_signing_config_disabled.json +++ b/x-pack/plugins/security_solution/server/lib/detection_engine/rules/prepackaged_rules/persistence_microsoft_365_exchange_dkim_signing_config_disabled.json @@ -22,7 +22,7 @@ "related_integrations": [ { "package": "o365", - "version": "1.3.0" + "version": "^1.3.0" } ], "required_fields": [ @@ -89,5 +89,5 @@ ], "timestamp_override": "event.ingested", "type": "query", - "version": 100 + "version": 101 } diff --git a/x-pack/plugins/security_solution/server/lib/detection_engine/rules/prepackaged_rules/persistence_microsoft_365_exchange_management_role_assignment.json b/x-pack/plugins/security_solution/server/lib/detection_engine/rules/prepackaged_rules/persistence_microsoft_365_exchange_management_role_assignment.json index 633c904fe746c..648c9fb76e85c 100644 --- a/x-pack/plugins/security_solution/server/lib/detection_engine/rules/prepackaged_rules/persistence_microsoft_365_exchange_management_role_assignment.json +++ b/x-pack/plugins/security_solution/server/lib/detection_engine/rules/prepackaged_rules/persistence_microsoft_365_exchange_management_role_assignment.json @@ -23,7 +23,7 @@ "related_integrations": [ { "package": "o365", - "version": "1.3.0" + "version": "^1.3.0" } ], "required_fields": [ @@ -84,5 +84,5 @@ ], "timestamp_override": "event.ingested", "type": "query", - "version": 100 + "version": 101 } diff --git a/x-pack/plugins/security_solution/server/lib/detection_engine/rules/prepackaged_rules/persistence_microsoft_365_global_administrator_role_assign.json b/x-pack/plugins/security_solution/server/lib/detection_engine/rules/prepackaged_rules/persistence_microsoft_365_global_administrator_role_assign.json index 8ff2741303bd5..d9878e325c37b 100644 --- a/x-pack/plugins/security_solution/server/lib/detection_engine/rules/prepackaged_rules/persistence_microsoft_365_global_administrator_role_assign.json +++ b/x-pack/plugins/security_solution/server/lib/detection_engine/rules/prepackaged_rules/persistence_microsoft_365_global_administrator_role_assign.json @@ -19,7 +19,7 @@ "related_integrations": [ { "package": "o365", - "version": "1.3.0" + "version": "^1.3.0" } ], "required_fields": [ @@ -82,5 +82,5 @@ ], "timestamp_override": "event.ingested", "type": "query", - "version": 100 + "version": 101 } diff --git a/x-pack/plugins/security_solution/server/lib/detection_engine/rules/prepackaged_rules/persistence_microsoft_365_teams_custom_app_interaction_allowed.json b/x-pack/plugins/security_solution/server/lib/detection_engine/rules/prepackaged_rules/persistence_microsoft_365_teams_custom_app_interaction_allowed.json index 485c55e14f22b..3535cad547648 100644 --- a/x-pack/plugins/security_solution/server/lib/detection_engine/rules/prepackaged_rules/persistence_microsoft_365_teams_custom_app_interaction_allowed.json +++ b/x-pack/plugins/security_solution/server/lib/detection_engine/rules/prepackaged_rules/persistence_microsoft_365_teams_custom_app_interaction_allowed.json @@ -22,7 +22,7 @@ "related_integrations": [ { "package": "o365", - "version": "1.3.0" + "version": "^1.3.0" } ], "required_fields": [ @@ -88,5 +88,5 @@ ], "timestamp_override": "event.ingested", "type": "query", - "version": 100 + "version": 101 } diff --git a/x-pack/plugins/security_solution/server/lib/detection_engine/rules/prepackaged_rules/persistence_microsoft_365_teams_external_access_enabled.json b/x-pack/plugins/security_solution/server/lib/detection_engine/rules/prepackaged_rules/persistence_microsoft_365_teams_external_access_enabled.json index 6297c5b5ca250..05e60d2470536 100644 --- a/x-pack/plugins/security_solution/server/lib/detection_engine/rules/prepackaged_rules/persistence_microsoft_365_teams_external_access_enabled.json +++ b/x-pack/plugins/security_solution/server/lib/detection_engine/rules/prepackaged_rules/persistence_microsoft_365_teams_external_access_enabled.json @@ -22,7 +22,7 @@ "related_integrations": [ { "package": "o365", - "version": "1.3.0" + "version": "^1.3.0" } ], "required_fields": [ @@ -88,5 +88,5 @@ ], "timestamp_override": "event.ingested", "type": "query", - "version": 100 + "version": 101 } diff --git a/x-pack/plugins/security_solution/server/lib/detection_engine/rules/prepackaged_rules/persistence_microsoft_365_teams_guest_access_enabled.json b/x-pack/plugins/security_solution/server/lib/detection_engine/rules/prepackaged_rules/persistence_microsoft_365_teams_guest_access_enabled.json index 6767d2da121c2..d102a801655e8 100644 --- a/x-pack/plugins/security_solution/server/lib/detection_engine/rules/prepackaged_rules/persistence_microsoft_365_teams_guest_access_enabled.json +++ b/x-pack/plugins/security_solution/server/lib/detection_engine/rules/prepackaged_rules/persistence_microsoft_365_teams_guest_access_enabled.json @@ -22,7 +22,7 @@ "related_integrations": [ { "package": "o365", - "version": "1.3.0" + "version": "^1.3.0" } ], "required_fields": [ @@ -88,5 +88,5 @@ ], "timestamp_override": "event.ingested", "type": "query", - "version": 100 + "version": 101 } diff --git a/x-pack/plugins/security_solution/server/lib/detection_engine/rules/prepackaged_rules/persistence_okta_attempt_to_modify_or_delete_application_sign_on_policy.json b/x-pack/plugins/security_solution/server/lib/detection_engine/rules/prepackaged_rules/persistence_okta_attempt_to_modify_or_delete_application_sign_on_policy.json index 177f4f5c09e98..c3de284691700 100644 --- a/x-pack/plugins/security_solution/server/lib/detection_engine/rules/prepackaged_rules/persistence_okta_attempt_to_modify_or_delete_application_sign_on_policy.json +++ b/x-pack/plugins/security_solution/server/lib/detection_engine/rules/prepackaged_rules/persistence_okta_attempt_to_modify_or_delete_application_sign_on_policy.json @@ -23,7 +23,7 @@ "related_integrations": [ { "package": "okta", - "version": "1.3.0" + "version": "^1.3.0" } ], "required_fields": [ @@ -70,5 +70,5 @@ ], "timestamp_override": "event.ingested", "type": "query", - "version": 100 + "version": 101 } diff --git a/x-pack/plugins/security_solution/server/lib/detection_engine/rules/prepackaged_rules/persistence_rds_cluster_creation.json b/x-pack/plugins/security_solution/server/lib/detection_engine/rules/prepackaged_rules/persistence_rds_cluster_creation.json index 13c04ef97a791..6cd4776337537 100644 --- a/x-pack/plugins/security_solution/server/lib/detection_engine/rules/prepackaged_rules/persistence_rds_cluster_creation.json +++ b/x-pack/plugins/security_solution/server/lib/detection_engine/rules/prepackaged_rules/persistence_rds_cluster_creation.json @@ -27,7 +27,7 @@ { "integration": "cloudtrail", "package": "aws", - "version": "1.10.2" + "version": "^1.5.0" } ], "required_fields": [ @@ -92,5 +92,5 @@ ], "timestamp_override": "event.ingested", "type": "query", - "version": 100 + "version": 101 } diff --git a/x-pack/plugins/security_solution/server/lib/detection_engine/rules/prepackaged_rules/persistence_rds_group_creation.json b/x-pack/plugins/security_solution/server/lib/detection_engine/rules/prepackaged_rules/persistence_rds_group_creation.json index 8c880e9dcb09f..b0193afd93c9f 100644 --- a/x-pack/plugins/security_solution/server/lib/detection_engine/rules/prepackaged_rules/persistence_rds_group_creation.json +++ b/x-pack/plugins/security_solution/server/lib/detection_engine/rules/prepackaged_rules/persistence_rds_group_creation.json @@ -25,7 +25,7 @@ { "integration": "cloudtrail", "package": "aws", - "version": "1.10.2" + "version": "^1.5.0" } ], "required_fields": [ @@ -88,5 +88,5 @@ ], "timestamp_override": "event.ingested", "type": "query", - "version": 100 + "version": 101 } diff --git a/x-pack/plugins/security_solution/server/lib/detection_engine/rules/prepackaged_rules/persistence_rds_instance_creation.json b/x-pack/plugins/security_solution/server/lib/detection_engine/rules/prepackaged_rules/persistence_rds_instance_creation.json index 49487238f21f8..678d0feea17b0 100644 --- a/x-pack/plugins/security_solution/server/lib/detection_engine/rules/prepackaged_rules/persistence_rds_instance_creation.json +++ b/x-pack/plugins/security_solution/server/lib/detection_engine/rules/prepackaged_rules/persistence_rds_instance_creation.json @@ -25,7 +25,7 @@ { "integration": "cloudtrail", "package": "aws", - "version": "1.10.2" + "version": "^1.5.0" } ], "required_fields": [ @@ -76,5 +76,5 @@ ], "timestamp_override": "event.ingested", "type": "query", - "version": 100 + "version": 101 } diff --git a/x-pack/plugins/security_solution/server/lib/detection_engine/rules/prepackaged_rules/persistence_redshift_instance_creation.json b/x-pack/plugins/security_solution/server/lib/detection_engine/rules/prepackaged_rules/persistence_redshift_instance_creation.json index 3283c14d9aca0..6375be698d4af 100644 --- a/x-pack/plugins/security_solution/server/lib/detection_engine/rules/prepackaged_rules/persistence_redshift_instance_creation.json +++ b/x-pack/plugins/security_solution/server/lib/detection_engine/rules/prepackaged_rules/persistence_redshift_instance_creation.json @@ -24,7 +24,7 @@ { "integration": "cloudtrail", "package": "aws", - "version": "1.10.2" + "version": "^1.5.0" } ], "required_fields": [ @@ -75,5 +75,5 @@ ], "timestamp_override": "event.ingested", "type": "query", - "version": 100 + "version": 101 } diff --git a/x-pack/plugins/security_solution/server/lib/detection_engine/rules/prepackaged_rules/persistence_route_53_domain_transfer_lock_disabled.json b/x-pack/plugins/security_solution/server/lib/detection_engine/rules/prepackaged_rules/persistence_route_53_domain_transfer_lock_disabled.json index 8dca090e0f9a6..2110c9652e3b0 100644 --- a/x-pack/plugins/security_solution/server/lib/detection_engine/rules/prepackaged_rules/persistence_route_53_domain_transfer_lock_disabled.json +++ b/x-pack/plugins/security_solution/server/lib/detection_engine/rules/prepackaged_rules/persistence_route_53_domain_transfer_lock_disabled.json @@ -26,7 +26,7 @@ { "integration": "cloudtrail", "package": "aws", - "version": "1.10.2" + "version": "^1.5.0" } ], "required_fields": [ @@ -91,5 +91,5 @@ ], "timestamp_override": "event.ingested", "type": "query", - "version": 100 + "version": 101 } diff --git a/x-pack/plugins/security_solution/server/lib/detection_engine/rules/prepackaged_rules/persistence_route_53_domain_transferred_to_another_account.json b/x-pack/plugins/security_solution/server/lib/detection_engine/rules/prepackaged_rules/persistence_route_53_domain_transferred_to_another_account.json index c62d4384302e7..05ce6140607c7 100644 --- a/x-pack/plugins/security_solution/server/lib/detection_engine/rules/prepackaged_rules/persistence_route_53_domain_transferred_to_another_account.json +++ b/x-pack/plugins/security_solution/server/lib/detection_engine/rules/prepackaged_rules/persistence_route_53_domain_transferred_to_another_account.json @@ -25,7 +25,7 @@ { "integration": "cloudtrail", "package": "aws", - "version": "1.10.2" + "version": "^1.5.0" } ], "required_fields": [ @@ -90,5 +90,5 @@ ], "timestamp_override": "event.ingested", "type": "query", - "version": 100 + "version": 101 } diff --git a/x-pack/plugins/security_solution/server/lib/detection_engine/rules/prepackaged_rules/persistence_route_53_hosted_zone_associated_with_a_vpc.json b/x-pack/plugins/security_solution/server/lib/detection_engine/rules/prepackaged_rules/persistence_route_53_hosted_zone_associated_with_a_vpc.json index 43d7e004867dd..03e739c86e575 100644 --- a/x-pack/plugins/security_solution/server/lib/detection_engine/rules/prepackaged_rules/persistence_route_53_hosted_zone_associated_with_a_vpc.json +++ b/x-pack/plugins/security_solution/server/lib/detection_engine/rules/prepackaged_rules/persistence_route_53_hosted_zone_associated_with_a_vpc.json @@ -24,7 +24,7 @@ { "integration": "cloudtrail", "package": "aws", - "version": "1.10.2" + "version": "^1.5.0" } ], "required_fields": [ @@ -80,5 +80,5 @@ ], "timestamp_override": "event.ingested", "type": "query", - "version": 100 + "version": 101 } diff --git a/x-pack/plugins/security_solution/server/lib/detection_engine/rules/prepackaged_rules/persistence_route_table_created.json b/x-pack/plugins/security_solution/server/lib/detection_engine/rules/prepackaged_rules/persistence_route_table_created.json index 49ed26fdd2d49..2f5858bf331e2 100644 --- a/x-pack/plugins/security_solution/server/lib/detection_engine/rules/prepackaged_rules/persistence_route_table_created.json +++ b/x-pack/plugins/security_solution/server/lib/detection_engine/rules/prepackaged_rules/persistence_route_table_created.json @@ -27,7 +27,7 @@ { "integration": "cloudtrail", "package": "aws", - "version": "1.10.2" + "version": "^1.5.0" } ], "required_fields": [ @@ -78,5 +78,5 @@ ], "timestamp_override": "event.ingested", "type": "query", - "version": 100 + "version": 101 } diff --git a/x-pack/plugins/security_solution/server/lib/detection_engine/rules/prepackaged_rules/persistence_route_table_modified_or_deleted.json b/x-pack/plugins/security_solution/server/lib/detection_engine/rules/prepackaged_rules/persistence_route_table_modified_or_deleted.json index 9855381acc3ac..69c6f31579b85 100644 --- a/x-pack/plugins/security_solution/server/lib/detection_engine/rules/prepackaged_rules/persistence_route_table_modified_or_deleted.json +++ b/x-pack/plugins/security_solution/server/lib/detection_engine/rules/prepackaged_rules/persistence_route_table_modified_or_deleted.json @@ -31,7 +31,7 @@ { "integration": "cloudtrail", "package": "aws", - "version": "1.10.2" + "version": "^1.5.0" } ], "required_fields": [ @@ -82,5 +82,5 @@ ], "timestamp_override": "event.ingested", "type": "query", - "version": 100 + "version": 101 } diff --git a/x-pack/plugins/security_solution/server/lib/detection_engine/rules/prepackaged_rules/persistence_user_added_as_owner_for_azure_application.json b/x-pack/plugins/security_solution/server/lib/detection_engine/rules/prepackaged_rules/persistence_user_added_as_owner_for_azure_application.json index 4fb01f45f6d5a..a7f57e93cbaf2 100644 --- a/x-pack/plugins/security_solution/server/lib/detection_engine/rules/prepackaged_rules/persistence_user_added_as_owner_for_azure_application.json +++ b/x-pack/plugins/security_solution/server/lib/detection_engine/rules/prepackaged_rules/persistence_user_added_as_owner_for_azure_application.json @@ -16,7 +16,7 @@ "related_integrations": [ { "package": "azure", - "version": "0.12.0" + "version": "^1.0.0" } ], "required_fields": [ @@ -67,5 +67,5 @@ ], "timestamp_override": "event.ingested", "type": "query", - "version": 100 + "version": 101 } diff --git a/x-pack/plugins/security_solution/server/lib/detection_engine/rules/prepackaged_rules/persistence_user_added_as_owner_for_azure_service_principal.json b/x-pack/plugins/security_solution/server/lib/detection_engine/rules/prepackaged_rules/persistence_user_added_as_owner_for_azure_service_principal.json index ed398ed5e9ea2..066b0cbfe8d84 100644 --- a/x-pack/plugins/security_solution/server/lib/detection_engine/rules/prepackaged_rules/persistence_user_added_as_owner_for_azure_service_principal.json +++ b/x-pack/plugins/security_solution/server/lib/detection_engine/rules/prepackaged_rules/persistence_user_added_as_owner_for_azure_service_principal.json @@ -19,7 +19,7 @@ "related_integrations": [ { "package": "azure", - "version": "0.12.0" + "version": "^1.0.0" } ], "required_fields": [ @@ -70,5 +70,5 @@ ], "timestamp_override": "event.ingested", "type": "query", - "version": 100 + "version": 101 } diff --git a/x-pack/plugins/security_solution/server/lib/detection_engine/rules/prepackaged_rules/privilege_escalation_aws_suspicious_saml_activity.json b/x-pack/plugins/security_solution/server/lib/detection_engine/rules/prepackaged_rules/privilege_escalation_aws_suspicious_saml_activity.json index 21015597f946d..e8119d810dbc8 100644 --- a/x-pack/plugins/security_solution/server/lib/detection_engine/rules/prepackaged_rules/privilege_escalation_aws_suspicious_saml_activity.json +++ b/x-pack/plugins/security_solution/server/lib/detection_engine/rules/prepackaged_rules/privilege_escalation_aws_suspicious_saml_activity.json @@ -24,7 +24,7 @@ { "integration": "cloudtrail", "package": "aws", - "version": "1.10.2" + "version": "^1.5.0" } ], "required_fields": [ @@ -102,5 +102,5 @@ ], "timestamp_override": "event.ingested", "type": "query", - "version": 100 + "version": 101 } diff --git a/x-pack/plugins/security_solution/server/lib/detection_engine/rules/prepackaged_rules/privilege_escalation_azure_kubernetes_rolebinding_created.json b/x-pack/plugins/security_solution/server/lib/detection_engine/rules/prepackaged_rules/privilege_escalation_azure_kubernetes_rolebinding_created.json index deed8fb00637c..23173232a65da 100644 --- a/x-pack/plugins/security_solution/server/lib/detection_engine/rules/prepackaged_rules/privilege_escalation_azure_kubernetes_rolebinding_created.json +++ b/x-pack/plugins/security_solution/server/lib/detection_engine/rules/prepackaged_rules/privilege_escalation_azure_kubernetes_rolebinding_created.json @@ -21,7 +21,7 @@ { "integration": "activitylogs", "package": "azure", - "version": "0.12.0" + "version": "^1.0.0" } ], "required_fields": [ @@ -66,5 +66,5 @@ ], "timestamp_override": "event.ingested", "type": "query", - "version": 100 + "version": 101 } diff --git a/x-pack/plugins/security_solution/server/lib/detection_engine/rules/prepackaged_rules/privilege_escalation_cyberarkpas_error_audit_event_promotion.json b/x-pack/plugins/security_solution/server/lib/detection_engine/rules/prepackaged_rules/privilege_escalation_cyberarkpas_error_audit_event_promotion.json index bb5dbe031c7df..3484db354a1d0 100644 --- a/x-pack/plugins/security_solution/server/lib/detection_engine/rules/prepackaged_rules/privilege_escalation_cyberarkpas_error_audit_event_promotion.json +++ b/x-pack/plugins/security_solution/server/lib/detection_engine/rules/prepackaged_rules/privilege_escalation_cyberarkpas_error_audit_event_promotion.json @@ -22,7 +22,7 @@ "related_integrations": [ { "package": "cyberarkpas", - "version": "2.2.0" + "version": "^2.2.0" } ], "required_fields": [ @@ -78,5 +78,5 @@ ], "timestamp_override": "event.ingested", "type": "query", - "version": 100 + "version": 101 } diff --git a/x-pack/plugins/security_solution/server/lib/detection_engine/rules/prepackaged_rules/privilege_escalation_cyberarkpas_recommended_events_to_monitor_promotion.json b/x-pack/plugins/security_solution/server/lib/detection_engine/rules/prepackaged_rules/privilege_escalation_cyberarkpas_recommended_events_to_monitor_promotion.json index 71d918844b943..6ee8411d989f1 100644 --- a/x-pack/plugins/security_solution/server/lib/detection_engine/rules/prepackaged_rules/privilege_escalation_cyberarkpas_recommended_events_to_monitor_promotion.json +++ b/x-pack/plugins/security_solution/server/lib/detection_engine/rules/prepackaged_rules/privilege_escalation_cyberarkpas_recommended_events_to_monitor_promotion.json @@ -22,7 +22,7 @@ "related_integrations": [ { "package": "cyberarkpas", - "version": "2.2.0" + "version": "^2.2.0" } ], "required_fields": [ @@ -83,5 +83,5 @@ ], "timestamp_override": "event.ingested", "type": "query", - "version": 100 + "version": 101 } diff --git a/x-pack/plugins/security_solution/server/lib/detection_engine/rules/prepackaged_rules/privilege_escalation_gcp_kubernetes_rolebindings_created_or_patched.json b/x-pack/plugins/security_solution/server/lib/detection_engine/rules/prepackaged_rules/privilege_escalation_gcp_kubernetes_rolebindings_created_or_patched.json index 1f949b57edc12..41d7c2e58474b 100644 --- a/x-pack/plugins/security_solution/server/lib/detection_engine/rules/prepackaged_rules/privilege_escalation_gcp_kubernetes_rolebindings_created_or_patched.json +++ b/x-pack/plugins/security_solution/server/lib/detection_engine/rules/prepackaged_rules/privilege_escalation_gcp_kubernetes_rolebindings_created_or_patched.json @@ -21,8 +21,9 @@ ], "related_integrations": [ { + "integration": "audit", "package": "gcp", - "version": "1.10.0" + "version": "^2.2.1" } ], "required_fields": [ @@ -72,5 +73,5 @@ ], "timestamp_override": "event.ingested", "type": "query", - "version": 100 + "version": 101 } diff --git a/x-pack/plugins/security_solution/server/lib/detection_engine/rules/prepackaged_rules/privilege_escalation_new_or_modified_federation_domain.json b/x-pack/plugins/security_solution/server/lib/detection_engine/rules/prepackaged_rules/privilege_escalation_new_or_modified_federation_domain.json index 90601a72b1b34..fba42b17b4fbb 100644 --- a/x-pack/plugins/security_solution/server/lib/detection_engine/rules/prepackaged_rules/privilege_escalation_new_or_modified_federation_domain.json +++ b/x-pack/plugins/security_solution/server/lib/detection_engine/rules/prepackaged_rules/privilege_escalation_new_or_modified_federation_domain.json @@ -23,7 +23,7 @@ "related_integrations": [ { "package": "o365", - "version": "1.3.0" + "version": "^1.3.0" } ], "required_fields": [ @@ -91,5 +91,5 @@ ], "timestamp_override": "event.ingested", "type": "query", - "version": 100 + "version": 101 } diff --git a/x-pack/plugins/security_solution/server/lib/detection_engine/rules/prepackaged_rules/privilege_escalation_root_login_without_mfa.json b/x-pack/plugins/security_solution/server/lib/detection_engine/rules/prepackaged_rules/privilege_escalation_root_login_without_mfa.json index 01b6ebd880189..058ff41c7444a 100644 --- a/x-pack/plugins/security_solution/server/lib/detection_engine/rules/prepackaged_rules/privilege_escalation_root_login_without_mfa.json +++ b/x-pack/plugins/security_solution/server/lib/detection_engine/rules/prepackaged_rules/privilege_escalation_root_login_without_mfa.json @@ -24,7 +24,7 @@ { "integration": "cloudtrail", "package": "aws", - "version": "1.10.2" + "version": "^1.5.0" } ], "required_fields": [ @@ -91,5 +91,5 @@ ], "timestamp_override": "event.ingested", "type": "query", - "version": 101 + "version": 102 } diff --git a/x-pack/plugins/security_solution/server/lib/detection_engine/rules/prepackaged_rules/privilege_escalation_sts_assumerole_usage.json b/x-pack/plugins/security_solution/server/lib/detection_engine/rules/prepackaged_rules/privilege_escalation_sts_assumerole_usage.json index d6acdcbc3d06a..b90ac6954163e 100644 --- a/x-pack/plugins/security_solution/server/lib/detection_engine/rules/prepackaged_rules/privilege_escalation_sts_assumerole_usage.json +++ b/x-pack/plugins/security_solution/server/lib/detection_engine/rules/prepackaged_rules/privilege_escalation_sts_assumerole_usage.json @@ -22,7 +22,7 @@ { "integration": "cloudtrail", "package": "aws", - "version": "1.10.2" + "version": "^1.5.0" } ], "required_fields": [ @@ -105,5 +105,5 @@ ], "timestamp_override": "event.ingested", "type": "query", - "version": 100 + "version": 101 } diff --git a/x-pack/plugins/security_solution/server/lib/detection_engine/rules/prepackaged_rules/privilege_escalation_sts_getsessiontoken_abuse.json b/x-pack/plugins/security_solution/server/lib/detection_engine/rules/prepackaged_rules/privilege_escalation_sts_getsessiontoken_abuse.json index f0a963883b26d..588708bcef4c8 100644 --- a/x-pack/plugins/security_solution/server/lib/detection_engine/rules/prepackaged_rules/privilege_escalation_sts_getsessiontoken_abuse.json +++ b/x-pack/plugins/security_solution/server/lib/detection_engine/rules/prepackaged_rules/privilege_escalation_sts_getsessiontoken_abuse.json @@ -22,7 +22,7 @@ { "integration": "cloudtrail", "package": "aws", - "version": "1.10.2" + "version": "^1.5.0" } ], "required_fields": [ @@ -105,5 +105,5 @@ ], "timestamp_override": "event.ingested", "type": "query", - "version": 100 + "version": 101 } diff --git a/x-pack/plugins/security_solution/server/lib/detection_engine/rules/prepackaged_rules/privilege_escalation_suspicious_assignment_of_controller_service_account.json b/x-pack/plugins/security_solution/server/lib/detection_engine/rules/prepackaged_rules/privilege_escalation_suspicious_assignment_of_controller_service_account.json index 9673e704e4772..fa217cf1cfd87 100644 --- a/x-pack/plugins/security_solution/server/lib/detection_engine/rules/prepackaged_rules/privilege_escalation_suspicious_assignment_of_controller_service_account.json +++ b/x-pack/plugins/security_solution/server/lib/detection_engine/rules/prepackaged_rules/privilege_escalation_suspicious_assignment_of_controller_service_account.json @@ -20,7 +20,7 @@ "related_integrations": [ { "package": "kubernetes", - "version": "1.17.2" + "version": "^1.4.1" } ], "required_fields": [ @@ -87,5 +87,5 @@ ], "timestamp_override": "event.ingested", "type": "query", - "version": 1 + "version": 2 } diff --git a/x-pack/plugins/security_solution/server/lib/detection_engine/rules/prepackaged_rules/privilege_escalation_updateassumerolepolicy.json b/x-pack/plugins/security_solution/server/lib/detection_engine/rules/prepackaged_rules/privilege_escalation_updateassumerolepolicy.json index b632697515ada..6e6bbe4bdef10 100644 --- a/x-pack/plugins/security_solution/server/lib/detection_engine/rules/prepackaged_rules/privilege_escalation_updateassumerolepolicy.json +++ b/x-pack/plugins/security_solution/server/lib/detection_engine/rules/prepackaged_rules/privilege_escalation_updateassumerolepolicy.json @@ -24,7 +24,7 @@ { "integration": "cloudtrail", "package": "aws", - "version": "1.10.2" + "version": "^1.5.0" } ], "required_fields": [ @@ -81,5 +81,5 @@ ], "timestamp_override": "event.ingested", "type": "query", - "version": 101 + "version": 102 } From 8ab92b206a470ab995bde4649af97341729f50f4 Mon Sep 17 00:00:00 2001 From: christineweng <18648970+christineweng@users.noreply.github.com> Date: Thu, 29 Sep 2022 15:10:45 -0500 Subject: [PATCH 27/72] [Security Solution][Analyzer] Fixed alignment issues for process cube in analyzer (#141706) * fixed alignment issues for process cube in analyzer * [CI] Auto-commit changed files from 'node scripts/eslint --no-cache --fix' Co-authored-by: kibanamachine <42973632+kibanamachine@users.noreply.github.com> --- .../public/resolver/view/panels/cube_for_process.tsx | 1 + .../public/resolver/view/panels/node_detail.tsx | 1 - 2 files changed, 1 insertion(+), 1 deletion(-) diff --git a/x-pack/plugins/security_solution/public/resolver/view/panels/cube_for_process.tsx b/x-pack/plugins/security_solution/public/resolver/view/panels/cube_for_process.tsx index d16e1bec3c36c..ef22f0f60edce 100644 --- a/x-pack/plugins/security_solution/public/resolver/view/panels/cube_for_process.tsx +++ b/x-pack/plugins/security_solution/public/resolver/view/panels/cube_for_process.tsx @@ -51,6 +51,7 @@ export const CubeForProcess = memo(function ({ viewBox="0 0 34 34" data-test-subj={dataTestSubj} isOrigin={isOrigin} + style={{ verticalAlign: 'middle' }} > {i18n.translate('xpack.securitySolution.resolver.node_icon', { diff --git a/x-pack/plugins/security_solution/public/resolver/view/panels/node_detail.tsx b/x-pack/plugins/security_solution/public/resolver/view/panels/node_detail.tsx index 2c4181add11cb..a3d3251e4100e 100644 --- a/x-pack/plugins/security_solution/public/resolver/view/panels/node_detail.tsx +++ b/x-pack/plugins/security_solution/public/resolver/view/panels/node_detail.tsx @@ -35,7 +35,6 @@ import { PanelContentError } from './panel_content_error'; const StyledCubeForProcess = styled(CubeForProcess)` position: relative; - top: 0.75em; `; const nodeDetailError = i18n.translate('xpack.securitySolution.resolver.panel.nodeDetail.Error', { From 0cfaff4deb81195f15b3dfc0ad7abf02bc59f268 Mon Sep 17 00:00:00 2001 From: Luke Gmys Date: Thu, 29 Sep 2022 22:31:01 +0200 Subject: [PATCH 28/72] [TIP] Align Threat Intel plugin loading states with the designs (#142200) --- .../indicators_barchart_wrapper.test.tsx.snap | 170 +----------- .../indicators_barchart_wrapper.stories.tsx | 242 ++++++++++++------ .../indicators_barchart_wrapper.test.tsx | 88 +++++-- .../indicators_barchart_wrapper.tsx | 49 +++- .../indicators_table.stories.tsx | 51 +++- .../indicators_table.test.tsx | 31 ++- .../indicators_table/indicators_table.tsx | 75 ++++-- .../hooks/use_aggregated_indicators.test.tsx | 2 + .../hooks/use_aggregated_indicators.ts | 13 +- .../modules/indicators/indicators_page.tsx | 18 +- 10 files changed, 428 insertions(+), 311 deletions(-) diff --git a/x-pack/plugins/threat_intelligence/public/modules/indicators/components/indicators_barchart_wrapper/__snapshots__/indicators_barchart_wrapper.test.tsx.snap b/x-pack/plugins/threat_intelligence/public/modules/indicators/components/indicators_barchart_wrapper/__snapshots__/indicators_barchart_wrapper.test.tsx.snap index bc2b71303138b..f7ae645c3b1d9 100644 --- a/x-pack/plugins/threat_intelligence/public/modules/indicators/components/indicators_barchart_wrapper/__snapshots__/indicators_barchart_wrapper.test.tsx.snap +++ b/x-pack/plugins/threat_intelligence/public/modules/indicators/components/indicators_barchart_wrapper/__snapshots__/indicators_barchart_wrapper.test.tsx.snap @@ -1,115 +1,10 @@ // Jest Snapshot v1, https://goo.gl/fbAQLP -exports[` should render barchart and field selector dropdown 1`] = ` -Object { - "asFragment": [Function], - "baseElement": -
-
-
-

- Trend -

-
-
-
-
- -
-
- - threat.feed.name - -
- -
-
-
-
- -
-
-
-
-
-
-
-
-
-
-
-
-
- , - "container":
+exports[` when not loading or refetching should render barchart and field selector dropdown 1`] = ` + +
@@ -212,57 +107,6 @@ Object { class="echContainer" />
-
, - "debug": [Function], - "findAllByAltText": [Function], - "findAllByDisplayValue": [Function], - "findAllByLabelText": [Function], - "findAllByPlaceholderText": [Function], - "findAllByRole": [Function], - "findAllByTestId": [Function], - "findAllByText": [Function], - "findAllByTitle": [Function], - "findByAltText": [Function], - "findByDisplayValue": [Function], - "findByLabelText": [Function], - "findByPlaceholderText": [Function], - "findByRole": [Function], - "findByTestId": [Function], - "findByText": [Function], - "findByTitle": [Function], - "getAllByAltText": [Function], - "getAllByDisplayValue": [Function], - "getAllByLabelText": [Function], - "getAllByPlaceholderText": [Function], - "getAllByRole": [Function], - "getAllByTestId": [Function], - "getAllByText": [Function], - "getAllByTitle": [Function], - "getByAltText": [Function], - "getByDisplayValue": [Function], - "getByLabelText": [Function], - "getByPlaceholderText": [Function], - "getByRole": [Function], - "getByTestId": [Function], - "getByText": [Function], - "getByTitle": [Function], - "queryAllByAltText": [Function], - "queryAllByDisplayValue": [Function], - "queryAllByLabelText": [Function], - "queryAllByPlaceholderText": [Function], - "queryAllByRole": [Function], - "queryAllByTestId": [Function], - "queryAllByText": [Function], - "queryAllByTitle": [Function], - "queryByAltText": [Function], - "queryByDisplayValue": [Function], - "queryByLabelText": [Function], - "queryByPlaceholderText": [Function], - "queryByRole": [Function], - "queryByTestId": [Function], - "queryByText": [Function], - "queryByTitle": [Function], - "rerender": [Function], - "unmount": [Function], -} +
+ `; diff --git a/x-pack/plugins/threat_intelligence/public/modules/indicators/components/indicators_barchart_wrapper/indicators_barchart_wrapper.stories.tsx b/x-pack/plugins/threat_intelligence/public/modules/indicators/components/indicators_barchart_wrapper/indicators_barchart_wrapper.stories.tsx index f08e8f3b2f0e8..ed7be8b06b4af 100644 --- a/x-pack/plugins/threat_intelligence/public/modules/indicators/components/indicators_barchart_wrapper/indicators_barchart_wrapper.stories.tsx +++ b/x-pack/plugins/threat_intelligence/public/modules/indicators/components/indicators_barchart_wrapper/indicators_barchart_wrapper.stories.tsx @@ -18,104 +18,108 @@ import { StoryProvidersComponent } from '../../../../common/mocks/story_provider import { mockKibanaTimelinesService } from '../../../../common/mocks/mock_kibana_timelines_service'; import { DEFAULT_TIME_RANGE } from '../../../query_bar/hooks/use_filters/utils'; import { IndicatorsBarChartWrapper } from './indicators_barchart_wrapper'; -import { Aggregation, AGGREGATION_NAME } from '../../services/fetch_aggregated_indicators'; +import { + Aggregation, + AGGREGATION_NAME, + ChartSeries, +} from '../../services/fetch_aggregated_indicators'; export default { component: IndicatorsBarChartWrapper, title: 'IndicatorsBarChartWrapper', }; -export const Default: Story = () => { - const mockTimeRange: TimeRange = DEFAULT_TIME_RANGE; +const mockTimeRange: TimeRange = DEFAULT_TIME_RANGE; + +const mockIndexPattern: DataView = { + fields: [ + { + name: '@timestamp', + type: 'date', + } as DataViewField, + { + name: 'threat.feed.name', + type: 'string', + } as DataViewField, + ], +} as DataView; - const mockIndexPattern: DataView = { - fields: [ +const validDate: string = '1 Jan 2022 00:00:00 GMT'; +const numberOfDays: number = 1; +const aggregation1: Aggregation = { + events: { + buckets: [ { - name: '@timestamp', - type: 'date', - } as DataViewField, + doc_count: 0, + key: 1641016800000, + key_as_string: '1 Jan 2022 06:00:00 GMT', + }, { - name: 'threat.feed.name', - type: 'string', - } as DataViewField, + doc_count: 10, + key: 1641038400000, + key_as_string: '1 Jan 2022 12:00:00 GMT', + }, ], - } as DataView; - - const validDate: string = '1 Jan 2022 00:00:00 GMT'; - const numberOfDays: number = 1; - const aggregation1: Aggregation = { - events: { - buckets: [ - { - doc_count: 0, - key: 1641016800000, - key_as_string: '1 Jan 2022 06:00:00 GMT', - }, - { - doc_count: 10, - key: 1641038400000, - key_as_string: '1 Jan 2022 12:00:00 GMT', - }, - ], - }, - doc_count: 0, - key: '[Filebeat] AbuseCH Malware', - }; - const aggregation2: Aggregation = { - events: { - buckets: [ - { - doc_count: 20, - key: 1641016800000, - key_as_string: '1 Jan 2022 06:00:00 GMT', - }, - { - doc_count: 8, - key: 1641038400000, - key_as_string: '1 Jan 2022 12:00:00 GMT', - }, - ], - }, - doc_count: 0, - key: '[Filebeat] AbuseCH MalwareBazaar', - }; + }, + doc_count: 0, + key: '[Filebeat] AbuseCH Malware', +}; +const aggregation2: Aggregation = { + events: { + buckets: [ + { + doc_count: 20, + key: 1641016800000, + key_as_string: '1 Jan 2022 06:00:00 GMT', + }, + { + doc_count: 8, + key: 1641038400000, + key_as_string: '1 Jan 2022 12:00:00 GMT', + }, + ], + }, + doc_count: 0, + key: '[Filebeat] AbuseCH MalwareBazaar', +}; - const dataServiceMock = { - search: { - search: () => - of({ - rawResponse: { - aggregations: { - [AGGREGATION_NAME]: { - buckets: [aggregation1, aggregation2], - }, +const dataServiceMock = { + search: { + search: () => + of({ + rawResponse: { + aggregations: { + [AGGREGATION_NAME]: { + buckets: [aggregation1, aggregation2], }, }, - }), - }, - query: { - timefilter: { - timefilter: { - calculateBounds: () => ({ - min: moment(validDate), - max: moment(validDate).add(numberOfDays, 'days'), - }), }, + }), + }, + query: { + timefilter: { + timefilter: { + calculateBounds: () => ({ + min: moment(validDate), + max: moment(validDate).add(numberOfDays, 'days'), + }), }, - filterManager: { - getFilters: () => {}, - setFilters: () => {}, - getUpdates$: () => of(), - }, }, - } as unknown as DataPublicPluginStart; + filterManager: { + getFilters: () => {}, + setFilters: () => {}, + getUpdates$: () => of(), + }, + }, +} as unknown as DataPublicPluginStart; - const uiSettingsMock = { - get: () => {}, - } as unknown as IUiSettingsClient; +const uiSettingsMock = { + get: () => {}, +} as unknown as IUiSettingsClient; - const timelinesMock = mockKibanaTimelinesService; +const timelinesMock = mockKibanaTimelinesService; +export const Default: Story = () => { return ( = () => { ); }; + Default.decorators = [(story) => {story()}]; + +export const InitialLoad: Story = () => { + return ( + + + + ); +}; + +InitialLoad.decorators = [(story) => {story()}]; + +export const UpdatingData: Story = () => { + const mockIndicators: ChartSeries[] = [ + { + x: '1 Jan 2022 00:00:00 GMT', + y: 2, + g: '[Filebeat] AbuseCH Malware', + }, + { + x: '1 Jan 2022 00:00:00 GMT', + y: 10, + g: '[Filebeat] AbuseCH MalwareBazaar', + }, + { + x: '1 Jan 2022 06:00:00 GMT', + y: 0, + g: '[Filebeat] AbuseCH Malware', + }, + { + x: '1 Jan 2022 06:00:00 GMT', + y: 0, + g: '[Filebeat] AbuseCH MalwareBazaar', + }, + { + x: '1 Jan 2022 12:00:00 GMT', + y: 25, + g: '[Filebeat] AbuseCH Malware', + }, + { + x: '1 Jan 2022 18:00:00 GMT', + y: 15, + g: '[Filebeat] AbuseCH MalwareBazaar', + }, + ]; + + return ( + + + + ); +}; + +UpdatingData.decorators = [(story) => {story()}]; diff --git a/x-pack/plugins/threat_intelligence/public/modules/indicators/components/indicators_barchart_wrapper/indicators_barchart_wrapper.test.tsx b/x-pack/plugins/threat_intelligence/public/modules/indicators/components/indicators_barchart_wrapper/indicators_barchart_wrapper.test.tsx index 48d084b0e832a..ef968be02c224 100644 --- a/x-pack/plugins/threat_intelligence/public/modules/indicators/components/indicators_barchart_wrapper/indicators_barchart_wrapper.test.tsx +++ b/x-pack/plugins/threat_intelligence/public/modules/indicators/components/indicators_barchart_wrapper/indicators_barchart_wrapper.test.tsx @@ -10,9 +10,11 @@ import { render } from '@testing-library/react'; import { TimeRange } from '@kbn/es-query'; import { DataView, DataViewField } from '@kbn/data-views-plugin/common'; import { TestProvidersComponent } from '../../../../common/mocks/test_providers'; -import { IndicatorsBarChartWrapper } from './indicators_barchart_wrapper'; +import { + CHART_UPDATE_PROGRESS_TEST_ID, + IndicatorsBarChartWrapper, +} from './indicators_barchart_wrapper'; import { DEFAULT_TIME_RANGE } from '../../../query_bar/hooks/use_filters/utils'; -import { useFilters } from '../../../query_bar/hooks/use_filters'; import moment from 'moment'; jest.mock('../../../query_bar/hooks/use_filters'); @@ -32,33 +34,67 @@ const mockIndexPattern: DataView = { const mockTimeRange: TimeRange = DEFAULT_TIME_RANGE; -const stub = () => {}; - describe('', () => { - beforeEach(() => { - (useFilters as jest.MockedFunction).mockReturnValue({ - filters: [], - filterQuery: { language: 'kuery', query: '' }, - filterManager: {} as any, - handleSavedQuery: stub, - handleSubmitQuery: stub, - handleSubmitTimeRange: stub, + describe('when not loading or refetching', () => { + it('should render barchart and field selector dropdown', () => { + const component = render( + + + + ); + + expect(component.asFragment()).toMatchSnapshot(); + }); + }); + + describe('when loading for the first time', () => { + it('should render progress indicator', () => { + const component = render( + + + + ); + + expect(component.queryByRole('progressbar')).toBeInTheDocument(); }); }); - it('should render barchart and field selector dropdown', () => { - const component = render( - - - - ); - expect(component).toMatchSnapshot(); + describe('when updating the data', () => { + it('should render progress indicator', () => { + const component = render( + + + + ); + + expect(component.queryByTestId(CHART_UPDATE_PROGRESS_TEST_ID)).toBeInTheDocument(); + }); }); }); diff --git a/x-pack/plugins/threat_intelligence/public/modules/indicators/components/indicators_barchart_wrapper/indicators_barchart_wrapper.tsx b/x-pack/plugins/threat_intelligence/public/modules/indicators/components/indicators_barchart_wrapper/indicators_barchart_wrapper.tsx index 31148685e370d..aabfecde30243 100644 --- a/x-pack/plugins/threat_intelligence/public/modules/indicators/components/indicators_barchart_wrapper/indicators_barchart_wrapper.tsx +++ b/x-pack/plugins/threat_intelligence/public/modules/indicators/components/indicators_barchart_wrapper/indicators_barchart_wrapper.tsx @@ -6,7 +6,14 @@ */ import React, { memo } from 'react'; -import { EuiFlexGroup, EuiFlexItem, EuiTitle } from '@elastic/eui'; +import { + EuiFlexGroup, + EuiFlexItem, + EuiLoadingSpinner, + EuiPanel, + EuiProgress, + EuiTitle, +} from '@elastic/eui'; import { FormattedMessage } from '@kbn/i18n-react'; import { TimeRange } from '@kbn/es-query'; import { TimeRangeBounds } from '@kbn/data-plugin/common'; @@ -18,6 +25,8 @@ import { ChartSeries } from '../../services/fetch_aggregated_indicators'; const DEFAULT_FIELD = RawIndicatorFieldId.Feed; +export const CHART_UPDATE_PROGRESS_TEST_ID = 'tiBarchartWrapper-updating'; + export interface IndicatorsBarChartWrapperProps { /** * From and to values received from the KQL bar and passed down to the hook to query data. @@ -35,6 +44,12 @@ export interface IndicatorsBarChartWrapperProps { field: string; onFieldChange: (value: string) => void; + + /** Is initial load in progress? */ + isLoading?: boolean; + + /** Is data update in progress? */ + isFetching?: boolean; } /** @@ -42,9 +57,21 @@ export interface IndicatorsBarChartWrapperProps { * and handles retrieving aggregated indicator data. */ export const IndicatorsBarChartWrapper = memo( - ({ timeRange, indexPattern, series, dateRange, field, onFieldChange }) => { + ({ timeRange, indexPattern, isLoading, isFetching, series, dateRange, field, onFieldChange }) => { + if (isLoading) { + return ( + + + + + + + + ); + } + return ( - <> +
@@ -64,12 +91,20 @@ export const IndicatorsBarChartWrapper = memo( /> - {timeRange ? ( + + {isFetching && ( + + )} + + {timeRange && ( - ) : ( - <> )} - +
); } ); diff --git a/x-pack/plugins/threat_intelligence/public/modules/indicators/components/indicators_table/indicators_table.stories.tsx b/x-pack/plugins/threat_intelligence/public/modules/indicators/components/indicators_table/indicators_table.stories.tsx index 6505996a26a7d..95217171cb9e5 100644 --- a/x-pack/plugins/threat_intelligence/public/modules/indicators/components/indicators_table/indicators_table.stories.tsx +++ b/x-pack/plugins/threat_intelligence/public/modules/indicators/components/indicators_table/indicators_table.stories.tsx @@ -36,7 +36,7 @@ const columnSettings = { onSort: stub, }, }; -export function WithIndicators() { +export function IndicatorsFullyLoaded() { const indicatorsFixture: Indicator[] = Array(10).fill(generateMockIndicator()); return ( @@ -62,6 +62,55 @@ export function WithIndicators() { ); } +export function FirstLoad() { + return ( + + + + ); +} + +export function DataUpdateInProgress() { + const indicatorsFixture: Indicator[] = Array(10).fill(generateMockIndicator()); + + return ( + + + + + + ); +} + export function WithNoIndicators() { return ( diff --git a/x-pack/plugins/threat_intelligence/public/modules/indicators/components/indicators_table/indicators_table.test.tsx b/x-pack/plugins/threat_intelligence/public/modules/indicators/components/indicators_table/indicators_table.test.tsx index 027033ae47710..eb1d4c3411c1f 100644 --- a/x-pack/plugins/threat_intelligence/public/modules/indicators/components/indicators_table/indicators_table.test.tsx +++ b/x-pack/plugins/threat_intelligence/public/modules/indicators/components/indicators_table/indicators_table.test.tsx @@ -7,7 +7,11 @@ import { act, render, screen } from '@testing-library/react'; import React from 'react'; -import { IndicatorsTable, IndicatorsTableProps } from './indicators_table'; +import { + IndicatorsTable, + IndicatorsTableProps, + TABLE_UPDATE_PROGRESS_TEST_ID, +} from './indicators_table'; import { TestProvidersComponent } from '../../../../common/mocks/test_providers'; import { generateMockIndicator, Indicator } from '../../../../../common/types/indicator'; import { BUTTON_TEST_ID } from '../open_indicator_flyout_button'; @@ -56,7 +60,7 @@ const indicatorsFixture: Indicator[] = [ ]; describe('', () => { - it('should render loading spinner when loading', async () => { + it('should render loading spinner when doing initial loading', async () => { await act(async () => { render( @@ -68,6 +72,25 @@ describe('', () => { expect(screen.queryByRole('progressbar')).toBeInTheDocument(); }); + it('should render loading indicator when doing data update', async () => { + await act(async () => { + render( + + + + ); + }); + + screen.debug(); + + expect(screen.queryByTestId(TABLE_UPDATE_PROGRESS_TEST_ID)).toBeInTheDocument(); + }); + it('should render datagrid when loading is done', async () => { await act(async () => { render( @@ -75,6 +98,7 @@ describe('', () => { @@ -92,5 +116,8 @@ describe('', () => { }); expect(screen.queryByTestId(TITLE_TEST_ID)).toBeInTheDocument(); + + expect(screen.queryByRole('progressbar')).not.toBeInTheDocument(); + expect(screen.queryByTestId(TABLE_UPDATE_PROGRESS_TEST_ID)).not.toBeInTheDocument(); }); }); diff --git a/x-pack/plugins/threat_intelligence/public/modules/indicators/components/indicators_table/indicators_table.tsx b/x-pack/plugins/threat_intelligence/public/modules/indicators/components/indicators_table/indicators_table.tsx index d1888431f7d82..7391003471870 100644 --- a/x-pack/plugins/threat_intelligence/public/modules/indicators/components/indicators_table/indicators_table.tsx +++ b/x-pack/plugins/threat_intelligence/public/modules/indicators/components/indicators_table/indicators_table.tsx @@ -13,6 +13,8 @@ import { EuiFlexItem, EuiLoadingSpinner, EuiPanel, + EuiProgress, + EuiSpacer, } from '@elastic/eui'; import { FormattedMessage } from '@kbn/i18n-react'; @@ -39,7 +41,8 @@ export interface IndicatorsTableProps { /** * If true, no data is available yet */ - isLoading: boolean; + isLoading?: boolean; + isFetching?: boolean; indexPattern: SecuritySolutionDataViewBase; browserFields: BrowserFields; columnSettings: ColumnSettingsValue; @@ -54,6 +57,8 @@ const gridStyle = { fontSize: 's', } as const; +export const TABLE_UPDATE_PROGRESS_TEST_ID = `${TABLE_TEST_ID}-updating` as const; + export const IndicatorsTable: VFC = ({ indicators, indicatorCount, @@ -61,6 +66,7 @@ export const IndicatorsTable: VFC = ({ onChangeItemsPerPage, pagination, isLoading, + isFetching, browserFields, columnSettings: { columns, columnVisibility, handleResetColumns, handleToggleColumn, sorting }, }) => { @@ -157,44 +163,57 @@ export const IndicatorsTable: VFC = ({ } return ( - + <> + {isFetching && ( + + )} + + + + ); }, [ - columnVisibility, - mappedColumns, + isLoading, indicatorCount, + isFetching, leadingControlColumns, - isLoading, + renderCellValue, + toolbarOptions, + pagination, onChangeItemsPerPage, onChangePage, - pagination, - renderCellValue, sorting, - toolbarOptions, + columnVisibility, + mappedColumns, ]); return ( -
- + +
{flyoutFragment} {gridFragment} - -
+
+ ); }; diff --git a/x-pack/plugins/threat_intelligence/public/modules/indicators/hooks/use_aggregated_indicators.test.tsx b/x-pack/plugins/threat_intelligence/public/modules/indicators/hooks/use_aggregated_indicators.test.tsx index 85c703cf5dca1..21bff01fab760 100644 --- a/x-pack/plugins/threat_intelligence/public/modules/indicators/hooks/use_aggregated_indicators.test.tsx +++ b/x-pack/plugins/threat_intelligence/public/modules/indicators/hooks/use_aggregated_indicators.test.tsx @@ -88,6 +88,8 @@ describe('useAggregatedIndicators()', () => { "max": "2022-01-02T00:00:00.000Z", "min": "2022-01-01T00:00:00.000Z", }, + "isFetching": true, + "isLoading": true, "onFieldChange": [Function], "selectedField": "threat.feed.name", "series": Array [], diff --git a/x-pack/plugins/threat_intelligence/public/modules/indicators/hooks/use_aggregated_indicators.ts b/x-pack/plugins/threat_intelligence/public/modules/indicators/hooks/use_aggregated_indicators.ts index 98e672ac3ad91..06b99202288b6 100644 --- a/x-pack/plugins/threat_intelligence/public/modules/indicators/hooks/use_aggregated_indicators.ts +++ b/x-pack/plugins/threat_intelligence/public/modules/indicators/hooks/use_aggregated_indicators.ts @@ -49,6 +49,12 @@ export interface UseAggregatedIndicatorsValue { * Indicator field used to query the aggregated Indicators. */ selectedField: string; + + /** Is initial load in progress? */ + isLoading?: boolean; + + /** Is data update in progress? */ + isFetching?: boolean; } const DEFAULT_FIELD = RawIndicatorFieldId.Feed; @@ -80,7 +86,7 @@ export const useAggregatedIndicators = ({ [inspectorAdapters, queryService, searchService] ); - const { data } = useQuery( + const { data, isLoading, isFetching } = useQuery( [ 'indicatorsBarchart', { @@ -97,7 +103,8 @@ export const useAggregatedIndicators = ({ }: { signal?: AbortSignal; queryKey: [string, FetchAggregatedIndicatorsParams]; - }) => aggregatedIndicatorsQuery(queryParams, signal) + }) => aggregatedIndicatorsQuery(queryParams, signal), + { keepPreviousData: true } ); const dateRange = useMemo( @@ -110,5 +117,7 @@ export const useAggregatedIndicators = ({ series: data || [], onFieldChange: setField, selectedField: field, + isLoading, + isFetching, }; }; diff --git a/x-pack/plugins/threat_intelligence/public/modules/indicators/indicators_page.tsx b/x-pack/plugins/threat_intelligence/public/modules/indicators/indicators_page.tsx index fff2caad5715f..5ad0413003388 100644 --- a/x-pack/plugins/threat_intelligence/public/modules/indicators/indicators_page.tsx +++ b/x-pack/plugins/threat_intelligence/public/modules/indicators/indicators_page.tsx @@ -53,10 +53,11 @@ const IndicatorsPageContent: VFC = () => { handleRefresh, indicatorCount, indicators, - isLoading, onChangeItemsPerPage, onChangePage, pagination, + isLoading: isLoadingIndicators, + isFetching: isFetchingIndicators, } = useIndicators({ filters, filterQuery, @@ -64,7 +65,14 @@ const IndicatorsPageContent: VFC = () => { sorting: columnSettings.sorting.columns, }); - const { dateRange, series, selectedField, onFieldChange } = useAggregatedIndicators({ + const { + dateRange, + series, + selectedField, + onFieldChange, + isLoading: isLoadingAggregatedIndicators, + isFetching: isFetchingAggregatedIndicators, + } = useAggregatedIndicators({ timeRange, filters, filterQuery, @@ -97,7 +105,10 @@ const IndicatorsPageContent: VFC = () => { indexPattern={indexPattern} field={selectedField} onFieldChange={onFieldChange} + isFetching={isFetchingAggregatedIndicators} + isLoading={isLoadingAggregatedIndicators} /> + { pagination={pagination} indicatorCount={indicatorCount} indicators={indicators} - isLoading={isLoading} + isLoading={isLoadingIndicators} + isFetching={isFetchingIndicators} onChangeItemsPerPage={onChangeItemsPerPage} onChangePage={onChangePage} /> From 7274c272185ed87408ef2d32f11e6df5f5b2cf8a Mon Sep 17 00:00:00 2001 From: Jonathan Budzenski Date: Thu, 29 Sep 2022 16:18:19 -0500 Subject: [PATCH 29/72] [ci/build] Add label for building example plugins (#139720) * [ci/build] Add label for building example plugins * update snapshots * remove plugins before tests * fix * fix again * fix formatting --- .buildkite/scripts/build_kibana.sh | 1 + .buildkite/scripts/download_build_artifacts.sh | 7 +++++++ .buildkite/scripts/steps/demo_env/Dockerfile | 2 -- .gitignore | 1 + src/dev/build/args.test.ts | 14 +++++++------- src/dev/build/args.ts | 2 +- src/dev/build/build_distributables.ts | 12 ++++-------- .../build/tasks/build_kibana_example_plugins.ts | 15 +++++++-------- 8 files changed, 28 insertions(+), 26 deletions(-) diff --git a/.buildkite/scripts/build_kibana.sh b/.buildkite/scripts/build_kibana.sh index 90f9da8ac8de4..2757c956920f7 100755 --- a/.buildkite/scripts/build_kibana.sh +++ b/.buildkite/scripts/build_kibana.sh @@ -10,6 +10,7 @@ echo "--- Build Kibana Distribution" BUILD_ARGS="" is_pr_with_label "ci:build-all-platforms" && BUILD_ARGS="--all-platforms" +is_pr_with_label "ci:build-example-plugins" && BUILD_ARGS="$BUILD_ARGS --example-plugins" is_pr_with_label "ci:build-docker-cross-compile" && BUILD_ARG="$BUILD_ARGS --docker-cross-compile" is_pr_with_label "ci:build-os-packages" || BUILD_ARGS="$BUILD_ARGS --skip-os-packages" is_pr_with_label "ci:build-canvas-shareable-runtime" || BUILD_ARGS="$BUILD_ARGS --skip-canvas-shareable-runtime" diff --git a/.buildkite/scripts/download_build_artifacts.sh b/.buildkite/scripts/download_build_artifacts.sh index dd0ae660543a8..1e793346da33b 100755 --- a/.buildkite/scripts/download_build_artifacts.sh +++ b/.buildkite/scripts/download_build_artifacts.sh @@ -15,6 +15,13 @@ if [[ ! -d "$KIBANA_BUILD_LOCATION/bin" ]]; then mkdir -p "$KIBANA_BUILD_LOCATION" tar -xzf kibana-default.tar.gz -C "$KIBANA_BUILD_LOCATION" --strip=1 + if is_pr_with_label "ci:build-example-plugins"; then + # Testing against an example plugin distribution is not supported, + # mostly due to snapshot failures when testing UI element lists + rm -rf "$KIBANA_BUILD_LOCATION/plugins" + mkdir "$KIBANA_BUILD_LOCATION/plugins" + fi + cd "$KIBANA_DIR" tar -xzf ../kibana-default-plugins.tar.gz diff --git a/.buildkite/scripts/steps/demo_env/Dockerfile b/.buildkite/scripts/steps/demo_env/Dockerfile index a0b1c3311dc8c..4e841c04bbf42 100644 --- a/.buildkite/scripts/steps/demo_env/Dockerfile +++ b/.buildkite/scripts/steps/demo_env/Dockerfile @@ -1,4 +1,2 @@ ARG BASE_IMAGE FROM ${BASE_IMAGE} -COPY ./* /var/lib/example_plugins -RUN find /var/lib/example_plugins/ -type f -name '*.zip' | xargs -I % /usr/share/kibana/bin/kibana-plugin install 'file://%' diff --git a/.gitignore b/.gitignore index 98b294dbd6dc2..82a13e661a5bb 100644 --- a/.gitignore +++ b/.gitignore @@ -25,6 +25,7 @@ __tmp__ # Ignore example plugin builds /examples/*/build +/x-pack/examples/*/build # Ignore certain functional test runner artifacts /test/*/failure_debug diff --git a/src/dev/build/args.test.ts b/src/dev/build/args.test.ts index 6a7436284b2ea..3e1b1c72f88fb 100644 --- a/src/dev/build/args.test.ts +++ b/src/dev/build/args.test.ts @@ -28,13 +28,13 @@ it('build default and oss dist for current platform, without packages, by defaul Object { "buildOptions": Object { "buildCanvasShareableRuntime": true, + "buildExamplePlugins": false, "createArchives": true, "createDebPackage": false, "createDockerCloud": false, "createDockerContexts": true, "createDockerUBI": false, "createDockerUbuntu": false, - "createExamplePlugins": false, "createGenericFolders": true, "createPlatformFolders": true, "createRpmPackage": false, @@ -62,13 +62,13 @@ it('builds packages if --all-platforms is passed', () => { Object { "buildOptions": Object { "buildCanvasShareableRuntime": true, + "buildExamplePlugins": false, "createArchives": true, "createDebPackage": true, "createDockerCloud": true, "createDockerContexts": true, "createDockerUBI": true, "createDockerUbuntu": true, - "createExamplePlugins": false, "createGenericFolders": true, "createPlatformFolders": true, "createRpmPackage": true, @@ -96,13 +96,13 @@ it('limits packages if --rpm passed with --all-platforms', () => { Object { "buildOptions": Object { "buildCanvasShareableRuntime": true, + "buildExamplePlugins": false, "createArchives": true, "createDebPackage": false, "createDockerCloud": false, "createDockerContexts": true, "createDockerUBI": false, "createDockerUbuntu": false, - "createExamplePlugins": false, "createGenericFolders": true, "createPlatformFolders": true, "createRpmPackage": true, @@ -130,13 +130,13 @@ it('limits packages if --deb passed with --all-platforms', () => { Object { "buildOptions": Object { "buildCanvasShareableRuntime": true, + "buildExamplePlugins": false, "createArchives": true, "createDebPackage": true, "createDockerCloud": false, "createDockerContexts": true, "createDockerUBI": false, "createDockerUbuntu": false, - "createExamplePlugins": false, "createGenericFolders": true, "createPlatformFolders": true, "createRpmPackage": false, @@ -165,13 +165,13 @@ it('limits packages if --docker passed with --all-platforms', () => { Object { "buildOptions": Object { "buildCanvasShareableRuntime": true, + "buildExamplePlugins": false, "createArchives": true, "createDebPackage": false, "createDockerCloud": true, "createDockerContexts": true, "createDockerUBI": true, "createDockerUbuntu": true, - "createExamplePlugins": false, "createGenericFolders": true, "createPlatformFolders": true, "createRpmPackage": false, @@ -207,13 +207,13 @@ it('limits packages if --docker passed with --skip-docker-ubi and --all-platform Object { "buildOptions": Object { "buildCanvasShareableRuntime": true, + "buildExamplePlugins": false, "createArchives": true, "createDebPackage": false, "createDockerCloud": true, "createDockerContexts": true, "createDockerUBI": false, "createDockerUbuntu": true, - "createExamplePlugins": false, "createGenericFolders": true, "createPlatformFolders": true, "createRpmPackage": false, @@ -242,13 +242,13 @@ it('limits packages if --all-platforms passed with --skip-docker-ubuntu', () => Object { "buildOptions": Object { "buildCanvasShareableRuntime": true, + "buildExamplePlugins": false, "createArchives": true, "createDebPackage": true, "createDockerCloud": true, "createDockerContexts": true, "createDockerUBI": true, "createDockerUbuntu": false, - "createExamplePlugins": false, "createGenericFolders": true, "createPlatformFolders": true, "createRpmPackage": true, diff --git a/src/dev/build/args.ts b/src/dev/build/args.ts index c3d1a19f82a3e..c3cd4f164a483 100644 --- a/src/dev/build/args.ts +++ b/src/dev/build/args.ts @@ -127,7 +127,7 @@ export function readCliArgs(argv: string[]) { createGenericFolders: !Boolean(flags['skip-generic-folders']), createPlatformFolders: !Boolean(flags['skip-platform-folders']), createArchives: !Boolean(flags['skip-archives']), - createExamplePlugins: Boolean(flags['example-plugins']), + buildExamplePlugins: Boolean(flags['example-plugins']), createRpmPackage: isOsPackageDesired('rpm'), createDebPackage: isOsPackageDesired('deb'), createDockerUbuntu: diff --git a/src/dev/build/build_distributables.ts b/src/dev/build/build_distributables.ts index 0649c5ddc946a..40a1afa51add6 100644 --- a/src/dev/build/build_distributables.ts +++ b/src/dev/build/build_distributables.ts @@ -32,7 +32,7 @@ export interface BuildOptions { createDockerContexts: boolean; versionQualifier: string | undefined; targetAllPlatforms: boolean; - createExamplePlugins: boolean; + buildExamplePlugins: boolean; eprRegistry: 'production' | 'snapshot'; } @@ -58,13 +58,6 @@ export async function buildDistributables(log: ToolingLog, options: BuildOptions await run(Tasks.ExtractNodeBuilds); } - /** - * build example plugins - */ - if (options.createExamplePlugins) { - await run(Tasks.BuildKibanaExamplePlugins); - } - /** * run platform-generic build tasks */ @@ -79,6 +72,9 @@ export async function buildDistributables(log: ToolingLog, options: BuildOptions await run(Tasks.BuildCanvasShareableRuntime); } await run(Tasks.BuildKibanaPlatformPlugins); + if (options.buildExamplePlugins) { + await run(Tasks.BuildKibanaExamplePlugins); + } await run(Tasks.CreatePackageJson); await run(Tasks.InstallDependencies); await run(Tasks.GeneratePackagesOptimizedAssets); diff --git a/src/dev/build/tasks/build_kibana_example_plugins.ts b/src/dev/build/tasks/build_kibana_example_plugins.ts index 0208ba2ed61b6..6fc53e10390c2 100644 --- a/src/dev/build/tasks/build_kibana_example_plugins.ts +++ b/src/dev/build/tasks/build_kibana_example_plugins.ts @@ -9,14 +9,16 @@ import Path from 'path'; import Fs from 'fs'; import { REPO_ROOT } from '@kbn/utils'; -import { exec, mkdirp, copyAll, Task } from '../lib'; +import { exec, Task } from '../lib'; export const BuildKibanaExamplePlugins: Task = { description: 'Building distributable versions of Kibana example plugins', - async run(config, log) { + async run(config, log, build) { + const pluginsDir = build.resolvePath('plugins'); const args = [ Path.resolve(REPO_ROOT, 'scripts/plugin_helpers'), 'build', + '--skip-archive', `--kibana-version=${config.getBuildVersion()}`, ]; @@ -42,15 +44,12 @@ export const BuildKibanaExamplePlugins: Task = { cwd: examplePlugin, level: 'info', }); + log.info('Copying build to distribution'); + const pluginBuild = Path.resolve(examplePlugin, 'build', 'kibana'); + Fs.cpSync(pluginBuild, pluginsDir, { recursive: true }); } catch (e) { log.info(`Skipping ${examplePlugin}, no kibana.json`); } } - - const pluginsDir = config.resolveFromTarget('example_plugins'); - await mkdirp(pluginsDir); - await copyAll(REPO_ROOT, pluginsDir, { - select: ['examples/*/build/*.zip', 'x-pack/examples/*/build/*.zip'], - }); }, }; From 733d7e38ed8e5e340ce33331c9e4de79f829dc7f Mon Sep 17 00:00:00 2001 From: Jiawei Wu <74562234+JiaweiWu@users.noreply.github.com> Date: Thu, 29 Sep 2022 19:42:53 -0700 Subject: [PATCH 30/72] [RAM] Fix flaky rule details E2E tests (#138215) * Fix flaky rule details E2E tests * Clean up test entities * Add snooze while disabled test * Fix broken test due to tab changing order Co-authored-by: Kibana Machine <42973632+kibanamachine@users.noreply.github.com> --- .../apps/triggers_actions_ui/details.ts | 73 ++++++++++--------- 1 file changed, 40 insertions(+), 33 deletions(-) diff --git a/x-pack/test/functional_with_es_ssl/apps/triggers_actions_ui/details.ts b/x-pack/test/functional_with_es_ssl/apps/triggers_actions_ui/details.ts index 56dfa17ef6268..d32c5bd58a94c 100644 --- a/x-pack/test/functional_with_es_ssl/apps/triggers_actions_ui/details.ts +++ b/x-pack/test/functional_with_es_ssl/apps/triggers_actions_ui/details.ts @@ -136,9 +136,7 @@ export default ({ getPageObjects, getService }: FtrProviderContext) => { return response; } - // Failing: See https://github.com/elastic/kibana/issues/129337 - // Failing: See https://github.com/elastic/kibana/issues/129337 - describe.skip('Rule Details', function () { + describe('Rule Details', function () { describe('Header', function () { const testRunUuid = uuid.v4(); before(async () => { @@ -200,19 +198,27 @@ export default ({ getPageObjects, getService }: FtrProviderContext) => { }); }); - it('shouldnt allow you to snooze a disabled rule', async () => { + it('should allow you to snooze a disabled rule', async () => { const actionsDropdown = await testSubjects.find('statusDropdown'); expect(await actionsDropdown.getVisibleText()).to.eql('Disabled'); - await actionsDropdown.click(); - const actionsMenuElem = await testSubjects.find('ruleStatusMenu'); - const actionsMenuItemElem = await actionsMenuElem.findAllByClassName('euiContextMenuItem'); + let snoozeBadge = await testSubjects.find('rulesListNotifyBadge-unsnoozed'); + await snoozeBadge.click(); - expect(await actionsMenuItemElem.at(2)?.getVisibleText()).to.eql('Snooze'); - expect(await actionsMenuItemElem.at(2)?.getAttribute('disabled')).to.eql('true'); - // close the dropdown - await actionsDropdown.click(); + const snoozeIndefinite = await testSubjects.find('ruleSnoozeIndefiniteApply'); + await snoozeIndefinite.click(); + + await retry.try(async () => { + await testSubjects.existOrFail('rulesListNotifyBadge-snoozedIndefinitely'); + }); + + // Unsnooze the rule for the next test + snoozeBadge = await testSubjects.find('rulesListNotifyBadge-snoozedIndefinitely'); + await snoozeBadge.click(); + + const snoozeCancel = await testSubjects.find('ruleSnoozeCancel'); + await snoozeCancel.click(); }); it('should reenable a disabled the rule', async () => { @@ -232,42 +238,26 @@ export default ({ getPageObjects, getService }: FtrProviderContext) => { }); it('should snooze the rule', async () => { - const actionsDropdown = await testSubjects.find('statusDropdown'); - - expect(await actionsDropdown.getVisibleText()).to.eql('Enabled'); - - await actionsDropdown.click(); - const actionsMenuElem = await testSubjects.find('ruleStatusMenu'); - const actionsMenuItemElem = await actionsMenuElem.findAllByClassName('euiContextMenuItem'); - - await actionsMenuItemElem.at(2)?.click(); + const snoozeBadge = await testSubjects.find('rulesListNotifyBadge-unsnoozed'); + await snoozeBadge.click(); const snoozeIndefinite = await testSubjects.find('ruleSnoozeIndefiniteApply'); await snoozeIndefinite.click(); await retry.try(async () => { - expect(await actionsDropdown.getVisibleText()).to.eql('Snoozed'); - const remainingSnoozeTime = await testSubjects.find('remainingSnoozeTime'); - expect(await remainingSnoozeTime.getVisibleText()).to.eql('Indefinitely'); + await testSubjects.existOrFail('rulesListNotifyBadge-snoozedIndefinitely'); }); }); it('should unsnooze the rule', async () => { - const actionsDropdown = await testSubjects.find('statusDropdown'); - - expect(await actionsDropdown.getVisibleText()).to.eql('Snoozed'); - - await actionsDropdown.click(); - const actionsMenuElem = await testSubjects.find('ruleStatusMenu'); - const actionsMenuItemElem = await actionsMenuElem.findAllByClassName('euiContextMenuItem'); - - await actionsMenuItemElem.at(2)?.click(); + const snoozeBadge = await testSubjects.find('rulesListNotifyBadge-snoozedIndefinitely'); + await snoozeBadge.click(); const snoozeCancel = await testSubjects.find('ruleSnoozeCancel'); await snoozeCancel.click(); await retry.try(async () => { - expect(await actionsDropdown.getVisibleText()).to.eql('Enabled'); + await testSubjects.existOrFail('rulesListNotifyBadge-unsnoozed'); }); }); }); @@ -510,6 +500,22 @@ export default ({ getPageObjects, getService }: FtrProviderContext) => { expect(await testSubjects.exists('addNewActionConnectorActionGroup-0')).to.eql(true); expect(await testSubjects.exists('addNewActionConnectorActionGroup-1')).to.eql(true); + + // delete connector + await pageObjects.common.navigateToApp('triggersActions'); + // refresh to see alert + await browser.refresh(); + await pageObjects.header.waitUntilLoadingHasFinished(); + + // verify content + await testSubjects.existOrFail('rulesList'); + + await pageObjects.triggersActionsUI.changeTabs('connectorsTab'); + await pageObjects.triggersActionsUI.searchConnectors('new connector'); + await testSubjects.click('deleteConnector'); + await testSubjects.existOrFail('deleteIdsConfirmation'); + await testSubjects.click('deleteIdsConfirmation > confirmModalConfirmButton'); + await testSubjects.missingOrFail('deleteIdsConfirmation'); }); }); @@ -890,6 +896,7 @@ export default ({ getPageObjects, getService }: FtrProviderContext) => { it('renders the event log list and can filter/sort', async () => { await browser.refresh(); + await (await testSubjects.find('eventLogListTab')).click(); // Check to see if the experimental is enabled, if not, just return const tabbedContentExists = await testSubjects.exists('ruleDetailsTabbedContent'); From 66f209f4b20885a6749760eb04931e8428c36160 Mon Sep 17 00:00:00 2001 From: Kibana Machine <42973632+kibanamachine@users.noreply.github.com> Date: Thu, 29 Sep 2022 22:43:31 -0600 Subject: [PATCH 31/72] [api-docs] Daily api_docs build (#142298) --- api_docs/actions.mdx | 2 +- api_docs/advanced_settings.mdx | 2 +- api_docs/aiops.mdx | 2 +- api_docs/alerting.mdx | 2 +- api_docs/apm.mdx | 2 +- api_docs/banners.mdx | 2 +- api_docs/bfetch.mdx | 2 +- api_docs/canvas.mdx | 2 +- api_docs/cases.mdx | 2 +- api_docs/charts.mdx | 2 +- api_docs/cloud.mdx | 2 +- api_docs/cloud_experiments.mdx | 2 +- api_docs/cloud_security_posture.mdx | 2 +- api_docs/console.mdx | 2 +- api_docs/controls.mdx | 2 +- api_docs/core.mdx | 2 +- api_docs/custom_integrations.devdocs.json | 2 +- api_docs/custom_integrations.mdx | 2 +- api_docs/dashboard.mdx | 2 +- api_docs/dashboard_enhanced.mdx | 2 +- api_docs/data.mdx | 2 +- api_docs/data_query.mdx | 2 +- api_docs/data_search.mdx | 2 +- api_docs/data_view_editor.mdx | 2 +- api_docs/data_view_field_editor.mdx | 2 +- api_docs/data_view_management.mdx | 2 +- api_docs/data_views.mdx | 2 +- api_docs/data_visualizer.mdx | 2 +- api_docs/deprecations_by_api.mdx | 2 +- api_docs/deprecations_by_plugin.mdx | 2 +- api_docs/deprecations_by_team.mdx | 2 +- api_docs/dev_tools.mdx | 2 +- api_docs/discover.mdx | 2 +- api_docs/discover_enhanced.mdx | 2 +- api_docs/embeddable.mdx | 2 +- api_docs/embeddable_enhanced.mdx | 2 +- api_docs/encrypted_saved_objects.mdx | 2 +- api_docs/enterprise_search.mdx | 2 +- api_docs/es_ui_shared.mdx | 2 +- api_docs/event_annotation.mdx | 2 +- api_docs/event_log.mdx | 2 +- api_docs/expression_error.mdx | 2 +- api_docs/expression_gauge.mdx | 2 +- api_docs/expression_heatmap.mdx | 2 +- api_docs/expression_image.mdx | 2 +- api_docs/expression_legacy_metric_vis.mdx | 2 +- api_docs/expression_metric.mdx | 2 +- api_docs/expression_metric_vis.mdx | 2 +- api_docs/expression_partition_vis.mdx | 2 +- api_docs/expression_repeat_image.mdx | 2 +- api_docs/expression_reveal_image.mdx | 2 +- api_docs/expression_shape.mdx | 2 +- api_docs/expression_tagcloud.mdx | 2 +- api_docs/expression_x_y.mdx | 2 +- api_docs/expressions.devdocs.json | 42 +- api_docs/expressions.mdx | 2 +- api_docs/features.mdx | 2 +- api_docs/field_formats.mdx | 2 +- api_docs/file_upload.mdx | 2 +- api_docs/files.mdx | 2 +- api_docs/fleet.devdocs.json | 16 + api_docs/fleet.mdx | 4 +- api_docs/global_search.mdx | 2 +- api_docs/guided_onboarding.mdx | 2 +- api_docs/home.mdx | 2 +- api_docs/index_lifecycle_management.mdx | 2 +- api_docs/index_management.mdx | 2 +- api_docs/infra.mdx | 2 +- api_docs/inspector.mdx | 2 +- api_docs/interactive_setup.mdx | 2 +- api_docs/kbn_ace.mdx | 2 +- api_docs/kbn_aiops_components.mdx | 2 +- api_docs/kbn_aiops_utils.mdx | 2 +- api_docs/kbn_alerts.mdx | 2 +- api_docs/kbn_analytics.mdx | 2 +- api_docs/kbn_analytics_client.mdx | 2 +- ..._analytics_shippers_elastic_v3_browser.mdx | 2 +- ...n_analytics_shippers_elastic_v3_common.mdx | 2 +- ...n_analytics_shippers_elastic_v3_server.mdx | 2 +- api_docs/kbn_analytics_shippers_fullstory.mdx | 2 +- api_docs/kbn_apm_config_loader.mdx | 2 +- api_docs/kbn_apm_synthtrace.mdx | 2 +- api_docs/kbn_apm_utils.mdx | 2 +- api_docs/kbn_axe_config.mdx | 2 +- api_docs/kbn_chart_icons.mdx | 2 +- api_docs/kbn_ci_stats_core.mdx | 2 +- api_docs/kbn_ci_stats_performance_metrics.mdx | 2 +- api_docs/kbn_ci_stats_reporter.mdx | 2 +- api_docs/kbn_cli_dev_mode.mdx | 2 +- api_docs/kbn_coloring.mdx | 2 +- api_docs/kbn_config.mdx | 2 +- api_docs/kbn_config_mocks.mdx | 2 +- api_docs/kbn_config_schema.mdx | 2 +- .../kbn_content_management_table_list.mdx | 2 +- api_docs/kbn_core_analytics_browser.mdx | 2 +- .../kbn_core_analytics_browser_internal.mdx | 2 +- api_docs/kbn_core_analytics_browser_mocks.mdx | 2 +- api_docs/kbn_core_analytics_server.mdx | 2 +- .../kbn_core_analytics_server_internal.mdx | 2 +- api_docs/kbn_core_analytics_server_mocks.mdx | 2 +- api_docs/kbn_core_application_browser.mdx | 2 +- .../kbn_core_application_browser_internal.mdx | 2 +- .../kbn_core_application_browser_mocks.mdx | 2 +- api_docs/kbn_core_application_common.mdx | 2 +- api_docs/kbn_core_apps_browser_internal.mdx | 2 +- api_docs/kbn_core_apps_browser_mocks.mdx | 2 +- api_docs/kbn_core_base_browser_mocks.mdx | 2 +- api_docs/kbn_core_base_common.mdx | 2 +- api_docs/kbn_core_base_server_internal.mdx | 2 +- api_docs/kbn_core_base_server_mocks.mdx | 2 +- .../kbn_core_capabilities_browser_mocks.mdx | 2 +- api_docs/kbn_core_capabilities_common.mdx | 2 +- api_docs/kbn_core_capabilities_server.mdx | 2 +- .../kbn_core_capabilities_server_mocks.mdx | 2 +- api_docs/kbn_core_chrome_browser.mdx | 2 +- api_docs/kbn_core_chrome_browser_mocks.mdx | 2 +- api_docs/kbn_core_config_server_internal.mdx | 2 +- api_docs/kbn_core_deprecations_browser.mdx | 2 +- ...kbn_core_deprecations_browser_internal.mdx | 2 +- .../kbn_core_deprecations_browser_mocks.mdx | 2 +- api_docs/kbn_core_deprecations_common.mdx | 2 +- api_docs/kbn_core_deprecations_server.mdx | 2 +- .../kbn_core_deprecations_server_internal.mdx | 2 +- .../kbn_core_deprecations_server_mocks.mdx | 2 +- api_docs/kbn_core_doc_links_browser.mdx | 2 +- api_docs/kbn_core_doc_links_browser_mocks.mdx | 2 +- api_docs/kbn_core_doc_links_server.mdx | 2 +- api_docs/kbn_core_doc_links_server_mocks.mdx | 2 +- ...e_elasticsearch_client_server_internal.mdx | 2 +- ...core_elasticsearch_client_server_mocks.mdx | 2 +- api_docs/kbn_core_elasticsearch_server.mdx | 2 +- ...kbn_core_elasticsearch_server_internal.mdx | 2 +- .../kbn_core_elasticsearch_server_mocks.mdx | 2 +- .../kbn_core_environment_server_internal.mdx | 2 +- .../kbn_core_environment_server_mocks.mdx | 2 +- .../kbn_core_execution_context_browser.mdx | 2 +- ...ore_execution_context_browser_internal.mdx | 2 +- ...n_core_execution_context_browser_mocks.mdx | 2 +- .../kbn_core_execution_context_common.mdx | 2 +- .../kbn_core_execution_context_server.mdx | 2 +- ...core_execution_context_server_internal.mdx | 2 +- ...bn_core_execution_context_server_mocks.mdx | 2 +- api_docs/kbn_core_fatal_errors_browser.mdx | 2 +- .../kbn_core_fatal_errors_browser_mocks.mdx | 2 +- api_docs/kbn_core_http_browser.mdx | 2 +- api_docs/kbn_core_http_browser_internal.mdx | 2 +- api_docs/kbn_core_http_browser_mocks.mdx | 2 +- api_docs/kbn_core_http_common.mdx | 2 +- .../kbn_core_http_context_server_mocks.mdx | 2 +- ...re_http_request_handler_context_server.mdx | 2 +- .../kbn_core_http_router_server_internal.mdx | 2 +- .../kbn_core_http_router_server_mocks.mdx | 2 +- api_docs/kbn_core_http_server.mdx | 2 +- api_docs/kbn_core_http_server_internal.mdx | 2 +- api_docs/kbn_core_http_server_mocks.mdx | 2 +- api_docs/kbn_core_i18n_browser.mdx | 2 +- api_docs/kbn_core_i18n_browser_mocks.mdx | 2 +- api_docs/kbn_core_i18n_server.mdx | 2 +- api_docs/kbn_core_i18n_server_internal.mdx | 2 +- api_docs/kbn_core_i18n_server_mocks.mdx | 2 +- .../kbn_core_injected_metadata_browser.mdx | 2 +- ...n_core_injected_metadata_browser_mocks.mdx | 2 +- ...kbn_core_integrations_browser_internal.mdx | 2 +- .../kbn_core_integrations_browser_mocks.mdx | 2 +- api_docs/kbn_core_lifecycle_browser.mdx | 2 +- api_docs/kbn_core_lifecycle_browser_mocks.mdx | 2 +- api_docs/kbn_core_logging_server.mdx | 2 +- api_docs/kbn_core_logging_server_internal.mdx | 2 +- api_docs/kbn_core_logging_server_mocks.mdx | 2 +- ...ore_metrics_collectors_server_internal.mdx | 2 +- ...n_core_metrics_collectors_server_mocks.mdx | 2 +- api_docs/kbn_core_metrics_server.mdx | 2 +- api_docs/kbn_core_metrics_server_internal.mdx | 2 +- api_docs/kbn_core_metrics_server_mocks.mdx | 2 +- api_docs/kbn_core_mount_utils_browser.mdx | 2 +- api_docs/kbn_core_node_server.mdx | 2 +- api_docs/kbn_core_node_server_internal.mdx | 2 +- api_docs/kbn_core_node_server_mocks.mdx | 2 +- api_docs/kbn_core_notifications_browser.mdx | 2 +- ...bn_core_notifications_browser_internal.mdx | 2 +- .../kbn_core_notifications_browser_mocks.mdx | 2 +- api_docs/kbn_core_overlays_browser.mdx | 2 +- .../kbn_core_overlays_browser_internal.mdx | 2 +- api_docs/kbn_core_overlays_browser_mocks.mdx | 2 +- api_docs/kbn_core_plugins_browser.mdx | 2 +- api_docs/kbn_core_plugins_browser_mocks.mdx | 2 +- api_docs/kbn_core_preboot_server.mdx | 2 +- api_docs/kbn_core_preboot_server_mocks.mdx | 2 +- api_docs/kbn_core_rendering_browser_mocks.mdx | 2 +- .../kbn_core_saved_objects_api_browser.mdx | 2 +- .../kbn_core_saved_objects_api_server.mdx | 2 +- ...core_saved_objects_api_server_internal.mdx | 2 +- ...bn_core_saved_objects_api_server_mocks.mdx | 2 +- ...ore_saved_objects_base_server_internal.mdx | 2 +- ...n_core_saved_objects_base_server_mocks.mdx | 2 +- api_docs/kbn_core_saved_objects_browser.mdx | 2 +- ...bn_core_saved_objects_browser_internal.mdx | 2 +- .../kbn_core_saved_objects_browser_mocks.mdx | 2 +- api_docs/kbn_core_saved_objects_common.mdx | 2 +- ..._objects_import_export_server_internal.mdx | 2 +- ...ved_objects_import_export_server_mocks.mdx | 2 +- ...aved_objects_migration_server_internal.mdx | 2 +- ...e_saved_objects_migration_server_mocks.mdx | 2 +- api_docs/kbn_core_saved_objects_server.mdx | 2 +- ...kbn_core_saved_objects_server_internal.mdx | 2 +- .../kbn_core_saved_objects_server_mocks.mdx | 2 +- .../kbn_core_saved_objects_utils_server.mdx | 2 +- api_docs/kbn_core_status_common.mdx | 2 +- api_docs/kbn_core_status_common_internal.mdx | 2 +- api_docs/kbn_core_status_server.mdx | 2 +- api_docs/kbn_core_status_server_internal.mdx | 2 +- api_docs/kbn_core_status_server_mocks.mdx | 2 +- ...core_test_helpers_deprecations_getters.mdx | 2 +- ...n_core_test_helpers_http_setup_browser.mdx | 2 +- api_docs/kbn_core_theme_browser.mdx | 2 +- api_docs/kbn_core_theme_browser_internal.mdx | 2 +- api_docs/kbn_core_theme_browser_mocks.mdx | 2 +- api_docs/kbn_core_ui_settings_browser.mdx | 2 +- .../kbn_core_ui_settings_browser_internal.mdx | 2 +- .../kbn_core_ui_settings_browser_mocks.mdx | 2 +- api_docs/kbn_core_ui_settings_common.mdx | 2 +- api_docs/kbn_core_ui_settings_server.mdx | 2 +- .../kbn_core_ui_settings_server_internal.mdx | 2 +- .../kbn_core_ui_settings_server_mocks.mdx | 2 +- api_docs/kbn_core_usage_data_server.mdx | 2 +- .../kbn_core_usage_data_server_internal.mdx | 2 +- api_docs/kbn_core_usage_data_server_mocks.mdx | 2 +- api_docs/kbn_crypto.mdx | 2 +- api_docs/kbn_crypto_browser.mdx | 2 +- api_docs/kbn_datemath.mdx | 2 +- api_docs/kbn_dev_cli_errors.mdx | 2 +- api_docs/kbn_dev_cli_runner.mdx | 2 +- api_docs/kbn_dev_proc_runner.mdx | 2 +- api_docs/kbn_dev_utils.mdx | 2 +- api_docs/kbn_doc_links.mdx | 2 +- api_docs/kbn_docs_utils.mdx | 2 +- api_docs/kbn_ebt_tools.mdx | 2 +- api_docs/kbn_es_archiver.mdx | 2 +- api_docs/kbn_es_errors.mdx | 2 +- api_docs/kbn_es_query.mdx | 2 +- api_docs/kbn_es_types.mdx | 2 +- api_docs/kbn_eslint_plugin_imports.mdx | 2 +- api_docs/kbn_field_types.mdx | 2 +- api_docs/kbn_find_used_node_modules.mdx | 2 +- .../kbn_ftr_common_functional_services.mdx | 2 +- api_docs/kbn_generate.mdx | 2 +- api_docs/kbn_get_repo_files.mdx | 2 +- api_docs/kbn_handlebars.mdx | 2 +- api_docs/kbn_hapi_mocks.mdx | 2 +- api_docs/kbn_home_sample_data_card.mdx | 2 +- api_docs/kbn_home_sample_data_tab.mdx | 2 +- api_docs/kbn_i18n.mdx | 2 +- api_docs/kbn_import_resolver.mdx | 2 +- api_docs/kbn_interpreter.mdx | 2 +- api_docs/kbn_io_ts_utils.mdx | 2 +- api_docs/kbn_jest_serializers.mdx | 2 +- api_docs/kbn_journeys.mdx | 2 +- api_docs/kbn_kibana_manifest_schema.mdx | 2 +- api_docs/kbn_logging.mdx | 2 +- api_docs/kbn_logging_mocks.mdx | 2 +- api_docs/kbn_managed_vscode_config.mdx | 2 +- api_docs/kbn_mapbox_gl.mdx | 2 +- api_docs/kbn_ml_agg_utils.mdx | 2 +- api_docs/kbn_ml_is_populated_object.mdx | 2 +- api_docs/kbn_ml_string_hash.mdx | 2 +- api_docs/kbn_monaco.mdx | 2 +- api_docs/kbn_optimizer.mdx | 2 +- api_docs/kbn_optimizer_webpack_helpers.mdx | 2 +- api_docs/kbn_osquery_io_ts_types.mdx | 2 +- ..._performance_testing_dataset_extractor.mdx | 2 +- api_docs/kbn_plugin_generator.mdx | 2 +- api_docs/kbn_plugin_helpers.mdx | 2 +- api_docs/kbn_react_field.mdx | 2 +- api_docs/kbn_repo_source_classifier.mdx | 2 +- api_docs/kbn_rule_data_utils.mdx | 2 +- .../kbn_securitysolution_autocomplete.mdx | 2 +- api_docs/kbn_securitysolution_es_utils.mdx | 2 +- ...ritysolution_exception_list_components.mdx | 2 +- api_docs/kbn_securitysolution_hook_utils.mdx | 2 +- ..._securitysolution_io_ts_alerting_types.mdx | 2 +- .../kbn_securitysolution_io_ts_list_types.mdx | 2 +- api_docs/kbn_securitysolution_io_ts_types.mdx | 2 +- api_docs/kbn_securitysolution_io_ts_utils.mdx | 2 +- api_docs/kbn_securitysolution_list_api.mdx | 2 +- .../kbn_securitysolution_list_constants.mdx | 2 +- api_docs/kbn_securitysolution_list_hooks.mdx | 2 +- api_docs/kbn_securitysolution_list_utils.mdx | 2 +- api_docs/kbn_securitysolution_rules.mdx | 2 +- api_docs/kbn_securitysolution_t_grid.mdx | 2 +- api_docs/kbn_securitysolution_utils.mdx | 2 +- api_docs/kbn_server_http_tools.mdx | 2 +- api_docs/kbn_server_route_repository.mdx | 2 +- api_docs/kbn_shared_svg.mdx | 2 +- ...ared_ux_avatar_user_profile_components.mdx | 2 +- ...hared_ux_button_exit_full_screen_mocks.mdx | 2 +- api_docs/kbn_shared_ux_button_toolbar.mdx | 2 +- api_docs/kbn_shared_ux_card_no_data.mdx | 2 +- api_docs/kbn_shared_ux_card_no_data_mocks.mdx | 2 +- .../kbn_shared_ux_link_redirect_app_mocks.mdx | 2 +- .../kbn_shared_ux_page_analytics_no_data.mdx | 2 +- ...shared_ux_page_analytics_no_data_mocks.mdx | 2 +- .../kbn_shared_ux_page_kibana_no_data.mdx | 2 +- ...bn_shared_ux_page_kibana_no_data_mocks.mdx | 2 +- .../kbn_shared_ux_page_kibana_template.mdx | 2 +- ...n_shared_ux_page_kibana_template_mocks.mdx | 2 +- api_docs/kbn_shared_ux_page_no_data.mdx | 2 +- .../kbn_shared_ux_page_no_data_config.mdx | 2 +- ...bn_shared_ux_page_no_data_config_mocks.mdx | 2 +- api_docs/kbn_shared_ux_page_no_data_mocks.mdx | 2 +- api_docs/kbn_shared_ux_page_solution_nav.mdx | 2 +- .../kbn_shared_ux_prompt_no_data_views.mdx | 2 +- ...n_shared_ux_prompt_no_data_views_mocks.mdx | 2 +- api_docs/kbn_shared_ux_router.mdx | 2 +- api_docs/kbn_shared_ux_router_mocks.mdx | 2 +- api_docs/kbn_shared_ux_storybook_config.mdx | 2 +- api_docs/kbn_shared_ux_storybook_mock.mdx | 2 +- api_docs/kbn_shared_ux_utility.mdx | 2 +- api_docs/kbn_some_dev_log.mdx | 2 +- api_docs/kbn_sort_package_json.mdx | 2 +- api_docs/kbn_std.mdx | 2 +- api_docs/kbn_stdio_dev_helpers.mdx | 2 +- api_docs/kbn_storybook.mdx | 2 +- api_docs/kbn_telemetry_tools.mdx | 2 +- api_docs/kbn_test.mdx | 2 +- api_docs/kbn_test_jest_helpers.mdx | 2 +- api_docs/kbn_test_subj_selector.mdx | 2 +- api_docs/kbn_tooling_log.mdx | 2 +- api_docs/kbn_type_summarizer.mdx | 2 +- api_docs/kbn_type_summarizer_core.mdx | 2 +- api_docs/kbn_typed_react_router_config.mdx | 2 +- api_docs/kbn_ui_theme.mdx | 2 +- api_docs/kbn_user_profile_components.mdx | 2 +- api_docs/kbn_utility_types.mdx | 2 +- api_docs/kbn_utility_types_jest.mdx | 2 +- api_docs/kbn_utils.mdx | 2 +- api_docs/kbn_yarn_lock_validator.mdx | 2 +- api_docs/kibana_overview.mdx | 2 +- api_docs/kibana_react.mdx | 2 +- api_docs/kibana_utils.mdx | 2 +- api_docs/kubernetes_security.mdx | 2 +- api_docs/lens.devdocs.json | 22 +- api_docs/lens.mdx | 2 +- api_docs/license_api_guard.mdx | 2 +- api_docs/license_management.mdx | 2 +- api_docs/licensing.mdx | 2 +- api_docs/lists.mdx | 2 +- api_docs/management.mdx | 2 +- api_docs/maps.mdx | 2 +- api_docs/maps_ems.mdx | 2 +- api_docs/ml.mdx | 2 +- api_docs/monitoring.mdx | 2 +- api_docs/monitoring_collection.mdx | 2 +- api_docs/navigation.mdx | 2 +- api_docs/newsfeed.mdx | 2 +- api_docs/observability.mdx | 2 +- api_docs/osquery.mdx | 2 +- api_docs/plugin_directory.mdx | 8 +- api_docs/presentation_util.mdx | 2 +- api_docs/profiling.mdx | 2 +- api_docs/remote_clusters.mdx | 2 +- api_docs/reporting.mdx | 2 +- api_docs/rollup.mdx | 2 +- api_docs/rule_registry.mdx | 2 +- api_docs/runtime_fields.mdx | 2 +- api_docs/saved_objects.mdx | 2 +- api_docs/saved_objects_finder.mdx | 2 +- api_docs/saved_objects_management.mdx | 2 +- api_docs/saved_objects_tagging.mdx | 2 +- api_docs/saved_objects_tagging_oss.mdx | 2 +- api_docs/saved_search.mdx | 2 +- api_docs/screenshot_mode.mdx | 2 +- api_docs/screenshotting.mdx | 2 +- api_docs/security.mdx | 2 +- api_docs/security_solution.mdx | 2 +- api_docs/session_view.mdx | 2 +- api_docs/share.mdx | 2 +- api_docs/snapshot_restore.mdx | 2 +- api_docs/spaces.mdx | 2 +- api_docs/stack_alerts.mdx | 2 +- api_docs/stack_connectors.mdx | 2 +- api_docs/task_manager.mdx | 2 +- api_docs/telemetry.mdx | 2 +- api_docs/telemetry_collection_manager.mdx | 2 +- api_docs/telemetry_collection_xpack.mdx | 2 +- api_docs/telemetry_management_section.mdx | 2 +- api_docs/threat_intelligence.mdx | 2 +- api_docs/timelines.mdx | 2 +- api_docs/transform.mdx | 2 +- api_docs/triggers_actions_ui.mdx | 2 +- api_docs/ui_actions.mdx | 2 +- api_docs/ui_actions_enhanced.mdx | 2 +- api_docs/unified_field_list.mdx | 2 +- api_docs/unified_search.mdx | 2 +- api_docs/unified_search_autocomplete.mdx | 2 +- api_docs/url_forwarding.mdx | 2 +- api_docs/usage_collection.mdx | 2 +- api_docs/ux.mdx | 2 +- api_docs/vis_default_editor.mdx | 2 +- api_docs/vis_type_gauge.mdx | 2 +- api_docs/vis_type_heatmap.mdx | 2 +- api_docs/vis_type_pie.mdx | 2 +- api_docs/vis_type_table.mdx | 2 +- api_docs/vis_type_timelion.mdx | 2 +- api_docs/vis_type_timeseries.mdx | 2 +- api_docs/vis_type_vega.mdx | 2 +- api_docs/vis_type_vislib.mdx | 2 +- api_docs/vis_type_xy.mdx | 2 +- api_docs/visualizations.devdocs.json | 487 +++++++++++++++++- api_docs/visualizations.mdx | 4 +- 409 files changed, 961 insertions(+), 426 deletions(-) diff --git a/api_docs/actions.mdx b/api_docs/actions.mdx index 929e069b2bf52..27394a9d1337c 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: 2022-09-29 +date: 2022-09-30 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 43856104f3281..50e964f1d4fce 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: 2022-09-29 +date: 2022-09-30 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'advancedSettings'] --- import advancedSettingsObj from './advanced_settings.devdocs.json'; diff --git a/api_docs/aiops.mdx b/api_docs/aiops.mdx index 7694fbde6190c..97c9deaf7e160 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: 2022-09-29 +date: 2022-09-30 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 fd1ed97c10f2a..1d4419372cb8d 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: 2022-09-29 +date: 2022-09-30 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 934ffbbd33801..894f1a4124006 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: 2022-09-29 +date: 2022-09-30 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'apm'] --- import apmObj from './apm.devdocs.json'; diff --git a/api_docs/banners.mdx b/api_docs/banners.mdx index 12a25911e2da1..a88ae007a49f1 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: 2022-09-29 +date: 2022-09-30 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 c4055d6564051..9aa4dc3dc6cbd 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: 2022-09-29 +date: 2022-09-30 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 4ef1b1b03a0ec..98d04fe776c11 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: 2022-09-29 +date: 2022-09-30 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 6df29978541a0..8e0ec02de9523 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: 2022-09-29 +date: 2022-09-30 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 718e93231dffe..0daa29277e4c5 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: 2022-09-29 +date: 2022-09-30 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 74692e016ccf0..8794f842b3462 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: 2022-09-29 +date: 2022-09-30 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'cloud'] --- import cloudObj from './cloud.devdocs.json'; diff --git a/api_docs/cloud_experiments.mdx b/api_docs/cloud_experiments.mdx index 9b5efb2aa51f4..67f93229e1310 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: 2022-09-29 +date: 2022-09-30 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 1ccfb42f61d02..e1a21c6f2cc8b 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: 2022-09-29 +date: 2022-09-30 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 00e0779286aae..8ba5fe4e37288 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: 2022-09-29 +date: 2022-09-30 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'console'] --- import consoleObj from './console.devdocs.json'; diff --git a/api_docs/controls.mdx b/api_docs/controls.mdx index e1427ab3d19f0..b0885214467d7 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: 2022-09-29 +date: 2022-09-30 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'controls'] --- import controlsObj from './controls.devdocs.json'; diff --git a/api_docs/core.mdx b/api_docs/core.mdx index 798c6c53ce345..38ceacd3fae04 100644 --- a/api_docs/core.mdx +++ b/api_docs/core.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/core title: "core" image: https://source.unsplash.com/400x175/?github description: API docs for the core plugin -date: 2022-09-29 +date: 2022-09-30 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'core'] --- import coreObj from './core.devdocs.json'; diff --git a/api_docs/custom_integrations.devdocs.json b/api_docs/custom_integrations.devdocs.json index 03090384a0559..44611a9497dfc 100644 --- a/api_docs/custom_integrations.devdocs.json +++ b/api_docs/custom_integrations.devdocs.json @@ -298,7 +298,7 @@ "label": "languageClientsUiComponents", "description": [], "signature": [ - "Map>" + "{ [x: string]: React.FC<{}>; }" ], "path": "src/plugins/custom_integrations/public/types.ts", "deprecated": false, diff --git a/api_docs/custom_integrations.mdx b/api_docs/custom_integrations.mdx index 77c928f34e584..99cc968190594 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: 2022-09-29 +date: 2022-09-30 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 7a36e763bfeac..f429f17719091 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: 2022-09-29 +date: 2022-09-30 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 06821933db670..1b406c8cf22e8 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: 2022-09-29 +date: 2022-09-30 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 e5c75be5fa094..6b45be67575ce 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: 2022-09-29 +date: 2022-09-30 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'data'] --- import dataObj from './data.devdocs.json'; diff --git a/api_docs/data_query.mdx b/api_docs/data_query.mdx index fdd7cb4298da4..9c7512fae8261 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: 2022-09-29 +date: 2022-09-30 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 619cec4220ea7..6131baf378500 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: 2022-09-29 +date: 2022-09-30 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 f0d1bf1f9d458..eb804887cbbb7 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: 2022-09-29 +date: 2022-09-30 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 9800b25ff8baf..0360e887a0f14 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: 2022-09-29 +date: 2022-09-30 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 d2f23607c286c..cf20215434912 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: 2022-09-29 +date: 2022-09-30 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'dataViewManagement'] --- import dataViewManagementObj from './data_view_management.devdocs.json'; diff --git a/api_docs/data_views.mdx b/api_docs/data_views.mdx index 3c9d9dc38bae9..9e9e13d1c714b 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: 2022-09-29 +date: 2022-09-30 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 86bbfd4e83cfa..a31d748cb362d 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: 2022-09-29 +date: 2022-09-30 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'dataVisualizer'] --- import dataVisualizerObj from './data_visualizer.devdocs.json'; diff --git a/api_docs/deprecations_by_api.mdx b/api_docs/deprecations_by_api.mdx index 547c12c8570c2..32c98155e1b6a 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: 2022-09-29 +date: 2022-09-30 tags: ['contributor', 'dev', 'apidocs', 'kibana'] --- diff --git a/api_docs/deprecations_by_plugin.mdx b/api_docs/deprecations_by_plugin.mdx index 3943c847158f1..52ccce27de739 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: 2022-09-29 +date: 2022-09-30 tags: ['contributor', 'dev', 'apidocs', 'kibana'] --- diff --git a/api_docs/deprecations_by_team.mdx b/api_docs/deprecations_by_team.mdx index da0e278bffa6c..28ee76e3644fa 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: 2022-09-29 +date: 2022-09-30 tags: ['contributor', 'dev', 'apidocs', 'kibana'] --- diff --git a/api_docs/dev_tools.mdx b/api_docs/dev_tools.mdx index b724ab15e695e..9753d6519463e 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: 2022-09-29 +date: 2022-09-30 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 39b2814d4136c..d99574811ed8e 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: 2022-09-29 +date: 2022-09-30 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 e9974fbb2bf45..46669e83965b4 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: 2022-09-29 +date: 2022-09-30 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'discoverEnhanced'] --- import discoverEnhancedObj from './discover_enhanced.devdocs.json'; diff --git a/api_docs/embeddable.mdx b/api_docs/embeddable.mdx index 8bbe0a063796d..19cbeac71650f 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: 2022-09-29 +date: 2022-09-30 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 c53b6a4aba7e9..cad3566677f9a 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: 2022-09-29 +date: 2022-09-30 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 6cc990a42eba7..0964ad2d3db43 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: 2022-09-29 +date: 2022-09-30 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 8f80e15d3886b..25628d88904b8 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: 2022-09-29 +date: 2022-09-30 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'enterpriseSearch'] --- import enterpriseSearchObj from './enterprise_search.devdocs.json'; diff --git a/api_docs/es_ui_shared.mdx b/api_docs/es_ui_shared.mdx index 6a4ca6fcb7735..31bbfd3cfa77e 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: 2022-09-29 +date: 2022-09-30 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'esUiShared'] --- import esUiSharedObj from './es_ui_shared.devdocs.json'; diff --git a/api_docs/event_annotation.mdx b/api_docs/event_annotation.mdx index 159a2f7167b0a..70931ba483ca9 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: 2022-09-29 +date: 2022-09-30 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'eventAnnotation'] --- import eventAnnotationObj from './event_annotation.devdocs.json'; diff --git a/api_docs/event_log.mdx b/api_docs/event_log.mdx index b9be569d3a3e9..57cb17ed7f57d 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: 2022-09-29 +date: 2022-09-30 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'eventLog'] --- import eventLogObj from './event_log.devdocs.json'; diff --git a/api_docs/expression_error.mdx b/api_docs/expression_error.mdx index 6d9a8d244589a..87f06ab7f0fc8 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: 2022-09-29 +date: 2022-09-30 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 b38b786ca55b9..e2d8790bf2b71 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: 2022-09-29 +date: 2022-09-30 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 9d856b882a318..03060b8617a53 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: 2022-09-29 +date: 2022-09-30 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 84225e80ad009..7ccb3fec0ef4b 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: 2022-09-29 +date: 2022-09-30 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 e6902356f091e..ea8581c29a05f 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: 2022-09-29 +date: 2022-09-30 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 60a4d843aad34..b7d3b7b434519 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: 2022-09-29 +date: 2022-09-30 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 85c6421d292d1..901d559b5a7e7 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: 2022-09-29 +date: 2022-09-30 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 4d4a23fe3a6ff..4f53bb28008ea 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: 2022-09-29 +date: 2022-09-30 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 ff4af965c963e..aeff45f40a77f 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: 2022-09-29 +date: 2022-09-30 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 2d3ede34cf142..096441865046f 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: 2022-09-29 +date: 2022-09-30 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 114bb08462720..237430ae0fb81 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: 2022-09-29 +date: 2022-09-30 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 6a87768ff01e5..2316d7e48cc91 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: 2022-09-29 +date: 2022-09-30 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 bf0c8f9c49aea..6c70b3fd09b18 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: 2022-09-29 +date: 2022-09-30 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'expressionXY'] --- import expressionXYObj from './expression_x_y.devdocs.json'; diff --git a/api_docs/expressions.devdocs.json b/api_docs/expressions.devdocs.json index bae5e63702f4f..dfc68e39dd9c9 100644 --- a/api_docs/expressions.devdocs.json +++ b/api_docs/expressions.devdocs.json @@ -363,7 +363,7 @@ "label": "invokeChain", "description": [], "signature": [ - "(chainArr: ", + "([head, ...tail]: ", { "pluginId": "expressions", "scope": "common", @@ -373,7 +373,15 @@ }, "[], input: unknown) => ", "Observable", - "" + "<", + { + "pluginId": "expressions", + "scope": "common", + "docId": "kibExpressionsPluginApi", + "section": "def-common.ExpressionValueError", + "text": "ExpressionValueError" + }, + " | ChainOutput>" ], "path": "src/plugins/expressions/common/execution/execution.ts", "deprecated": false, @@ -384,7 +392,7 @@ "id": "def-public.Execution.invokeChain.$1", "type": "Array", "tags": [], - "label": "chainArr", + "label": "[head, ...tail]", "description": [], "signature": [ { @@ -13369,7 +13377,7 @@ "label": "invokeChain", "description": [], "signature": [ - "(chainArr: ", + "([head, ...tail]: ", { "pluginId": "expressions", "scope": "common", @@ -13379,7 +13387,15 @@ }, "[], input: unknown) => ", "Observable", - "" + "<", + { + "pluginId": "expressions", + "scope": "common", + "docId": "kibExpressionsPluginApi", + "section": "def-common.ExpressionValueError", + "text": "ExpressionValueError" + }, + " | ChainOutput>" ], "path": "src/plugins/expressions/common/execution/execution.ts", "deprecated": false, @@ -13390,7 +13406,7 @@ "id": "def-server.Execution.invokeChain.$1", "type": "Array", "tags": [], - "label": "chainArr", + "label": "[head, ...tail]", "description": [], "signature": [ { @@ -22158,7 +22174,7 @@ "label": "invokeChain", "description": [], "signature": [ - "(chainArr: ", + "([head, ...tail]: ", { "pluginId": "expressions", "scope": "common", @@ -22168,7 +22184,15 @@ }, "[], input: unknown) => ", "Observable", - "" + "<", + { + "pluginId": "expressions", + "scope": "common", + "docId": "kibExpressionsPluginApi", + "section": "def-common.ExpressionValueError", + "text": "ExpressionValueError" + }, + " | ChainOutput>" ], "path": "src/plugins/expressions/common/execution/execution.ts", "deprecated": false, @@ -22179,7 +22203,7 @@ "id": "def-common.Execution.invokeChain.$1", "type": "Array", "tags": [], - "label": "chainArr", + "label": "[head, ...tail]", "description": [], "signature": [ { diff --git a/api_docs/expressions.mdx b/api_docs/expressions.mdx index cb5617b237f7a..a2c88ec023169 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: 2022-09-29 +date: 2022-09-30 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 1c1d57aa91eb1..821587d02923a 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: 2022-09-29 +date: 2022-09-30 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 dc89d286ddfe5..77ec5bd6a6db2 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: 2022-09-29 +date: 2022-09-30 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'fieldFormats'] --- import fieldFormatsObj from './field_formats.devdocs.json'; diff --git a/api_docs/file_upload.mdx b/api_docs/file_upload.mdx index f29f32174d128..71fd5ede2e0a9 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: 2022-09-29 +date: 2022-09-30 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 3cc10c4a1612a..5536609e6bf4f 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: 2022-09-29 +date: 2022-09-30 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'files'] --- import filesObj from './files.devdocs.json'; diff --git a/api_docs/fleet.devdocs.json b/api_docs/fleet.devdocs.json index 3059a8f9c9f84..59f0a3a2c3c98 100644 --- a/api_docs/fleet.devdocs.json +++ b/api_docs/fleet.devdocs.json @@ -9645,6 +9645,22 @@ "deprecated": false, "trackAdoption": false }, + { + "parentPluginId": "fleet", + "id": "def-common.FleetServerAgent.last_checkin_message", + "type": "string", + "tags": [], + "label": "last_checkin_message", + "description": [ + "\nLast checkin message" + ], + "signature": [ + "string | undefined" + ], + "path": "x-pack/plugins/fleet/common/types/models/agent.ts", + "deprecated": false, + "trackAdoption": false + }, { "parentPluginId": "fleet", "id": "def-common.FleetServerAgent.default_api_key_id", diff --git a/api_docs/fleet.mdx b/api_docs/fleet.mdx index 7c5beab0d5c9d..61843d4ecb35c 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: 2022-09-29 +date: 2022-09-30 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'fleet'] --- import fleetObj from './fleet.devdocs.json'; @@ -21,7 +21,7 @@ Contact [Fleet](https://github.com/orgs/elastic/teams/fleet) for questions regar | Public API count | Any count | Items lacking comments | Missing exports | |-------------------|-----------|------------------------|-----------------| -| 996 | 3 | 893 | 17 | +| 997 | 3 | 893 | 17 | ## Client diff --git a/api_docs/global_search.mdx b/api_docs/global_search.mdx index 6803fa9d095e6..8681c30dcf97c 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: 2022-09-29 +date: 2022-09-30 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 062ffb1effb3c..01249c9253db9 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: 2022-09-29 +date: 2022-09-30 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 8f772016026cb..21a00dd18b779 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: 2022-09-29 +date: 2022-09-30 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'home'] --- import homeObj from './home.devdocs.json'; diff --git a/api_docs/index_lifecycle_management.mdx b/api_docs/index_lifecycle_management.mdx index 29de31f6cf689..08133b2e0ce45 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: 2022-09-29 +date: 2022-09-30 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 3dac89fa09d7f..e6a58683dd574 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: 2022-09-29 +date: 2022-09-30 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'indexManagement'] --- import indexManagementObj from './index_management.devdocs.json'; diff --git a/api_docs/infra.mdx b/api_docs/infra.mdx index 315978011a0b4..27d270ef03490 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: 2022-09-29 +date: 2022-09-30 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'infra'] --- import infraObj from './infra.devdocs.json'; diff --git a/api_docs/inspector.mdx b/api_docs/inspector.mdx index 1eec7a67db10b..69d8e811d233c 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: 2022-09-29 +date: 2022-09-30 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'inspector'] --- import inspectorObj from './inspector.devdocs.json'; diff --git a/api_docs/interactive_setup.mdx b/api_docs/interactive_setup.mdx index ba3797cab67d7..d425e08214e06 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: 2022-09-29 +date: 2022-09-30 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'interactiveSetup'] --- import interactiveSetupObj from './interactive_setup.devdocs.json'; diff --git a/api_docs/kbn_ace.mdx b/api_docs/kbn_ace.mdx index c6dcd6bde7831..85eedf5bc8cb1 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: 2022-09-29 +date: 2022-09-30 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/ace'] --- import kbnAceObj from './kbn_ace.devdocs.json'; diff --git a/api_docs/kbn_aiops_components.mdx b/api_docs/kbn_aiops_components.mdx index 78c88adbe04a1..0fcb70c426aac 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: 2022-09-29 +date: 2022-09-30 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/aiops-components'] --- import kbnAiopsComponentsObj from './kbn_aiops_components.devdocs.json'; diff --git a/api_docs/kbn_aiops_utils.mdx b/api_docs/kbn_aiops_utils.mdx index 8e0003a6394ae..7a5a7dc343e11 100644 --- a/api_docs/kbn_aiops_utils.mdx +++ b/api_docs/kbn_aiops_utils.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-aiops-utils title: "@kbn/aiops-utils" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/aiops-utils plugin -date: 2022-09-29 +date: 2022-09-30 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/aiops-utils'] --- import kbnAiopsUtilsObj from './kbn_aiops_utils.devdocs.json'; diff --git a/api_docs/kbn_alerts.mdx b/api_docs/kbn_alerts.mdx index b936fa218da1b..d3da6e6fc6278 100644 --- a/api_docs/kbn_alerts.mdx +++ b/api_docs/kbn_alerts.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-alerts title: "@kbn/alerts" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/alerts plugin -date: 2022-09-29 +date: 2022-09-30 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/alerts'] --- import kbnAlertsObj from './kbn_alerts.devdocs.json'; diff --git a/api_docs/kbn_analytics.mdx b/api_docs/kbn_analytics.mdx index 480d1389d1d53..b19adbf23a6ba 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: 2022-09-29 +date: 2022-09-30 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/analytics'] --- import kbnAnalyticsObj from './kbn_analytics.devdocs.json'; diff --git a/api_docs/kbn_analytics_client.mdx b/api_docs/kbn_analytics_client.mdx index 67d5f65e938ae..cb3267bf94c0f 100644 --- a/api_docs/kbn_analytics_client.mdx +++ b/api_docs/kbn_analytics_client.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-analytics-client title: "@kbn/analytics-client" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/analytics-client plugin -date: 2022-09-29 +date: 2022-09-30 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/analytics-client'] --- import kbnAnalyticsClientObj from './kbn_analytics_client.devdocs.json'; diff --git a/api_docs/kbn_analytics_shippers_elastic_v3_browser.mdx b/api_docs/kbn_analytics_shippers_elastic_v3_browser.mdx index 2c75bd5664b65..6f92758ba29f5 100644 --- a/api_docs/kbn_analytics_shippers_elastic_v3_browser.mdx +++ b/api_docs/kbn_analytics_shippers_elastic_v3_browser.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-analytics-shippers-elastic-v3-browser title: "@kbn/analytics-shippers-elastic-v3-browser" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/analytics-shippers-elastic-v3-browser plugin -date: 2022-09-29 +date: 2022-09-30 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/analytics-shippers-elastic-v3-browser'] --- import kbnAnalyticsShippersElasticV3BrowserObj from './kbn_analytics_shippers_elastic_v3_browser.devdocs.json'; diff --git a/api_docs/kbn_analytics_shippers_elastic_v3_common.mdx b/api_docs/kbn_analytics_shippers_elastic_v3_common.mdx index af39931531e69..42ba3bd8ac0d9 100644 --- a/api_docs/kbn_analytics_shippers_elastic_v3_common.mdx +++ b/api_docs/kbn_analytics_shippers_elastic_v3_common.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-analytics-shippers-elastic-v3-common title: "@kbn/analytics-shippers-elastic-v3-common" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/analytics-shippers-elastic-v3-common plugin -date: 2022-09-29 +date: 2022-09-30 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/analytics-shippers-elastic-v3-common'] --- import kbnAnalyticsShippersElasticV3CommonObj from './kbn_analytics_shippers_elastic_v3_common.devdocs.json'; diff --git a/api_docs/kbn_analytics_shippers_elastic_v3_server.mdx b/api_docs/kbn_analytics_shippers_elastic_v3_server.mdx index 5515fe767880f..9e24183eab48c 100644 --- a/api_docs/kbn_analytics_shippers_elastic_v3_server.mdx +++ b/api_docs/kbn_analytics_shippers_elastic_v3_server.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-analytics-shippers-elastic-v3-server title: "@kbn/analytics-shippers-elastic-v3-server" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/analytics-shippers-elastic-v3-server plugin -date: 2022-09-29 +date: 2022-09-30 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/analytics-shippers-elastic-v3-server'] --- import kbnAnalyticsShippersElasticV3ServerObj from './kbn_analytics_shippers_elastic_v3_server.devdocs.json'; diff --git a/api_docs/kbn_analytics_shippers_fullstory.mdx b/api_docs/kbn_analytics_shippers_fullstory.mdx index d857977462103..642cfc316df01 100644 --- a/api_docs/kbn_analytics_shippers_fullstory.mdx +++ b/api_docs/kbn_analytics_shippers_fullstory.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-analytics-shippers-fullstory title: "@kbn/analytics-shippers-fullstory" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/analytics-shippers-fullstory plugin -date: 2022-09-29 +date: 2022-09-30 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/analytics-shippers-fullstory'] --- import kbnAnalyticsShippersFullstoryObj from './kbn_analytics_shippers_fullstory.devdocs.json'; diff --git a/api_docs/kbn_apm_config_loader.mdx b/api_docs/kbn_apm_config_loader.mdx index ec16bbb3798aa..64f41b4de638f 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: 2022-09-29 +date: 2022-09-30 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/apm-config-loader'] --- import kbnApmConfigLoaderObj from './kbn_apm_config_loader.devdocs.json'; diff --git a/api_docs/kbn_apm_synthtrace.mdx b/api_docs/kbn_apm_synthtrace.mdx index cd86d11a33dc4..a07ae6ec5b388 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: 2022-09-29 +date: 2022-09-30 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/apm-synthtrace'] --- import kbnApmSynthtraceObj from './kbn_apm_synthtrace.devdocs.json'; diff --git a/api_docs/kbn_apm_utils.mdx b/api_docs/kbn_apm_utils.mdx index 24e76f781315f..ccabe37aa9fbf 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: 2022-09-29 +date: 2022-09-30 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/apm-utils'] --- import kbnApmUtilsObj from './kbn_apm_utils.devdocs.json'; diff --git a/api_docs/kbn_axe_config.mdx b/api_docs/kbn_axe_config.mdx index a38a76d26da3c..904c2db7eeb95 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: 2022-09-29 +date: 2022-09-30 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/axe-config'] --- import kbnAxeConfigObj from './kbn_axe_config.devdocs.json'; diff --git a/api_docs/kbn_chart_icons.mdx b/api_docs/kbn_chart_icons.mdx index 96f35a5ca85a3..3ef51f85a1dd8 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: 2022-09-29 +date: 2022-09-30 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 efc5f97cca9fe..4dbba9e0e4bbf 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: 2022-09-29 +date: 2022-09-30 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 7030b63abaa14..a3510af5f70b1 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: 2022-09-29 +date: 2022-09-30 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 464ef1f629346..c1bdc23214055 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: 2022-09-29 +date: 2022-09-30 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 7aac22dfeead6..dd6763ce0a98c 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: 2022-09-29 +date: 2022-09-30 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/cli-dev-mode'] --- import kbnCliDevModeObj from './kbn_cli_dev_mode.devdocs.json'; diff --git a/api_docs/kbn_coloring.mdx b/api_docs/kbn_coloring.mdx index edd9cb125e751..b8a547e074cd5 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: 2022-09-29 +date: 2022-09-30 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 b82dc689dba2f..f2993b49d5f86 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: 2022-09-29 +date: 2022-09-30 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/config'] --- import kbnConfigObj from './kbn_config.devdocs.json'; diff --git a/api_docs/kbn_config_mocks.mdx b/api_docs/kbn_config_mocks.mdx index cebca9163e797..62491682503dc 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: 2022-09-29 +date: 2022-09-30 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 bd788d6e1868d..cf14ce5a40d53 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: 2022-09-29 +date: 2022-09-30 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/config-schema'] --- import kbnConfigSchemaObj from './kbn_config_schema.devdocs.json'; diff --git a/api_docs/kbn_content_management_table_list.mdx b/api_docs/kbn_content_management_table_list.mdx index ac56135aa2927..11c9a0928b583 100644 --- a/api_docs/kbn_content_management_table_list.mdx +++ b/api_docs/kbn_content_management_table_list.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-content-management-table-list title: "@kbn/content-management-table-list" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/content-management-table-list plugin -date: 2022-09-29 +date: 2022-09-30 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/content-management-table-list'] --- import kbnContentManagementTableListObj from './kbn_content_management_table_list.devdocs.json'; diff --git a/api_docs/kbn_core_analytics_browser.mdx b/api_docs/kbn_core_analytics_browser.mdx index eefeafb88d5d6..76cb685c99f35 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: 2022-09-29 +date: 2022-09-30 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 36b99e4215594..6c4d86bf0b722 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: 2022-09-29 +date: 2022-09-30 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 abf361ac547be..34614865e7e8f 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: 2022-09-29 +date: 2022-09-30 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-analytics-browser-mocks'] --- import kbnCoreAnalyticsBrowserMocksObj from './kbn_core_analytics_browser_mocks.devdocs.json'; diff --git a/api_docs/kbn_core_analytics_server.mdx b/api_docs/kbn_core_analytics_server.mdx index ec45043e4726a..1342382025c64 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: 2022-09-29 +date: 2022-09-30 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 04e49781988c4..da2faf312d367 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: 2022-09-29 +date: 2022-09-30 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 126ab218962cd..f2810dc16d62c 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: 2022-09-29 +date: 2022-09-30 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 71e7fae504f5f..b002114d3e337 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: 2022-09-29 +date: 2022-09-30 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 55beb31993bb2..c726e5f8b7876 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: 2022-09-29 +date: 2022-09-30 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 c777505da45db..fe234ab156ecd 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: 2022-09-29 +date: 2022-09-30 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 10828fe0de714..f0450f42dbb9d 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: 2022-09-29 +date: 2022-09-30 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 978ac4faed760..b486574b88c2c 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: 2022-09-29 +date: 2022-09-30 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 16fd9445d124c..6c09e87c4cc07 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: 2022-09-29 +date: 2022-09-30 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_base_browser_mocks.mdx b/api_docs/kbn_core_base_browser_mocks.mdx index cdaf427d6802b..6f23a43cb533a 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: 2022-09-29 +date: 2022-09-30 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 5bd2a717b5b84..98cc757ce42de 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: 2022-09-29 +date: 2022-09-30 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 76f931b4d756c..69b473e30ee8a 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: 2022-09-29 +date: 2022-09-30 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 77aa19a6800c9..be0a688924dac 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: 2022-09-29 +date: 2022-09-30 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 e6bfe1ecd7db2..8eee81e91198b 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: 2022-09-29 +date: 2022-09-30 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 e9475861b697e..48ebe7f76b165 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: 2022-09-29 +date: 2022-09-30 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 d6dc431b07fdc..6c6318b812457 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: 2022-09-29 +date: 2022-09-30 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 fdf7cc31d41f9..0087fd5a98375 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: 2022-09-29 +date: 2022-09-30 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 73d5385236586..cb7a24e95c615 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: 2022-09-29 +date: 2022-09-30 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 a1f512749d437..b98bb79392f8a 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: 2022-09-29 +date: 2022-09-30 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 42574e3029ea4..83a912dd03fdb 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: 2022-09-29 +date: 2022-09-30 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_deprecations_browser.mdx b/api_docs/kbn_core_deprecations_browser.mdx index 6bb0bb64c5ba2..a3f274459a413 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: 2022-09-29 +date: 2022-09-30 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 938d8d6b38aff..eeb3c991a0d63 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: 2022-09-29 +date: 2022-09-30 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 9d33c64bd7f4a..2eb4bda78a5c1 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: 2022-09-29 +date: 2022-09-30 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 7f254dda6eee2..1edd0ca68c530 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: 2022-09-29 +date: 2022-09-30 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 527a5f2be91ee..35470535f96e8 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: 2022-09-29 +date: 2022-09-30 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 7b470aeff3555..b9f9b064de302 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: 2022-09-29 +date: 2022-09-30 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 34e0e5fb4d1fe..118225780a1f2 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: 2022-09-29 +date: 2022-09-30 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 97c4d2e6d4b44..c1331c1caec0f 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: 2022-09-29 +date: 2022-09-30 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 0347b3f309a86..7c77af97bad80 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: 2022-09-29 +date: 2022-09-30 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 5cccdf33b5038..3e100243e2116 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: 2022-09-29 +date: 2022-09-30 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 e2c4d921a70b3..83c04c073ea9c 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: 2022-09-29 +date: 2022-09-30 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 1d786ddcd3496..ea9ad18fb0ac4 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: 2022-09-29 +date: 2022-09-30 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 25079df745e3c..524e9382c019f 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: 2022-09-29 +date: 2022-09-30 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 a5712d10acd36..2c5d8ce0deeed 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: 2022-09-29 +date: 2022-09-30 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 2b2107d520826..dd5df0e31e51e 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: 2022-09-29 +date: 2022-09-30 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 c9aa728e95fb2..3e6df91ab7eb5 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: 2022-09-29 +date: 2022-09-30 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 630ee26b50242..679fdb16b2af6 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: 2022-09-29 +date: 2022-09-30 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 62ed3d4b8afa0..bdb596d8b29e8 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: 2022-09-29 +date: 2022-09-30 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 1c33ab738b0ea..2832e5b25baa2 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: 2022-09-29 +date: 2022-09-30 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 8d4402a7a2cda..765f996d9c461 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: 2022-09-29 +date: 2022-09-30 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 5e923792bc936..dd30432a2a83c 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: 2022-09-29 +date: 2022-09-30 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 f2336d9fdfb05..f91bd759633c2 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: 2022-09-29 +date: 2022-09-30 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 61e72d43c392a..06e0a3a543a06 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: 2022-09-29 +date: 2022-09-30 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 1c31d922fc680..031735030635b 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: 2022-09-29 +date: 2022-09-30 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 00772d47658c5..5a354609a0a38 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: 2022-09-29 +date: 2022-09-30 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 7a8edbe3e3b30..d520c20c2d3bb 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: 2022-09-29 +date: 2022-09-30 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 6dd6b8aebce65..bc6c34d1c07f7 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: 2022-09-29 +date: 2022-09-30 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 8014dbb2ceb6b..3faf57a4c881c 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: 2022-09-29 +date: 2022-09-30 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 ed565e7b8f3b3..83a7e913c0825 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: 2022-09-29 +date: 2022-09-30 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 632f5546a7210..10055c2130fd2 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: 2022-09-29 +date: 2022-09-30 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 92184cbab2784..acb60f56ebfc7 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: 2022-09-29 +date: 2022-09-30 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 52f62aad5c930..9130f1f857a9e 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: 2022-09-29 +date: 2022-09-30 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 0e41263673dda..4d1bfc14b6a63 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: 2022-09-29 +date: 2022-09-30 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_router_server_internal.mdx b/api_docs/kbn_core_http_router_server_internal.mdx index 0fdb1bfe43185..d548463315b24 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: 2022-09-29 +date: 2022-09-30 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 b758dea2dd269..b873c4a15d6e2 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: 2022-09-29 +date: 2022-09-30 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.mdx b/api_docs/kbn_core_http_server.mdx index bb3c7c1bd3505..7e6e71fa61954 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: 2022-09-29 +date: 2022-09-30 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 220d5282e1fc4..8186ddd0f39a8 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: 2022-09-29 +date: 2022-09-30 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 ed120c45d977d..fdeeded54cd66 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: 2022-09-29 +date: 2022-09-30 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 9cb11bc93a1fe..cc8e5edcd399e 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: 2022-09-29 +date: 2022-09-30 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 1bb71320adbcf..2ca59b2bad48e 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: 2022-09-29 +date: 2022-09-30 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 edbbec7b5aac1..ba5a6502efe18 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: 2022-09-29 +date: 2022-09-30 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 408a8656056a7..8847538b3a2dd 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: 2022-09-29 +date: 2022-09-30 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 549c463617a54..e992ae37a3b76 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: 2022-09-29 +date: 2022-09-30 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.mdx b/api_docs/kbn_core_injected_metadata_browser.mdx index 11a4ba2c541e6..39b237eedd45f 100644 --- a/api_docs/kbn_core_injected_metadata_browser.mdx +++ b/api_docs/kbn_core_injected_metadata_browser.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-injected-metadata-browser title: "@kbn/core-injected-metadata-browser" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-injected-metadata-browser plugin -date: 2022-09-29 +date: 2022-09-30 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-injected-metadata-browser'] --- import kbnCoreInjectedMetadataBrowserObj from './kbn_core_injected_metadata_browser.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 579e9087903cf..9e750bb7dba99 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: 2022-09-29 +date: 2022-09-30 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 c88718d0e930c..ed82f8a5dea47 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: 2022-09-29 +date: 2022-09-30 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 6be7ee2210094..f9f9e8a948c63 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: 2022-09-29 +date: 2022-09-30 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 863f69b315180..f9376e67d6990 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: 2022-09-29 +date: 2022-09-30 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 add898c16abe6..fa9f4053803d0 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: 2022-09-29 +date: 2022-09-30 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_logging_server.mdx b/api_docs/kbn_core_logging_server.mdx index a488e40d01dd0..7f27d332faca9 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: 2022-09-29 +date: 2022-09-30 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 87082d1e33197..3d5bfb44851bf 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: 2022-09-29 +date: 2022-09-30 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 7a746c6278054..84ab6fff88ffe 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: 2022-09-29 +date: 2022-09-30 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 a413d283cb4c8..3e9e378809f2a 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: 2022-09-29 +date: 2022-09-30 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 3ad9c040ab8ff..6f502bf2c3bc2 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: 2022-09-29 +date: 2022-09-30 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 4e9e0445e3f75..85f6d9268f7c9 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: 2022-09-29 +date: 2022-09-30 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 0cfd64309de97..fcc2c94523111 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: 2022-09-29 +date: 2022-09-30 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 40f97497e1cff..5683a2d792ef1 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: 2022-09-29 +date: 2022-09-30 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 3e4d25261b363..8b1732b474d94 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: 2022-09-29 +date: 2022-09-30 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 9ec6da0be76fe..cb8ab729b92d9 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: 2022-09-29 +date: 2022-09-30 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 e1be058f66949..983e300999f72 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: 2022-09-29 +date: 2022-09-30 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 2f8dd3d2d3cfc..6832c1707041f 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: 2022-09-29 +date: 2022-09-30 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 99c39b3ae3bff..b86953b92d74c 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: 2022-09-29 +date: 2022-09-30 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 b1abfcae9d1d7..d400da3e6594b 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: 2022-09-29 +date: 2022-09-30 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 6af7ea7a401a6..457f058a1c212 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: 2022-09-29 +date: 2022-09-30 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 4e53620f210c2..03fa3b8be0798 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: 2022-09-29 +date: 2022-09-30 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 3cdf63fa196bf..187d1c690e2df 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: 2022-09-29 +date: 2022-09-30 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 ed9822ce6524b..6dca74dc0384d 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: 2022-09-29 +date: 2022-09-30 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 0e35863807e95..8ef53aa00edb4 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: 2022-09-29 +date: 2022-09-30 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 e8513df53c908..f023cecb27a9a 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: 2022-09-29 +date: 2022-09-30 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_preboot_server.mdx b/api_docs/kbn_core_preboot_server.mdx index a33965c6f0245..89514146e62f3 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: 2022-09-29 +date: 2022-09-30 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 499f42fd91b2c..5f530e17cbf2f 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: 2022-09-29 +date: 2022-09-30 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 cedfc5029275d..3f6c17f74aba3 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: 2022-09-29 +date: 2022-09-30 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_saved_objects_api_browser.mdx b/api_docs/kbn_core_saved_objects_api_browser.mdx index de5b9aa205cab..4d731485bd3bb 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: 2022-09-29 +date: 2022-09-30 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 7628f073dc948..6297a248ab161 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: 2022-09-29 +date: 2022-09-30 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_internal.mdx b/api_docs/kbn_core_saved_objects_api_server_internal.mdx index a91351cf9f732..7784682515d4f 100644 --- a/api_docs/kbn_core_saved_objects_api_server_internal.mdx +++ b/api_docs/kbn_core_saved_objects_api_server_internal.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-saved-objects-api-server-internal title: "@kbn/core-saved-objects-api-server-internal" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-saved-objects-api-server-internal plugin -date: 2022-09-29 +date: 2022-09-30 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-saved-objects-api-server-internal'] --- import kbnCoreSavedObjectsApiServerInternalObj from './kbn_core_saved_objects_api_server_internal.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 fa562b3b2acf5..9b590bd554e8a 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: 2022-09-29 +date: 2022-09-30 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 acc5f724b1bc8..321c7d8761b6d 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: 2022-09-29 +date: 2022-09-30 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 114ad87c44b3c..13287c8f8e30a 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: 2022-09-29 +date: 2022-09-30 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 6731e21119771..bb9f4b645d23a 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: 2022-09-29 +date: 2022-09-30 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 276569792284a..676a2bb193658 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: 2022-09-29 +date: 2022-09-30 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 9f0c9ea82ba6c..93c77175614e7 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: 2022-09-29 +date: 2022-09-30 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 bc3ea822a9424..3d80365761236 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: 2022-09-29 +date: 2022-09-30 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 b5f3e61df18bf..d9f37e38d76b3 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: 2022-09-29 +date: 2022-09-30 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 99e95bfdab286..77f3b314f46f3 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: 2022-09-29 +date: 2022-09-30 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 5edf8cbfddef4..1a389643784bf 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: 2022-09-29 +date: 2022-09-30 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 5ed2a4976d1cf..5f12f65364d0e 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: 2022-09-29 +date: 2022-09-30 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 8f12d48e0f7a2..945817f8b5ed2 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: 2022-09-29 +date: 2022-09-30 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 6de1b336be402..128f95a96f7fc 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: 2022-09-29 +date: 2022-09-30 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 4fb52fecf8710..52533c9b6fe39 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: 2022-09-29 +date: 2022-09-30 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 71fdb228446e2..e1795a3be133e 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: 2022-09-29 +date: 2022-09-30 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-saved-objects-utils-server'] --- import kbnCoreSavedObjectsUtilsServerObj from './kbn_core_saved_objects_utils_server.devdocs.json'; diff --git a/api_docs/kbn_core_status_common.mdx b/api_docs/kbn_core_status_common.mdx index 49314722d46af..d6ff451e1d1dc 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: 2022-09-29 +date: 2022-09-30 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 266265f2ee05f..e3a2233f32a15 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: 2022-09-29 +date: 2022-09-30 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 8d222376f5bf9..2a073386f7a75 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: 2022-09-29 +date: 2022-09-30 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 f8cae5c4a5506..da2f56a7f69ca 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: 2022-09-29 +date: 2022-09-30 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 0dacdfd5af97c..db4c4003ec798 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: 2022-09-29 +date: 2022-09-30 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 99b4036abb6bd..c8b0a759e9da9 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: 2022-09-29 +date: 2022-09-30 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 549cdfe3a58e1..a46dd1b958ad3 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: 2022-09-29 +date: 2022-09-30 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_theme_browser.mdx b/api_docs/kbn_core_theme_browser.mdx index c429de87e13d9..bf4074f9ff80f 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: 2022-09-29 +date: 2022-09-30 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_internal.mdx b/api_docs/kbn_core_theme_browser_internal.mdx index 0888bc8875a22..50d9d7c378160 100644 --- a/api_docs/kbn_core_theme_browser_internal.mdx +++ b/api_docs/kbn_core_theme_browser_internal.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-theme-browser-internal title: "@kbn/core-theme-browser-internal" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-theme-browser-internal plugin -date: 2022-09-29 +date: 2022-09-30 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-theme-browser-internal'] --- import kbnCoreThemeBrowserInternalObj from './kbn_core_theme_browser_internal.devdocs.json'; diff --git a/api_docs/kbn_core_theme_browser_mocks.mdx b/api_docs/kbn_core_theme_browser_mocks.mdx index 254373b7a14d3..876f4bd186bb7 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: 2022-09-29 +date: 2022-09-30 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 61ceae147d70f..433f7324e5491 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: 2022-09-29 +date: 2022-09-30 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 9b9365bc3081a..0bf1ae7c24108 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: 2022-09-29 +date: 2022-09-30 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 baf48b87a0eb3..577822a31bc17 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: 2022-09-29 +date: 2022-09-30 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 1aba4f31960ad..30759d2ba604c 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: 2022-09-29 +date: 2022-09-30 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 b2fe92199314c..b00037c8b73c7 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: 2022-09-29 +date: 2022-09-30 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 91c104b8b9de3..0dbf6764d598c 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: 2022-09-29 +date: 2022-09-30 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 31ba42e2554fc..f2e11e0ec4103 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: 2022-09-29 +date: 2022-09-30 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 a25b0cfc501c8..fdafd7c74c008 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: 2022-09-29 +date: 2022-09-30 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 101431a9c73db..8e7cee968fe75 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: 2022-09-29 +date: 2022-09-30 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 710a3c62d5446..bfcb2471b8f09 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: 2022-09-29 +date: 2022-09-30 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_crypto.mdx b/api_docs/kbn_crypto.mdx index a8c5ebefe66c9..d47e0499bc2ad 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: 2022-09-29 +date: 2022-09-30 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 b7a8b4187db82..471c3b25429df 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: 2022-09-29 +date: 2022-09-30 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/crypto-browser'] --- import kbnCryptoBrowserObj from './kbn_crypto_browser.devdocs.json'; diff --git a/api_docs/kbn_datemath.mdx b/api_docs/kbn_datemath.mdx index 77c10c205e812..4dc98f350e51d 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: 2022-09-29 +date: 2022-09-30 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/datemath'] --- import kbnDatemathObj from './kbn_datemath.devdocs.json'; diff --git a/api_docs/kbn_dev_cli_errors.mdx b/api_docs/kbn_dev_cli_errors.mdx index f79bd78824a01..0691a727d305b 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: 2022-09-29 +date: 2022-09-30 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 156f2ad1e34d0..7f92e41d7a4dc 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: 2022-09-29 +date: 2022-09-30 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 c40a114fb200d..720562339cb01 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: 2022-09-29 +date: 2022-09-30 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 6c817ebf71e78..9b0d11e055baa 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: 2022-09-29 +date: 2022-09-30 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/dev-utils'] --- import kbnDevUtilsObj from './kbn_dev_utils.devdocs.json'; diff --git a/api_docs/kbn_doc_links.mdx b/api_docs/kbn_doc_links.mdx index 055b95affc247..a972f8dfe08c2 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: 2022-09-29 +date: 2022-09-30 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 f6a0a8c29e495..7fde88f253ffb 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: 2022-09-29 +date: 2022-09-30 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/docs-utils'] --- import kbnDocsUtilsObj from './kbn_docs_utils.devdocs.json'; diff --git a/api_docs/kbn_ebt_tools.mdx b/api_docs/kbn_ebt_tools.mdx index fa63acb9d852c..b60e5a1432257 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: 2022-09-29 +date: 2022-09-30 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/ebt-tools'] --- import kbnEbtToolsObj from './kbn_ebt_tools.devdocs.json'; diff --git a/api_docs/kbn_es_archiver.mdx b/api_docs/kbn_es_archiver.mdx index 9f608a801f2c0..5b8334a6273f7 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: 2022-09-29 +date: 2022-09-30 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 1498ddb5d2636..cbd8011fd264d 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: 2022-09-29 +date: 2022-09-30 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 537db266a40f5..6454ec64eeec1 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: 2022-09-29 +date: 2022-09-30 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 923c644404d7b..9d9912a3e60be 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: 2022-09-29 +date: 2022-09-30 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 23893848967a1..460d6cc14eab2 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: 2022-09-29 +date: 2022-09-30 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/eslint-plugin-imports'] --- import kbnEslintPluginImportsObj from './kbn_eslint_plugin_imports.devdocs.json'; diff --git a/api_docs/kbn_field_types.mdx b/api_docs/kbn_field_types.mdx index a29e11c7f3f5c..de71112dafadf 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: 2022-09-29 +date: 2022-09-30 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/field-types'] --- import kbnFieldTypesObj from './kbn_field_types.devdocs.json'; diff --git a/api_docs/kbn_find_used_node_modules.mdx b/api_docs/kbn_find_used_node_modules.mdx index c3673495d2d9a..4e028126633c1 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: 2022-09-29 +date: 2022-09-30 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/find-used-node-modules'] --- import kbnFindUsedNodeModulesObj from './kbn_find_used_node_modules.devdocs.json'; diff --git a/api_docs/kbn_ftr_common_functional_services.mdx b/api_docs/kbn_ftr_common_functional_services.mdx index 29968a934531a..04d7cb7b4cfd8 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: 2022-09-29 +date: 2022-09-30 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_generate.mdx b/api_docs/kbn_generate.mdx index 535192fd22884..d88b4e834bee8 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: 2022-09-29 +date: 2022-09-30 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/generate'] --- import kbnGenerateObj from './kbn_generate.devdocs.json'; diff --git a/api_docs/kbn_get_repo_files.mdx b/api_docs/kbn_get_repo_files.mdx index 270341543e978..11f578d5d6c58 100644 --- a/api_docs/kbn_get_repo_files.mdx +++ b/api_docs/kbn_get_repo_files.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-get-repo-files title: "@kbn/get-repo-files" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/get-repo-files plugin -date: 2022-09-29 +date: 2022-09-30 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/get-repo-files'] --- import kbnGetRepoFilesObj from './kbn_get_repo_files.devdocs.json'; diff --git a/api_docs/kbn_handlebars.mdx b/api_docs/kbn_handlebars.mdx index 75d249e64bf71..b3a8defe77206 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: 2022-09-29 +date: 2022-09-30 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 d7346ce1b677d..e9429b41deb7b 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: 2022-09-29 +date: 2022-09-30 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/hapi-mocks'] --- import kbnHapiMocksObj from './kbn_hapi_mocks.devdocs.json'; diff --git a/api_docs/kbn_home_sample_data_card.mdx b/api_docs/kbn_home_sample_data_card.mdx index b1ce2043e27f1..f678cb181de18 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: 2022-09-29 +date: 2022-09-30 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 63510d74b009a..404f2163c46c0 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: 2022-09-29 +date: 2022-09-30 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 ce7de735a1105..525cb60f347a1 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: 2022-09-29 +date: 2022-09-30 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/i18n'] --- import kbnI18nObj from './kbn_i18n.devdocs.json'; diff --git a/api_docs/kbn_import_resolver.mdx b/api_docs/kbn_import_resolver.mdx index a96adba4a09b2..d4f49a5704638 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: 2022-09-29 +date: 2022-09-30 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/import-resolver'] --- import kbnImportResolverObj from './kbn_import_resolver.devdocs.json'; diff --git a/api_docs/kbn_interpreter.mdx b/api_docs/kbn_interpreter.mdx index d35da6c7ae880..9fa8dfc8321c7 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: 2022-09-29 +date: 2022-09-30 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 623552a19ab96..4c08eeab4c883 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: 2022-09-29 +date: 2022-09-30 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/io-ts-utils'] --- import kbnIoTsUtilsObj from './kbn_io_ts_utils.devdocs.json'; diff --git a/api_docs/kbn_jest_serializers.mdx b/api_docs/kbn_jest_serializers.mdx index 46b40beb8bf35..d8948bee86402 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: 2022-09-29 +date: 2022-09-30 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 e9b4b290f7d14..e2a2cc005cad2 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: 2022-09-29 +date: 2022-09-30 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/journeys'] --- import kbnJourneysObj from './kbn_journeys.devdocs.json'; diff --git a/api_docs/kbn_kibana_manifest_schema.mdx b/api_docs/kbn_kibana_manifest_schema.mdx index 3f19d6bc0c359..3999084bdf285 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: 2022-09-29 +date: 2022-09-30 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/kibana-manifest-schema'] --- import kbnKibanaManifestSchemaObj from './kbn_kibana_manifest_schema.devdocs.json'; diff --git a/api_docs/kbn_logging.mdx b/api_docs/kbn_logging.mdx index da43bfec51c4d..6f279b0700ac2 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: 2022-09-29 +date: 2022-09-30 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 2770d7ccb6ac7..cc05defa4dac2 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: 2022-09-29 +date: 2022-09-30 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/logging-mocks'] --- import kbnLoggingMocksObj from './kbn_logging_mocks.devdocs.json'; diff --git a/api_docs/kbn_managed_vscode_config.mdx b/api_docs/kbn_managed_vscode_config.mdx index 83b9321c6a3f9..20c5f25e026bf 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: 2022-09-29 +date: 2022-09-30 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/managed-vscode-config'] --- import kbnManagedVscodeConfigObj from './kbn_managed_vscode_config.devdocs.json'; diff --git a/api_docs/kbn_mapbox_gl.mdx b/api_docs/kbn_mapbox_gl.mdx index ae4854e96ac2a..a0dfd15450607 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: 2022-09-29 +date: 2022-09-30 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/mapbox-gl'] --- import kbnMapboxGlObj from './kbn_mapbox_gl.devdocs.json'; diff --git a/api_docs/kbn_ml_agg_utils.mdx b/api_docs/kbn_ml_agg_utils.mdx index dd5f5c5ace183..8c10def45c78c 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: 2022-09-29 +date: 2022-09-30 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_is_populated_object.mdx b/api_docs/kbn_ml_is_populated_object.mdx index 4a750b0b7dfad..f4eb153961bd3 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: 2022-09-29 +date: 2022-09-30 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_string_hash.mdx b/api_docs/kbn_ml_string_hash.mdx index 1702698262627..8d36ae0132631 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: 2022-09-29 +date: 2022-09-30 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/ml-string-hash'] --- import kbnMlStringHashObj from './kbn_ml_string_hash.devdocs.json'; diff --git a/api_docs/kbn_monaco.mdx b/api_docs/kbn_monaco.mdx index 987ec45f387a2..2a32d7d919b0c 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: 2022-09-29 +date: 2022-09-30 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/monaco'] --- import kbnMonacoObj from './kbn_monaco.devdocs.json'; diff --git a/api_docs/kbn_optimizer.mdx b/api_docs/kbn_optimizer.mdx index ed7566b575b58..ad7149dc8fe1a 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: 2022-09-29 +date: 2022-09-30 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 7c45eeef92b57..8d83ba6d1f0ef 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: 2022-09-29 +date: 2022-09-30 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 859b6a067644d..9bd69c34940d3 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: 2022-09-29 +date: 2022-09-30 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_performance_testing_dataset_extractor.mdx b/api_docs/kbn_performance_testing_dataset_extractor.mdx index aedd0101a45aa..e87e2bea07312 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: 2022-09-29 +date: 2022-09-30 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/performance-testing-dataset-extractor'] --- import kbnPerformanceTestingDatasetExtractorObj from './kbn_performance_testing_dataset_extractor.devdocs.json'; diff --git a/api_docs/kbn_plugin_generator.mdx b/api_docs/kbn_plugin_generator.mdx index bfd4b4e6b5afb..dff42547b8b4e 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: 2022-09-29 +date: 2022-09-30 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 3ca9f9e155f16..9dfa323c764a1 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: 2022-09-29 +date: 2022-09-30 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/plugin-helpers'] --- import kbnPluginHelpersObj from './kbn_plugin_helpers.devdocs.json'; diff --git a/api_docs/kbn_react_field.mdx b/api_docs/kbn_react_field.mdx index 293fa51905454..233fdfa2b5299 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: 2022-09-29 +date: 2022-09-30 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/react-field'] --- import kbnReactFieldObj from './kbn_react_field.devdocs.json'; diff --git a/api_docs/kbn_repo_source_classifier.mdx b/api_docs/kbn_repo_source_classifier.mdx index aaf5d45ea057c..e7e506f42c4dc 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: 2022-09-29 +date: 2022-09-30 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/repo-source-classifier'] --- import kbnRepoSourceClassifierObj from './kbn_repo_source_classifier.devdocs.json'; diff --git a/api_docs/kbn_rule_data_utils.mdx b/api_docs/kbn_rule_data_utils.mdx index 4f65db7503fc7..2385663d0372e 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: 2022-09-29 +date: 2022-09-30 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/rule-data-utils'] --- import kbnRuleDataUtilsObj from './kbn_rule_data_utils.devdocs.json'; diff --git a/api_docs/kbn_securitysolution_autocomplete.mdx b/api_docs/kbn_securitysolution_autocomplete.mdx index 5a9078575773a..c9560b881efcc 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: 2022-09-29 +date: 2022-09-30 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/securitysolution-autocomplete'] --- import kbnSecuritysolutionAutocompleteObj from './kbn_securitysolution_autocomplete.devdocs.json'; diff --git a/api_docs/kbn_securitysolution_es_utils.mdx b/api_docs/kbn_securitysolution_es_utils.mdx index dc5fcdbd1d0f1..277e8fe2e29f0 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: 2022-09-29 +date: 2022-09-30 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 1bcc5017dfc5e..aada63b6cdcfc 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: 2022-09-29 +date: 2022-09-30 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 a22707f2957be..06a05479ba722 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: 2022-09-29 +date: 2022-09-30 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 cdc1b3ea54ed7..4ff62a3c86d94 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: 2022-09-29 +date: 2022-09-30 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 185f8a6c2a54b..73431dba715aa 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: 2022-09-29 +date: 2022-09-30 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 ee826f79d080f..f1065703e694b 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: 2022-09-29 +date: 2022-09-30 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 79363d1648a7d..0a3e38566ee92 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: 2022-09-29 +date: 2022-09-30 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 bad03cd4ead92..0dc5e87dba567 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: 2022-09-29 +date: 2022-09-30 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 d2e797f19a3e8..ee9a5057cd0b7 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: 2022-09-29 +date: 2022-09-30 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 aadd62030a1b8..75f29aaf7123e 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: 2022-09-29 +date: 2022-09-30 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 37f5836577b4f..515b4a8285bb3 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: 2022-09-29 +date: 2022-09-30 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 7aa2954ee0c08..2991cdacbacd0 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: 2022-09-29 +date: 2022-09-30 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 99fe2b585b0b2..92b1867f34a64 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: 2022-09-29 +date: 2022-09-30 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 e132797fea852..a9ff8d1d81fbd 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: 2022-09-29 +date: 2022-09-30 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 48d0d4756ef6c..91cf5bb3b5dd9 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: 2022-09-29 +date: 2022-09-30 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/server-http-tools'] --- import kbnServerHttpToolsObj from './kbn_server_http_tools.devdocs.json'; diff --git a/api_docs/kbn_server_route_repository.mdx b/api_docs/kbn_server_route_repository.mdx index 5c184c9a583cc..cefe3d1543a94 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: 2022-09-29 +date: 2022-09-30 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/server-route-repository'] --- import kbnServerRouteRepositoryObj from './kbn_server_route_repository.devdocs.json'; diff --git a/api_docs/kbn_shared_svg.mdx b/api_docs/kbn_shared_svg.mdx index 249f6a00cf7e6..737c986cbf11a 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: 2022-09-29 +date: 2022-09-30 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_user_profile_components.mdx b/api_docs/kbn_shared_ux_avatar_user_profile_components.mdx index e5e0f236974fb..eebd51935c35a 100644 --- a/api_docs/kbn_shared_ux_avatar_user_profile_components.mdx +++ b/api_docs/kbn_shared_ux_avatar_user_profile_components.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-shared-ux-avatar-user-profile-components title: "@kbn/shared-ux-avatar-user-profile-components" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/shared-ux-avatar-user-profile-components plugin -date: 2022-09-29 +date: 2022-09-30 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/shared-ux-avatar-user-profile-components'] --- import kbnSharedUxAvatarUserProfileComponentsObj from './kbn_shared_ux_avatar_user_profile_components.devdocs.json'; diff --git a/api_docs/kbn_shared_ux_button_exit_full_screen_mocks.mdx b/api_docs/kbn_shared_ux_button_exit_full_screen_mocks.mdx index b78abda31ac59..c121d1e8a4893 100644 --- a/api_docs/kbn_shared_ux_button_exit_full_screen_mocks.mdx +++ b/api_docs/kbn_shared_ux_button_exit_full_screen_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-shared-ux-button-exit-full-screen-mocks title: "@kbn/shared-ux-button-exit-full-screen-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/shared-ux-button-exit-full-screen-mocks plugin -date: 2022-09-29 +date: 2022-09-30 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/shared-ux-button-exit-full-screen-mocks'] --- import kbnSharedUxButtonExitFullScreenMocksObj from './kbn_shared_ux_button_exit_full_screen_mocks.devdocs.json'; diff --git a/api_docs/kbn_shared_ux_button_toolbar.mdx b/api_docs/kbn_shared_ux_button_toolbar.mdx index dda07aa08205d..ff53903386830 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: 2022-09-29 +date: 2022-09-30 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 92fa45970a95f..12b820666a653 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: 2022-09-29 +date: 2022-09-30 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 67fd1537b9531..c083f9ea1266f 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: 2022-09-29 +date: 2022-09-30 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_link_redirect_app_mocks.mdx b/api_docs/kbn_shared_ux_link_redirect_app_mocks.mdx index dba90c297e1be..35439d9fda006 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: 2022-09-29 +date: 2022-09-30 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_page_analytics_no_data.mdx b/api_docs/kbn_shared_ux_page_analytics_no_data.mdx index eb63fe71719da..de78cc05fd160 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: 2022-09-29 +date: 2022-09-30 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 312cc6dc442de..b1c6f91ebdbd1 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: 2022-09-29 +date: 2022-09-30 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 fc5ddb138a558..9f07e742a7606 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: 2022-09-29 +date: 2022-09-30 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 00f4e0b05251d..065a90d00a348 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: 2022-09-29 +date: 2022-09-30 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 22e5de7cb344c..c100281c25d4d 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: 2022-09-29 +date: 2022-09-30 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 de0d8b5ff101e..b884d72ca4d07 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: 2022-09-29 +date: 2022-09-30 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 b1597719e26ac..c060047529bc6 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: 2022-09-29 +date: 2022-09-30 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 254ce88f6ed03..362eb12bc58f9 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: 2022-09-29 +date: 2022-09-30 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 4b7ce948af067..4e02c245ff69b 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: 2022-09-29 +date: 2022-09-30 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 4bebd9fa27f9e..49e658a38c8b7 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: 2022-09-29 +date: 2022-09-30 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 a3b2ddd97a17e..5e2e625539982 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: 2022-09-29 +date: 2022-09-30 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 0a1d772cc031c..eec2b418bbc44 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: 2022-09-29 +date: 2022-09-30 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 70d3cf84c5ef6..f6bf840ae41ac 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: 2022-09-29 +date: 2022-09-30 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_router.mdx b/api_docs/kbn_shared_ux_router.mdx index 61fe760de5035..deb460019bbeb 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: 2022-09-29 +date: 2022-09-30 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 02064c4eacc66..b6141feed65de 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: 2022-09-29 +date: 2022-09-30 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 86606778f8dfd..9d6b7561cd4fe 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: 2022-09-29 +date: 2022-09-30 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 180ae33f7885a..1d57383c1f7a2 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: 2022-09-29 +date: 2022-09-30 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/shared-ux-storybook-mock'] --- import kbnSharedUxStorybookMockObj from './kbn_shared_ux_storybook_mock.devdocs.json'; diff --git a/api_docs/kbn_shared_ux_utility.mdx b/api_docs/kbn_shared_ux_utility.mdx index 7c2f7cc09c77b..f1529dbdeeadd 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: 2022-09-29 +date: 2022-09-30 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/shared-ux-utility'] --- import kbnSharedUxUtilityObj from './kbn_shared_ux_utility.devdocs.json'; diff --git a/api_docs/kbn_some_dev_log.mdx b/api_docs/kbn_some_dev_log.mdx index ef8d669ed27aa..08e81f53f5e6a 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: 2022-09-29 +date: 2022-09-30 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_package_json.mdx b/api_docs/kbn_sort_package_json.mdx index 0e8f9505b35f7..f9a40e4e50605 100644 --- a/api_docs/kbn_sort_package_json.mdx +++ b/api_docs/kbn_sort_package_json.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-sort-package-json title: "@kbn/sort-package-json" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/sort-package-json plugin -date: 2022-09-29 +date: 2022-09-30 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/sort-package-json'] --- import kbnSortPackageJsonObj from './kbn_sort_package_json.devdocs.json'; diff --git a/api_docs/kbn_std.mdx b/api_docs/kbn_std.mdx index c2a9a20196954..0be3ac9e885d8 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: 2022-09-29 +date: 2022-09-30 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 9662e0b7958fe..12855b1d6c6e1 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: 2022-09-29 +date: 2022-09-30 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 f279425a11288..ff504977fbd18 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: 2022-09-29 +date: 2022-09-30 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/storybook'] --- import kbnStorybookObj from './kbn_storybook.devdocs.json'; diff --git a/api_docs/kbn_telemetry_tools.mdx b/api_docs/kbn_telemetry_tools.mdx index 70dd586f3b9f7..c4980baa0846b 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: 2022-09-29 +date: 2022-09-30 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 2d4b1f7a3e301..fc2d3aa4ceb2f 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: 2022-09-29 +date: 2022-09-30 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/test'] --- import kbnTestObj from './kbn_test.devdocs.json'; diff --git a/api_docs/kbn_test_jest_helpers.mdx b/api_docs/kbn_test_jest_helpers.mdx index f0c472ec736d5..c0fe273058800 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: 2022-09-29 +date: 2022-09-30 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 421399623af64..a11f331d327f9 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: 2022-09-29 +date: 2022-09-30 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/test-subj-selector'] --- import kbnTestSubjSelectorObj from './kbn_test_subj_selector.devdocs.json'; diff --git a/api_docs/kbn_tooling_log.mdx b/api_docs/kbn_tooling_log.mdx index 8c06707332c23..634503f237630 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: 2022-09-29 +date: 2022-09-30 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/tooling-log'] --- import kbnToolingLogObj from './kbn_tooling_log.devdocs.json'; diff --git a/api_docs/kbn_type_summarizer.mdx b/api_docs/kbn_type_summarizer.mdx index a03912522beaa..ec79f6d74e50a 100644 --- a/api_docs/kbn_type_summarizer.mdx +++ b/api_docs/kbn_type_summarizer.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-type-summarizer title: "@kbn/type-summarizer" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/type-summarizer plugin -date: 2022-09-29 +date: 2022-09-30 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/type-summarizer'] --- import kbnTypeSummarizerObj from './kbn_type_summarizer.devdocs.json'; diff --git a/api_docs/kbn_type_summarizer_core.mdx b/api_docs/kbn_type_summarizer_core.mdx index 7d6e18575e25c..64a86ae7f718d 100644 --- a/api_docs/kbn_type_summarizer_core.mdx +++ b/api_docs/kbn_type_summarizer_core.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-type-summarizer-core title: "@kbn/type-summarizer-core" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/type-summarizer-core plugin -date: 2022-09-29 +date: 2022-09-30 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/type-summarizer-core'] --- import kbnTypeSummarizerCoreObj from './kbn_type_summarizer_core.devdocs.json'; diff --git a/api_docs/kbn_typed_react_router_config.mdx b/api_docs/kbn_typed_react_router_config.mdx index 3d387dbca9d59..fd83134954efd 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: 2022-09-29 +date: 2022-09-30 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_theme.mdx b/api_docs/kbn_ui_theme.mdx index 80555e578ee94..e05e7d1fbf270 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: 2022-09-29 +date: 2022-09-30 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/ui-theme'] --- import kbnUiThemeObj from './kbn_ui_theme.devdocs.json'; diff --git a/api_docs/kbn_user_profile_components.mdx b/api_docs/kbn_user_profile_components.mdx index 0396c24bc40eb..c62021b90a7c5 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: 2022-09-29 +date: 2022-09-30 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 de93a8fe050a9..383e50529e744 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: 2022-09-29 +date: 2022-09-30 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 fe8d933d19a34..900ea8d6e615c 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: 2022-09-29 +date: 2022-09-30 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 e9e1e8d327dfd..224a3cfeb7afa 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: 2022-09-29 +date: 2022-09-30 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/utils'] --- import kbnUtilsObj from './kbn_utils.devdocs.json'; diff --git a/api_docs/kbn_yarn_lock_validator.mdx b/api_docs/kbn_yarn_lock_validator.mdx index 96ce8b5f78b19..51c6ae605e7bd 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: 2022-09-29 +date: 2022-09-30 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/yarn-lock-validator'] --- import kbnYarnLockValidatorObj from './kbn_yarn_lock_validator.devdocs.json'; diff --git a/api_docs/kibana_overview.mdx b/api_docs/kibana_overview.mdx index 2a28c3743374d..c15bfc3b7fe22 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: 2022-09-29 +date: 2022-09-30 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 7ab80f87e401c..ea705da0da762 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: 2022-09-29 +date: 2022-09-30 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 21d349683d8e3..0ea7624514ef5 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: 2022-09-29 +date: 2022-09-30 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 b7d40f28432aa..ac719690669b5 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: 2022-09-29 +date: 2022-09-30 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'kubernetesSecurity'] --- import kubernetesSecurityObj from './kubernetes_security.devdocs.json'; diff --git a/api_docs/lens.devdocs.json b/api_docs/lens.devdocs.json index 4d4561547ed2a..43a256fa418ca 100644 --- a/api_docs/lens.devdocs.json +++ b/api_docs/lens.devdocs.json @@ -4532,7 +4532,15 @@ }, " | ", "VisualizeEditorContext", - " | undefined) => T) | undefined" + "<", + { + "pluginId": "visualizations", + "scope": "common", + "docId": "kibVisualizationsPluginApi", + "section": "def-common.Configuration", + "text": "Configuration" + }, + "> | undefined) => T) | undefined" ], "path": "x-pack/plugins/lens/public/types.ts", "deprecated": false, @@ -4586,7 +4594,15 @@ }, " | ", "VisualizeEditorContext", - " | undefined" + "<", + { + "pluginId": "visualizations", + "scope": "common", + "docId": "kibVisualizationsPluginApi", + "section": "def-common.Configuration", + "text": "Configuration" + }, + "> | undefined" ], "path": "x-pack/plugins/lens/public/types.ts", "deprecated": false, @@ -6415,7 +6431,7 @@ "signature": [ "((props: VisualizationStateFromContextChangeProps) => ", "Suggestion", - ") | undefined" + " | undefined) | undefined" ], "path": "x-pack/plugins/lens/public/types.ts", "deprecated": false, diff --git a/api_docs/lens.mdx b/api_docs/lens.mdx index 0cb5e40b3b4cb..ebeef2fc8c31d 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: 2022-09-29 +date: 2022-09-30 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 63d15a7c40650..7a642bff9e73a 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: 2022-09-29 +date: 2022-09-30 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 88e17bcee6feb..0f646773d6138 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: 2022-09-29 +date: 2022-09-30 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 c7000d51761c4..13e56db522d2b 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: 2022-09-29 +date: 2022-09-30 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'licensing'] --- import licensingObj from './licensing.devdocs.json'; diff --git a/api_docs/lists.mdx b/api_docs/lists.mdx index 9deb279fb73b6..4a6747d66e72c 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: 2022-09-29 +date: 2022-09-30 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'lists'] --- import listsObj from './lists.devdocs.json'; diff --git a/api_docs/management.mdx b/api_docs/management.mdx index 2cec82774807b..3b4067947d08b 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: 2022-09-29 +date: 2022-09-30 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 2667e8f19bae6..e68653a32c8ca 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: 2022-09-29 +date: 2022-09-30 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 558352f89505a..8547850fa777a 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: 2022-09-29 +date: 2022-09-30 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'mapsEms'] --- import mapsEmsObj from './maps_ems.devdocs.json'; diff --git a/api_docs/ml.mdx b/api_docs/ml.mdx index b1abe52cefe17..b52f48b935000 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: 2022-09-29 +date: 2022-09-30 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'ml'] --- import mlObj from './ml.devdocs.json'; diff --git a/api_docs/monitoring.mdx b/api_docs/monitoring.mdx index b9332eb4163e6..eaa35953f39e9 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: 2022-09-29 +date: 2022-09-30 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 23c398899ccbf..4048c3102a29f 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: 2022-09-29 +date: 2022-09-30 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 bfa907ab09267..4b05d9ce3b7ef 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: 2022-09-29 +date: 2022-09-30 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 4336085d004ce..b10f893f9601b 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: 2022-09-29 +date: 2022-09-30 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'newsfeed'] --- import newsfeedObj from './newsfeed.devdocs.json'; diff --git a/api_docs/observability.mdx b/api_docs/observability.mdx index db3f0906e6142..758f400939d9e 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: 2022-09-29 +date: 2022-09-30 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'observability'] --- import observabilityObj from './observability.devdocs.json'; diff --git a/api_docs/osquery.mdx b/api_docs/osquery.mdx index c569e301708df..40c14dd0feebf 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: 2022-09-29 +date: 2022-09-30 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'osquery'] --- import osqueryObj from './osquery.devdocs.json'; diff --git a/api_docs/plugin_directory.mdx b/api_docs/plugin_directory.mdx index 568f38705df0a..faf5c1b113204 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: 2022-09-29 +date: 2022-09-30 tags: ['contributor', 'dev', 'apidocs', 'kibana'] --- @@ -21,7 +21,7 @@ tags: ['contributor', 'dev', 'apidocs', 'kibana'] | API Count | Any Count | Missing comments | Missing exports | |--------------|----------|-----------------|--------| -| 31953 | 179 | 21502 | 1003 | +| 31986 | 179 | 21534 | 1003 | ## Plugin Directory @@ -81,7 +81,7 @@ tags: ['contributor', 'dev', 'apidocs', 'kibana'] | | [App Services](https://github.com/orgs/elastic/teams/kibana-app-services) | Index pattern fields and ambiguous values formatters | 288 | 5 | 249 | 3 | | | [Machine Learning UI](https://github.com/orgs/elastic/teams/ml-ui) | The file upload plugin contains components and services for uploading a file, analyzing its data, and then importing the data into an Elasticsearch index. Supported file types include CSV, TSV, newline-delimited JSON and GeoJSON. | 62 | 0 | 62 | 2 | | | [@elastic/kibana-app-services](https://github.com/orgs/elastic/teams/team:AppServicesUx) | File upload, download, sharing, and serving over HTTP implementation in Kibana. | 263 | 0 | 14 | 2 | -| | [Fleet](https://github.com/orgs/elastic/teams/fleet) | - | 996 | 3 | 893 | 17 | +| | [Fleet](https://github.com/orgs/elastic/teams/fleet) | - | 997 | 3 | 893 | 17 | | | [Kibana Core](https://github.com/orgs/elastic/teams/kibana-core) | - | 68 | 0 | 14 | 5 | | globalSearchBar | [Kibana Core](https://github.com/orgs/elastic/teams/kibana-core) | - | 0 | 0 | 0 | 0 | | globalSearchProviders | [Kibana Core](https://github.com/orgs/elastic/teams/kibana-core) | - | 0 | 0 | 0 | 0 | @@ -175,7 +175,7 @@ tags: ['contributor', 'dev', 'apidocs', 'kibana'] | | [Vis Editors](https://github.com/orgs/elastic/teams/kibana-vis-editors) | Registers the vega visualization. Is the elastic version of vega and vega-lite libraries. | 2 | 0 | 2 | 0 | | | [Vis Editors](https://github.com/orgs/elastic/teams/kibana-vis-editors) | Contains the vislib visualizations. These are the classical area/line/bar, pie, gauge/goal and heatmap charts. We want to replace them with elastic-charts. | 26 | 0 | 25 | 1 | | | [Vis Editors](https://github.com/orgs/elastic/teams/kibana-vis-editors) | Contains the new xy-axis chart using the elastic-charts library, which will eventually replace the vislib xy-axis charts including bar, area, and line. | 53 | 0 | 50 | 5 | -| | [Vis Editors](https://github.com/orgs/elastic/teams/kibana-vis-editors) | Contains the shared architecture among all the legacy visualizations, e.g. the visualization type registry or the visualization embeddable. | 693 | 12 | 663 | 18 | +| | [Vis Editors](https://github.com/orgs/elastic/teams/kibana-vis-editors) | Contains the shared architecture among all the legacy visualizations, e.g. the visualization type registry or the visualization embeddable. | 725 | 12 | 695 | 18 | | watcher | [Stack Management](https://github.com/orgs/elastic/teams/kibana-stack-management) | - | 0 | 0 | 0 | 0 | ## Package Directory diff --git a/api_docs/presentation_util.mdx b/api_docs/presentation_util.mdx index 099351a2d0f2e..4d3613a8b117a 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: 2022-09-29 +date: 2022-09-30 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 2ef17ce2192fa..29db7898a4b53 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: 2022-09-29 +date: 2022-09-30 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'profiling'] --- import profilingObj from './profiling.devdocs.json'; diff --git a/api_docs/remote_clusters.mdx b/api_docs/remote_clusters.mdx index 8a248f78f1fa8..49b546ef38a2b 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: 2022-09-29 +date: 2022-09-30 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 9589edc812df2..18eff91aea12b 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: 2022-09-29 +date: 2022-09-30 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 1964dc994cd2e..099cff0ab5181 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: 2022-09-29 +date: 2022-09-30 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 d4539ef64efa0..c2aaaeb78852e 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: 2022-09-29 +date: 2022-09-30 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 8112f8684b552..5c28ac8b2bdb5 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: 2022-09-29 +date: 2022-09-30 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 613f942ef9065..6351e3d45b6ee 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: 2022-09-29 +date: 2022-09-30 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 23cf7d31ca48e..b0955d53c8d0f 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: 2022-09-29 +date: 2022-09-30 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 c9cc4aa61ea7c..ddb1f6d02750c 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: 2022-09-29 +date: 2022-09-30 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 1450399aefd83..f9510b48f7efe 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: 2022-09-29 +date: 2022-09-30 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 1ed5aa9d511ea..3239724d7ef38 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: 2022-09-29 +date: 2022-09-30 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 6c1900781f66a..b11f668fa1169 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: 2022-09-29 +date: 2022-09-30 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 883f8e26e2cc0..42b62ddb1d6d1 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: 2022-09-29 +date: 2022-09-30 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 df0feab2c445c..2e8f47d4893bb 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: 2022-09-29 +date: 2022-09-30 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'screenshotting'] --- import screenshottingObj from './screenshotting.devdocs.json'; diff --git a/api_docs/security.mdx b/api_docs/security.mdx index 814d0173f69cf..a576dc7f8b981 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: 2022-09-29 +date: 2022-09-30 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'security'] --- import securityObj from './security.devdocs.json'; diff --git a/api_docs/security_solution.mdx b/api_docs/security_solution.mdx index a86c48a48dfce..575793a057288 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: 2022-09-29 +date: 2022-09-30 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'securitySolution'] --- import securitySolutionObj from './security_solution.devdocs.json'; diff --git a/api_docs/session_view.mdx b/api_docs/session_view.mdx index 66978ad664e04..2ccc09799e6f6 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: 2022-09-29 +date: 2022-09-30 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 0086ad02ab5ac..3c787d2f24b06 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: 2022-09-29 +date: 2022-09-30 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'share'] --- import shareObj from './share.devdocs.json'; diff --git a/api_docs/snapshot_restore.mdx b/api_docs/snapshot_restore.mdx index 7bce31d6e1832..fcd7d2325c179 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: 2022-09-29 +date: 2022-09-30 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 decf22f6da092..a0c0f7d6c4c24 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: 2022-09-29 +date: 2022-09-30 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 e68ecfcdfb999..6c9a14514a8aa 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: 2022-09-29 +date: 2022-09-30 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 5363b913fbe0c..fb2aab7cf00a6 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: 2022-09-29 +date: 2022-09-30 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 7377ef34d529c..5289e0a7dee5e 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: 2022-09-29 +date: 2022-09-30 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 1a95f8384f249..ec6a6fda9343b 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: 2022-09-29 +date: 2022-09-30 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 355a38255c9c3..28813ee2279e7 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: 2022-09-29 +date: 2022-09-30 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 e607fc3598bd1..167b467328b25 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: 2022-09-29 +date: 2022-09-30 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 f538309dd4628..c11efc4d43706 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: 2022-09-29 +date: 2022-09-30 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 bcebf8f8b9342..8d9b53a137bc8 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: 2022-09-29 +date: 2022-09-30 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 7a96d016a99c9..5070df796c8a6 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: 2022-09-29 +date: 2022-09-30 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 7d3c611c084ba..3115cbb40769f 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: 2022-09-29 +date: 2022-09-30 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 e40b4b0c4d440..c7570c5245900 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: 2022-09-29 +date: 2022-09-30 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 9a49946469889..9626982ef7232 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: 2022-09-29 +date: 2022-09-30 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 e1fd951d5e2a2..5e08f17c4b215 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: 2022-09-29 +date: 2022-09-30 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'uiActionsEnhanced'] --- import uiActionsEnhancedObj from './ui_actions_enhanced.devdocs.json'; diff --git a/api_docs/unified_field_list.mdx b/api_docs/unified_field_list.mdx index 254b1228a31fd..2c376ec69d7eb 100644 --- a/api_docs/unified_field_list.mdx +++ b/api_docs/unified_field_list.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/unifiedFieldList title: "unifiedFieldList" image: https://source.unsplash.com/400x175/?github description: API docs for the unifiedFieldList plugin -date: 2022-09-29 +date: 2022-09-30 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'unifiedFieldList'] --- import unifiedFieldListObj from './unified_field_list.devdocs.json'; diff --git a/api_docs/unified_search.mdx b/api_docs/unified_search.mdx index 5015d2debdc41..de104e703fd94 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: 2022-09-29 +date: 2022-09-30 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 5a40018e6081e..6138b56184d26 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: 2022-09-29 +date: 2022-09-30 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'unifiedSearch.autocomplete'] --- import unifiedSearchAutocompleteObj from './unified_search_autocomplete.devdocs.json'; diff --git a/api_docs/url_forwarding.mdx b/api_docs/url_forwarding.mdx index f57d70892e70d..e44699c7b7c56 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: 2022-09-29 +date: 2022-09-30 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 f40f15636c943..b59d6dcec2681 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: 2022-09-29 +date: 2022-09-30 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 d462e4d19616c..b5e23e55dfb64 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: 2022-09-29 +date: 2022-09-30 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 0b2993331260b..2fb7351aa02f8 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: 2022-09-29 +date: 2022-09-30 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 cc20cda9db105..408e2c2ca376b 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: 2022-09-29 +date: 2022-09-30 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 609c06b1a92cf..fa44a39b582b7 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: 2022-09-29 +date: 2022-09-30 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 3f8c15b314a0e..cd176ecf49a95 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: 2022-09-29 +date: 2022-09-30 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 5aa2bd8b01f5a..d5b90e601d8ec 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: 2022-09-29 +date: 2022-09-30 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 2219fc96f2e31..ba692d609d713 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: 2022-09-29 +date: 2022-09-30 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 2608ea12c24f9..4b74690406711 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: 2022-09-29 +date: 2022-09-30 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 e535d8ca970e3..9eddbfeec41d4 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: 2022-09-29 +date: 2022-09-30 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 c6bd5fba0b068..31e138d68aa17 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: 2022-09-29 +date: 2022-09-30 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 8caa2a67dab8d..a1d6cb9154128 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: 2022-09-29 +date: 2022-09-30 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 95b3390b94cea..befca8a834867 100644 --- a/api_docs/visualizations.devdocs.json +++ b/api_docs/visualizations.devdocs.json @@ -9665,6 +9665,327 @@ ], "initialIsOpen": false }, + { + "parentPluginId": "visualizations", + "id": "def-common.PartitionLayerState", + "type": "Interface", + "tags": [], + "label": "PartitionLayerState", + "description": [], + "path": "src/plugins/visualizations/common/convert_to_lens/types/configurations.ts", + "deprecated": false, + "trackAdoption": false, + "children": [ + { + "parentPluginId": "visualizations", + "id": "def-common.PartitionLayerState.layerId", + "type": "string", + "tags": [], + "label": "layerId", + "description": [], + "path": "src/plugins/visualizations/common/convert_to_lens/types/configurations.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "visualizations", + "id": "def-common.PartitionLayerState.layerType", + "type": "CompoundType", + "tags": [], + "label": "layerType", + "description": [], + "signature": [ + "\"data\" | \"referenceLine\" | \"annotations\"" + ], + "path": "src/plugins/visualizations/common/convert_to_lens/types/configurations.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "visualizations", + "id": "def-common.PartitionLayerState.primaryGroups", + "type": "Array", + "tags": [], + "label": "primaryGroups", + "description": [], + "signature": [ + "string[]" + ], + "path": "src/plugins/visualizations/common/convert_to_lens/types/configurations.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "visualizations", + "id": "def-common.PartitionLayerState.secondaryGroups", + "type": "Array", + "tags": [], + "label": "secondaryGroups", + "description": [], + "signature": [ + "string[] | undefined" + ], + "path": "src/plugins/visualizations/common/convert_to_lens/types/configurations.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "visualizations", + "id": "def-common.PartitionLayerState.metric", + "type": "string", + "tags": [], + "label": "metric", + "description": [], + "signature": [ + "string | undefined" + ], + "path": "src/plugins/visualizations/common/convert_to_lens/types/configurations.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "visualizations", + "id": "def-common.PartitionLayerState.collapseFns", + "type": "Object", + "tags": [], + "label": "collapseFns", + "description": [], + "signature": [ + "Record | undefined" + ], + "path": "src/plugins/visualizations/common/convert_to_lens/types/configurations.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "visualizations", + "id": "def-common.PartitionLayerState.numberDisplay", + "type": "CompoundType", + "tags": [], + "label": "numberDisplay", + "description": [], + "signature": [ + "\"value\" | \"percent\" | \"hidden\"" + ], + "path": "src/plugins/visualizations/common/convert_to_lens/types/configurations.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "visualizations", + "id": "def-common.PartitionLayerState.categoryDisplay", + "type": "CompoundType", + "tags": [], + "label": "categoryDisplay", + "description": [], + "signature": [ + "\"default\" | \"hide\" | \"inside\"" + ], + "path": "src/plugins/visualizations/common/convert_to_lens/types/configurations.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "visualizations", + "id": "def-common.PartitionLayerState.legendDisplay", + "type": "CompoundType", + "tags": [], + "label": "legendDisplay", + "description": [], + "signature": [ + "\"default\" | \"hide\" | \"show\"" + ], + "path": "src/plugins/visualizations/common/convert_to_lens/types/configurations.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "visualizations", + "id": "def-common.PartitionLayerState.legendPosition", + "type": "CompoundType", + "tags": [], + "label": "legendPosition", + "description": [], + "signature": [ + "Position", + " | undefined" + ], + "path": "src/plugins/visualizations/common/convert_to_lens/types/configurations.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "visualizations", + "id": "def-common.PartitionLayerState.showValuesInLegend", + "type": "CompoundType", + "tags": [], + "label": "showValuesInLegend", + "description": [], + "signature": [ + "boolean | undefined" + ], + "path": "src/plugins/visualizations/common/convert_to_lens/types/configurations.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "visualizations", + "id": "def-common.PartitionLayerState.nestedLegend", + "type": "CompoundType", + "tags": [], + "label": "nestedLegend", + "description": [], + "signature": [ + "boolean | undefined" + ], + "path": "src/plugins/visualizations/common/convert_to_lens/types/configurations.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "visualizations", + "id": "def-common.PartitionLayerState.percentDecimals", + "type": "number", + "tags": [], + "label": "percentDecimals", + "description": [], + "signature": [ + "number | undefined" + ], + "path": "src/plugins/visualizations/common/convert_to_lens/types/configurations.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "visualizations", + "id": "def-common.PartitionLayerState.emptySizeRatio", + "type": "number", + "tags": [], + "label": "emptySizeRatio", + "description": [], + "signature": [ + "number | undefined" + ], + "path": "src/plugins/visualizations/common/convert_to_lens/types/configurations.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "visualizations", + "id": "def-common.PartitionLayerState.legendMaxLines", + "type": "number", + "tags": [], + "label": "legendMaxLines", + "description": [], + "signature": [ + "number | undefined" + ], + "path": "src/plugins/visualizations/common/convert_to_lens/types/configurations.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "visualizations", + "id": "def-common.PartitionLayerState.legendSize", + "type": "CompoundType", + "tags": [], + "label": "legendSize", + "description": [], + "signature": [ + { + "pluginId": "visualizations", + "scope": "common", + "docId": "kibVisualizationsPluginApi", + "section": "def-common.LegendSize", + "text": "LegendSize" + }, + " | undefined" + ], + "path": "src/plugins/visualizations/common/convert_to_lens/types/configurations.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "visualizations", + "id": "def-common.PartitionLayerState.truncateLegend", + "type": "CompoundType", + "tags": [], + "label": "truncateLegend", + "description": [], + "signature": [ + "boolean | undefined" + ], + "path": "src/plugins/visualizations/common/convert_to_lens/types/configurations.ts", + "deprecated": false, + "trackAdoption": false + } + ], + "initialIsOpen": false + }, + { + "parentPluginId": "visualizations", + "id": "def-common.PartitionVisConfiguration", + "type": "Interface", + "tags": [], + "label": "PartitionVisConfiguration", + "description": [], + "path": "src/plugins/visualizations/common/convert_to_lens/types/configurations.ts", + "deprecated": false, + "trackAdoption": false, + "children": [ + { + "parentPluginId": "visualizations", + "id": "def-common.PartitionVisConfiguration.shape", + "type": "CompoundType", + "tags": [], + "label": "shape", + "description": [], + "signature": [ + "\"pie\" | \"donut\" | \"treemap\" | \"mosaic\" | \"waffle\"" + ], + "path": "src/plugins/visualizations/common/convert_to_lens/types/configurations.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "visualizations", + "id": "def-common.PartitionVisConfiguration.layers", + "type": "Array", + "tags": [], + "label": "layers", + "description": [], + "signature": [ + { + "pluginId": "visualizations", + "scope": "common", + "docId": "kibVisualizationsPluginApi", + "section": "def-common.PartitionLayerState", + "text": "PartitionLayerState" + }, + "[]" + ], + "path": "src/plugins/visualizations/common/convert_to_lens/types/configurations.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "visualizations", + "id": "def-common.PartitionVisConfiguration.palette", + "type": "Object", + "tags": [], + "label": "palette", + "description": [], + "signature": [ + "PaletteOutput", + "<{ [key: string]: unknown; }> | undefined" + ], + "path": "src/plugins/visualizations/common/convert_to_lens/types/configurations.ts", + "deprecated": false, + "trackAdoption": false + } + ], + "initialIsOpen": false + }, { "parentPluginId": "visualizations", "id": "def-common.PercentileParams", @@ -12007,6 +12328,21 @@ "trackAdoption": false, "initialIsOpen": false }, + { + "parentPluginId": "visualizations", + "id": "def-common.CategoryDisplayType", + "type": "Type", + "tags": [], + "label": "CategoryDisplayType", + "description": [], + "signature": [ + "\"default\" | \"hide\" | \"inside\"" + ], + "path": "src/plugins/visualizations/common/convert_to_lens/types/configurations.ts", + "deprecated": false, + "trackAdoption": false, + "initialIsOpen": false + }, { "parentPluginId": "visualizations", "id": "def-common.Column", @@ -12090,6 +12426,14 @@ "text": "TableVisConfiguration" }, " | ", + { + "pluginId": "visualizations", + "scope": "common", + "docId": "kibVisualizationsPluginApi", + "section": "def-common.PartitionVisConfiguration", + "text": "PartitionVisConfiguration" + }, + " | ", { "pluginId": "visualizations", "scope": "common", @@ -12532,6 +12876,36 @@ "trackAdoption": false, "initialIsOpen": false }, + { + "parentPluginId": "visualizations", + "id": "def-common.LayerType", + "type": "Type", + "tags": [], + "label": "LayerType", + "description": [], + "signature": [ + "\"data\" | \"referenceLine\" | \"annotations\"" + ], + "path": "src/plugins/visualizations/common/convert_to_lens/types/configurations.ts", + "deprecated": false, + "trackAdoption": false, + "initialIsOpen": false + }, + { + "parentPluginId": "visualizations", + "id": "def-common.LegendDisplayType", + "type": "Type", + "tags": [], + "label": "LegendDisplayType", + "description": [], + "signature": [ + "\"default\" | \"hide\" | \"show\"" + ], + "path": "src/plugins/visualizations/common/convert_to_lens/types/configurations.ts", + "deprecated": false, + "trackAdoption": false, + "initialIsOpen": false + }, { "parentPluginId": "visualizations", "id": "def-common.MaxColumn", @@ -12715,6 +13089,21 @@ "trackAdoption": false, "initialIsOpen": false }, + { + "parentPluginId": "visualizations", + "id": "def-common.NumberDisplayType", + "type": "Type", + "tags": [], + "label": "NumberDisplayType", + "description": [], + "signature": [ + "\"value\" | \"percent\" | \"hidden\"" + ], + "path": "src/plugins/visualizations/common/convert_to_lens/types/configurations.ts", + "deprecated": false, + "trackAdoption": false, + "initialIsOpen": false + }, { "parentPluginId": "visualizations", "id": "def-common.Operation", @@ -12760,6 +13149,21 @@ "trackAdoption": false, "initialIsOpen": false }, + { + "parentPluginId": "visualizations", + "id": "def-common.PartitionChartType", + "type": "Type", + "tags": [], + "label": "PartitionChartType", + "description": [], + "signature": [ + "\"pie\" | \"donut\" | \"treemap\" | \"mosaic\" | \"waffle\"" + ], + "path": "src/plugins/visualizations/common/convert_to_lens/types/configurations.ts", + "deprecated": false, + "trackAdoption": false, + "initialIsOpen": false + }, { "parentPluginId": "visualizations", "id": "def-common.PercentileColumn", @@ -13210,6 +13614,21 @@ } ], "objects": [ + { + "parentPluginId": "visualizations", + "id": "def-common.CategoryDisplayTypes", + "type": "Object", + "tags": [], + "label": "CategoryDisplayTypes", + "description": [], + "signature": [ + "{ readonly DEFAULT: \"default\"; readonly INSIDE: \"inside\"; readonly HIDE: \"hide\"; }" + ], + "path": "src/plugins/visualizations/common/convert_to_lens/constants.ts", + "deprecated": false, + "trackAdoption": false, + "initialIsOpen": false + }, { "parentPluginId": "visualizations", "id": "def-common.FillTypes", @@ -13220,7 +13639,37 @@ "signature": [ "{ readonly NONE: \"none\"; readonly ABOVE: \"above\"; readonly BELOW: \"below\"; }" ], - "path": "src/plugins/visualizations/common/convert_to_lens/types/configurations.ts", + "path": "src/plugins/visualizations/common/convert_to_lens/constants.ts", + "deprecated": false, + "trackAdoption": false, + "initialIsOpen": false + }, + { + "parentPluginId": "visualizations", + "id": "def-common.LayerTypes", + "type": "Object", + "tags": [], + "label": "LayerTypes", + "description": [], + "signature": [ + "{ readonly DATA: \"data\"; readonly REFERENCELINE: \"referenceLine\"; readonly ANNOTATIONS: \"annotations\"; }" + ], + "path": "src/plugins/visualizations/common/convert_to_lens/constants.ts", + "deprecated": false, + "trackAdoption": false, + "initialIsOpen": false + }, + { + "parentPluginId": "visualizations", + "id": "def-common.LegendDisplayTypes", + "type": "Object", + "tags": [], + "label": "LegendDisplayTypes", + "description": [], + "signature": [ + "{ readonly DEFAULT: \"default\"; readonly SHOW: \"show\"; readonly HIDE: \"hide\"; }" + ], + "path": "src/plugins/visualizations/common/convert_to_lens/constants.ts", "deprecated": false, "trackAdoption": false, "initialIsOpen": false @@ -13240,6 +13689,21 @@ "trackAdoption": false, "initialIsOpen": false }, + { + "parentPluginId": "visualizations", + "id": "def-common.NumberDisplayTypes", + "type": "Object", + "tags": [], + "label": "NumberDisplayTypes", + "description": [], + "signature": [ + "{ readonly HIDDEN: \"hidden\"; readonly PERCENT: \"percent\"; readonly VALUE: \"value\"; }" + ], + "path": "src/plugins/visualizations/common/convert_to_lens/constants.ts", + "deprecated": false, + "trackAdoption": false, + "initialIsOpen": false + }, { "parentPluginId": "visualizations", "id": "def-common.Operations", @@ -13285,6 +13749,21 @@ "trackAdoption": false, "initialIsOpen": false }, + { + "parentPluginId": "visualizations", + "id": "def-common.PartitionChartTypes", + "type": "Object", + "tags": [], + "label": "PartitionChartTypes", + "description": [], + "signature": [ + "{ readonly PIE: \"pie\"; readonly DONUT: \"donut\"; readonly TREEMAP: \"treemap\"; readonly MOSAIC: \"mosaic\"; readonly WAFFLE: \"waffle\"; }" + ], + "path": "src/plugins/visualizations/common/convert_to_lens/constants.ts", + "deprecated": false, + "trackAdoption": false, + "initialIsOpen": false + }, { "parentPluginId": "visualizations", "id": "def-common.RANGE_MODES", @@ -13310,7 +13789,7 @@ "signature": [ "{ readonly BAR: \"bar\"; readonly LINE: \"line\"; readonly AREA: \"area\"; readonly BAR_STACKED: \"bar_stacked\"; readonly AREA_STACKED: \"area_stacked\"; readonly BAR_HORIZONTAL: \"bar_horizontal\"; readonly BAR_PERCENTAGE_STACKED: \"bar_percentage_stacked\"; readonly BAR_HORIZONTAL_STACKED: \"bar_horizontal_stacked\"; readonly AREA_PERCENTAGE_STACKED: \"area_percentage_stacked\"; readonly BAR_HORIZONTAL_PERCENTAGE_STACKED: \"bar_horizontal_percentage_stacked\"; }" ], - "path": "src/plugins/visualizations/common/convert_to_lens/types/configurations.ts", + "path": "src/plugins/visualizations/common/convert_to_lens/constants.ts", "deprecated": false, "trackAdoption": false, "initialIsOpen": false @@ -13325,7 +13804,7 @@ "signature": [ "{ readonly LINEAR: \"LINEAR\"; readonly CURVE_MONOTONE_X: \"CURVE_MONOTONE_X\"; readonly CURVE_STEP_AFTER: \"CURVE_STEP_AFTER\"; }" ], - "path": "src/plugins/visualizations/common/convert_to_lens/types/configurations.ts", + "path": "src/plugins/visualizations/common/convert_to_lens/constants.ts", "deprecated": false, "trackAdoption": false, "initialIsOpen": false @@ -13340,7 +13819,7 @@ "signature": [ "{ readonly AUTO: \"auto\"; readonly LEFT: \"left\"; readonly RIGHT: \"right\"; readonly BOTTOM: \"bottom\"; }" ], - "path": "src/plugins/visualizations/common/convert_to_lens/types/configurations.ts", + "path": "src/plugins/visualizations/common/convert_to_lens/constants.ts", "deprecated": false, "trackAdoption": false, "initialIsOpen": false diff --git a/api_docs/visualizations.mdx b/api_docs/visualizations.mdx index 6e29fc3d03f29..db658a8b5a0b1 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: 2022-09-29 +date: 2022-09-30 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'visualizations'] --- import visualizationsObj from './visualizations.devdocs.json'; @@ -21,7 +21,7 @@ Contact [Vis Editors](https://github.com/orgs/elastic/teams/kibana-vis-editors) | Public API count | Any count | Items lacking comments | Missing exports | |-------------------|-----------|------------------------|-----------------| -| 693 | 12 | 663 | 18 | +| 725 | 12 | 695 | 18 | ## Client From 8e9fc2d9484b375f15fb24fdfd18660d5caefba7 Mon Sep 17 00:00:00 2001 From: Stratoula Kalafateli Date: Fri, 30 Sep 2022 11:27:46 +0300 Subject: [PATCH 32/72] [Lens] Explore field in Discover (#142199) * [Lens] Explore field in Discover * Remove button for geo_ fields * Open in new tab --- .../field_item.test.tsx | 46 ++++++++++++++++ .../indexpattern_datasource/field_item.tsx | 54 ++++++++++++++++++- .../public/indexpattern_datasource/index.ts | 5 +- .../indexpattern_datasource/indexpattern.tsx | 4 ++ 4 files changed, 107 insertions(+), 2 deletions(-) diff --git a/x-pack/plugins/lens/public/indexpattern_datasource/field_item.test.tsx b/x-pack/plugins/lens/public/indexpattern_datasource/field_item.test.tsx index 2404d53b8f02a..3c6ddbe5e849d 100644 --- a/x-pack/plugins/lens/public/indexpattern_datasource/field_item.test.tsx +++ b/x-pack/plugins/lens/public/indexpattern_datasource/field_item.test.tsx @@ -9,9 +9,11 @@ import React, { ReactElement } from 'react'; import { ReactWrapper } from 'enzyme'; import { act } from 'react-dom/test-utils'; import { EuiLoadingSpinner, EuiPopover } from '@elastic/eui'; +import type { DiscoverStart } from '@kbn/discover-plugin/public'; import { InnerFieldItem, FieldItemProps } from './field_item'; import { coreMock } from '@kbn/core/public/mocks'; import { mountWithIntl } from '@kbn/test-jest-helpers'; +import { findTestSubject } from '@elastic/eui/lib/test'; import { fieldFormatsServiceMock } from '@kbn/field-formats-plugin/public/mocks'; import { IndexPattern } from '../types'; import { chartPluginMock } from '@kbn/charts-plugin/public/mocks'; @@ -47,6 +49,11 @@ const mockedServices = { fieldFormats: fieldFormatsServiceMock.createStartContract(), charts: chartPluginMock.createSetupContract(), uiSettings: coreMock.createStart().uiSettings, + discover: { + locator: { + getRedirectUrl: jest.fn(() => 'discover_url'), + }, + } as unknown as DiscoverStart, }; const InnerFieldItemWrapper: React.FC = (props) => { @@ -414,4 +421,43 @@ describe('IndexPattern Field Item', () => { expect(wrapper.find(EuiLoadingSpinner)).toHaveLength(0); expect(wrapper.find(FieldStats).text()).toBe('Analysis is not available for this field.'); }); + + it('should display Explore in discover button', async () => { + const wrapper = await mountWithIntl(); + + await clickField(wrapper, 'bytes'); + + await wrapper.update(); + + const exploreInDiscoverBtn = findTestSubject( + wrapper, + 'lnsFieldListPanel-exploreInDiscover-bytes' + ); + expect(exploreInDiscoverBtn.length).toBe(1); + }); + + it('should not display Explore in discover button for a geo_point field', async () => { + const wrapper = await mountWithIntl( + + ); + + await clickField(wrapper, 'geo_point'); + + await wrapper.update(); + + const exploreInDiscoverBtn = findTestSubject( + wrapper, + 'lnsFieldListPanel-exploreInDiscover-geo_point' + ); + expect(exploreInDiscoverBtn.length).toBe(0); + }); }); diff --git a/x-pack/plugins/lens/public/indexpattern_datasource/field_item.tsx b/x-pack/plugins/lens/public/indexpattern_datasource/field_item.tsx index 29f666a4ff6eb..d545d05c80341 100644 --- a/x-pack/plugins/lens/public/indexpattern_datasource/field_item.tsx +++ b/x-pack/plugins/lens/public/indexpattern_datasource/field_item.tsx @@ -19,6 +19,7 @@ import { EuiText, EuiTitle, EuiToolTip, + EuiButton, } from '@elastic/eui'; import { i18n } from '@kbn/i18n'; import { useKibana } from '@kbn/kibana-react-plugin/public'; @@ -30,7 +31,7 @@ import { DataViewField } from '@kbn/data-views-plugin/common'; import { ChartsPluginSetup } from '@kbn/charts-plugin/public'; import { UiActionsStart } from '@kbn/ui-actions-plugin/public'; import { AddFieldFilterHandler, FieldStats } from '@kbn/unified-field-list-plugin/public'; -import { generateFilters } from '@kbn/data-plugin/public'; +import { generateFilters, getEsQueryConfig } from '@kbn/data-plugin/public'; import { DragDrop, DragDropIdentifier } from '../drag_drop'; import { DatasourceDataPanelProps, DataType } from '../types'; import { DOCUMENT_FIELD_NAME } from '../../common'; @@ -41,6 +42,7 @@ import { VisualizeGeoFieldButton } from './visualize_geo_field_button'; import type { LensAppServices } from '../app_plugin/types'; import { debouncedComponent } from '../debounced_component'; import { getFieldType } from './pure_utils'; +import { combineQueryAndFilters } from '../app_plugin/show_underlying_data'; export interface FieldItemProps { core: DatasourceDataPanelProps['core']; @@ -347,6 +349,41 @@ function FieldItemPopoverContents(props: FieldItemProps) { /> ); + const exploreInDiscover = useMemo(() => { + const meta = { + id: indexPattern.id, + columns: [field.name], + filters: { + enabled: { + lucene: [], + kuery: [], + }, + disabled: { + lucene: [], + kuery: [], + }, + }, + }; + const { filters: newFilters, query: newQuery } = combineQueryAndFilters( + query, + filters, + meta, + [indexPattern], + getEsQueryConfig(services.uiSettings) + ); + + if (!services.discover) { + return; + } + return services.discover.locator!.getRedirectUrl({ + dataViewSpec: indexPattern?.spec, + timeRange: services.data.query.timefilter.timefilter.getTime(), + filters: newFilters, + query: newQuery, + columns: meta.columns, + }); + }, [field.name, filters, indexPattern, query, services]); + if (hideDetails) { return panelHeader; } @@ -404,6 +441,21 @@ function FieldItemPopoverContents(props: FieldItemProps) { return params.element; }} /> + {exploreInDiscover && field.type !== 'geo_point' && field.type !== 'geo_shape' && ( + + + {i18n.translate('xpack.lens.indexPattern.fieldExploreInDiscover', { + defaultMessage: 'Explore values in Discover', + })} + + + )} ); } diff --git a/x-pack/plugins/lens/public/indexpattern_datasource/index.ts b/x-pack/plugins/lens/public/indexpattern_datasource/index.ts index 4bf33013b3280..6b1b052c90b14 100644 --- a/x-pack/plugins/lens/public/indexpattern_datasource/index.ts +++ b/x-pack/plugins/lens/public/indexpattern_datasource/index.ts @@ -8,6 +8,7 @@ import type { CoreSetup } from '@kbn/core/public'; import { createStartServicesGetter, Storage } from '@kbn/kibana-utils-plugin/public'; import type { UnifiedSearchPublicPluginStart } from '@kbn/unified-search-plugin/public'; +import type { DiscoverStart } from '@kbn/discover-plugin/public'; import type { DataViewsPublicPluginStart } from '@kbn/data-views-plugin/public'; import type { ExpressionsSetup } from '@kbn/expressions-plugin/public'; import type { ChartsPluginSetup } from '@kbn/charts-plugin/public'; @@ -30,6 +31,7 @@ export interface IndexPatternDatasourceSetupPlugins { export interface IndexPatternDatasourceStartPlugins { data: DataPublicPluginStart; unifiedSearch: UnifiedSearchPublicPluginStart; + discover?: DiscoverStart; fieldFormats: FieldFormatsStart; dataViewFieldEditor: IndexPatternFieldEditorStart; dataViews: DataViewsPublicPluginStart; @@ -62,7 +64,7 @@ export class IndexPatternDatasource { const [ coreStart, - { dataViewFieldEditor, uiActions, data, fieldFormats, dataViews, unifiedSearch }, + { dataViewFieldEditor, uiActions, data, fieldFormats, dataViews, unifiedSearch, discover }, ] = await core.getStartServices(); return getIndexPatternDatasource({ @@ -71,6 +73,7 @@ export class IndexPatternDatasource { storage: new Storage(localStorage), data, unifiedSearch, + discover, dataViews, charts, dataViewFieldEditor, diff --git a/x-pack/plugins/lens/public/indexpattern_datasource/indexpattern.tsx b/x-pack/plugins/lens/public/indexpattern_datasource/indexpattern.tsx index 20d0df1358be7..7c083debecb2b 100644 --- a/x-pack/plugins/lens/public/indexpattern_datasource/indexpattern.tsx +++ b/x-pack/plugins/lens/public/indexpattern_datasource/indexpattern.tsx @@ -11,6 +11,7 @@ import { I18nProvider } from '@kbn/i18n-react'; import type { CoreStart, SavedObjectReference } from '@kbn/core/public'; import { i18n } from '@kbn/i18n'; import { TimeRange } from '@kbn/es-query'; +import type { DiscoverStart } from '@kbn/discover-plugin/public'; import type { IStorageWrapper } from '@kbn/kibana-utils-plugin/public'; import type { FieldFormatsStart } from '@kbn/field-formats-plugin/public'; import { flatten, isEqual } from 'lodash'; @@ -130,6 +131,7 @@ export function getIndexPatternDatasource({ storage, data, unifiedSearch, + discover, dataViews, fieldFormats, charts, @@ -140,6 +142,7 @@ export function getIndexPatternDatasource({ storage: IStorageWrapper; data: DataPublicPluginStart; unifiedSearch: UnifiedSearchPublicPluginStart; + discover?: DiscoverStart; dataViews: DataViewsPublicPluginStart; fieldFormats: FieldFormatsStart; charts: ChartsPluginSetup; @@ -282,6 +285,7 @@ export function getIndexPatternDatasource({ fieldFormats, charts, unifiedSearch, + discover, }} > Date: Fri, 30 Sep 2022 10:49:05 +0200 Subject: [PATCH 33/72] [Lens] drag field to annotations to the config panel (#141626) * getCurrentIndexPattern -> getUsedDataView * implement dnd for field --- .../buttons/draggable_dimension_button.tsx | 120 +-- .../buttons/drop_targets_utils.test.tsx | 128 --- .../buttons/drop_targets_utils.tsx | 52 +- .../buttons/empty_dimension_button.tsx | 113 +-- .../config_panel/config_panel.tsx | 2 +- .../editor_frame/config_panel/layer_panel.tsx | 51 +- .../droppable/get_drop_props.ts | 19 +- .../dimension_panel/droppable/mocks.ts | 7 + .../droppable/on_drop_handler.test.ts | 4 + .../droppable/on_drop_handler.ts | 5 +- .../indexpattern_datasource/field_item.tsx | 3 +- .../indexpattern_datasource/indexpattern.tsx | 12 +- .../operations/layer_helpers.test.ts | 2 + .../indexpattern_datasource/pure_utils.ts | 10 +- .../lens/public/mocks/datasource_mock.ts | 1 - .../state_management/lens_slice.test.ts | 2 +- .../public/state_management/lens_slice.ts | 4 +- .../text_based_languages.tsx | 10 +- x-pack/plugins/lens/public/types.ts | 25 +- x-pack/plugins/lens/public/utils.ts | 39 +- .../visualizations/xy/annotations/helpers.tsx | 100 +- .../visualizations/xy/visualization.test.ts | 891 ++++++++++++------ .../visualizations/xy/visualization.tsx | 45 +- 23 files changed, 989 insertions(+), 656 deletions(-) delete mode 100644 x-pack/plugins/lens/public/editor_frame_service/editor_frame/config_panel/buttons/drop_targets_utils.test.tsx diff --git a/x-pack/plugins/lens/public/editor_frame_service/editor_frame/config_panel/buttons/draggable_dimension_button.tsx b/x-pack/plugins/lens/public/editor_frame_service/editor_frame/config_panel/buttons/draggable_dimension_button.tsx index a118183c49061..6e3978a414ec7 100644 --- a/x-pack/plugins/lens/public/editor_frame_service/editor_frame/config_panel/buttons/draggable_dimension_button.tsx +++ b/x-pack/plugins/lens/public/editor_frame_service/editor_frame/config_panel/buttons/draggable_dimension_button.tsx @@ -6,6 +6,7 @@ */ import React, { useMemo, useCallback, useContext, ReactElement } from 'react'; +import { isDraggedField } from '../../../../utils'; import { DragDrop, DragDropIdentifier, DragContext } from '../../../../drag_drop'; import { Datasource, @@ -14,23 +15,20 @@ import { DropType, DatasourceLayers, IndexPatternMap, + DragDropOperation, + Visualization, } from '../../../../types'; import { getCustomDropTarget, getAdditionalClassesOnDroppable, getAdditionalClassesOnEnter, - getDropProps, } from './drop_targets_utils'; export function DraggableDimensionButton({ - layerId, - label, - accessorIndex, - groupIndex, - layerIndex, - columnId, + order, group, onDrop, + activeVisualization, onDragStart, onDragEnd, children, @@ -39,100 +37,82 @@ export function DraggableDimensionButton({ datasourceLayers, registerNewButtonRef, indexPatterns, + target, }: { - layerId: string; - groupIndex: number; - layerIndex: number; + target: DragDropOperation & { + id: string; + humanData: { + label: string; + groupLabel: string; + position: number; + layerNumber: number; + }; + }; + order: [2, number, number, number]; onDrop: (source: DragDropIdentifier, dropTarget: DragDropIdentifier, dropType?: DropType) => void; onDragStart: () => void; onDragEnd: () => void; + activeVisualization: Visualization; group: VisualizationDimensionGroupConfig; - label: string; children: ReactElement; layerDatasource?: Datasource; datasourceLayers: DatasourceLayers; state: unknown; - accessorIndex: number; - columnId: string; registerNewButtonRef: (id: string, instance: HTMLDivElement | null) => void; indexPatterns: IndexPatternMap; }) { const { dragging } = useContext(DragContext); - const sharedDatasource = - !isOperation(dragging) || - datasourceLayers?.[dragging.layerId]?.datasourceId === datasourceLayers?.[layerId]?.datasourceId - ? layerDatasource - : undefined; + let getDropProps; - const dropProps = getDropProps( - { - state, - source: dragging, - target: { - layerId, - columnId, - groupId: group.groupId, - filterOperations: group.filterOperations, - prioritizedOperation: group.prioritizedOperation, - }, - indexPatterns, - }, - sharedDatasource - ); + if (dragging) { + if (!layerDatasource) { + getDropProps = activeVisualization.getDropProps; + } else if ( + isDraggedField(dragging) || + (isOperation(dragging) && + layerDatasource && + datasourceLayers?.[dragging.layerId]?.datasourceId === + datasourceLayers?.[target.layerId]?.datasourceId) + ) { + getDropProps = layerDatasource.getDropProps; + } + } + + const { dropTypes, nextLabel } = getDropProps?.({ + state, + source: dragging, + target, + indexPatterns, + }) || { dropTypes: [], nextLabel: '' }; - const dropTypes = dropProps?.dropTypes; - const nextLabel = dropProps?.nextLabel; const canDuplicate = !!( - dropTypes && - (dropTypes.includes('replace_duplicate_incompatible') || - dropTypes.includes('replace_duplicate_compatible')) + dropTypes.includes('replace_duplicate_incompatible') || + dropTypes.includes('replace_duplicate_compatible') ); const canSwap = !!( - dropTypes && - (dropTypes.includes('swap_incompatible') || dropTypes.includes('swap_compatible')) + dropTypes.includes('swap_incompatible') || dropTypes.includes('swap_compatible') ); const canCombine = Boolean( - dropTypes && - (dropTypes.includes('combine_compatible') || - dropTypes.includes('field_combine') || - dropTypes.includes('combine_incompatible')) + dropTypes.includes('combine_compatible') || + dropTypes.includes('field_combine') || + dropTypes.includes('combine_incompatible') ); const value = useMemo( () => ({ - columnId, - groupId: group.groupId, - layerId, - id: columnId, - filterOperations: group.filterOperations, + ...target, humanData: { + ...target.humanData, canSwap, canDuplicate, canCombine, - label, - groupLabel: group.groupLabel, - position: accessorIndex + 1, nextLabel: nextLabel || '', - layerNumber: layerIndex + 1, }, }), - [ - columnId, - group.groupId, - accessorIndex, - layerId, - label, - group.groupLabel, - nextLabel, - group.filterOperations, - canDuplicate, - canSwap, - canCombine, - layerIndex, - ] + [target, nextLabel, canDuplicate, canSwap, canCombine] ); const reorderableGroup = useMemo( @@ -144,8 +124,8 @@ export function DraggableDimensionButton({ ); const registerNewButtonRefMemoized = useCallback( - (el) => registerNewButtonRef(columnId, el), - [registerNewButtonRef, columnId] + (el) => registerNewButtonRef(target.columnId, el), + [registerNewButtonRef, target.columnId] ); const handleOnDrop = useCallback( @@ -162,7 +142,7 @@ export function DraggableDimensionButton({ getCustomDropTarget={getCustomDropTarget} getAdditionalClassesOnEnter={getAdditionalClassesOnEnter} getAdditionalClassesOnDroppable={getAdditionalClassesOnDroppable} - order={[2, layerIndex, groupIndex, accessorIndex]} + order={order} draggable dragType={isOperation(dragging) ? 'move' : 'copy'} dropTypes={dropTypes} diff --git a/x-pack/plugins/lens/public/editor_frame_service/editor_frame/config_panel/buttons/drop_targets_utils.test.tsx b/x-pack/plugins/lens/public/editor_frame_service/editor_frame/config_panel/buttons/drop_targets_utils.test.tsx deleted file mode 100644 index 17907ac19c4bc..0000000000000 --- a/x-pack/plugins/lens/public/editor_frame_service/editor_frame/config_panel/buttons/drop_targets_utils.test.tsx +++ /dev/null @@ -1,128 +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 { getDropProps } from './drop_targets_utils'; -import { createMockDatasource } from '../../../../mocks'; - -describe('getDropProps', () => { - it('should run datasource getDropProps if exists', () => { - const mockDatasource = createMockDatasource('testDatasource'); - getDropProps( - { - state: 'datasourceState', - target: { - columnId: 'col1', - groupId: 'x', - layerId: 'first', - filterOperations: () => true, - }, - source: { - columnId: 'col1', - groupId: 'x', - layerId: 'first', - id: 'annotationColumn2', - humanData: { label: 'Event' }, - }, - indexPatterns: {}, - }, - mockDatasource - ); - expect(mockDatasource.getDropProps).toHaveBeenCalled(); - }); - describe('no datasource', () => { - it('returns reorder for the same group existing columns', () => { - expect( - getDropProps({ - state: 'datasourceState', - target: { - columnId: 'annotationColumn', - groupId: 'xAnnotations', - layerId: 'second', - filterOperations: () => true, - }, - source: { - columnId: 'annotationColumn2', - groupId: 'xAnnotations', - layerId: 'second', - id: 'annotationColumn2', - humanData: { label: 'Event' }, - }, - indexPatterns: {}, - }) - ).toEqual({ dropTypes: ['reorder'] }); - }); - it('returns duplicate for the same group existing column and not existing column', () => { - expect( - getDropProps({ - state: 'datasourceState', - target: { - columnId: 'annotationColumn', - groupId: 'xAnnotations', - layerId: 'second', - isNewColumn: true, - filterOperations: () => true, - }, - source: { - columnId: 'annotationColumn2', - groupId: 'xAnnotations', - layerId: 'second', - id: 'annotationColumn2', - humanData: { label: 'Event' }, - }, - indexPatterns: {}, - }) - ).toEqual({ dropTypes: ['duplicate_compatible'] }); - }); - it('returns replace_duplicate and replace for replacing to different layer', () => { - expect( - getDropProps({ - state: 'datasourceState', - target: { - columnId: 'annotationColumn', - groupId: 'xAnnotations', - layerId: 'first', - filterOperations: () => true, - }, - source: { - columnId: 'annotationColumn2', - groupId: 'xAnnotations', - layerId: 'second', - id: 'annotationColumn2', - humanData: { label: 'Event' }, - }, - indexPatterns: {}, - }) - ).toEqual({ - dropTypes: ['replace_compatible', 'replace_duplicate_compatible', 'swap_compatible'], - }); - }); - it('returns duplicate and move for replacing to different layer for empty column', () => { - expect( - getDropProps({ - state: 'datasourceState', - target: { - columnId: 'annotationColumn', - groupId: 'xAnnotations', - layerId: 'first', - isNewColumn: true, - filterOperations: () => true, - }, - source: { - columnId: 'annotationColumn2', - groupId: 'xAnnotations', - layerId: 'second', - id: 'annotationColumn2', - humanData: { label: 'Event' }, - }, - indexPatterns: {}, - }) - ).toEqual({ - dropTypes: ['move_compatible', 'duplicate_compatible'], - }); - }); - }); -}); diff --git a/x-pack/plugins/lens/public/editor_frame_service/editor_frame/config_panel/buttons/drop_targets_utils.tsx b/x-pack/plugins/lens/public/editor_frame_service/editor_frame/config_panel/buttons/drop_targets_utils.tsx index 5f3fd2d4a73b5..3094a07cf3290 100644 --- a/x-pack/plugins/lens/public/editor_frame_service/editor_frame/config_panel/buttons/drop_targets_utils.tsx +++ b/x-pack/plugins/lens/public/editor_frame_service/editor_frame/config_panel/buttons/drop_targets_utils.tsx @@ -9,12 +9,10 @@ import React from 'react'; import classNames from 'classnames'; import { EuiIcon, EuiFlexItem, EuiFlexGroup, EuiText } from '@elastic/eui'; import { i18n } from '@kbn/i18n'; -import { DragDropIdentifier, DraggingIdentifier } from '../../../../drag_drop'; +import { DragDropIdentifier } from '../../../../drag_drop'; import { - Datasource, DropType, FramePublicAPI, - GetDropPropsArgs, isOperation, Visualization, DragDropOperation, @@ -140,53 +138,6 @@ export const getAdditionalClassesOnDroppable = (dropType?: string) => { } }; -const isOperationFromCompatibleGroup = (op1?: DraggingIdentifier, op2?: DragDropOperation) => { - return ( - isOperation(op1) && - isOperation(op2) && - op1.columnId !== op2.columnId && - op1.groupId === op2.groupId && - op1.layerId !== op2.layerId - ); -}; - -export const isOperationFromTheSameGroup = (op1?: DraggingIdentifier, op2?: DragDropOperation) => { - return ( - isOperation(op1) && - isOperation(op2) && - op1.columnId !== op2.columnId && - op1.groupId === op2.groupId && - op1.layerId === op2.layerId - ); -}; - -export function getDropPropsForSameGroup( - isNewColumn?: boolean -): { dropTypes: DropType[]; nextLabel?: string } | undefined { - return !isNewColumn ? { dropTypes: ['reorder'] } : { dropTypes: ['duplicate_compatible'] }; -} - -export const getDropProps = ( - dropProps: GetDropPropsArgs, - sharedDatasource?: Datasource -): { dropTypes: DropType[]; nextLabel?: string } | undefined => { - if (sharedDatasource) { - return sharedDatasource?.getDropProps(dropProps); - } else { - if (isOperationFromTheSameGroup(dropProps.source, dropProps.target)) { - return getDropPropsForSameGroup(dropProps.target.isNewColumn); - } - if (isOperationFromCompatibleGroup(dropProps.source, dropProps.target)) { - return { - dropTypes: dropProps.target.isNewColumn - ? ['move_compatible', 'duplicate_compatible'] - : ['replace_compatible', 'replace_duplicate_compatible', 'swap_compatible'], - }; - } - } - return; -}; - export interface OnVisDropProps { prevState: T; target: DragDropOperation; @@ -215,7 +166,6 @@ export function onDropForVisualization( frame, }); - // remove source if ( isOperation(source) && (dropType === 'move_compatible' || diff --git a/x-pack/plugins/lens/public/editor_frame_service/editor_frame/config_panel/buttons/empty_dimension_button.tsx b/x-pack/plugins/lens/public/editor_frame_service/editor_frame/config_panel/buttons/empty_dimension_button.tsx index b6d7e58b0f7e7..8b1fe4082b31c 100644 --- a/x-pack/plugins/lens/public/editor_frame_service/editor_frame/config_panel/buttons/empty_dimension_button.tsx +++ b/x-pack/plugins/lens/public/editor_frame_service/editor_frame/config_panel/buttons/empty_dimension_button.tsx @@ -9,6 +9,7 @@ import React, { useMemo, useState, useEffect, useContext } from 'react'; import { EuiButtonEmpty } from '@elastic/eui'; import { FormattedMessage } from '@kbn/i18n-react'; import { i18n } from '@kbn/i18n'; +import { isDraggedField } from '../../../../utils'; import { generateId } from '../../../../id_generator'; import { DragDrop, DragDropIdentifier, DragContext } from '../../../../drag_drop'; @@ -19,16 +20,10 @@ import { DatasourceLayers, isOperation, IndexPatternMap, + DragDropOperation, + Visualization, } from '../../../../types'; -import { - getCustomDropTarget, - getAdditionalClassesOnDroppable, - getDropProps, -} from './drop_targets_utils'; - -const label = i18n.translate('xpack.lens.indexPattern.emptyDimensionButton', { - defaultMessage: 'Empty dimension', -}); +import { getCustomDropTarget, getAdditionalClassesOnDroppable } from './drop_targets_utils'; interface EmptyButtonProps { columnId: string; @@ -106,91 +101,81 @@ export function EmptyDimensionButton({ group, layerDatasource, state, - layerId, - groupIndex, - layerIndex, onClick, onDrop, datasourceLayers, indexPatterns, + activeVisualization, + order, + target, }: { - layerId: string; - groupIndex: number; - layerIndex: number; - onDrop: (source: DragDropIdentifier, dropTarget: DragDropIdentifier, dropType?: DropType) => void; - onClick: (id: string) => void; + order: [2, number, number, number]; group: VisualizationDimensionGroupConfig; layerDatasource?: Datasource; datasourceLayers: DatasourceLayers; state: unknown; + onDrop: (source: DragDropIdentifier, dropTarget: DragDropIdentifier, dropType?: DropType) => void; + onClick: (id: string) => void; indexPatterns: IndexPatternMap; + activeVisualization: Visualization; + target: Omit & { + humanData: { + groupLabel: string; + position: number; + layerNumber: number; + label: string; + }; + }; }) { const { dragging } = useContext(DragContext); - const sharedDatasource = - !isOperation(dragging) || - datasourceLayers?.[dragging.layerId]?.datasourceId === datasourceLayers?.[layerId]?.datasourceId - ? layerDatasource - : undefined; - const itemIndex = group.accessors.length; + let getDropProps; + + if (dragging) { + if (!layerDatasource) { + getDropProps = activeVisualization.getDropProps; + } else if ( + isDraggedField(dragging) || + (isOperation(dragging) && + layerDatasource && + datasourceLayers?.[dragging.layerId]?.datasourceId === + datasourceLayers?.[target.layerId]?.datasourceId) + ) { + getDropProps = layerDatasource.getDropProps; + } + } const [newColumnId, setNewColumnId] = useState(generateId()); useEffect(() => { setNewColumnId(generateId()); - }, [itemIndex]); - - const dropProps = getDropProps( - { - state, - source: dragging, - target: { - layerId, - columnId: newColumnId, - groupId: group.groupId, - filterOperations: group.filterOperations, - prioritizedOperation: group.prioritizedOperation, - isNewColumn: true, - }, - indexPatterns, - }, - sharedDatasource - ); + }, [group.accessors.length]); - const dropTypes = dropProps?.dropTypes; - const nextLabel = dropProps?.nextLabel; + const { dropTypes, nextLabel } = getDropProps?.({ + state, + source: dragging, + target: { + ...target, + columnId: newColumnId, + }, + indexPatterns, + }) || { dropTypes: [], nextLabel: '' }; const canDuplicate = !!( - dropTypes && - (dropTypes.includes('duplicate_compatible') || dropTypes.includes('duplicate_incompatible')) + dropTypes.includes('duplicate_compatible') || dropTypes.includes('duplicate_incompatible') ); const value = useMemo( () => ({ + ...target, columnId: newColumnId, - groupId: group.groupId, - layerId, - filterOperations: group.filterOperations, id: newColumnId, humanData: { - label, - groupLabel: group.groupLabel, - position: itemIndex + 1, + ...target.humanData, nextLabel: nextLabel || '', canDuplicate, - layerNumber: layerIndex + 1, }, }), - [ - newColumnId, - group.groupId, - layerId, - group.groupLabel, - group.filterOperations, - itemIndex, - nextLabel, - canDuplicate, - layerIndex, - ] + [newColumnId, target, nextLabel, canDuplicate] ); const handleOnDrop = React.useCallback( @@ -209,7 +194,7 @@ export function EmptyDimensionButton({ layerDatasource.getUsedDataView(layerDatasourceState, layer)), - defaultDataView: layerDatasource.getCurrentIndexPatternId(layerDatasourceState), + defaultDataView: layerDatasource.getUsedDataView(layerDatasourceState), } as ActionExecutionContext); } diff --git a/x-pack/plugins/lens/public/editor_frame_service/editor_frame/config_panel/layer_panel.tsx b/x-pack/plugins/lens/public/editor_frame_service/editor_frame/config_panel/layer_panel.tsx index cc748df7c3ecd..e40281fa1f3ea 100644 --- a/x-pack/plugins/lens/public/editor_frame_service/editor_frame/config_panel/layer_panel.tsx +++ b/x-pack/plugins/lens/public/editor_frame_service/editor_frame/config_panel/layer_panel.tsx @@ -458,18 +458,34 @@ export function LayerPanel( const { columnId } = accessorConfig; return ( setHideTooltip(true)} onDragEnd={() => setHideTooltip(false)} onDrop={onDrop} @@ -567,10 +583,27 @@ export function LayerPanel( {group.supportsMoreColumns ? ( !op.isBucketed, id: 'col1', humanData: { label: 'Column 1' }, + indexPatternId: 'first', }, numericalOnly: { layerId: 'first', @@ -257,6 +259,7 @@ export const mockedDndOperations = { filterOperations: (op: OperationMetadata) => op.dataType === 'number', id: 'col1', humanData: { label: 'Column 1' }, + indexPatternId: 'first', }, bucket: { columnId: 'col2', @@ -265,6 +268,7 @@ export const mockedDndOperations = { id: 'col2', humanData: { label: 'Column 2' }, filterOperations: (op: OperationMetadata) => op.isBucketed, + indexPatternId: 'first', }, staticValue: { columnId: 'col1', @@ -273,6 +277,7 @@ export const mockedDndOperations = { id: 'col1', humanData: { label: 'Column 2' }, filterOperations: (op: OperationMetadata) => !!op.isStaticValue, + indexPatternId: 'first', }, bucket2: { columnId: 'col3', @@ -282,6 +287,7 @@ export const mockedDndOperations = { humanData: { label: '', }, + indexPatternId: 'first', }, metricC: { columnId: 'col4', @@ -292,5 +298,6 @@ export const mockedDndOperations = { label: '', }, filterOperations: (op: OperationMetadata) => !op.isBucketed, + indexPatternId: 'first', }, }; diff --git a/x-pack/plugins/lens/public/indexpattern_datasource/dimension_panel/droppable/on_drop_handler.test.ts b/x-pack/plugins/lens/public/indexpattern_datasource/dimension_panel/droppable/on_drop_handler.test.ts index 6156be3570031..3b468181db6df 100644 --- a/x-pack/plugins/lens/public/indexpattern_datasource/dimension_panel/droppable/on_drop_handler.test.ts +++ b/x-pack/plugins/lens/public/indexpattern_datasource/dimension_panel/droppable/on_drop_handler.test.ts @@ -1562,12 +1562,14 @@ describe('IndexPatternDimensionEditorPanel: onDrop', () => { groupId: 'x', layerId: 'first', filterOperations: (op: OperationMetadata) => op.isBucketed, + indexPatternId: 'indexPattern1', }, target: { filterOperations: (op: OperationMetadata) => op.isBucketed, columnId: 'newCol', groupId: 'x', layerId: 'second', + indexPatternId: 'indexPattern1', }, dimensionGroups: defaultDimensionGroups, dropType: 'move_compatible', @@ -2161,6 +2163,7 @@ describe('IndexPatternDimensionEditorPanel: onDrop', () => { groupId: 'y', layerId: 'second', filterOperations: (op) => !op.isBucketed, + indexPatternId: 'test', }, }; @@ -2224,6 +2227,7 @@ describe('IndexPatternDimensionEditorPanel: onDrop', () => { groupId: 'y', layerId: 'second', filterOperations: (op) => !op.isBucketed, + indexPatternId: 'test', }, }) ).toEqual(true); diff --git a/x-pack/plugins/lens/public/indexpattern_datasource/dimension_panel/droppable/on_drop_handler.ts b/x-pack/plugins/lens/public/indexpattern_datasource/dimension_panel/droppable/on_drop_handler.ts index 8ea027a3da98f..77444e8ae59ee 100644 --- a/x-pack/plugins/lens/public/indexpattern_datasource/dimension_panel/droppable/on_drop_handler.ts +++ b/x-pack/plugins/lens/public/indexpattern_datasource/dimension_panel/droppable/on_drop_handler.ts @@ -4,6 +4,7 @@ * 2.0; you may not use this file except in compliance with the Elastic License * 2.0. */ +import { isDraggedField } from '../../../utils'; import { DatasourceDimensionDropHandlerProps, DragDropOperation, @@ -12,6 +13,7 @@ import { isOperation, StateSetter, VisualizationDimensionGroupConfig, + DraggedField, } from '../../../types'; import { insertOrReplaceColumn, @@ -25,9 +27,8 @@ import { deleteColumnInLayers, } from '../../operations'; import { mergeLayer, mergeLayers } from '../../state_helpers'; -import { isDraggedField } from '../../pure_utils'; import { getNewOperation, getField } from './get_drop_props'; -import { IndexPatternPrivateState, DraggedField, DataViewDragDropOperation } from '../../types'; +import { IndexPatternPrivateState, DataViewDragDropOperation } from '../../types'; interface DropHandlerProps { state: IndexPatternPrivateState; diff --git a/x-pack/plugins/lens/public/indexpattern_datasource/field_item.tsx b/x-pack/plugins/lens/public/indexpattern_datasource/field_item.tsx index d545d05c80341..a91286881197e 100644 --- a/x-pack/plugins/lens/public/indexpattern_datasource/field_item.tsx +++ b/x-pack/plugins/lens/public/indexpattern_datasource/field_item.tsx @@ -33,10 +33,9 @@ import { UiActionsStart } from '@kbn/ui-actions-plugin/public'; import { AddFieldFilterHandler, FieldStats } from '@kbn/unified-field-list-plugin/public'; import { generateFilters, getEsQueryConfig } from '@kbn/data-plugin/public'; import { DragDrop, DragDropIdentifier } from '../drag_drop'; -import { DatasourceDataPanelProps, DataType } from '../types'; +import { DatasourceDataPanelProps, DataType, DraggedField } from '../types'; import { DOCUMENT_FIELD_NAME } from '../../common'; import type { IndexPattern, IndexPatternField } from '../types'; -import type { DraggedField } from './types'; import { LensFieldIcon } from '../shared_components/field_picker/lens_field_icon'; import { VisualizeGeoFieldButton } from './visualize_geo_field_button'; import type { LensAppServices } from '../app_plugin/types'; diff --git a/x-pack/plugins/lens/public/indexpattern_datasource/indexpattern.tsx b/x-pack/plugins/lens/public/indexpattern_datasource/indexpattern.tsx index 7c083debecb2b..c16ced9ab78f8 100644 --- a/x-pack/plugins/lens/public/indexpattern_datasource/indexpattern.tsx +++ b/x-pack/plugins/lens/public/indexpattern_datasource/indexpattern.tsx @@ -69,7 +69,8 @@ import { isColumnInvalid, cloneLayer, } from './utils'; -import { normalizeOperationDataType, isDraggedField } from './pure_utils'; +import { isDraggedField } from '../utils'; +import { normalizeOperationDataType } from './pure_utils'; import { LayerPanel } from './layerpanel'; import { DateHistogramIndexPatternColumn, @@ -179,10 +180,6 @@ export function getIndexPatternDatasource({ return extractReferences(state); }, - getCurrentIndexPatternId(state: IndexPatternPrivateState) { - return state.currentIndexPatternId; - }, - insertLayer(state: IndexPatternPrivateState, newLayerId: string) { return { ...state, @@ -778,7 +775,10 @@ export function getIndexPatternDatasource({ injectReferences(persistableState1, references1), injectReferences(persistableState2, references2) ), - getUsedDataView: (state: IndexPatternPrivateState, layerId: string) => { + getUsedDataView: (state: IndexPatternPrivateState, layerId?: string) => { + if (!layerId) { + return state.currentIndexPatternId; + } return state.layers[layerId].indexPatternId; }, getUsedDataViews: (state) => { diff --git a/x-pack/plugins/lens/public/indexpattern_datasource/operations/layer_helpers.test.ts b/x-pack/plugins/lens/public/indexpattern_datasource/operations/layer_helpers.test.ts index 2df8300eb6481..1a77cd253424f 100644 --- a/x-pack/plugins/lens/public/indexpattern_datasource/operations/layer_helpers.test.ts +++ b/x-pack/plugins/lens/public/indexpattern_datasource/operations/layer_helpers.test.ts @@ -190,6 +190,7 @@ describe('state_helpers', () => { layerId: 'layer', dataView: indexPattern, filterOperations: () => true, + indexPatternId: '1', }, target: { columnId: 'copy', @@ -197,6 +198,7 @@ describe('state_helpers', () => { dataView: indexPattern, layerId: 'layer', filterOperations: () => true, + indexPatternId: '1', }, shouldDeleteSource: false, }).layer diff --git a/x-pack/plugins/lens/public/indexpattern_datasource/pure_utils.ts b/x-pack/plugins/lens/public/indexpattern_datasource/pure_utils.ts index e1fd78e0b1713..39b4bcdf49229 100644 --- a/x-pack/plugins/lens/public/indexpattern_datasource/pure_utils.ts +++ b/x-pack/plugins/lens/public/indexpattern_datasource/pure_utils.ts @@ -6,7 +6,7 @@ */ import type { DataType, IndexPattern, IndexPatternField } from '../types'; -import type { DraggedField, IndexPatternLayer } from './types'; +import type { IndexPatternLayer } from './types'; import type { BaseIndexPatternColumn, FieldBasedIndexPatternColumn, @@ -53,11 +53,3 @@ export function sortByField(columns: C[]) { return column1.operationType.localeCompare(column2.operationType); }); } - -export function isDraggedField(fieldCandidate: unknown): fieldCandidate is DraggedField { - return ( - typeof fieldCandidate === 'object' && - fieldCandidate !== null && - ['id', 'field', 'indexPatternId'].every((prop) => prop in fieldCandidate) - ); -} diff --git a/x-pack/plugins/lens/public/mocks/datasource_mock.ts b/x-pack/plugins/lens/public/mocks/datasource_mock.ts index 3d169b643c2ce..65d001a726b8c 100644 --- a/x-pack/plugins/lens/public/mocks/datasource_mock.ts +++ b/x-pack/plugins/lens/public/mocks/datasource_mock.ts @@ -41,7 +41,6 @@ export function createMockDatasource(id: string): DatasourceMock { initialize: jest.fn((_state?) => {}), renderDataPanel: jest.fn(), renderLayerPanel: jest.fn(), - getCurrentIndexPatternId: jest.fn(), toExpression: jest.fn((_frame, _state, _indexPatterns) => null), insertLayer: jest.fn((_state, _newLayerId) => ({})), removeLayer: jest.fn((_state, _layerId) => {}), diff --git a/x-pack/plugins/lens/public/state_management/lens_slice.test.ts b/x-pack/plugins/lens/public/state_management/lens_slice.test.ts index fc536b30ddac6..f83786238f628 100644 --- a/x-pack/plugins/lens/public/state_management/lens_slice.test.ts +++ b/x-pack/plugins/lens/public/state_management/lens_slice.test.ts @@ -279,7 +279,7 @@ describe('lensSlice', () => { removeLayer: (layerIds: unknown, layerId: string) => (layerIds as string[]).filter((id: string) => id !== layerId), insertLayer: (layerIds: unknown, layerId: string) => [...(layerIds as string[]), layerId], - getCurrentIndexPatternId: jest.fn(() => 'indexPattern1'), + getUsedDataView: jest.fn(() => 'indexPattern1'), }; }; const datasourceStates = { diff --git a/x-pack/plugins/lens/public/state_management/lens_slice.ts b/x-pack/plugins/lens/public/state_management/lens_slice.ts index 725c60bfc22cb..38aee718a536f 100644 --- a/x-pack/plugins/lens/public/state_management/lens_slice.ts +++ b/x-pack/plugins/lens/public/state_management/lens_slice.ts @@ -377,7 +377,7 @@ export const makeLensReducer = (storeDeps: LensStoreDeps) => { ); state.stagedPreview = undefined; // reuse the activeDatasource current dataView id for the moment - const currentDataViewsId = activeDataSource.getCurrentIndexPatternId( + const currentDataViewsId = activeDataSource.getUsedDataView( state.datasourceStates[state.activeDatasourceId!].state ); state.visualization.state = @@ -928,7 +928,7 @@ export const makeLensReducer = (storeDeps: LensStoreDeps) => { const activeVisualization = visualizationMap[state.visualization.activeId]; const activeDatasource = datasourceMap[state.activeDatasourceId]; // reuse the active datasource dataView id for the new layer - const currentDataViewsId = activeDatasource.getCurrentIndexPatternId( + const currentDataViewsId = activeDatasource.getUsedDataView( state.datasourceStates[state.activeDatasourceId!].state ); const visualizationState = activeVisualization.appendLayer!( diff --git a/x-pack/plugins/lens/public/text_based_languages_datasource/text_based_languages.tsx b/x-pack/plugins/lens/public/text_based_languages_datasource/text_based_languages.tsx index 5a03500c76fbf..4857d3eed3e32 100644 --- a/x-pack/plugins/lens/public/text_based_languages_datasource/text_based_languages.tsx +++ b/x-pack/plugins/lens/public/text_based_languages_datasource/text_based_languages.tsx @@ -224,10 +224,6 @@ export function getTextBasedLanguagesDatasource({ getLayers(state: TextBasedLanguagesPrivateState) { return state && state.layers ? Object.keys(state?.layers) : []; }, - getCurrentIndexPatternId(state: TextBasedLanguagesPrivateState) { - const layers = Object.values(state.layers); - return layers?.[0]?.index; - }, isTimeBased: (state, indexPatterns) => { if (!state) return false; const { layers } = state; @@ -238,7 +234,11 @@ export function getTextBasedLanguagesDatasource({ }) ); }, - getUsedDataView: (state: TextBasedLanguagesPrivateState, layerId: string) => { + getUsedDataView: (state: TextBasedLanguagesPrivateState, layerId?: string) => { + if (!layerId) { + const layers = Object.values(state.layers); + return layers?.[0]?.index; + } return state.layers[layerId].index; }, diff --git a/x-pack/plugins/lens/public/types.ts b/x-pack/plugins/lens/public/types.ts index 32fc21cc4a61d..486ddef88ee99 100644 --- a/x-pack/plugins/lens/public/types.ts +++ b/x-pack/plugins/lens/public/types.ts @@ -228,14 +228,7 @@ export type VisualizeEditorContext = { export interface GetDropPropsArgs { state: T; source?: DraggingIdentifier; - target: { - layerId: string; - groupId: string; - columnId: string; - filterOperations: (meta: OperationMetadata) => boolean; - prioritizedOperation?: string; - isNewColumn?: boolean; - }; + target: DragDropOperation; indexPatterns: IndexPatternMap; } @@ -258,7 +251,6 @@ export interface Datasource { // Given the current state, which parts should be saved? getPersistableState: (state: T) => { state: P; savedObjectReferences: SavedObjectReference[] }; - getCurrentIndexPatternId: (state: T) => string; getUnifiedSearchErrors?: (state: T) => Error[]; insertLayer: (state: T, newLayerId: string) => T; @@ -441,7 +433,7 @@ export interface Datasource { /** * Get the used DataView value from state */ - getUsedDataView: (state: T, layerId: string) => string; + getUsedDataView: (state: T, layerId?: string) => string; /** * Get all the used DataViews from state */ @@ -582,8 +574,16 @@ export interface DragDropOperation { groupId: string; columnId: string; filterOperations: (operation: OperationMetadata) => boolean; + indexPatternId?: string; + isNewColumn?: boolean; + prioritizedOperation?: string; } +export type DraggedField = DragDropIdentifier & { + field: IndexPatternField; + indexPatternId: string; +}; + export function isOperation(operationCandidate: unknown): operationCandidate is DragDropOperation { return ( typeof operationCandidate === 'object' && @@ -892,6 +892,7 @@ export interface Visualization { */ initialize: (addNewLayer: () => string, state?: T, mainPalette?: PaletteOutput) => T; + getUsedDataView?: (state: T, layerId: string) => string | undefined; /** * Retrieve the used DataViews in the visualization */ @@ -1022,6 +1023,10 @@ export interface Visualization { group?: VisualizationDimensionGroupConfig; }) => T; + getDropProps?: ( + dropProps: GetDropPropsArgs + ) => { dropTypes: DropType[]; nextLabel?: string } | undefined; + /** * Additional editor that gets rendered inside the dimension popover. * This can be used to configure dimension-specific options diff --git a/x-pack/plugins/lens/public/utils.ts b/x-pack/plugins/lens/public/utils.ts index 8f25379c0e21e..181ea104ffa71 100644 --- a/x-pack/plugins/lens/public/utils.ts +++ b/x-pack/plugins/lens/public/utils.ts @@ -15,15 +15,19 @@ import type { DataView, DataViewsContract } from '@kbn/data-views-plugin/public' import type { DatatableUtilitiesService } from '@kbn/data-plugin/common'; import { BrushTriggerEvent, ClickTriggerEvent } from '@kbn/charts-plugin/public'; import type { Document } from './persistence/saved_object_store'; -import type { +import { Datasource, DatasourceMap, Visualization, IndexPatternMap, IndexPatternRef, + DraggedField, + DragDropOperation, + isOperation, } from './types'; import type { DatasourceStates, VisualizationState } from './state_management'; import { IndexPatternServiceAPI } from './data_views_service/service'; +import { DraggingIdentifier } from './drag_drop'; export function getVisualizeGeoFieldMessage(fieldType: string) { return i18n.translate('xpack.lens.visualizeGeoFieldMessage', { @@ -126,7 +130,7 @@ export function getIndexPatternsIds({ const references: SavedObjectReference[] = []; Object.entries(activeDatasources).forEach(([id, datasource]) => { const { savedObjectReferences } = datasource.getPersistableState(datasourceStates[id].state); - const indexPatternId = datasource.getCurrentIndexPatternId(datasourceStates[id].state); + const indexPatternId = datasource.getUsedDataView(datasourceStates[id].state); currentIndexPatternId = indexPatternId; references.push(...savedObjectReferences); }); @@ -242,3 +246,34 @@ export function renewIDs( */ export const DONT_CLOSE_DIMENSION_CONTAINER_ON_CLICK_CLASS = 'lensDontCloseDimensionContainerOnClick'; + +export function isDraggedField(fieldCandidate: unknown): fieldCandidate is DraggedField { + return ( + typeof fieldCandidate === 'object' && + fieldCandidate !== null && + ['id', 'field', 'indexPatternId'].every((prop) => prop in fieldCandidate) + ); +} + +export const isOperationFromCompatibleGroup = ( + op1?: DraggingIdentifier, + op2?: DragDropOperation +) => { + return ( + isOperation(op1) && + isOperation(op2) && + op1.columnId !== op2.columnId && + op1.groupId === op2.groupId && + op1.layerId !== op2.layerId + ); +}; + +export const isOperationFromTheSameGroup = (op1?: DraggingIdentifier, op2?: DragDropOperation) => { + return ( + isOperation(op1) && + isOperation(op2) && + op1.columnId !== op2.columnId && + op1.groupId === op2.groupId && + op1.layerId === op2.layerId + ); +}; diff --git a/x-pack/plugins/lens/public/visualizations/xy/annotations/helpers.tsx b/x-pack/plugins/lens/public/visualizations/xy/annotations/helpers.tsx index baaed78ec0237..3c54d67c49131 100644 --- a/x-pack/plugins/lens/public/visualizations/xy/annotations/helpers.tsx +++ b/x-pack/plugins/lens/public/visualizations/xy/annotations/helpers.tsx @@ -10,10 +10,12 @@ import moment from 'moment'; import { defaultAnnotationColor, defaultAnnotationRangeColor, + isQueryAnnotationConfig, isRangeAnnotationConfig, } from '@kbn/event-annotation-plugin/public'; import { EventAnnotationConfig } from '@kbn/event-annotation-plugin/common'; import { IconChartBarAnnotations } from '@kbn/chart-icons'; +import { isDraggedField } from '../../../utils'; import { layerTypes } from '../../../../common'; import type { FramePublicAPI, Visualization } from '../../../types'; import { isHorizontalChart } from '../state_helpers'; @@ -125,7 +127,7 @@ export const getAnnotationsSupportedLayer = ( }; }; -const getDefaultAnnotationConfig = (id: string, timestamp: string): EventAnnotationConfig => ({ +const getDefaultManualAnnotation = (id: string, timestamp: string): EventAnnotationConfig => ({ label: defaultAnnotationLabel, type: 'manual', key: { @@ -136,13 +138,32 @@ const getDefaultAnnotationConfig = (id: string, timestamp: string): EventAnnotat id, }); +const getDefaultQueryAnnotation = ( + id: string, + fieldName: string, + timeField: string +): EventAnnotationConfig => ({ + filter: { + type: 'kibana_query', + query: `${fieldName}: *`, + language: 'kuery', + }, + timeField, + type: 'query', + key: { + type: 'point_in_time', + }, + id, + label: `${fieldName}: *`, +}); + const createCopiedAnnotation = ( newId: string, timestamp: string, source?: EventAnnotationConfig ): EventAnnotationConfig => { if (!source) { - return getDefaultAnnotationConfig(newId, timestamp); + return getDefaultManualAnnotation(newId, timestamp); } return { ...source, @@ -158,17 +179,78 @@ export const onAnnotationDrop: Visualization['onDrop'] = ({ dropType, }) => { const targetLayer = prevState.layers.find((l) => l.layerId === target.layerId); - const sourceLayer = prevState.layers.find((l) => l.layerId === source.layerId); - if ( - !targetLayer || - !isAnnotationsLayer(targetLayer) || - !sourceLayer || - !isAnnotationsLayer(sourceLayer) - ) { + if (!targetLayer || !isAnnotationsLayer(targetLayer)) { return prevState; } const targetAnnotation = targetLayer.annotations.find(({ id }) => id === target.columnId); + const targetDataView = frame.dataViews.indexPatterns[targetLayer.indexPatternId]; + + if (isDraggedField(source)) { + const timeField = targetDataView.timeFieldName; + switch (dropType) { + case 'field_add': + if (targetAnnotation || !timeField) { + return prevState; + } + return { + ...prevState, + layers: prevState.layers.map( + (l): XYLayerConfig => + l.layerId === target.layerId + ? { + ...targetLayer, + annotations: [ + ...targetLayer.annotations, + getDefaultQueryAnnotation(target.columnId, source.field.name, timeField), + ], + } + : l + ), + }; + case 'field_replace': + if (!targetAnnotation || !timeField) { + return prevState; + } + + return { + ...prevState, + layers: prevState.layers.map( + (l): XYLayerConfig => + l.layerId === target.layerId + ? { + ...targetLayer, + annotations: [ + ...targetLayer.annotations.map((a) => + a === targetAnnotation + ? { + ...targetAnnotation, + ...getDefaultQueryAnnotation( + target.columnId, + source.field.name, + timeField + ), + } + : a + ), + ], + } + : l + ), + }; + } + + return prevState; + } + + const sourceLayer = prevState.layers.find((l) => l.layerId === source.layerId); + if (!sourceLayer || !isAnnotationsLayer(sourceLayer)) { + return prevState; + } const sourceAnnotation = sourceLayer.annotations.find(({ id }) => id === source.columnId); + const sourceDataView = frame.dataViews.indexPatterns[sourceLayer.indexPatternId]; + if (sourceDataView !== targetDataView && isQueryAnnotationConfig(sourceAnnotation)) { + return prevState; + } switch (dropType) { case 'reorder': if (!targetAnnotation || !sourceAnnotation || source.layerId !== target.layerId) { diff --git a/x-pack/plugins/lens/public/visualizations/xy/visualization.test.ts b/x-pack/plugins/lens/public/visualizations/xy/visualization.test.ts index 556a89c9a8553..c62d2c1195e5f 100644 --- a/x-pack/plugins/lens/public/visualizations/xy/visualization.test.ts +++ b/x-pack/plugins/lens/public/visualizations/xy/visualization.test.ts @@ -338,7 +338,11 @@ describe('xy_visualization', () => { let frame: ReturnType; beforeEach(() => { - frame = createMockFramePublicAPI(); + frame = createMockFramePublicAPI({ + dataViews: createMockDataViewsState({ + indexPatterns: { indexPattern1: createMockedIndexPattern() }, + }), + }); mockDatasource = createMockDatasource('testDatasource'); mockDatasource.publicAPIMock.getTableSpec.mockReturnValue([ @@ -494,309 +498,650 @@ describe('xy_visualization', () => { ], }); }); - it('should copy previous column if passed and assign a new id', () => { - expect( - xyVisualization.onDrop!({ - frame, - prevState: { - ...exampleState(), - layers: [ - { - layerId: 'annotation', - layerType: layerTypes.ANNOTATIONS, - indexPatternId: 'indexPattern1', - annotations: [exampleAnnotation2], - ignoreGlobalFilters: true, + + describe('getDropProps', () => { + it('dragging operation: returns reorder for the same group existing columns', () => { + expect( + xyVisualization.getDropProps?.({ + state: 'datasourceState', + target: { + columnId: 'annotationColumn', + groupId: 'xAnnotations', + layerId: 'second', + filterOperations: () => true, + indexPatternId: '1', + }, + source: { + columnId: 'annotationColumn2', + groupId: 'xAnnotations', + layerId: 'second', + id: 'annotationColumn2', + humanData: { label: 'Event' }, + indexPatternId: '1', + }, + indexPatterns: {}, + }) + ).toEqual({ dropTypes: ['reorder'] }); + }); + it('dragging operation: returns duplicate for the same group existing column and not existing column', () => { + expect( + xyVisualization.getDropProps?.({ + state: 'datasourceState', + target: { + columnId: 'annotationColumn', + groupId: 'xAnnotations', + layerId: 'second', + isNewColumn: true, + filterOperations: () => true, + indexPatternId: 'indexPattern1', + }, + source: { + columnId: 'annotationColumn2', + groupId: 'xAnnotations', + layerId: 'second', + id: 'annotationColumn2', + humanData: { label: 'Event' }, + indexPatternId: 'indexPattern1', + }, + indexPatterns: {}, + }) + ).toEqual({ dropTypes: ['duplicate_compatible'] }); + }); + it('dragging operation: returns replace_duplicate and replace for replacing to different layer', () => { + expect( + xyVisualization.getDropProps?.({ + state: 'datasourceState', + target: { + columnId: 'annotationColumn', + groupId: 'xAnnotations', + layerId: 'first', + filterOperations: () => true, + indexPatternId: '1', + }, + source: { + columnId: 'annotationColumn2', + groupId: 'xAnnotations', + layerId: 'second', + id: 'annotationColumn2', + humanData: { label: 'Event' }, + indexPatternId: '1', + }, + indexPatterns: {}, + }) + ).toEqual({ + dropTypes: ['replace_compatible', 'replace_duplicate_compatible', 'swap_compatible'], + }); + }); + it('dragging operation: returns duplicate and move for replacing to different layer for empty column', () => { + expect( + xyVisualization.getDropProps?.({ + state: 'datasourceState', + target: { + columnId: 'annotationColumn', + groupId: 'xAnnotations', + layerId: 'first', + isNewColumn: true, + indexPatternId: 'indexPattern1', + filterOperations: () => true, + }, + source: { + columnId: 'annotationColumn2', + groupId: 'xAnnotations', + layerId: 'second', + id: 'annotationColumn2', + humanData: { label: 'Event' }, + indexPatternId: 'indexPattern1', + }, + indexPatterns: {}, + }) + ).toEqual({ + dropTypes: ['move_compatible', 'duplicate_compatible'], + }); + }); + it('dragging operation: does not allow to drop for different operations on different data views', () => { + expect( + xyVisualization.getDropProps?.({ + state: 'datasourceState', + target: { + columnId: 'annotationColumn', + groupId: 'xAnnotations', + layerId: 'first', + isNewColumn: true, + indexPatternId: 'indexPattern1', + filterOperations: () => true, + }, + source: { + columnId: 'annotationColumn2', + groupId: 'xAnnotations', + layerId: 'second', + id: 'annotationColumn2', + humanData: { label: 'Event' }, + indexPatternId: 'indexPattern2', + }, + indexPatterns: {}, + }) + ).toEqual(undefined); + }); + it('dragging field: should add a new dimension when dragged to a new dimension', () => { + expect( + xyVisualization.getDropProps?.({ + state: 'datasourceState', + target: { + columnId: 'annotationColumn', + groupId: 'xAnnotations', + layerId: 'first', + isNewColumn: true, + indexPatternId: 'indexPattern1', + filterOperations: () => true, + }, + source: { + field: { + name: 'agent.keyword', + displayName: 'agent.keyword', }, - ], - }, - dropType: 'duplicate_compatible', - source: { - layerId: 'annotation', - groupId: 'xAnnotation', - columnId: 'an2', - id: 'an2', - humanData: { label: 'an2' }, - }, - target: { - layerId: 'annotation', - groupId: 'xAnnotation', - columnId: 'newColId', - filterOperations: Boolean, - }, - }).layers[0] - ).toEqual({ - layerId: 'annotation', - layerType: layerTypes.ANNOTATIONS, - indexPatternId: 'indexPattern1', - annotations: [exampleAnnotation2, { ...exampleAnnotation2, id: 'newColId' }], - ignoreGlobalFilters: true, + indexPatternId: 'indexPattern1', + id: 'agent.keyword', + humanData: { + label: 'agent.keyword', + position: 2, + }, + }, + indexPatterns: {}, + }) + ).toEqual({ dropTypes: ['field_add'] }); }); - }); - it('should reorder a dimension to a annotation layer', () => { - expect( - xyVisualization.onDrop!({ - frame, - prevState: { - ...exampleState(), - layers: [ - { - layerId: 'annotation', - layerType: layerTypes.ANNOTATIONS, - indexPatternId: 'indexPattern1', - annotations: [exampleAnnotation, exampleAnnotation2], - ignoreGlobalFilters: true, + it('dragging field: should replace an existing dimension when dragged to a dimension', () => { + expect( + xyVisualization.getDropProps?.({ + state: 'datasourceState', + target: { + columnId: 'annotationColumn', + groupId: 'xAnnotations', + layerId: 'first', + indexPatternId: 'indexPattern1', + filterOperations: () => true, + }, + source: { + field: { + name: 'agent.keyword', + displayName: 'agent.keyword', }, - ], - }, - source: { - layerId: 'annotation', - groupId: 'xAnnotation', - columnId: 'an2', - id: 'an2', - humanData: { label: 'label' }, - filterOperations: () => true, - }, - target: { - layerId: 'annotation', - groupId: 'xAnnotation', - columnId: 'an1', - filterOperations: () => true, - }, - dropType: 'reorder', - }).layers[0] - ).toEqual({ - layerId: 'annotation', - layerType: layerTypes.ANNOTATIONS, - indexPatternId: 'indexPattern1', - annotations: [exampleAnnotation2, exampleAnnotation], - ignoreGlobalFilters: true, + indexPatternId: 'indexPattern1', + id: 'agent.keyword', + humanData: { + label: 'agent.keyword', + position: 2, + }, + }, + indexPatterns: {}, + }) + ).toEqual({ dropTypes: ['field_replace'] }); + }); + it('dragging field: should not allow to drop when data view conflict', () => { + expect( + xyVisualization.getDropProps?.({ + state: 'datasourceState', + target: { + columnId: 'annotationColumn', + groupId: 'xAnnotations', + layerId: 'first', + indexPatternId: 'indexPattern1', + filterOperations: () => true, + }, + source: { + field: { + name: 'agent.keyword', + displayName: 'agent.keyword', + }, + indexPatternId: 'indexPattern2', + id: 'agent.keyword', + humanData: { + label: 'agent.keyword', + position: 2, + }, + }, + indexPatterns: {}, + }) + ).toEqual(undefined); }); }); - it('should duplicate the annotations and replace the target in another annotation layer', () => { - expect( - xyVisualization.onDrop!({ - frame, - prevState: { - ...exampleState(), - layers: [ - { - layerId: 'first', - layerType: layerTypes.ANNOTATIONS, - indexPatternId: 'indexPattern1', - annotations: [exampleAnnotation], - ignoreGlobalFilters: true, + describe('onDrop', () => { + it('dragging field: should add a new dimension when dragged to a new dimension', () => { + expect( + xyVisualization.onDrop!({ + frame, + prevState: { + ...exampleState(), + layers: [ + { + layerId: 'annotation', + layerType: layerTypes.ANNOTATIONS, + indexPatternId: 'indexPattern1', + annotations: [exampleAnnotation2], + ignoreGlobalFilters: true, + }, + ], + }, + dropType: 'field_add', + source: { + field: { + name: 'agent.keyword', }, - { - layerId: 'second', - layerType: layerTypes.ANNOTATIONS, - indexPatternId: 'indexPattern1', - annotations: [exampleAnnotation2], - ignoreGlobalFilters: true, + indexPatternId: 'indexPattern1', + id: 'agent.keyword', + humanData: { + label: 'agent.keyword', + position: 2, }, - ], - }, - source: { - layerId: 'first', - groupId: 'xAnnotation', - columnId: 'an1', - id: 'an1', - humanData: { label: 'label' }, - filterOperations: () => true, - }, - target: { - layerId: 'second', - groupId: 'xAnnotation', - columnId: 'an2', - filterOperations: () => true, - }, - dropType: 'replace_duplicate_compatible', - }).layers - ).toEqual([ - { - layerId: 'first', + }, + target: { + layerId: 'annotation', + groupId: 'xAnnotation', + columnId: 'newColId', + filterOperations: Boolean, + indexPatternId: 'indexPattern1', + }, + }).layers[0] + ).toEqual({ + layerId: 'annotation', layerType: layerTypes.ANNOTATIONS, indexPatternId: 'indexPattern1', - annotations: [exampleAnnotation], + annotations: [ + exampleAnnotation2, + { + filter: { + language: 'kuery', + query: 'agent.keyword: *', + type: 'kibana_query', + }, + id: 'newColId', + key: { + type: 'point_in_time', + }, + label: 'agent.keyword: *', + timeField: 'timestamp', + type: 'query', + }, + ], ignoreGlobalFilters: true, - }, - { - layerId: 'second', + }); + }); + it('dragging field: should replace an existing dimension when dragged to a dimension', () => { + expect( + xyVisualization.onDrop!({ + frame, + prevState: { + ...exampleState(), + layers: [ + { + layerId: 'annotation', + layerType: layerTypes.ANNOTATIONS, + indexPatternId: 'indexPattern1', + annotations: [exampleAnnotation], + ignoreGlobalFilters: true, + }, + ], + }, + dropType: 'field_replace', + source: { + field: { + name: 'agent.keyword', + }, + indexPatternId: 'indexPattern1', + id: 'agent.keyword', + humanData: { + label: 'agent.keyword', + position: 2, + }, + }, + target: { + layerId: 'annotation', + groupId: 'xAnnotation', + columnId: 'an1', + filterOperations: () => true, + indexPatternId: 'indexPattern1', + }, + }).layers[0] + ).toEqual({ + layerId: 'annotation', layerType: layerTypes.ANNOTATIONS, indexPatternId: 'indexPattern1', - annotations: [{ ...exampleAnnotation, id: 'an2' }], - ignoreGlobalFilters: true, - }, - ]); - }); - it('should swap the annotations between layers', () => { - expect( - xyVisualization.onDrop!({ - frame, - prevState: { - ...exampleState(), - layers: [ - { - layerId: 'first', - layerType: layerTypes.ANNOTATIONS, - indexPatternId: 'indexPattern1', - annotations: [exampleAnnotation], - ignoreGlobalFilters: true, + annotations: [ + { + filter: { + language: 'kuery', + query: 'agent.keyword: *', + type: 'kibana_query', }, - { - layerId: 'second', - layerType: layerTypes.ANNOTATIONS, - indexPatternId: 'indexPattern1', - annotations: [exampleAnnotation2], - ignoreGlobalFilters: true, + icon: 'circle', + id: 'an1', + key: { + type: 'point_in_time', }, - ], - }, - source: { - layerId: 'first', - groupId: 'xAnnotation', - columnId: 'an1', - id: 'an1', - humanData: { label: 'label' }, - filterOperations: () => true, - }, - target: { - layerId: 'second', - groupId: 'xAnnotation', - columnId: 'an2', - filterOperations: () => true, - }, - dropType: 'swap_compatible', - }).layers - ).toEqual([ - { - layerId: 'first', + label: 'agent.keyword: *', + timeField: 'timestamp', + type: 'query', + }, + ], + ignoreGlobalFilters: true, + }); + }); + it('dragging operation: should copy previous column if passed and assign a new id', () => { + expect( + xyVisualization.onDrop!({ + frame, + prevState: { + ...exampleState(), + layers: [ + { + layerId: 'annotation', + layerType: layerTypes.ANNOTATIONS, + indexPatternId: 'indexPattern1', + annotations: [exampleAnnotation2], + ignoreGlobalFilters: true, + }, + ], + }, + dropType: 'duplicate_compatible', + source: { + layerId: 'annotation', + groupId: 'xAnnotation', + columnId: 'an2', + id: 'an2', + humanData: { label: 'an2' }, + indexPatternId: 'indexPattern1', + }, + target: { + layerId: 'annotation', + groupId: 'xAnnotation', + columnId: 'newColId', + filterOperations: Boolean, + indexPatternId: 'indexPattern1', + }, + }).layers[0] + ).toEqual({ + layerId: 'annotation', layerType: layerTypes.ANNOTATIONS, indexPatternId: 'indexPattern1', - annotations: [exampleAnnotation2], + annotations: [exampleAnnotation2, { ...exampleAnnotation2, id: 'newColId' }], ignoreGlobalFilters: true, - }, - { - layerId: 'second', + }); + }); + it('dragging operation: should reorder a dimension to a annotation layer', () => { + expect( + xyVisualization.onDrop!({ + frame, + prevState: { + ...exampleState(), + layers: [ + { + layerId: 'annotation', + layerType: layerTypes.ANNOTATIONS, + indexPatternId: 'indexPattern1', + annotations: [exampleAnnotation, exampleAnnotation2], + ignoreGlobalFilters: true, + }, + ], + }, + source: { + layerId: 'annotation', + groupId: 'xAnnotation', + columnId: 'an2', + id: 'an2', + humanData: { label: 'label' }, + filterOperations: () => true, + indexPatternId: 'indexPattern1', + }, + target: { + layerId: 'annotation', + groupId: 'xAnnotation', + columnId: 'an1', + filterOperations: () => true, + indexPatternId: 'indexPattern1', + }, + dropType: 'reorder', + }).layers[0] + ).toEqual({ + layerId: 'annotation', layerType: layerTypes.ANNOTATIONS, indexPatternId: 'indexPattern1', - annotations: [exampleAnnotation], + annotations: [exampleAnnotation2, exampleAnnotation], ignoreGlobalFilters: true, - }, - ]); - }); - it('should replace the target in another annotation layer', () => { - expect( - xyVisualization.onDrop!({ - frame, - prevState: { - ...exampleState(), - layers: [ - { - layerId: 'first', - layerType: layerTypes.ANNOTATIONS, - indexPatternId: 'indexPattern1', - annotations: [exampleAnnotation], - ignoreGlobalFilters: true, - }, - { - layerId: 'second', - layerType: layerTypes.ANNOTATIONS, - indexPatternId: 'indexPattern1', - annotations: [exampleAnnotation2], - ignoreGlobalFilters: true, - }, - ], + }); + }); + + it('dragging operation: should duplicate the annotations and replace the target in another annotation layer', () => { + expect( + xyVisualization.onDrop!({ + frame, + prevState: { + ...exampleState(), + layers: [ + { + layerId: 'first', + layerType: layerTypes.ANNOTATIONS, + indexPatternId: 'indexPattern1', + annotations: [exampleAnnotation], + ignoreGlobalFilters: true, + }, + { + layerId: 'second', + layerType: layerTypes.ANNOTATIONS, + indexPatternId: 'indexPattern1', + annotations: [exampleAnnotation2], + ignoreGlobalFilters: true, + }, + ], + }, + source: { + layerId: 'first', + groupId: 'xAnnotation', + columnId: 'an1', + id: 'an1', + humanData: { label: 'label' }, + filterOperations: () => true, + indexPatternId: 'indexPattern1', + }, + target: { + layerId: 'second', + groupId: 'xAnnotation', + columnId: 'an2', + filterOperations: () => true, + indexPatternId: 'indexPattern1', + }, + dropType: 'replace_duplicate_compatible', + }).layers + ).toEqual([ + { + layerId: 'first', + layerType: layerTypes.ANNOTATIONS, + indexPatternId: 'indexPattern1', + annotations: [exampleAnnotation], + ignoreGlobalFilters: true, }, - source: { + { + layerId: 'second', + layerType: layerTypes.ANNOTATIONS, + indexPatternId: 'indexPattern1', + annotations: [{ ...exampleAnnotation, id: 'an2' }], + ignoreGlobalFilters: true, + }, + ]); + }); + it('dragging operation: should swap the annotations between layers', () => { + expect( + xyVisualization.onDrop!({ + frame, + prevState: { + ...exampleState(), + layers: [ + { + layerId: 'first', + layerType: layerTypes.ANNOTATIONS, + indexPatternId: 'indexPattern1', + annotations: [exampleAnnotation], + ignoreGlobalFilters: true, + }, + { + layerId: 'second', + layerType: layerTypes.ANNOTATIONS, + indexPatternId: 'indexPattern1', + annotations: [exampleAnnotation2], + ignoreGlobalFilters: true, + }, + ], + }, + source: { + layerId: 'first', + groupId: 'xAnnotation', + columnId: 'an1', + id: 'an1', + humanData: { label: 'label' }, + filterOperations: () => true, + indexPatternId: 'indexPattern1', + }, + target: { + layerId: 'second', + groupId: 'xAnnotation', + columnId: 'an2', + filterOperations: () => true, + indexPatternId: 'indexPattern1', + }, + dropType: 'swap_compatible', + }).layers + ).toEqual([ + { layerId: 'first', - groupId: 'xAnnotation', - columnId: 'an1', - id: 'an1', - humanData: { label: 'label' }, - filterOperations: () => true, + layerType: layerTypes.ANNOTATIONS, + indexPatternId: 'indexPattern1', + annotations: [exampleAnnotation2], + ignoreGlobalFilters: true, }, - target: { + { layerId: 'second', - groupId: 'xAnnotation', - columnId: 'an2', - filterOperations: () => true, + layerType: layerTypes.ANNOTATIONS, + indexPatternId: 'indexPattern1', + annotations: [exampleAnnotation], + ignoreGlobalFilters: true, }, - dropType: 'replace_compatible', - }).layers - ).toEqual([ - { - layerId: 'first', - layerType: layerTypes.ANNOTATIONS, - indexPatternId: 'indexPattern1', - annotations: [], - ignoreGlobalFilters: true, - }, - { - layerId: 'second', - layerType: layerTypes.ANNOTATIONS, - indexPatternId: 'indexPattern1', - annotations: [exampleAnnotation], - ignoreGlobalFilters: true, - }, - ]); - }); - it('should move compatible to another annotation layer', () => { - expect( - xyVisualization.onDrop!({ - frame, - prevState: { - ...exampleState(), - layers: [ - { - layerId: 'first', - layerType: layerTypes.ANNOTATIONS, - indexPatternId: 'indexPattern1', - annotations: [exampleAnnotation], - ignoreGlobalFilters: true, - }, - { - layerId: 'second', - layerType: layerTypes.ANNOTATIONS, - indexPatternId: 'indexPattern1', - annotations: [], - ignoreGlobalFilters: true, - }, - ], + ]); + }); + it('dragging operation: should replace the target in another annotation layer', () => { + expect( + xyVisualization.onDrop!({ + frame, + prevState: { + ...exampleState(), + layers: [ + { + layerId: 'first', + layerType: layerTypes.ANNOTATIONS, + indexPatternId: 'indexPattern1', + annotations: [exampleAnnotation], + ignoreGlobalFilters: true, + }, + { + layerId: 'second', + layerType: layerTypes.ANNOTATIONS, + indexPatternId: 'indexPattern1', + annotations: [exampleAnnotation2], + ignoreGlobalFilters: true, + }, + ], + }, + source: { + layerId: 'first', + groupId: 'xAnnotation', + columnId: 'an1', + id: 'an1', + humanData: { label: 'label' }, + filterOperations: () => true, + }, + target: { + layerId: 'second', + groupId: 'xAnnotation', + columnId: 'an2', + filterOperations: () => true, + indexPatternId: 'indexPattern1', + }, + dropType: 'replace_compatible', + }).layers + ).toEqual([ + { + layerId: 'first', + layerType: layerTypes.ANNOTATIONS, + indexPatternId: 'indexPattern1', + annotations: [], + ignoreGlobalFilters: true, }, - source: { + { + layerId: 'second', + layerType: layerTypes.ANNOTATIONS, + indexPatternId: 'indexPattern1', + annotations: [exampleAnnotation], + ignoreGlobalFilters: true, + }, + ]); + }); + it('dragging operation: should move compatible to another annotation layer', () => { + expect( + xyVisualization.onDrop!({ + frame, + prevState: { + ...exampleState(), + layers: [ + { + layerId: 'first', + layerType: layerTypes.ANNOTATIONS, + indexPatternId: 'indexPattern1', + annotations: [exampleAnnotation], + ignoreGlobalFilters: true, + }, + { + layerId: 'second', + layerType: layerTypes.ANNOTATIONS, + indexPatternId: 'indexPattern1', + annotations: [], + ignoreGlobalFilters: true, + }, + ], + }, + source: { + layerId: 'first', + groupId: 'xAnnotation', + columnId: 'an1', + id: 'an1', + humanData: { label: 'label' }, + filterOperations: () => true, + indexPatternId: 'indexPattern1', + }, + target: { + layerId: 'second', + groupId: 'xAnnotation', + columnId: 'an2', + filterOperations: () => true, + indexPatternId: 'indexPattern1', + }, + dropType: 'move_compatible', + }).layers + ).toEqual([ + { layerId: 'first', - groupId: 'xAnnotation', - columnId: 'an1', - id: 'an1', - humanData: { label: 'label' }, - filterOperations: () => true, + layerType: layerTypes.ANNOTATIONS, + indexPatternId: 'indexPattern1', + annotations: [], + ignoreGlobalFilters: true, }, - target: { + { layerId: 'second', - groupId: 'xAnnotation', - columnId: 'an2', - filterOperations: () => true, + layerType: layerTypes.ANNOTATIONS, + indexPatternId: 'indexPattern1', + annotations: [exampleAnnotation], + ignoreGlobalFilters: true, }, - dropType: 'move_compatible', - }).layers - ).toEqual([ - { - layerId: 'first', - layerType: layerTypes.ANNOTATIONS, - indexPatternId: 'indexPattern1', - annotations: [], - ignoreGlobalFilters: true, - }, - { - layerId: 'second', - layerType: layerTypes.ANNOTATIONS, - indexPatternId: 'indexPattern1', - annotations: [exampleAnnotation], - ignoreGlobalFilters: true, - }, - ]); + ]); + }); }); }); }); diff --git a/x-pack/plugins/lens/public/visualizations/xy/visualization.tsx b/x-pack/plugins/lens/public/visualizations/xy/visualization.tsx index 34ab6c88ffa19..6184e3c607a82 100644 --- a/x-pack/plugins/lens/public/visualizations/xy/visualization.tsx +++ b/x-pack/plugins/lens/public/visualizations/xy/visualization.tsx @@ -20,12 +20,17 @@ import type { DataPublicPluginStart } from '@kbn/data-plugin/public'; import type { IStorageWrapper } from '@kbn/kibana-utils-plugin/public'; import { UnifiedSearchPublicPluginStart } from '@kbn/unified-search-plugin/public'; import { generateId } from '../../id_generator'; -import { renewIDs } from '../../utils'; +import { + isDraggedField, + isOperationFromCompatibleGroup, + isOperationFromTheSameGroup, + renewIDs, +} from '../../utils'; import { getSuggestions } from './xy_suggestions'; import { XyToolbar } from './xy_config_panel'; import { DimensionEditor } from './xy_config_panel/dimension_editor'; import { LayerHeader, LayerHeaderContent } from './xy_config_panel/layer_header'; -import type { Visualization, AccessorConfig, FramePublicAPI } from '../../types'; +import { Visualization, AccessorConfig, FramePublicAPI } from '../../types'; import { State, visualizationTypes, @@ -366,6 +371,39 @@ export const getXyVisualization = ({ return getFirstDataLayer(state.layers)?.palette; }, + getDropProps(dropProps) { + if (!dropProps.source) { + return; + } + const srcDataView = dropProps.source.indexPatternId; + const targetDataView = dropProps.target.indexPatternId; + if (!targetDataView || srcDataView !== targetDataView) { + return; + } + + if (isDraggedField(dropProps.source)) { + if (dropProps.source.field.type === 'document') { + return; + } + return dropProps.target.isNewColumn + ? { dropTypes: ['field_add'] } + : { dropTypes: ['field_replace'] }; + } + + if (isOperationFromTheSameGroup(dropProps.source, dropProps.target)) { + return dropProps.target.isNewColumn + ? { dropTypes: ['duplicate_compatible'] } + : { dropTypes: ['reorder'] }; + } + if (isOperationFromCompatibleGroup(dropProps.source, dropProps.target)) { + return { + dropTypes: dropProps.target.isNewColumn + ? ['move_compatible', 'duplicate_compatible'] + : ['replace_compatible', 'replace_duplicate_compatible', 'swap_compatible'], + }; + } + }, + onDrop(props) { const targetLayer: XYLayerConfig | undefined = props.prevState.layers.find( (l) => l.layerId === props.target.layerId @@ -724,6 +762,9 @@ export const getXyVisualization = ({ getUniqueLabels(state) { return getUniqueLabels(state.layers); }, + getUsedDataView(state, layerId) { + return getAnnotationsLayers(state.layers).find((l) => l.layerId === layerId)?.indexPatternId; + }, getUsedDataViews(state) { return ( state?.layers.filter(isAnnotationsLayer).map(({ indexPatternId }) => indexPatternId) ?? [] From 68bc3811c9a088cfa28c006b4a99884a27944189 Mon Sep 17 00:00:00 2001 From: Alexey Antonov Date: Fri, 30 Sep 2022 12:14:08 +0300 Subject: [PATCH 34/72] [Lens][TSVB to Lens] No annotation query string in TSVB and Lens lead to different result (#142197) * [Lens][TSVB to Lens] No annotation query string in TSVB and Lens lead to different result Closes: #142061 * Update layers.ts Co-authored-by: Kibana Machine <42973632+kibanamachine@users.noreply.github.com> --- .../lib/configurations/xy/layers.test.ts | 71 +++++++++++++++++++ .../lib/configurations/xy/layers.ts | 67 +++++++++-------- 2 files changed, 104 insertions(+), 34 deletions(-) diff --git a/src/plugins/vis_types/timeseries/public/convert_to_lens/lib/configurations/xy/layers.test.ts b/src/plugins/vis_types/timeseries/public/convert_to_lens/lib/configurations/xy/layers.test.ts index f869ac64380c6..dd4926e7aeb7e 100644 --- a/src/plugins/vis_types/timeseries/public/convert_to_lens/lib/configurations/xy/layers.test.ts +++ b/src/plugins/vis_types/timeseries/public/convert_to_lens/lib/configurations/xy/layers.test.ts @@ -229,6 +229,31 @@ describe('getLayers', () => { ], series: [createSeries({ metrics: staticValueMetric })], }); + + const panelWithSingleAnnotationWithoutQueryStringAndTimefield = createPanel({ + annotations: [ + { + fields: 'geo.src,host', + template: 'Security Error from {{geo.src}} on {{host}}', + id: 'ann1', + color: 'rgba(211,49,21,0.7)', + icon: 'fa-asterisk', + ignore_global_filters: 1, + ignore_panel_filters: 1, + time_field: '', + query_string: { + query: '', + language: 'lucene', + }, + hidden: true, + index_pattern: { + id: 'test', + }, + }, + ], + series: [createSeries({ metrics: staticValueMetric })], + }); + const panelWithMultiAnnotations = createPanel({ annotations: [ { @@ -411,6 +436,51 @@ describe('getLayers', () => { }, ], ], + [ + 'annotation layer should gets correct default params', + [dataSourceLayersWithStatic, panelWithSingleAnnotationWithoutQueryStringAndTimefield], + [ + { + layerType: 'referenceLine', + accessors: ['column-id-1'], + layerId: 'test-layer-1', + yConfig: [ + { + forAccessor: 'column-id-1', + axisMode: 'right', + color: '#68BC00', + fill: 'below', + }, + ], + }, + { + layerId: 'test-id', + layerType: 'annotations', + ignoreGlobalFilters: true, + annotations: [ + { + color: '#D33115', + extraFields: ['geo.src'], + filter: { + language: 'lucene', + query: '*', + type: 'kibana_query', + }, + icon: 'asterisk', + id: 'ann1', + isHidden: true, + key: { + type: 'point_in_time', + }, + label: 'Event', + timeField: 'test_field', + type: 'query', + }, + ], + indexPatternId: 'test', + }, + ], + ], [ 'multiple annotations with different data views create separate layers', [dataSourceLayersWithStatic, panelWithMultiAnnotations], @@ -507,6 +577,7 @@ const mockedIndices = [ { id: 'test', title: 'test', + timeFieldName: 'test_field', getFieldByName: (name: string) => ({ aggregatable: name !== 'host' }), }, ] as unknown as DataView[]; diff --git a/src/plugins/vis_types/timeseries/public/convert_to_lens/lib/configurations/xy/layers.ts b/src/plugins/vis_types/timeseries/public/convert_to_lens/lib/configurations/xy/layers.ts index 6815e278e0f30..7cc2aea19cbd9 100644 --- a/src/plugins/vis_types/timeseries/public/convert_to_lens/lib/configurations/xy/layers.ts +++ b/src/plugins/vis_types/timeseries/public/convert_to_lens/lib/configurations/xy/layers.ts @@ -20,6 +20,7 @@ import Color from 'color'; import { euiLightVars } from '@kbn/ui-theme'; import { groupBy } from 'lodash'; import { DataViewsPublicPluginStart, DataView } from '@kbn/data-plugin/public/data_views'; +import { getDefaultQueryLanguage } from '../../../../application/components/lib/get_default_query_language'; import { fetchIndexPattern } from '../../../../../common/index_patterns_utils'; import { ICON_TYPES_MAP } from '../../../../application/visualizations/constants'; import { SUPPORTED_METRICS } from '../../metrics'; @@ -170,38 +171,36 @@ const convertAnnotation = ( annotation: Annotation, dataView: DataView ): EventAnnotationConfig | undefined => { - if (annotation.query_string) { - const extraFields = annotation.fields - ? annotation.fields - ?.replace(/\s/g, '') - ?.split(',') - .map((field) => { - const dataViewField = dataView.getFieldByName(field); - return dataViewField && dataViewField.aggregatable ? field : undefined; - }) - .filter(nonNullable) - : undefined; - return { - type: 'query', - id: annotation.id, - label: 'Event', - key: { - type: 'point_in_time', - }, - color: new Color(transparentize(annotation.color || euiLightVars.euiColorAccent, 1)).hex(), - timeField: annotation.time_field, - icon: - annotation.icon && - ICON_TYPES_MAP[annotation.icon] && - typeof ICON_TYPES_MAP[annotation.icon] === 'string' - ? ICON_TYPES_MAP[annotation.icon] - : 'triangle', - filter: { - type: 'kibana_query', - ...annotation.query_string, - }, - extraFields, - isHidden: annotation.hidden, - }; - } + const extraFields = annotation.fields + ?.replace(/\s/g, '') + ?.split(',') + .map((field) => { + const dataViewField = dataView.getFieldByName(field); + return dataViewField && dataViewField.aggregatable ? field : undefined; + }) + .filter(nonNullable); + + return { + type: 'query', + id: annotation.id, + label: 'Event', + key: { + type: 'point_in_time', + }, + color: new Color(transparentize(annotation.color || euiLightVars.euiColorAccent, 1)).hex(), + timeField: annotation.time_field || dataView.timeFieldName, + icon: + annotation.icon && + ICON_TYPES_MAP[annotation.icon] && + typeof ICON_TYPES_MAP[annotation.icon] === 'string' + ? ICON_TYPES_MAP[annotation.icon] + : 'triangle', + filter: { + type: 'kibana_query', + query: annotation.query_string?.query || '*', + language: annotation.query_string?.language || getDefaultQueryLanguage(), + }, + extraFields, + isHidden: annotation.hidden, + }; }; From 2d8eb0eed6a8325d7f630cd8f539055e306d371a Mon Sep 17 00:00:00 2001 From: Dima Arnautov Date: Fri, 30 Sep 2022 11:22:36 +0200 Subject: [PATCH 35/72] [ML] Transforms: Preserves the `field` for unsupported aggs (#142106) * preserve field for unsupported agg * add unit test --- .../__snapshots__/popover_form.test.tsx.snap | 4 +- .../aggregation_list/popover_form.test.tsx | 72 ++++++++++++++++++- .../aggregation_list/popover_form.tsx | 6 +- 3 files changed, 74 insertions(+), 8 deletions(-) diff --git a/x-pack/plugins/transform/public/app/sections/create_transform/components/aggregation_list/__snapshots__/popover_form.test.tsx.snap b/x-pack/plugins/transform/public/app/sections/create_transform/components/aggregation_list/__snapshots__/popover_form.test.tsx.snap index 5f74967ff423c..966b3487ebfb2 100644 --- a/x-pack/plugins/transform/public/app/sections/create_transform/components/aggregation_list/__snapshots__/popover_form.test.tsx.snap +++ b/x-pack/plugins/transform/public/app/sections/create_transform/components/aggregation_list/__snapshots__/popover_form.test.tsx.snap @@ -2,12 +2,12 @@ exports[`Transform: Aggregation Minimal initialization 1`] = ` ', () => { + afterEach(() => { + jest.clearAllMocks(); + }); + test('Minimal initialization', () => { const defaultData: PivotAggsConfig = { agg: PIVOT_SUPPORTED_AGGS.CARDINALITY, @@ -37,4 +40,67 @@ describe('Transform: Aggregation ', () => { expect(wrapper).toMatchSnapshot(); }); + + test('preserves the field for unsupported aggs', async () => { + const mockOnChange = jest.fn(); + const { getByTestId } = render( + + + + ); + + const aggNameInput = getByTestId('transformAggName'); + fireEvent.change(aggNameInput, { + target: { value: 'betterName' }, + }); + + const applyButton = getByTestId('transformApplyAggChanges'); + fireEvent.click(applyButton); + + expect(mockOnChange).toHaveBeenCalledTimes(1); + expect(mockOnChange).toHaveBeenCalledWith({ + field: 'AvgTicketPrice', + keyed: true, + ranges: [ + { + to: 500, + }, + { + from: 500, + to: 700, + }, + { + from: 700, + }, + ], + // @ts-ignore + agg: 'range', + aggName: 'betterName', + dropDownName: 'AvgTicketPrice.ranges', + }); + }); }); diff --git a/x-pack/plugins/transform/public/app/sections/create_transform/components/aggregation_list/popover_form.tsx b/x-pack/plugins/transform/public/app/sections/create_transform/components/aggregation_list/popover_form.tsx index 56eeea8a242c0..0585d4553a99c 100644 --- a/x-pack/plugins/transform/public/app/sections/create_transform/components/aggregation_list/popover_form.tsx +++ b/x-pack/plugins/transform/public/app/sections/create_transform/components/aggregation_list/popover_form.tsx @@ -100,8 +100,8 @@ export const PopoverForm: React.FC = ({ defaultData, otherAggNames, onCha ...aggConfigDef, agg, aggName, - field: resultField, dropDownName: defaultData.dropDownName, + ...(isUnsupportedAgg ? {} : { field: resultField }), }; return updatedItem; @@ -153,7 +153,7 @@ export const PopoverForm: React.FC = ({ defaultData, otherAggNames, onCha } return ( - + = ({ defaultData, otherAggNames, onCha fontSize="s" language="json" paddingSize="s" - style={{ width: '100%', height: '200px' }} + css={{ width: '100%', height: '200px' }} > {JSON.stringify(getEsAggFromAggConfig(defaultData), null, 2)} From b885d9381de779650cb24d7c8e5a43097adf99d9 Mon Sep 17 00:00:00 2001 From: Joe Reuter Date: Fri, 30 Sep 2022 11:37:41 +0200 Subject: [PATCH 36/72] [UnifiedSearch] Add explore matching indices to data view menu (#141807) * add explore matching index * adjust type * move things around * fix types * fix tests * fix imports * fix limit * do not clean datasource on adding ad hoc data view Co-authored-by: Stratoula Kalafateli --- packages/kbn-optimizer/limits.yml | 2 +- .../data_view_editor_flyout_content.tsx | 53 ++++++------- .../components/form_fields/title_field.tsx | 8 +- .../components/form_fields/type_field.tsx | 3 +- .../public/components/form_schema.ts | 2 +- .../indices_list/indices_list.test.tsx | 2 +- .../indices_list/indices_list.tsx | 2 +- .../preview_panel/preview_panel.tsx | 3 +- .../status_message/status_message.test.tsx | 2 +- .../public/lib/get_matched_indices.test.ts | 3 +- .../public/lib/get_matched_indices.ts | 3 +- .../data_view_editor/public/lib/index.ts | 2 - src/plugins/data_view_editor/public/types.ts | 64 ++-------------- .../public/data_views_service_public.ts | 14 +++- src/plugins/data_views/public/index.ts | 9 ++- src/plugins/data_views/public/plugin.ts | 3 +- .../__snapshots__/get_indices.test.ts.snap | 0 .../public/services}/get_indices.test.ts | 0 .../public/services}/get_indices.ts | 10 +-- .../data_views/public/services/index.ts | 13 ++++ src/plugins/data_views/public/types.ts | 62 ++++++++++++++++ .../components/top_nav/discover_topnav.tsx | 16 +++- .../dataview_picker/change_dataview.tsx | 74 ++++++++++++++++++- .../public/dataview_picker/index.tsx | 4 + src/plugins/unified_search/public/types.ts | 1 + src/plugins/unified_search/tsconfig.json | 1 + .../lens/public/app_plugin/lens_top_nav.tsx | 59 ++++++++++++--- .../translations/translations/fr-FR.json | 10 +-- .../translations/translations/ja-JP.json | 10 +-- .../translations/translations/zh-CN.json | 10 +-- 30 files changed, 308 insertions(+), 137 deletions(-) rename src/plugins/{data_view_editor/public/lib => data_views/public/services}/__snapshots__/get_indices.test.ts.snap (100%) rename src/plugins/{data_view_editor/public/lib => data_views/public/services}/get_indices.test.ts (100%) rename src/plugins/{data_view_editor/public/lib => data_views/public/services}/get_indices.ts (90%) diff --git a/packages/kbn-optimizer/limits.yml b/packages/kbn-optimizer/limits.yml index 440ff3ce2b12c..5cd1458028626 100644 --- a/packages/kbn-optimizer/limits.yml +++ b/packages/kbn-optimizer/limits.yml @@ -23,7 +23,7 @@ pageLoadAssetSize: dataViewEditor: 12000 dataViewFieldEditor: 27000 dataViewManagement: 5000 - dataViews: 44532 + dataViews: 46532 dataVisualizer: 27530 devTools: 38637 discover: 99999 diff --git a/src/plugins/data_view_editor/public/components/data_view_editor_flyout_content.tsx b/src/plugins/data_view_editor/public/components/data_view_editor_flyout_content.tsx index c9baa374ed1de..08a13c7f43d48 100644 --- a/src/plugins/data_view_editor/public/components/data_view_editor_flyout_content.tsx +++ b/src/plugins/data_view_editor/public/components/data_view_editor_flyout_content.tsx @@ -10,7 +10,12 @@ import React, { useState, useEffect, useCallback, useRef } from 'react'; import { EuiTitle, EuiFlexGroup, EuiFlexItem, EuiSpacer, EuiLoadingSpinner } from '@elastic/eui'; import { i18n } from '@kbn/i18n'; import memoizeOne from 'memoize-one'; -import { DataViewField } from '@kbn/data-views-plugin/public'; +import { + DataViewField, + DataViewsPublicPluginStart, + INDEX_PATTERN_TYPE, + MatchedItem, +} from '@kbn/data-views-plugin/public'; import { DataView, @@ -23,16 +28,14 @@ import { UseField, } from '../shared_imports'; -import { ensureMinimumTime, getIndices, extractTimeFields, getMatchedIndices } from '../lib'; +import { ensureMinimumTime, extractTimeFields, getMatchedIndices } from '../lib'; import { FlyoutPanels } from './flyout_panels'; import { removeSpaces } from '../lib'; import { - MatchedItem, DataViewEditorContext, RollupIndicesCapsResponse, - INDEX_PATTERN_TYPE, IndexPatternConfig, MatchedIndicesSet, FormInternal, @@ -176,18 +179,19 @@ const IndexPatternEditorFlyoutContentComponent = ({ // load all data sources and set initial matchedIndices const loadSources = useCallback(() => { - getIndices({ - http, - isRollupIndex: () => false, - pattern: '*', - showAllIndices: allowHidden, - }).then((dataSources) => { - setAllSources(dataSources); - const matchedSet = getMatchedIndices(dataSources, [], [], allowHidden); - setMatchedIndices(matchedSet); - setIsLoadingSources(false); - }); - }, [http, allowHidden]); + dataViews + .getIndices({ + isRollupIndex: () => false, + pattern: '*', + showAllIndices: allowHidden, + }) + .then((dataSources) => { + setAllSources(dataSources); + const matchedSet = getMatchedIndices(dataSources, [], [], allowHidden); + setMatchedIndices(matchedSet); + setIsLoadingSources(false); + }); + }, [allowHidden, dataViews]); // loading list of index patterns useEffect(() => { @@ -271,7 +275,7 @@ const IndexPatternEditorFlyoutContentComponent = ({ const { matchedIndicesResult, exactMatched } = !isLoadingSources ? await loadMatchedIndices(query, allowHidden, allSources, { isRollupIndex, - http, + dataViews, }) : { matchedIndicesResult: { @@ -302,7 +306,7 @@ const IndexPatternEditorFlyoutContentComponent = ({ return fetchIndices(newTitle); }, - [http, allowHidden, allSources, type, rollupIndicesCapabilities, isLoadingSources] + [dataViews, allowHidden, allSources, type, rollupIndicesCapabilities, isLoadingSources] ); // If editData exists, loadSources so that MatchedIndices can be loaded for the Timestampfields @@ -453,10 +457,10 @@ const loadMatchedIndices = memoizeOne( allSources: MatchedItem[], { isRollupIndex, - http, + dataViews, }: { isRollupIndex: (index: string) => boolean; - http: DataViewEditorContext['http']; + dataViews: DataViewsPublicPluginStart; } ): Promise<{ matchedIndicesResult: MatchedIndicesSet; @@ -466,8 +470,7 @@ const loadMatchedIndices = memoizeOne( const indexRequests = []; if (query?.endsWith('*')) { - const exactMatchedQuery = getIndices({ - http, + const exactMatchedQuery = dataViews.getIndices({ isRollupIndex, pattern: query, showAllIndices: allowHidden, @@ -476,14 +479,12 @@ const loadMatchedIndices = memoizeOne( // provide default value when not making a request for the partialMatchQuery indexRequests.push(Promise.resolve([])); } else { - const exactMatchQuery = getIndices({ - http, + const exactMatchQuery = dataViews.getIndices({ isRollupIndex, pattern: query, showAllIndices: allowHidden, }); - const partialMatchQuery = getIndices({ - http, + const partialMatchQuery = dataViews.getIndices({ isRollupIndex, pattern: `${query}*`, showAllIndices: allowHidden, diff --git a/src/plugins/data_view_editor/public/components/form_fields/title_field.tsx b/src/plugins/data_view_editor/public/components/form_fields/title_field.tsx index 822de9506500a..9a4c209a56ebf 100644 --- a/src/plugins/data_view_editor/public/components/form_fields/title_field.tsx +++ b/src/plugins/data_view_editor/public/components/form_fields/title_field.tsx @@ -9,6 +9,7 @@ import React, { ChangeEvent, useState, useMemo } from 'react'; import { i18n } from '@kbn/i18n'; import { EuiFormRow, EuiFieldText } from '@elastic/eui'; +import { MatchedItem } from '@kbn/data-views-plugin/public'; import { UseField, getFieldValidityAndErrorMessage, @@ -17,12 +18,7 @@ import { } from '../../shared_imports'; import { canAppendWildcard, removeSpaces } from '../../lib'; import { schema } from '../form_schema'; -import { - MatchedItem, - RollupIndicesCapsResponse, - IndexPatternConfig, - MatchedIndicesSet, -} from '../../types'; +import { RollupIndicesCapsResponse, IndexPatternConfig, MatchedIndicesSet } from '../../types'; interface RefreshMatchedIndicesResult { matchedIndicesResult: MatchedIndicesSet; diff --git a/src/plugins/data_view_editor/public/components/form_fields/type_field.tsx b/src/plugins/data_view_editor/public/components/form_fields/type_field.tsx index 11b46c7ee31fa..b11d8ac2e03ea 100644 --- a/src/plugins/data_view_editor/public/components/form_fields/type_field.tsx +++ b/src/plugins/data_view_editor/public/components/form_fields/type_field.tsx @@ -20,9 +20,10 @@ import { EuiBadge, } from '@elastic/eui'; +import { INDEX_PATTERN_TYPE } from '@kbn/data-views-plugin/public'; import { UseField } from '../../shared_imports'; -import { INDEX_PATTERN_TYPE, IndexPatternConfig } from '../../types'; +import { IndexPatternConfig } from '../../types'; interface TypeFieldProps { onChange: (type: INDEX_PATTERN_TYPE) => void; diff --git a/src/plugins/data_view_editor/public/components/form_schema.ts b/src/plugins/data_view_editor/public/components/form_schema.ts index 98c3a3b5322eb..59e195a1f1280 100644 --- a/src/plugins/data_view_editor/public/components/form_schema.ts +++ b/src/plugins/data_view_editor/public/components/form_schema.ts @@ -6,9 +6,9 @@ * Side Public License, v 1. */ +import { INDEX_PATTERN_TYPE } from '@kbn/data-views-plugin/public'; import { i18n } from '@kbn/i18n'; import { fieldValidators, ValidationFunc } from '../shared_imports'; -import { INDEX_PATTERN_TYPE } from '../types'; export const singleAstriskValidator = ( ...args: Parameters diff --git a/src/plugins/data_view_editor/public/components/preview_panel/indices_list/indices_list.test.tsx b/src/plugins/data_view_editor/public/components/preview_panel/indices_list/indices_list.test.tsx index cad9f323f95ed..074865006a385 100644 --- a/src/plugins/data_view_editor/public/components/preview_panel/indices_list/indices_list.test.tsx +++ b/src/plugins/data_view_editor/public/components/preview_panel/indices_list/indices_list.test.tsx @@ -9,7 +9,7 @@ import React from 'react'; import { IndicesList } from '.'; import { shallow } from 'enzyme'; -import { MatchedItem } from '../../../types'; +import { MatchedItem } from '@kbn/data-views-plugin/public'; const indices = [ { name: 'kibana', tags: [] }, diff --git a/src/plugins/data_view_editor/public/components/preview_panel/indices_list/indices_list.tsx b/src/plugins/data_view_editor/public/components/preview_panel/indices_list/indices_list.tsx index db3d1dc491453..51405efc58790 100644 --- a/src/plugins/data_view_editor/public/components/preview_panel/indices_list/indices_list.tsx +++ b/src/plugins/data_view_editor/public/components/preview_panel/indices_list/indices_list.tsx @@ -27,7 +27,7 @@ import { import { Pager } from '@elastic/eui'; import { FormattedMessage } from '@kbn/i18n-react'; -import { MatchedItem, Tag } from '../../../types'; +import { MatchedItem, Tag } from '@kbn/data-views-plugin/public'; interface IndicesListProps { indices: MatchedItem[]; diff --git a/src/plugins/data_view_editor/public/components/preview_panel/preview_panel.tsx b/src/plugins/data_view_editor/public/components/preview_panel/preview_panel.tsx index 28413debdb2a9..26f6b2b1c2a70 100644 --- a/src/plugins/data_view_editor/public/components/preview_panel/preview_panel.tsx +++ b/src/plugins/data_view_editor/public/components/preview_panel/preview_panel.tsx @@ -8,10 +8,11 @@ import React from 'react'; import { EuiSpacer } from '@elastic/eui'; +import { INDEX_PATTERN_TYPE } from '@kbn/data-views-plugin/public'; import { StatusMessage } from './status_message'; import { IndicesList } from './indices_list'; -import { INDEX_PATTERN_TYPE, MatchedIndicesSet } from '../../types'; +import { MatchedIndicesSet } from '../../types'; interface Props { type: INDEX_PATTERN_TYPE; diff --git a/src/plugins/data_view_editor/public/components/preview_panel/status_message/status_message.test.tsx b/src/plugins/data_view_editor/public/components/preview_panel/status_message/status_message.test.tsx index 858a00f025e9c..23f0e1b8a6b01 100644 --- a/src/plugins/data_view_editor/public/components/preview_panel/status_message/status_message.test.tsx +++ b/src/plugins/data_view_editor/public/components/preview_panel/status_message/status_message.test.tsx @@ -9,7 +9,7 @@ import React from 'react'; import { StatusMessage } from '.'; import { shallow } from 'enzyme'; -import { MatchedItem } from '../../../types'; +import { MatchedItem } from '@kbn/data-views-plugin/public'; const tagsPartial = { tags: [], diff --git a/src/plugins/data_view_editor/public/lib/get_matched_indices.test.ts b/src/plugins/data_view_editor/public/lib/get_matched_indices.test.ts index b1c80791a1343..a5f12f7221ab1 100644 --- a/src/plugins/data_view_editor/public/lib/get_matched_indices.test.ts +++ b/src/plugins/data_view_editor/public/lib/get_matched_indices.test.ts @@ -6,8 +6,9 @@ * Side Public License, v 1. */ +import { MatchedItem } from '@kbn/data-views-plugin/public'; +import { Tag } from '@kbn/data-views-plugin/public/types'; import { getMatchedIndices } from './get_matched_indices'; -import { Tag, MatchedItem } from '../types'; jest.mock('../constants', () => ({ MAX_NUMBER_OF_MATCHING_INDICES: 6, diff --git a/src/plugins/data_view_editor/public/lib/get_matched_indices.ts b/src/plugins/data_view_editor/public/lib/get_matched_indices.ts index 0b659aa5fbc76..e35ba8f1e8fae 100644 --- a/src/plugins/data_view_editor/public/lib/get_matched_indices.ts +++ b/src/plugins/data_view_editor/public/lib/get_matched_indices.ts @@ -6,6 +6,7 @@ * Side Public License, v 1. */ +import { MatchedItem } from '@kbn/data-views-plugin/public'; import { MAX_NUMBER_OF_MATCHING_INDICES } from '../constants'; function isSystemIndex(index: string): boolean { @@ -50,7 +51,7 @@ function filterSystemIndices(indices: MatchedItem[], isIncludingSystemIndices: b We call this `exact` matches because ES is telling us exactly what it matches */ -import { MatchedItem, MatchedIndicesSet } from '../types'; +import { MatchedIndicesSet } from '../types'; export function getMatchedIndices( unfilteredAllIndices: MatchedItem[], diff --git a/src/plugins/data_view_editor/public/lib/index.ts b/src/plugins/data_view_editor/public/lib/index.ts index 981c9df03527b..97a1f08d35045 100644 --- a/src/plugins/data_view_editor/public/lib/index.ts +++ b/src/plugins/data_view_editor/public/lib/index.ts @@ -10,8 +10,6 @@ export { canAppendWildcard } from './can_append_wildcard'; export { ensureMinimumTime } from './ensure_minimum_time'; -export { getIndices } from './get_indices'; - export { getMatchedIndices } from './get_matched_indices'; export { containsIllegalCharacters } from './contains_illegal_characters'; diff --git a/src/plugins/data_view_editor/public/types.ts b/src/plugins/data_view_editor/public/types.ts index 5b177f65b0602..4500e522119d5 100644 --- a/src/plugins/data_view_editor/public/types.ts +++ b/src/plugins/data_view_editor/public/types.ts @@ -17,7 +17,12 @@ import { import { EuiComboBoxOptionOption } from '@elastic/eui'; -import type { DataView, DataViewsPublicPluginStart } from '@kbn/data-views-plugin/public'; +import type { + DataView, + DataViewsPublicPluginStart, + INDEX_PATTERN_TYPE, + MatchedItem, +} from '@kbn/data-views-plugin/public'; import { DataPublicPluginStart, IndexPatternAggRestrictions } from './shared_imports'; export interface DataViewEditorContext { @@ -80,51 +85,6 @@ export interface StartPlugins { export type CloseEditor = () => void; -export interface MatchedItem { - name: string; - tags: Tag[]; - item: { - name: string; - backing_indices?: string[]; - timestamp_field?: string; - indices?: string[]; - aliases?: string[]; - attributes?: ResolveIndexResponseItemIndexAttrs[]; - data_stream?: string; - }; -} - -// for showing index matches -export interface ResolveIndexResponse { - indices?: ResolveIndexResponseItemIndex[]; - aliases?: ResolveIndexResponseItemAlias[]; - data_streams?: ResolveIndexResponseItemDataStream[]; -} - -export interface ResolveIndexResponseItem { - name: string; -} - -export interface ResolveIndexResponseItemDataStream extends ResolveIndexResponseItem { - backing_indices: string[]; - timestamp_field: string; -} - -export interface ResolveIndexResponseItemAlias extends ResolveIndexResponseItem { - indices: string[]; -} - -export interface ResolveIndexResponseItemIndex extends ResolveIndexResponseItem { - aliases?: string[]; - attributes?: ResolveIndexResponseItemIndexAttrs[]; - data_stream?: string; -} - -export interface Tag { - name: string; - key: string; - color: string; -} // end for index matches export interface IndexPatternTableItem { @@ -135,13 +95,6 @@ export interface IndexPatternTableItem { sort: string; } -export enum ResolveIndexResponseItemIndexAttrs { - OPEN = 'open', - CLOSED = 'closed', - HIDDEN = 'hidden', - FROZEN = 'frozen', -} - export interface RollupIndiciesCapability { aggs: Record; error: string; @@ -149,11 +102,6 @@ export interface RollupIndiciesCapability { export type RollupIndicesCapsResponse = Record; -export enum INDEX_PATTERN_TYPE { - ROLLUP = 'rollup', - DEFAULT = 'default', -} - export interface IndexPatternConfig { title: string; timestampField?: EuiComboBoxOptionOption; diff --git a/src/plugins/data_views/public/data_views_service_public.ts b/src/plugins/data_views/public/data_views_service_public.ts index 4693e7000b2a3..30625b1b59da5 100644 --- a/src/plugins/data_views/public/data_views_service_public.ts +++ b/src/plugins/data_views/public/data_views_service_public.ts @@ -6,7 +6,7 @@ * Side Public License, v 1. */ -import { DataViewsService } from '.'; +import { DataViewsService, MatchedItem } from '.'; import { DataViewsServiceDeps } from '../common/data_views/data_views'; import { HasDataService } from '../common'; @@ -24,6 +24,11 @@ export interface DataViewsServicePublicDeps extends DataViewsServiceDeps { * Has data service */ hasData: HasDataService; + getIndices: (props: { + pattern: string; + showAllIndices?: boolean; + isRollupIndex: (indexName: string) => boolean; + }) => Promise; } /** @@ -32,6 +37,12 @@ export interface DataViewsServicePublicDeps extends DataViewsServiceDeps { */ export class DataViewsServicePublic extends DataViewsService { public getCanSaveSync: () => boolean; + + public getIndices: (props: { + pattern: string; + showAllIndices?: boolean; + isRollupIndex: (indexName: string) => boolean; + }) => Promise; public hasData: HasDataService; /** @@ -43,5 +54,6 @@ export class DataViewsServicePublic extends DataViewsService { super(deps); this.getCanSaveSync = deps.getCanSaveSync; this.hasData = deps.hasData; + this.getIndices = deps.getIndices; } } diff --git a/src/plugins/data_views/public/index.ts b/src/plugins/data_views/public/index.ts index f886d60696b8a..8ee149622f39f 100644 --- a/src/plugins/data_views/public/index.ts +++ b/src/plugins/data_views/public/index.ts @@ -32,7 +32,14 @@ export { getFieldSubtypeNested, } from '../common'; -export type { DataViewsPublicSetupDependencies, DataViewsPublicStartDependencies } from './types'; +export type { + DataViewsPublicSetupDependencies, + DataViewsPublicStartDependencies, + MatchedItem, + Tag, +} from './types'; + +export { INDEX_PATTERN_TYPE } from './types'; export type { DataViewsServicePublic, diff --git a/src/plugins/data_views/public/plugin.ts b/src/plugins/data_views/public/plugin.ts index df379ab18964e..415a6c97bc73a 100644 --- a/src/plugins/data_views/public/plugin.ts +++ b/src/plugins/data_views/public/plugin.ts @@ -21,7 +21,7 @@ import { SavedObjectsClientPublicToCommon } from './saved_objects_client_wrapper import { UiSettingsPublicToCommon } from './ui_settings_wrapper'; import { DataViewsServicePublic } from './data_views_service_public'; -import { HasData } from './services'; +import { getIndices, HasData } from './services'; import { debounceByKey } from './debounce_by_key'; @@ -76,6 +76,7 @@ export class DataViewsPublicPlugin getCanSaveSync: () => application.capabilities.indexPatterns.save === true, getCanSaveAdvancedSettings: () => Promise.resolve(application.capabilities.advancedSettings.save === true), + getIndices: (props) => getIndices({ ...props, http: core.http }), }); } diff --git a/src/plugins/data_view_editor/public/lib/__snapshots__/get_indices.test.ts.snap b/src/plugins/data_views/public/services/__snapshots__/get_indices.test.ts.snap similarity index 100% rename from src/plugins/data_view_editor/public/lib/__snapshots__/get_indices.test.ts.snap rename to src/plugins/data_views/public/services/__snapshots__/get_indices.test.ts.snap diff --git a/src/plugins/data_view_editor/public/lib/get_indices.test.ts b/src/plugins/data_views/public/services/get_indices.test.ts similarity index 100% rename from src/plugins/data_view_editor/public/lib/get_indices.test.ts rename to src/plugins/data_views/public/services/get_indices.test.ts diff --git a/src/plugins/data_view_editor/public/lib/get_indices.ts b/src/plugins/data_views/public/services/get_indices.ts similarity index 90% rename from src/plugins/data_view_editor/public/lib/get_indices.ts rename to src/plugins/data_views/public/services/get_indices.ts index 2c04d6e389964..fba5004367526 100644 --- a/src/plugins/data_view_editor/public/lib/get_indices.ts +++ b/src/plugins/data_views/public/services/get_indices.ts @@ -12,20 +12,20 @@ import { i18n } from '@kbn/i18n'; import { Tag, INDEX_PATTERN_TYPE } from '../types'; import { MatchedItem, ResolveIndexResponse, ResolveIndexResponseItemIndexAttrs } from '../types'; -const aliasLabel = i18n.translate('indexPatternEditor.aliasLabel', { defaultMessage: 'Alias' }); -const dataStreamLabel = i18n.translate('indexPatternEditor.dataStreamLabel', { +const aliasLabel = i18n.translate('dataViews.aliasLabel', { defaultMessage: 'Alias' }); +const dataStreamLabel = i18n.translate('dataViews.dataStreamLabel', { defaultMessage: 'Data stream', }); -const indexLabel = i18n.translate('indexPatternEditor.indexLabel', { +const indexLabel = i18n.translate('dataViews.indexLabel', { defaultMessage: 'Index', }); -const frozenLabel = i18n.translate('indexPatternEditor.frozenLabel', { +const frozenLabel = i18n.translate('dataViews.frozenLabel', { defaultMessage: 'Frozen', }); -const rollupLabel = i18n.translate('indexPatternEditor.rollupLabel', { +const rollupLabel = i18n.translate('dataViews.rollupLabel', { defaultMessage: 'Rollup', }); diff --git a/src/plugins/data_views/public/services/index.ts b/src/plugins/data_views/public/services/index.ts index 36d35d69bcb54..af3787bd5dbd1 100644 --- a/src/plugins/data_views/public/services/index.ts +++ b/src/plugins/data_views/public/services/index.ts @@ -6,4 +6,17 @@ * Side Public License, v 1. */ +import { HttpStart } from '@kbn/core/public'; +import { MatchedItem } from '../types'; + export * from './has_data'; + +export async function getIndices(props: { + http: HttpStart; + pattern: string; + showAllIndices?: boolean; + isRollupIndex: (indexName: string) => boolean; +}): Promise { + const { getIndices: getIndicesLazy } = await import('./get_indices'); + return getIndicesLazy(props); +} diff --git a/src/plugins/data_views/public/types.ts b/src/plugins/data_views/public/types.ts index fc888d2c42c87..637d4191c671e 100644 --- a/src/plugins/data_views/public/types.ts +++ b/src/plugins/data_views/public/types.ts @@ -11,6 +11,11 @@ import { FieldFormatsSetup, FieldFormatsStart } from '@kbn/field-formats-plugin/ import { DataViewsServicePublicMethods } from './data_views'; import { HasDataService } from '../common'; +export enum INDEX_PATTERN_TYPE { + ROLLUP = 'rollup', + DEFAULT = 'default', +} + export enum IndicesResponseItemIndexAttrs { OPEN = 'open', CLOSED = 'closed', @@ -98,6 +103,11 @@ export interface DataViewsPublicPluginSetup {} export interface DataViewsServicePublic extends DataViewsServicePublicMethods { getCanSaveSync: () => boolean; hasData: HasDataService; + getIndices: (props: { + pattern: string; + showAllIndices?: boolean; + isRollupIndex: (indexName: string) => boolean; + }) => Promise; } export type DataViewsContract = DataViewsServicePublic; @@ -106,3 +116,55 @@ export type DataViewsContract = DataViewsServicePublic; * Data views plugin public Start contract */ export type DataViewsPublicPluginStart = DataViewsServicePublic; + +export interface MatchedItem { + name: string; + tags: Tag[]; + item: { + name: string; + backing_indices?: string[]; + timestamp_field?: string; + indices?: string[]; + aliases?: string[]; + attributes?: ResolveIndexResponseItemIndexAttrs[]; + data_stream?: string; + }; +} + +// for showing index matches +export interface ResolveIndexResponse { + indices?: ResolveIndexResponseItemIndex[]; + aliases?: ResolveIndexResponseItemAlias[]; + data_streams?: ResolveIndexResponseItemDataStream[]; +} + +export interface ResolveIndexResponseItem { + name: string; +} + +export interface ResolveIndexResponseItemDataStream extends ResolveIndexResponseItem { + backing_indices: string[]; + timestamp_field: string; +} + +export interface ResolveIndexResponseItemAlias extends ResolveIndexResponseItem { + indices: string[]; +} + +export interface ResolveIndexResponseItemIndex extends ResolveIndexResponseItem { + aliases?: string[]; + attributes?: ResolveIndexResponseItemIndexAttrs[]; + data_stream?: string; +} + +export interface Tag { + name: string; + key: string; + color: string; +} +export enum ResolveIndexResponseItemIndexAttrs { + OPEN = 'open', + CLOSED = 'closed', + HIDDEN = 'hidden', + FROZEN = 'frozen', +} diff --git a/src/plugins/discover/public/application/main/components/top_nav/discover_topnav.tsx b/src/plugins/discover/public/application/main/components/top_nav/discover_topnav.tsx index 241a20a0a1559..82f3b1aadadbf 100644 --- a/src/plugins/discover/public/application/main/components/top_nav/discover_topnav.tsx +++ b/src/plugins/discover/public/application/main/components/top_nav/discover_topnav.tsx @@ -66,7 +66,7 @@ export const DiscoverTopNav = ({ [dataView] ); const services = useDiscoverServices(); - const { dataViewEditor, navigation, dataViewFieldEditor, data, uiSettings } = services; + const { dataViewEditor, navigation, dataViewFieldEditor, data, uiSettings, dataViews } = services; const canEditDataView = Boolean(dataViewEditor?.userPermissions.editDataView()); @@ -141,6 +141,19 @@ export const DiscoverTopNav = ({ [canEditDataView, dataViewEditor, onChangeDataView] ); + const onCreateDefaultAdHocDataView = useCallback( + async (pattern: string) => { + const newDataView = await dataViews.create({ + title: pattern, + }); + if (newDataView.fields.getByName('@timestamp')?.type === 'date') { + newDataView.timeFieldName = '@timestamp'; + } + onChangeDataView(newDataView.id!); + }, + [dataViews, onChangeDataView] + ); + const topNavMenu = useMemo( () => getTopNavLinks({ @@ -201,6 +214,7 @@ export const DiscoverTopNav = ({ currentDataViewId: dataView?.id, onAddField: addField, onDataViewCreated: createNewDataView, + onCreateDefaultAdHocDataView, onChangeDataView, textBasedLanguages: supportedTextBasedLanguages as DataViewPickerProps['textBasedLanguages'], adHocDataViews: adHocDataViewList, diff --git a/src/plugins/unified_search/public/dataview_picker/change_dataview.tsx b/src/plugins/unified_search/public/dataview_picker/change_dataview.tsx index 2f641cd2d4e28..72a2d8fea290f 100644 --- a/src/plugins/unified_search/public/dataview_picker/change_dataview.tsx +++ b/src/plugins/unified_search/public/dataview_picker/change_dataview.tsx @@ -7,7 +7,7 @@ */ import { i18n } from '@kbn/i18n'; -import React, { useState, useEffect, useCallback } from 'react'; +import React, { useState, useEffect, useCallback, useRef } from 'react'; import { css } from '@emotion/react'; import { EuiPopover, @@ -24,6 +24,7 @@ import { EuiFlexItem, EuiButtonEmpty, EuiToolTip, + EuiSpacer, } from '@elastic/eui'; import type { DataViewListItem } from '@kbn/data-views-plugin/public'; import { useKibana } from '@kbn/kibana-react-plugin/public'; @@ -71,9 +72,13 @@ export function ChangeDataView({ onTextLangQuerySubmit, textBasedLanguage, isDisabled, + onCreateDefaultAdHocDataView, }: DataViewPickerPropsExtended) { const { euiTheme } = useEuiTheme(); const [isPopoverOpen, setPopoverIsOpen] = useState(false); + const [noDataViewMatches, setNoDataViewMatches] = useState(false); + const [dataViewSearchString, setDataViewSearchString] = useState(''); + const [indexMatches, setIndexMatches] = useState(0); const [dataViewsList, setDataViewsList] = useState([]); const [triggerLabel, setTriggerLabel] = useState(''); const [isTextBasedLangSelected, setIsTextBasedLangSelected] = useState( @@ -111,6 +116,24 @@ export function ChangeDataView({ fetchDataViews(); }, [data, currentDataViewId, adHocDataViews]); + const pendingIndexMatch = useRef(); + useEffect(() => { + async function checkIndices() { + if (dataViewSearchString !== '' && noDataViewMatches) { + const matches = await kibana.services.dataViews.getIndices({ + pattern: dataViewSearchString, + isRollupIndex: () => false, + showAllIndices: false, + }); + setIndexMatches(matches.length); + } + } + if (pendingIndexMatch.current) { + clearTimeout(pendingIndexMatch.current); + } + pendingIndexMatch.current = setTimeout(checkIndices, 250); + }, [dataViewSearchString, kibana.services.dataViews, noDataViewMatches]); + useEffect(() => { if (trigger.label) { if (textBasedLanguage) { @@ -282,10 +305,57 @@ export function ChangeDataView({ } }} currentDataViewId={currentDataViewId} - selectableProps={selectableProps} + selectableProps={{ + ...(selectableProps || {}), + // @ts-expect-error Some EUI weirdness + searchProps: { + ...(selectableProps?.searchProps || {}), + onChange: (value, matches) => { + selectableProps?.searchProps?.onChange?.(value, matches); + setNoDataViewMatches(matches.length === 0 && dataViewsList.length > 0); + setDataViewSearchString(value); + }, + }, + }} searchListInputId={searchListInputId} isTextBasedLangSelected={isTextBasedLangSelected} /> + {onCreateDefaultAdHocDataView && noDataViewMatches && indexMatches > 0 && ( + + + { + setPopoverIsOpen(false); + onCreateDefaultAdHocDataView(dataViewSearchString); + }} + > + {i18n.translate( + 'unifiedSearch.query.queryBar.indexPattern.createForMatchingIndices', + { + defaultMessage: `Explore {indicesLength, plural, + one {# matching index} + other {# matching indices}}`, + values: { + indicesLength: indexMatches, + }, + } + )} + + + + + )} ); diff --git a/src/plugins/unified_search/public/dataview_picker/index.tsx b/src/plugins/unified_search/public/dataview_picker/index.tsx index 1cc0a8219af96..9fb794d58e642 100644 --- a/src/plugins/unified_search/public/dataview_picker/index.tsx +++ b/src/plugins/unified_search/public/dataview_picker/index.tsx @@ -63,6 +63,8 @@ export interface DataViewPickerProps { * Also works as a flag to show the create dataview button. */ onDataViewCreated?: () => void; + + onCreateDefaultAdHocDataView?: (pattern: string) => void; /** * List of the supported text based languages (SQL, ESQL) etc. * Defined per application, if not provided, no text based languages @@ -104,6 +106,7 @@ export const DataViewPicker = ({ onSaveTextLanguageQuery, onTextLangQuerySubmit, textBasedLanguage, + onCreateDefaultAdHocDataView, isDisabled, }: DataViewPickerPropsExtended) => { return ( @@ -113,6 +116,7 @@ export const DataViewPicker = ({ onChangeDataView={onChangeDataView} onAddField={onAddField} onDataViewCreated={onDataViewCreated} + onCreateDefaultAdHocDataView={onCreateDefaultAdHocDataView} trigger={trigger} adHocDataViews={adHocDataViews} selectableProps={selectableProps} diff --git a/src/plugins/unified_search/public/types.ts b/src/plugins/unified_search/public/types.ts index d079cd72edf81..85f32a9d4b7e3 100755 --- a/src/plugins/unified_search/public/types.ts +++ b/src/plugins/unified_search/public/types.ts @@ -86,5 +86,6 @@ export interface IUnifiedSearchPluginServices extends Partial { storage: IStorageWrapper; docLinks: DocLinksStart; data: DataPublicPluginStart; + dataViews: DataViewsPublicPluginStart; usageCollection?: UsageCollectionStart; } diff --git a/src/plugins/unified_search/tsconfig.json b/src/plugins/unified_search/tsconfig.json index 61b1f83058821..2f09d27c84b08 100644 --- a/src/plugins/unified_search/tsconfig.json +++ b/src/plugins/unified_search/tsconfig.json @@ -17,6 +17,7 @@ { "path": "../../core/tsconfig.json" }, { "path": "../data/tsconfig.json" }, { "path": "../data_views/tsconfig.json" }, + { "path": "../data_view_editor/tsconfig.json" }, { "path": "../embeddable/tsconfig.json" }, { "path": "../usage_collection/tsconfig.json" }, { "path": "../kibana_utils/tsconfig.json" }, diff --git a/x-pack/plugins/lens/public/app_plugin/lens_top_nav.tsx b/x-pack/plugins/lens/public/app_plugin/lens_top_nav.tsx index 8875d2d0f9839..e72253f6e2a5f 100644 --- a/x-pack/plugins/lens/public/app_plugin/lens_top_nav.tsx +++ b/x-pack/plugins/lens/public/app_plugin/lens_top_nav.tsx @@ -15,8 +15,8 @@ import { downloadMultipleAs } from '@kbn/share-plugin/public'; import { tableHasFormulas } from '@kbn/data-plugin/common'; import { exporters, getEsQueryConfig } from '@kbn/data-plugin/public'; import type { DataView } from '@kbn/data-views-plugin/public'; -import type { DataViewPickerProps } from '@kbn/unified-search-plugin/public'; import { useKibana } from '@kbn/kibana-react-plugin/public'; +import { DataViewPickerProps } from '@kbn/unified-search-plugin/public'; import { ENABLE_SQL } from '../../common'; import { LensAppServices, @@ -768,13 +768,15 @@ export const LensTopNavMenu = ({ closeDataViewEditor.current = dataViewEditor.openEditor({ onSave: async (dataView) => { if (dataView.id) { - dispatch( - switchAndCleanDatasource({ - newDatasourceId: 'indexpattern', - visualizationId: visualization?.activeId, - currentIndexPatternId: dataView?.id, - }) - ); + if (isOnTextBasedMode) { + dispatch( + switchAndCleanDatasource({ + newDatasourceId: 'indexpattern', + visualizationId: visualization?.activeId, + currentIndexPatternId: dataView?.id, + }) + ); + } dispatchChangeIndexPattern(dataView); setCurrentIndexPattern(dataView); } @@ -783,7 +785,43 @@ export const LensTopNavMenu = ({ }); } : undefined, - [canEditDataView, dataViewEditor, dispatch, dispatchChangeIndexPattern, visualization?.activeId] + [ + canEditDataView, + dataViewEditor, + dispatch, + dispatchChangeIndexPattern, + isOnTextBasedMode, + visualization?.activeId, + ] + ); + + const onCreateDefaultAdHocDataView = useCallback( + async (pattern: string) => { + const dataView = await dataViewsService.create({ + title: pattern, + }); + if (dataView.fields.getByName('@timestamp')?.type === 'date') { + dataView.timeFieldName = '@timestamp'; + } + if (isOnTextBasedMode) { + dispatch( + switchAndCleanDatasource({ + newDatasourceId: 'indexpattern', + visualizationId: visualization?.activeId, + currentIndexPatternId: dataView?.id, + }) + ); + } + dispatchChangeIndexPattern(dataView); + setCurrentIndexPattern(dataView); + }, + [ + dataViewsService, + dispatch, + dispatchChangeIndexPattern, + isOnTextBasedMode, + visualization?.activeId, + ] ); // setting that enables/disables SQL @@ -793,7 +831,7 @@ export const LensTopNavMenu = ({ supportedTextBasedLanguages.push('SQL'); } - const dataViewPickerProps = { + const dataViewPickerProps: DataViewPickerProps = { trigger: { label: currentIndexPattern?.getName?.() || '', 'data-test-subj': 'lns-dataView-switch-link', @@ -802,6 +840,7 @@ export const LensTopNavMenu = ({ currentDataViewId: currentIndexPattern?.id, onAddField: addField, onDataViewCreated: createNewDataView, + onCreateDefaultAdHocDataView, adHocDataViews: indexPatterns.filter((pattern) => !pattern.isPersisted()), onChangeDataView: (newIndexPatternId: string) => { const currentDataView = dataViewsList.find( diff --git a/x-pack/plugins/translations/translations/fr-FR.json b/x-pack/plugins/translations/translations/fr-FR.json index 09d5ebabd0d0a..f9648f0fa6d38 100644 --- a/x-pack/plugins/translations/translations/fr-FR.json +++ b/x-pack/plugins/translations/translations/fr-FR.json @@ -3720,10 +3720,10 @@ "indexPatternEditor.status.partialMatchLabel.partialMatchDetail": "Votre modèle d'indexation ne correspond à aucun flux de données, index ni alias d'index, mais {strongIndices} {matchedIndicesLength, plural, one {est semblable} other {sont semblables} }.", "indexPatternEditor.status.partialMatchLabel.strongIndicesLabel": "{matchedIndicesLength, plural, one {source} other {# sources} }", "indexPatternEditor.status.successLabel.successDetail": "Votre modèle d'indexation correspond à {sourceCount} {sourceCount, plural, one {source} other {sources} }.", - "indexPatternEditor.aliasLabel": "Alias", + "dataViews.aliasLabel": "Alias", "indexPatternEditor.createIndex.noMatch": "Le nom doit correspondre à au moins un flux de données, index ou alias d'index.", "indexPatternEditor.createIndexPattern.stepTime.noTimeFieldOptionLabel": "--- Je ne souhaite pas utiliser le filtre temporel ---", - "indexPatternEditor.dataStreamLabel": "Flux de données", + "dataViews.dataStreamLabel": "Flux de données", "indexPatternEditor.dataView.unableSaveLabel": "Échec de l'enregistrement de la vue de données.", "indexPatternEditor.dataViewExists.ValidationErrorMessage": "Une vue de données de ce nom existe déjà.", "indexPatternEditor.editDataView.editConfirmationModal.confirmButton": "Confirmer", @@ -3754,8 +3754,8 @@ "indexPatternEditor.form.customIndexPatternIdLabel": "ID de vue de données personnalisé", "indexPatternEditor.form.nameAriaLabel": "Champ de nom facultatif", "indexPatternEditor.form.titleAriaLabel": "Champ de modèle d'indexation", - "indexPatternEditor.frozenLabel": "Frozen", - "indexPatternEditor.indexLabel": "Index", + "dataViews.frozenLabel": "Frozen", + "dataViews.indexLabel": "Index", "indexPatternEditor.loadingHeader": "Recherche d'index correspondants…", "indexPatternEditor.requireTimestampOption.ValidationErrorMessage": "Sélectionnez un champ d'horodatage.", "indexPatternEditor.rollupDataView.createIndex.noMatchError": "Erreur de vue de données de cumul : doit correspondre à un index de cumul", @@ -3763,7 +3763,7 @@ "indexPatternEditor.rollupDataView.warning.textParagraphOne": "Kibana propose un support bêta pour les vues de données basées sur les cumuls. Vous pourriez rencontrer des problèmes lors de l'utilisation de ces vues dans les recherches enregistrées, les visualisations et les tableaux de bord. Ils ne sont pas compatibles avec certaines fonctionnalités avancées, telles que Timelion et le Machine Learning.", "indexPatternEditor.rollupDataView.warning.textParagraphTwo": "Vous pouvez mettre une vue de données de cumul en correspondance avec un index de cumul et zéro index régulier ou plus. Une vue de données de cumul dispose d'indicateurs, de champs, d'intervalles et d'agrégations limités. Un index de cumul se limite aux index disposant d'une configuration de tâche ou de plusieurs tâches avec des configurations compatibles.", "indexPatternEditor.rollupIndexPattern.warning.title": "Fonctionnalité bêta", - "indexPatternEditor.rollupLabel": "Cumul", + "dataViews.rollupLabel": "Cumul", "indexPatternEditor.saved": "'{indexPatternName}' enregistré", "indexPatternEditor.status.noSystemIndicesLabel": "Aucun flux de données, index ni alias d'index ne correspond à votre modèle d'indexation.", "indexPatternEditor.status.noSystemIndicesWithPromptLabel": "Aucun flux de données, index ni alias d'index ne correspond à votre modèle d'indexation.", diff --git a/x-pack/plugins/translations/translations/ja-JP.json b/x-pack/plugins/translations/translations/ja-JP.json index 32c2dbbf5f01e..db62f093fbda9 100644 --- a/x-pack/plugins/translations/translations/ja-JP.json +++ b/x-pack/plugins/translations/translations/ja-JP.json @@ -3715,10 +3715,10 @@ "indexPatternEditor.status.partialMatchLabel.partialMatchDetail": "インデックスパターンはどのデータストリーム、インデックス、インデックスエイリアスとも一致しませんが、{strongIndices} {matchedIndicesLength, plural, other {が} }類似しています。", "indexPatternEditor.status.partialMatchLabel.strongIndicesLabel": "{matchedIndicesLength, plural, other {# ソース} }", "indexPatternEditor.status.successLabel.successDetail": "インデックスパターンは、{sourceCount} {sourceCount, plural, other {ソース} }と一致します。", - "indexPatternEditor.aliasLabel": "エイリアス", + "dataViews.aliasLabel": "エイリアス", "indexPatternEditor.createIndex.noMatch": "名前は1つ以上のデータストリーム、インデックス、またはインデックスエイリアスと一致する必要があります。", "indexPatternEditor.createIndexPattern.stepTime.noTimeFieldOptionLabel": "--- 時間フィルターを使用しない ---", - "indexPatternEditor.dataStreamLabel": "データストリーム", + "dataViews.dataStreamLabel": "データストリーム", "indexPatternEditor.dataView.unableSaveLabel": "データビューの保存に失敗しました。", "indexPatternEditor.dataViewExists.ValidationErrorMessage": "この名前のデータビューはすでに存在します。", "indexPatternEditor.editDataView.editConfirmationModal.confirmButton": "確認", @@ -3749,8 +3749,8 @@ "indexPatternEditor.form.customIndexPatternIdLabel": "カスタムデータビューID", "indexPatternEditor.form.nameAriaLabel": "名前フィールド(任意)", "indexPatternEditor.form.titleAriaLabel": "インデックスパターンフィールド", - "indexPatternEditor.frozenLabel": "凍結", - "indexPatternEditor.indexLabel": "インデックス", + "dataViews.frozenLabel": "凍結", + "dataViews.indexLabel": "インデックス", "indexPatternEditor.loadingHeader": "一致するインデックスを検索中…", "indexPatternEditor.requireTimestampOption.ValidationErrorMessage": "タイムスタンプフィールドを選択します。", "indexPatternEditor.rollupDataView.createIndex.noMatchError": "ロールアップデータビューエラー:ロールアップインデックスの 1 つと一致している必要があります", @@ -3758,7 +3758,7 @@ "indexPatternEditor.rollupDataView.warning.textParagraphOne": "Kibanaではロールアップに基づいてデータビューのデータサポートを提供します。保存された検索、可視化、ダッシュボードでこれらを使用すると問題が発生する場合があります。Timelionや機械学習などの一部の高度な機能ではサポートされていません。", "indexPatternEditor.rollupDataView.warning.textParagraphTwo": "ロールアップデータビューは、1つのロールアップインデックスとゼロ以上の標準インデックスと一致させることができます。ロールアップデータビューでは、メトリック、フィールド、間隔、アグリゲーションが制限されています。ロールアップインデックスは、1つのジョブ構成があるインデックス、または複数のジョブと互換する構成があるインデックスに制限されています。", "indexPatternEditor.rollupIndexPattern.warning.title": "ベータ機能", - "indexPatternEditor.rollupLabel": "ロールアップ", + "dataViews.rollupLabel": "ロールアップ", "indexPatternEditor.saved": "'{indexPatternName}'が保存されました", "indexPatternEditor.status.noSystemIndicesLabel": "データストリーム、インデックス、またはインデックスエイリアスがインデックスパターンと一致しません。", "indexPatternEditor.status.noSystemIndicesWithPromptLabel": "データストリーム、インデックス、またはインデックスエイリアスがインデックスパターンと一致しません。", diff --git a/x-pack/plugins/translations/translations/zh-CN.json b/x-pack/plugins/translations/translations/zh-CN.json index 48fe03474e196..5f5d2638f6117 100644 --- a/x-pack/plugins/translations/translations/zh-CN.json +++ b/x-pack/plugins/translations/translations/zh-CN.json @@ -3720,10 +3720,10 @@ "indexPatternEditor.status.partialMatchLabel.partialMatchDetail": "您的索引模式不匹配任何数据流、索引或索引别名,但{strongIndices}{matchedIndicesLength, plural, other {} }类似。", "indexPatternEditor.status.partialMatchLabel.strongIndicesLabel": "{matchedIndicesLength, plural, one {个源} other {# 个源} }", "indexPatternEditor.status.successLabel.successDetail": "您的索引模式匹配 {sourceCount} 个{sourceCount, plural, other {源} }。", - "indexPatternEditor.aliasLabel": "别名", + "dataViews.aliasLabel": "别名", "indexPatternEditor.createIndex.noMatch": "名称必须匹配一个或多个数据流、索引或索引别名。", "indexPatternEditor.createIndexPattern.stepTime.noTimeFieldOptionLabel": "--- 我不想使用时间筛选 ---", - "indexPatternEditor.dataStreamLabel": "数据流", + "dataViews.dataStreamLabel": "数据流", "indexPatternEditor.dataView.unableSaveLabel": "无法保存数据视图。", "indexPatternEditor.dataViewExists.ValidationErrorMessage": "具有此名称的数据视图已存在。", "indexPatternEditor.editDataView.editConfirmationModal.confirmButton": "确认", @@ -3754,8 +3754,8 @@ "indexPatternEditor.form.customIndexPatternIdLabel": "定制数据视图 ID", "indexPatternEditor.form.nameAriaLabel": "名称字段(可选)", "indexPatternEditor.form.titleAriaLabel": "索引模式字段", - "indexPatternEditor.frozenLabel": "已冻结", - "indexPatternEditor.indexLabel": "索引", + "dataViews.frozenLabel": "已冻结", + "dataViews.indexLabel": "索引", "indexPatternEditor.loadingHeader": "正在寻找匹配的索引......", "indexPatternEditor.requireTimestampOption.ValidationErrorMessage": "选择时间戳字段。", "indexPatternEditor.rollupDataView.createIndex.noMatchError": "汇总/打包数据视图错误:必须匹配一个汇总/打包索引", @@ -3763,7 +3763,7 @@ "indexPatternEditor.rollupDataView.warning.textParagraphOne": "Kibana 基于汇总/打包为数据视图提供公测版支持。将这些视图用于已保存搜索、可视化以及仪表板可能会遇到问题。某些高级功能,如 Timelion 和 Machine Learning,不支持这些模式。", "indexPatternEditor.rollupDataView.warning.textParagraphTwo": "可以根据一个汇总/打包索引和零个或更多常规索引匹配汇总/打包数据视图。汇总/打包数据视图的指标、字段、时间间隔和聚合有限。汇总/打包索引仅限于具有一个作业配置或多个作业配置兼容的索引。", "indexPatternEditor.rollupIndexPattern.warning.title": "公测版功能", - "indexPatternEditor.rollupLabel": "汇总/打包", + "dataViews.rollupLabel": "汇总/打包", "indexPatternEditor.saved": "已保存“{indexPatternName}”", "indexPatternEditor.status.noSystemIndicesLabel": "没有数据流、索引或索引别名匹配您的索引模式。", "indexPatternEditor.status.noSystemIndicesWithPromptLabel": "没有数据流、索引或索引别名匹配您的索引模式。", From 802039ec34ba2129041a9515b79c70a120839491 Mon Sep 17 00:00:00 2001 From: Stratoula Kalafateli Date: Fri, 30 Sep 2022 12:48:31 +0300 Subject: [PATCH 37/72] [Lens][Discover] Visualize text based query (#141928) * [Lens] Enable text-based languages-sql * Display data * Chart switcher and further fixes * Drag and drop fixes * Small fix * Multiple improvements * Errors implementation and save and exit * Some cleanup * Fix types failures * Revert change * Fix underlying data error * Fix jest test * Fixes app test * Rename datasource to textBased * display the dataview picker component but disabled * Fix functional test * Refactoring * Populate the dataview to theembeddable * Load sync * sync load of the new dtsource * Fix * Fix bug when the dtaview is not found * Refactoring * Add some unit tests * Add some unit tests * Add more unit tests * Add a functional test * Add all files * Update lens limit * Fixes bug * Bump lens size * Fix flakiness * Further fixes * Fix check * More fixes * Fix test * Wait for query to run * More changes * Fix * Fix the function input to fetch from variable * Initial implementation of visualizing fields * Text based languages Visualization in Lens * Fix due to bad conflict * Fix types * Revert from main * Fix jest test * Add unit tests * Adds a functional test * Visualize lens field * Add a unit test * Move switch datasource logic to loadInitial * Cleanup --- .../sidebar/discover_sidebar.test.tsx | 10 ++ .../components/sidebar/discover_sidebar.tsx | 22 +++++ .../sidebar/lib/visualize_trigger_utils.ts | 17 ++++ src/plugins/ui_actions/public/types.ts | 2 + .../editor_frame/suggestion_helpers.ts | 6 ++ .../init_middleware/load_initial.ts | 6 ++ .../text_based_languages.test.ts | 92 +++++++++++++++++++ .../text_based_languages.tsx | 84 ++++++++++++++++- .../text_based_languages_datasource/types.ts | 3 + .../utils.test.ts | 22 +++++ .../text_based_languages_datasource/utils.ts | 13 ++- .../apps/discover/visualize_field.ts | 26 ++++++ 12 files changed, 294 insertions(+), 9 deletions(-) diff --git a/src/plugins/discover/public/application/main/components/sidebar/discover_sidebar.test.tsx b/src/plugins/discover/public/application/main/components/sidebar/discover_sidebar.test.tsx index 22d33215b1eaf..666b75a689499 100644 --- a/src/plugins/discover/public/application/main/components/sidebar/discover_sidebar.test.tsx +++ b/src/plugins/discover/public/application/main/components/sidebar/discover_sidebar.test.tsx @@ -194,4 +194,14 @@ describe('discover sidebar', function () { const createDataViewButton = findTestSubject(compWithPickerInViewerMode, 'dataview-create-new'); expect(createDataViewButton.length).toBe(0); }); + + it('should render the Visualize in Lens button in text based languages mode', () => { + const compInViewerMode = mountWithIntl( + + + + ); + const visualizeField = findTestSubject(compInViewerMode, 'textBased-visualize'); + expect(visualizeField.length).toBe(1); + }); }); diff --git a/src/plugins/discover/public/application/main/components/sidebar/discover_sidebar.tsx b/src/plugins/discover/public/application/main/components/sidebar/discover_sidebar.tsx index d7e227df94b8c..355512da5c52c 100644 --- a/src/plugins/discover/public/application/main/components/sidebar/discover_sidebar.tsx +++ b/src/plugins/discover/public/application/main/components/sidebar/discover_sidebar.tsx @@ -22,6 +22,7 @@ import { useResizeObserver, EuiButton, } from '@elastic/eui'; +import { isOfAggregateQueryType } from '@kbn/es-query'; import useShallowCompareEffect from 'react-use/lib/useShallowCompareEffect'; import { isEqual } from 'lodash'; import { FormattedMessage } from '@kbn/i18n-react'; @@ -39,6 +40,7 @@ import { DiscoverSidebarResponsiveProps } from './discover_sidebar_responsive'; import { VIEW_MODE } from '../../../../components/view_mode_toggle'; import { DISCOVER_TOUR_STEP_ANCHOR_IDS } from '../../../../components/discover_tour'; import type { DataTableRecord } from '../../../../types'; +import { triggerVisualizeActionsTextBasedLanguages } from './lib/visualize_trigger_utils'; /** * Default number of available fields displayed and added on scroll @@ -309,6 +311,12 @@ export function DiscoverSidebarComponent({ const filterChanged = useMemo(() => isEqual(fieldFilter, getDefaultFieldFilter()), [fieldFilter]); + const visualizeAggregateQuery = useCallback(() => { + const aggregateQuery = + state.query && isOfAggregateQueryType(state.query) ? state.query : undefined; + triggerVisualizeActionsTextBasedLanguages(columns, selectedDataView, aggregateQuery); + }, [columns, selectedDataView, state.query]); + if (!selectedDataView) { return null; } @@ -532,6 +540,20 @@ export function DiscoverSidebarComponent({ )} + {isPlainRecord && ( + + + {i18n.translate('discover.textBasedLanguages.visualize.label', { + defaultMessage: 'Visualize in Lens', + })} + + + )} ); diff --git a/src/plugins/discover/public/application/main/components/sidebar/lib/visualize_trigger_utils.ts b/src/plugins/discover/public/application/main/components/sidebar/lib/visualize_trigger_utils.ts index 005accf3021f3..85537df2ef364 100644 --- a/src/plugins/discover/public/application/main/components/sidebar/lib/visualize_trigger_utils.ts +++ b/src/plugins/discover/public/application/main/components/sidebar/lib/visualize_trigger_utils.ts @@ -12,6 +12,7 @@ import { visualizeFieldTrigger, visualizeGeoFieldTrigger, } from '@kbn/ui-actions-plugin/public'; +import type { AggregateQuery } from '@kbn/es-query'; import type { DataViewField, DataView } from '@kbn/data-views-plugin/public'; import { KBN_FIELD_TYPES } from '@kbn/data-plugin/public'; import { getUiActions } from '../../../../../kibana_services'; @@ -59,6 +60,22 @@ export function triggerVisualizeActions( getUiActions().getTrigger(trigger).exec(triggerOptions); } +export function triggerVisualizeActionsTextBasedLanguages( + contextualFields: string[], + dataView?: DataView, + query?: AggregateQuery +) { + if (!dataView) return; + const triggerOptions = { + dataViewSpec: dataView.toSpec(false), + fieldName: '', + contextualFields, + originatingApp: PLUGIN_ID, + query, + }; + getUiActions().getTrigger(VISUALIZE_FIELD_TRIGGER).exec(triggerOptions); +} + export interface VisualizeInformation { field: DataViewField; href?: string; diff --git a/src/plugins/ui_actions/public/types.ts b/src/plugins/ui_actions/public/types.ts index a76a8aa760ed7..fb2d9869e21c7 100644 --- a/src/plugins/ui_actions/public/types.ts +++ b/src/plugins/ui_actions/public/types.ts @@ -6,6 +6,7 @@ * Side Public License, v 1. */ +import type { AggregateQuery } from '@kbn/es-query'; import type { DataViewSpec } from '@kbn/data-views-plugin/public'; import { ActionInternal } from './actions/action_internal'; import { TriggerInternal } from './triggers/trigger_internal'; @@ -19,6 +20,7 @@ export interface VisualizeFieldContext { dataViewSpec: DataViewSpec; contextualFields?: string[]; originatingApp?: string; + query?: AggregateQuery; } export const ACTION_VISUALIZE_FIELD = 'ACTION_VISUALIZE_FIELD'; diff --git a/x-pack/plugins/lens/public/editor_frame_service/editor_frame/suggestion_helpers.ts b/x-pack/plugins/lens/public/editor_frame_service/editor_frame/suggestion_helpers.ts index ec8eb224678b6..21cab91889999 100644 --- a/x-pack/plugins/lens/public/editor_frame_service/editor_frame/suggestion_helpers.ts +++ b/x-pack/plugins/lens/public/editor_frame_service/editor_frame/suggestion_helpers.ts @@ -205,6 +205,12 @@ export function getVisualizeFieldSuggestions({ context: visualizeTriggerFieldContext, }); } + // suggestions for visualizing textbased languages + if (visualizeTriggerFieldContext && 'query' in visualizeTriggerFieldContext) { + if (visualizeTriggerFieldContext.query) { + return suggestions.find((s) => s.datasourceId === 'textBasedLanguages'); + } + } if (suggestions.length) { return suggestions.find((s) => s.visualizationId === activeVisualization?.id) || suggestions[0]; diff --git a/x-pack/plugins/lens/public/state_management/init_middleware/load_initial.ts b/x-pack/plugins/lens/public/state_management/init_middleware/load_initial.ts index dc2425917bad8..5b942eff4a683 100644 --- a/x-pack/plugins/lens/public/state_management/init_middleware/load_initial.ts +++ b/x-pack/plugins/lens/public/state_management/init_middleware/load_initial.ts @@ -115,6 +115,11 @@ export function loadInitial( defaultIndexPatternId: lensServices.uiSettings.get('defaultIndex'), }; + let activeDatasourceId: string | undefined; + if (initialContext && 'query' in initialContext) { + activeDatasourceId = 'textBasedLanguages'; + } + if ( !initialInput || (attributeService.inputIsRefType(initialInput) && @@ -141,6 +146,7 @@ export function loadInitial( ...emptyState, dataViews: getInitialDataViewsObject(indexPatterns, indexPatternRefs), searchSessionId: data.search.session.getSessionId() || data.search.session.start(), + ...(activeDatasourceId && { activeDatasourceId }), datasourceStates: Object.entries(datasourceStates).reduce( (state, [datasourceId, datasourceState]) => ({ ...state, diff --git a/x-pack/plugins/lens/public/text_based_languages_datasource/text_based_languages.test.ts b/x-pack/plugins/lens/public/text_based_languages_datasource/text_based_languages.test.ts index c2238bfd9fef1..92a3ef01fdb7d 100644 --- a/x-pack/plugins/lens/public/text_based_languages_datasource/text_based_languages.test.ts +++ b/x-pack/plugins/lens/public/text_based_languages_datasource/text_based_languages.test.ts @@ -12,6 +12,7 @@ import { TextBasedLanguagesPersistedState, TextBasedLanguagesPrivateState } from import { dataPluginMock } from '@kbn/data-plugin/public/mocks'; import { dataViewPluginMocks } from '@kbn/data-views-plugin/public/mocks'; import { getTextBasedLanguagesDatasource } from './text_based_languages'; +import { generateId } from '../id_generator'; import { DatasourcePublicAPI, Datasource } from '../types'; jest.mock('../id_generator'); @@ -272,6 +273,97 @@ describe('IndexPattern Data Source', () => { }); }); + describe('#getDatasourceSuggestionsForVisualizeField', () => { + (generateId as jest.Mock).mockReturnValue(`newid`); + it('should create the correct layers', () => { + const state = { + layers: {}, + initialContext: { + contextualFields: ['bytes', 'dest'], + query: { sql: 'SELECT * FROM "foo"' }, + dataViewSpec: { + title: 'foo', + id: '1', + name: 'Foo', + }, + }, + } as unknown as TextBasedLanguagesPrivateState; + const suggestions = textBasedLanguagesDatasource.getDatasourceSuggestionsForVisualizeField( + state, + '1', + '', + indexPatterns + ); + expect(suggestions[0].state).toEqual({ + ...state, + layers: { + newid: { + allColumns: [ + { + columnId: 'newid', + fieldName: 'bytes', + meta: { + type: 'number', + }, + }, + { + columnId: 'newid', + fieldName: 'dest', + meta: { + type: 'string', + }, + }, + ], + columns: [ + { + columnId: 'newid', + fieldName: 'bytes', + meta: { + type: 'number', + }, + }, + { + columnId: 'newid', + fieldName: 'dest', + meta: { + type: 'string', + }, + }, + ], + index: 'foo', + query: { + sql: 'SELECT * FROM "foo"', + }, + }, + }, + }); + + expect(suggestions[0].table).toEqual({ + changeType: 'initial', + columns: [ + { + columnId: 'newid', + operation: { + dataType: 'number', + isBucketed: false, + label: 'bytes', + }, + }, + { + columnId: 'newid', + operation: { + dataType: 'string', + isBucketed: true, + label: 'dest', + }, + }, + ], + isMultiRow: false, + layerId: 'newid', + }); + }); + }); + describe('#getErrorMessages', () => { it('should use the results of getErrorMessages directly when single layer', () => { const state = { diff --git a/x-pack/plugins/lens/public/text_based_languages_datasource/text_based_languages.tsx b/x-pack/plugins/lens/public/text_based_languages_datasource/text_based_languages.tsx index 4857d3eed3e32..e9ab24b8392c6 100644 --- a/x-pack/plugins/lens/public/text_based_languages_datasource/text_based_languages.tsx +++ b/x-pack/plugins/lens/public/text_based_languages_datasource/text_based_languages.tsx @@ -14,7 +14,7 @@ import { IStorageWrapper } from '@kbn/kibana-utils-plugin/public'; import type { AggregateQuery } from '@kbn/es-query'; import type { SavedObjectReference } from '@kbn/core/public'; import { EuiButtonEmpty, EuiFormRow } from '@elastic/eui'; -import type { ExpressionsStart } from '@kbn/expressions-plugin/public'; +import type { ExpressionsStart, DatatableColumnType } from '@kbn/expressions-plugin/public'; import type { DataViewsPublicPluginStart } from '@kbn/data-views-plugin/public'; import { DataPublicPluginStart } from '@kbn/data-plugin/public'; import { @@ -36,7 +36,7 @@ import type { TextBasedLanguageField, } from './types'; import { FieldSelect } from './field_select'; -import { Datasource } from '../types'; +import type { Datasource, IndexPatternMap } from '../types'; import { LayerPanel } from './layerpanel'; function getLayerReferenceName(layerId: string) { @@ -82,6 +82,77 @@ export function getTextBasedLanguagesDatasource({ }; }); }; + const getSuggestionsForVisualizeField = ( + state: TextBasedLanguagesPrivateState, + indexPatternId: string, + fieldName: string, + indexPatterns: IndexPatternMap + ) => { + const context = state.initialContext; + if (context && 'dataViewSpec' in context && context.dataViewSpec.title) { + const newLayerId = generateId(); + const indexPattern = indexPatterns[indexPatternId]; + + const contextualFields = context.contextualFields; + const newColumns = contextualFields?.map((c) => { + let field = indexPattern?.getFieldByName(c); + if (!field) { + field = indexPattern?.fields.find((f) => f.name.includes(c)); + } + const newId = generateId(); + const type = field?.type ?? 'number'; + return { + columnId: newId, + fieldName: c, + meta: { + type: type as DatatableColumnType, + }, + }; + }); + + const index = context.dataViewSpec.title; + const query = context.query; + const updatedState = { + ...state, + layers: { + ...state.layers, + [newLayerId]: { + index, + query, + columns: newColumns ?? [], + allColumns: newColumns ?? [], + }, + }, + }; + + return [ + { + state: { + ...updatedState, + }, + table: { + changeType: 'initial' as TableChangeType, + isMultiRow: false, + layerId: newLayerId, + columns: + newColumns?.map((f) => { + return { + columnId: f.columnId, + operation: { + dataType: f?.meta?.type as DataType, + label: f.fieldName, + isBucketed: Boolean(f?.meta?.type !== 'number'), + }, + }; + }) ?? [], + }, + keptLayerIds: [newLayerId], + }, + ]; + } + + return []; + }; const TextBasedLanguagesDatasource: Datasource< TextBasedLanguagesPrivateState, TextBasedLanguagesPersistedState @@ -137,6 +208,7 @@ export function getTextBasedLanguagesDatasource({ ...initState, fieldList: [], indexPatternRefs: refs, + initialContext: context, }; }, onRefreshIndexPattern() {}, @@ -291,7 +363,11 @@ export function getTextBasedLanguagesDatasource({ const columnExists = props.state.fieldList.some((f) => f.name === selectedField?.fieldName); render( - {}}> + {}} + data-test-subj="lns-dimensionTrigger-textBased" + > {customLabel ?? i18n.translate('xpack.lens.textBasedLanguages.missingField', { defaultMessage: 'Missing field', @@ -564,7 +640,7 @@ export function getTextBasedLanguagesDatasource({ }); return []; }, - getDatasourceSuggestionsForVisualizeField: getSuggestionsForState, + getDatasourceSuggestionsForVisualizeField: getSuggestionsForVisualizeField, getDatasourceSuggestionsFromCurrentState: getSuggestionsForState, getDatasourceSuggestionsForVisualizeCharts: getSuggestionsForState, isEqual: () => true, diff --git a/x-pack/plugins/lens/public/text_based_languages_datasource/types.ts b/x-pack/plugins/lens/public/text_based_languages_datasource/types.ts index 2ea1692cf37c0..11b9612624efd 100644 --- a/x-pack/plugins/lens/public/text_based_languages_datasource/types.ts +++ b/x-pack/plugins/lens/public/text_based_languages_datasource/types.ts @@ -6,6 +6,8 @@ */ import type { DatatableColumn } from '@kbn/expressions-plugin/public'; import type { AggregateQuery } from '@kbn/es-query'; +import type { VisualizeFieldContext } from '@kbn/ui-actions-plugin/public'; +import type { VisualizeEditorContext } from '../types'; export interface TextBasedLanguagesLayerColumn { columnId: string; @@ -34,6 +36,7 @@ export interface TextBasedLanguagesPersistedState { export type TextBasedLanguagesPrivateState = TextBasedLanguagesPersistedState & { indexPatternRefs: IndexPatternRef[]; fieldList: DatatableColumn[]; + initialContext?: VisualizeFieldContext | VisualizeEditorContext; }; export interface IndexPatternRef { diff --git a/x-pack/plugins/lens/public/text_based_languages_datasource/utils.test.ts b/x-pack/plugins/lens/public/text_based_languages_datasource/utils.test.ts index 1cbd830a92fc2..bc511bb2b86ce 100644 --- a/x-pack/plugins/lens/public/text_based_languages_datasource/utils.test.ts +++ b/x-pack/plugins/lens/public/text_based_languages_datasource/utils.test.ts @@ -84,6 +84,18 @@ describe('Text based languages utils', () => { index: '', }, }, + indexPatternRefs: [], + fieldList: [], + initialContext: { + contextualFields: ['bytes', 'dest'], + query: { sql: 'SELECT * FROM "foo"' }, + fieldName: '', + dataViewSpec: { + title: 'foo', + id: '1', + name: 'Foo', + }, + }, }; const dataViewsMock = dataViewPluginMocks.createStartContract(); const dataMock = dataPluginMock.createStartContract(); @@ -113,6 +125,16 @@ describe('Text based languages utils', () => { ); expect(updatedState).toStrictEqual({ + initialContext: { + contextualFields: ['bytes', 'dest'], + query: { sql: 'SELECT * FROM "foo"' }, + fieldName: '', + dataViewSpec: { + title: 'foo', + id: '1', + name: 'Foo', + }, + }, fieldList: [ { name: 'timestamp', diff --git a/x-pack/plugins/lens/public/text_based_languages_datasource/utils.ts b/x-pack/plugins/lens/public/text_based_languages_datasource/utils.ts index 6c17d5206efb0..c4e41103f0fd1 100644 --- a/x-pack/plugins/lens/public/text_based_languages_datasource/utils.ts +++ b/x-pack/plugins/lens/public/text_based_languages_datasource/utils.ts @@ -15,7 +15,7 @@ import { fetchDataFromAggregateQuery } from './fetch_data_from_aggregate_query'; import type { IndexPatternRef, - TextBasedLanguagesPersistedState, + TextBasedLanguagesPrivateState, TextBasedLanguagesLayerColumn, } from './types'; @@ -36,7 +36,7 @@ export async function loadIndexPatternRefs( } export async function getStateFromAggregateQuery( - state: TextBasedLanguagesPersistedState, + state: TextBasedLanguagesPrivateState, query: AggregateQuery, dataViews: DataViewsPublicPluginStart, data: DataPublicPluginStart, @@ -45,13 +45,14 @@ export async function getStateFromAggregateQuery( const indexPatternRefs: IndexPatternRef[] = await loadIndexPatternRefs(dataViews); const errors: Error[] = []; const layerIds = Object.keys(state.layers); + const context = state.initialContext; const newLayerId = layerIds.length > 0 ? layerIds[0] : generateId(); // fetch the pattern from the query const indexPattern = getIndexPatternFromTextBasedQuery(query); // get the id of the dataview const index = indexPatternRefs.find((r) => r.title === indexPattern)?.id ?? ''; let columnsFromQuery: DatatableColumn[] = []; - let columns: TextBasedLanguagesLayerColumn[] = []; + let allColumns: TextBasedLanguagesLayerColumn[] = []; let timeFieldName; try { const table = await fetchDataFromAggregateQuery(query, dataViews, data, expressions); @@ -59,7 +60,8 @@ export async function getStateFromAggregateQuery( timeFieldName = dataView.timeFieldName; columnsFromQuery = table?.columns ?? []; const existingColumns = state.layers[newLayerId].allColumns; - columns = [ + + allColumns = [ ...existingColumns, ...columnsFromQuery.map((c) => ({ columnId: c.id, fieldName: c.id, meta: c.meta })), ]; @@ -73,7 +75,7 @@ export async function getStateFromAggregateQuery( index, query, columns: state.layers[newLayerId].columns ?? [], - allColumns: columns, + allColumns, timeField: timeFieldName, errors, }, @@ -84,6 +86,7 @@ export async function getStateFromAggregateQuery( ...tempState, fieldList: columnsFromQuery ?? [], indexPatternRefs, + initialContext: context, }; } diff --git a/x-pack/test/functional/apps/discover/visualize_field.ts b/x-pack/test/functional/apps/discover/visualize_field.ts index 0a7f075d50bd4..be1f223110503 100644 --- a/x-pack/test/functional/apps/discover/visualize_field.ts +++ b/x-pack/test/functional/apps/discover/visualize_field.ts @@ -26,12 +26,20 @@ export default function ({ getPageObjects, getService }: FtrProviderContext) { 'spaceSelector', 'header', ]); + const monacoEditor = getService('monacoEditor'); + + const defaultSettings = { + 'discover:enableSql': true, + }; async function setDiscoverTimeRange() { await PageObjects.timePicker.setDefaultAbsoluteRange(); } describe('discover field visualize button', () => { + before(async () => { + await kibanaServer.uiSettings.replace(defaultSettings); + }); beforeEach(async () => { await esArchiver.loadIfNeeded('x-pack/test/functional/es_archives/logstash_functional'); await kibanaServer.importExport.load( @@ -95,5 +103,23 @@ export default function ({ getPageObjects, getService }: FtrProviderContext) { expect(selectedPattern).to.eql('logst*'); }); }); + + it('should visualize correctly text based language queries', async () => { + await PageObjects.discover.selectTextBaseLang('SQL'); + await PageObjects.header.waitUntilLoadingHasFinished(); + await monacoEditor.setCodeEditorValue( + 'SELECT extension, AVG("bytes") as average FROM "logstash-*" GROUP BY extension' + ); + await testSubjects.click('querySubmitButton'); + await PageObjects.header.waitUntilLoadingHasFinished(); + + await testSubjects.click('textBased-visualize'); + + await retry.try(async () => { + const dimensions = await testSubjects.findAll('lns-dimensionTrigger-textBased'); + expect(dimensions).to.have.length(2); + expect(await dimensions[1].getVisibleText()).to.be('average'); + }); + }); }); } From a1759bdd183038c5f425be134b422a4166b5e5cc Mon Sep 17 00:00:00 2001 From: James Gowdy Date: Fri, 30 Sep 2022 10:55:07 +0100 Subject: [PATCH 38/72] [ML] api/ml/jobs/jobs api tests (#142234) * [ML] /api/ml/jobs/jobs api tests * adding space tests --- .../api_integration/apis/ml/jobs/index.ts | 1 + .../test/api_integration/apis/ml/jobs/jobs.ts | 210 ++++++++++++++++++ 2 files changed, 211 insertions(+) create mode 100644 x-pack/test/api_integration/apis/ml/jobs/jobs.ts diff --git a/x-pack/test/api_integration/apis/ml/jobs/index.ts b/x-pack/test/api_integration/apis/ml/jobs/index.ts index e530b6bfb3622..8152f3e760b60 100644 --- a/x-pack/test/api_integration/apis/ml/jobs/index.ts +++ b/x-pack/test/api_integration/apis/ml/jobs/index.ts @@ -23,5 +23,6 @@ export default function ({ loadTestFile }: FtrProviderContext) { loadTestFile(require.resolve('./stop_datafeeds')); loadTestFile(require.resolve('./stop_datafeeds_spaces')); loadTestFile(require.resolve('./get_groups')); + loadTestFile(require.resolve('./jobs')); }); } diff --git a/x-pack/test/api_integration/apis/ml/jobs/jobs.ts b/x-pack/test/api_integration/apis/ml/jobs/jobs.ts new file mode 100644 index 0000000000000..c843aab29dc48 --- /dev/null +++ b/x-pack/test/api_integration/apis/ml/jobs/jobs.ts @@ -0,0 +1,210 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import expect from '@kbn/expect'; +import type { CombinedJobWithStats } from '@kbn/ml-plugin/common/types/anomaly_detection_jobs'; +import { FtrProviderContext } from '../../../ftr_provider_context'; +import { COMMON_REQUEST_HEADERS } from '../../../../functional/services/ml/common_api'; +import { USER } from '../../../../functional/services/ml/security_common'; +import { MULTI_METRIC_JOB_CONFIG, SINGLE_METRIC_JOB_CONFIG, DATAFEED_CONFIG } from './common_jobs'; + +export default ({ getService }: FtrProviderContext) => { + const esArchiver = getService('esArchiver'); + const supertest = getService('supertestWithoutAuth'); + const ml = getService('ml'); + + const idSpace1 = 'space1'; + + const testSetupJobConfigs = [SINGLE_METRIC_JOB_CONFIG, MULTI_METRIC_JOB_CONFIG]; + + const testSetupJobConfigsWithSpace = [ + { ...SINGLE_METRIC_JOB_CONFIG, job_id: `${SINGLE_METRIC_JOB_CONFIG.job_id}-${idSpace1}` }, + ]; + + const testCalendarsConfigs = [ + { + calendar_id: `test_get_cal_1`, + job_ids: ['multi-metric'], + description: `Test calendar 1`, + }, + { + calendar_id: `test_get_cal_2`, + job_ids: [MULTI_METRIC_JOB_CONFIG.job_id, 'multi-metric'], + description: `Test calendar 2`, + }, + { + calendar_id: `test_get_cal_3`, + job_ids: ['brand-new-group'], + description: `Test calendar 3`, + }, + ]; + + async function runGetJobsRequest( + user: USER, + requestBody: object, + expectedResponsecode: number, + space?: string + ): Promise { + const path = space === undefined ? '/api/ml/jobs/jobs' : `/s/${space}/api/ml/jobs/jobs`; + const { body, status } = await supertest + .post(path) + .auth(user, ml.securityCommon.getPasswordForUser(user)) + .set(COMMON_REQUEST_HEADERS) + .send(requestBody); + ml.api.assertResponseStatusCode(expectedResponsecode, status, body); + + return body; + } + + const expectedJobProperties = [ + { + jobId: MULTI_METRIC_JOB_CONFIG.job_id, + datafeedId: `datafeed-${MULTI_METRIC_JOB_CONFIG.job_id}`, + calendarIds: ['test_get_cal_1', 'test_get_cal_2'], + groups: ['farequote', 'automated', 'multi-metric'], + modelBytes: 0, + datafeedTotalSearchTimeMs: 0, + }, + { + jobId: SINGLE_METRIC_JOB_CONFIG.job_id, + datafeedId: `datafeed-${SINGLE_METRIC_JOB_CONFIG.job_id}`, + calendarIds: undefined, + groups: ['farequote', 'automated', 'single-metric'], + modelBytes: 0, + datafeedTotalSearchTimeMs: 0, + }, + ]; + + const expectedJobPropertiesWithSpace = [ + { + jobId: `${SINGLE_METRIC_JOB_CONFIG.job_id}-${idSpace1}`, + datafeedId: `datafeed-${SINGLE_METRIC_JOB_CONFIG.job_id}-${idSpace1}`, + calendarIds: undefined, + groups: ['farequote', 'automated', 'single-metric'], + modelBytes: 0, + datafeedTotalSearchTimeMs: 0, + }, + ]; + + describe('get combined jobs with stats', function () { + before(async () => { + await esArchiver.loadIfNeeded('x-pack/test/functional/es_archives/ml/farequote'); + await ml.testResources.setKibanaTimeZoneToUTC(); + + for (const job of testSetupJobConfigs) { + await ml.api.createAnomalyDetectionJob(job); + await ml.api.createDatafeed({ + ...DATAFEED_CONFIG, + datafeed_id: `datafeed-${job.job_id}`, + job_id: job.job_id, + }); + } + + for (const job of testSetupJobConfigsWithSpace) { + await ml.api.createAnomalyDetectionJob(job, idSpace1); + await ml.api.createDatafeed( + { + ...DATAFEED_CONFIG, + datafeed_id: `datafeed-${job.job_id}`, + job_id: job.job_id, + }, + idSpace1 + ); + } + + for (const cal of testCalendarsConfigs) { + await ml.api.createCalendar(cal.calendar_id, cal); + } + }); + + after(async () => { + await ml.api.cleanMlIndices(); + }); + + it('returns expected list of combined jobs with stats in default space', async () => { + const jobs = await runGetJobsRequest(USER.ML_VIEWER, {}, 200); + + expect(jobs.length).to.eql( + testSetupJobConfigs.length, + `number of jobs in default space should be ${testSetupJobConfigs.length})` + ); + + jobs.forEach((job, i) => { + expect(job.job_id).to.eql( + expectedJobProperties[i].jobId, + `job id should be equal to ${JSON.stringify(expectedJobProperties[i].jobId)})` + ); + expect(job.datafeed_config.datafeed_id).to.eql( + expectedJobProperties[i].datafeedId, + `datafeed id should be equal to ${JSON.stringify(expectedJobProperties[i].datafeedId)})` + ); + expect(job.calendars).to.eql( + expectedJobProperties[i].calendarIds, + `calendars should be equal to ${JSON.stringify(expectedJobProperties[i].calendarIds)})` + ); + expect(job.groups).to.eql( + expectedJobProperties[i].groups, + `groups should be equal to ${JSON.stringify(expectedJobProperties[i].groups)})` + ); + expect(job.model_size_stats.model_bytes).to.eql( + expectedJobProperties[i].modelBytes, + `model_bytes should be equal to ${JSON.stringify(expectedJobProperties[i].modelBytes)})` + ); + expect(job.datafeed_config.timing_stats.total_search_time_ms).to.eql( + expectedJobProperties[i].datafeedTotalSearchTimeMs, + `datafeed total_search_time_ms should be equal to ${JSON.stringify( + expectedJobProperties[i].datafeedTotalSearchTimeMs + )})` + ); + }); + }); + + it('returns expected list of combined jobs with stats in specified space', async () => { + const jobs = await runGetJobsRequest(USER.ML_VIEWER, {}, 200, idSpace1); + + expect(jobs.length).to.eql( + testSetupJobConfigsWithSpace.length, + `number of jobs in default space should be ${testSetupJobConfigsWithSpace.length})` + ); + + jobs.forEach((job, i) => { + expect(job.job_id).to.eql( + expectedJobPropertiesWithSpace[i].jobId, + `job id should be equal to ${JSON.stringify(expectedJobPropertiesWithSpace[i].jobId)})` + ); + expect(job.datafeed_config.datafeed_id).to.eql( + expectedJobPropertiesWithSpace[i].datafeedId, + `datafeed id should be equal to ${JSON.stringify( + expectedJobPropertiesWithSpace[i].datafeedId + )})` + ); + expect(job.calendars).to.eql( + expectedJobPropertiesWithSpace[i].calendarIds, + `calendars should be equal to ${JSON.stringify( + expectedJobPropertiesWithSpace[i].calendarIds + )})` + ); + expect(job.groups).to.eql( + expectedJobPropertiesWithSpace[i].groups, + `groups should be equal to ${JSON.stringify(expectedJobPropertiesWithSpace[i].groups)})` + ); + expect(job.model_size_stats.model_bytes).to.eql( + expectedJobPropertiesWithSpace[i].modelBytes, + `model_bytes should be equal to ${JSON.stringify( + expectedJobPropertiesWithSpace[i].modelBytes + )})` + ); + expect(job.datafeed_config.timing_stats.total_search_time_ms).to.eql( + expectedJobPropertiesWithSpace[i].datafeedTotalSearchTimeMs, + `datafeed total_search_time_ms should be equal to ${JSON.stringify( + expectedJobPropertiesWithSpace[i].datafeedTotalSearchTimeMs + )})` + ); + }); + }); + }); +}; From 6b11352f719ab5756c260b4a3f10afa22daba86a Mon Sep 17 00:00:00 2001 From: Vitalii Dmyterko <92328789+vitaliidm@users.noreply.github.com> Date: Fri, 30 Sep 2022 11:03:40 +0100 Subject: [PATCH 39/72] [Security Solution][Detections] fixes validation issues in rules actions form (#141811) ## Summary - addresses https://github.com/elastic/kibana/issues/140593 - bulk edit of rules actions - [single rule actions update](https://github.com/elastic/kibana/issues/140593#issuecomment-1257903212 ) ### Before Single rule actions update https://user-images.githubusercontent.com/92328789/192327231-8fdc846c-55f2-4ab1-8786-e96d2376af48.mov Bulk edit rule actions https://user-images.githubusercontent.com/92328789/192327094-ea830769-9633-43dc-be37-7ec68de4bd6f.mp4 ### After Single rule actions update and Bulk edit rule actions https://user-images.githubusercontent.com/92328789/192325274-010d11fc-17eb-47a1-b817-7a24eba8a365.mov --- .../rules/rule_actions_field/index.tsx | 35 +++++++++++-------- 1 file changed, 20 insertions(+), 15 deletions(-) diff --git a/x-pack/plugins/security_solution/public/detections/components/rules/rule_actions_field/index.tsx b/x-pack/plugins/security_solution/public/detections/components/rules/rule_actions_field/index.tsx index 0babfc8de387d..4cc5aed8aab69 100644 --- a/x-pack/plugins/security_solution/public/detections/components/rules/rule_actions_field/index.tsx +++ b/x-pack/plugins/security_solution/public/detections/components/rules/rule_actions_field/index.tsx @@ -86,8 +86,7 @@ export const RuleActionsField: React.FC = ({ field, messageVariables }) = updatedActions[index] = deepMerge(updatedActions[index], { id }); field.setValue(updatedActions); }, - // eslint-disable-next-line react-hooks/exhaustive-deps - [field.setValue, actions] + [field, actions] ); const setAlertActionsProperty = useCallback( @@ -98,20 +97,26 @@ export const RuleActionsField: React.FC = ({ field, messageVariables }) = const setActionParamsProperty = useCallback( // eslint-disable-next-line @typescript-eslint/no-explicit-any (key: string, value: any, index: number) => { - field.setValue((prevValue: RuleAction[]) => { - const updatedActions = [...prevValue]; - updatedActions[index] = { - ...updatedActions[index], - params: { - ...updatedActions[index].params, - [key]: value, - }, - }; - return updatedActions; - }); + // validation is not triggered correctly when actions params updated (more details in https://github.com/elastic/kibana/issues/142217) + // wrapping field.setValue in setTimeout fixes the issue above + // and triggers validation after params have been updated + setTimeout( + () => + field.setValue((prevValue: RuleAction[]) => { + const updatedActions = [...prevValue]; + updatedActions[index] = { + ...updatedActions[index], + params: { + ...updatedActions[index].params, + [key]: value, + }, + }; + return updatedActions; + }), + 0 + ); }, - // eslint-disable-next-line react-hooks/exhaustive-deps - [field.setValue] + [field] ); const actionForm = useMemo( From f6149a610f5654ed0d7be57c10bf12e71aab0bf0 Mon Sep 17 00:00:00 2001 From: Yngrid Coello Date: Fri, 30 Sep 2022 12:36:12 +0200 Subject: [PATCH 40/72] Removed isBeta property from SettingsSection interface since it was not used anymore in the template (#142313) --- .../components/fleet_integration/apm_policy_form/index.tsx | 1 - .../fleet_integration/apm_policy_form/settings_form/index.tsx | 1 - 2 files changed, 2 deletions(-) diff --git a/x-pack/plugins/apm/public/components/fleet_integration/apm_policy_form/index.tsx b/x-pack/plugins/apm/public/components/fleet_integration/apm_policy_form/index.tsx index 8a8a44282fb78..bad43923934a7 100644 --- a/x-pack/plugins/apm/public/components/fleet_integration/apm_policy_form/index.tsx +++ b/x-pack/plugins/apm/public/components/fleet_integration/apm_policy_form/index.tsx @@ -133,7 +133,6 @@ export function APMPolicyForm({ vars = {}, updateAPMPolicy }: Props) { } ), settings: tailSamplingSettings, - isBeta: false, isPlatinumLicence: true, }, ] diff --git a/x-pack/plugins/apm/public/components/fleet_integration/apm_policy_form/settings_form/index.tsx b/x-pack/plugins/apm/public/components/fleet_integration/apm_policy_form/settings_form/index.tsx index a834c41098798..d32ace1933427 100644 --- a/x-pack/plugins/apm/public/components/fleet_integration/apm_policy_form/settings_form/index.tsx +++ b/x-pack/plugins/apm/public/components/fleet_integration/apm_policy_form/settings_form/index.tsx @@ -92,7 +92,6 @@ export interface SettingsSection { title: string; subtitle?: string; settings: SettingsRow[]; - isBeta?: boolean; isPlatinumLicence?: boolean; } From d92baddf1726a4c8b48ce08a8ac15180b4d9b84b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Efe=20G=C3=BCrkan=20YALAMAN?= Date: Fri, 30 Sep 2022 12:39:16 +0200 Subject: [PATCH 41/72] Remove duplicate breadcrumb link from the settings page (#142068) --- .../enterprise_search_content/components/settings/settings.tsx | 3 --- x-pack/plugins/translations/translations/fr-FR.json | 1 - x-pack/plugins/translations/translations/ja-JP.json | 1 - x-pack/plugins/translations/translations/zh-CN.json | 1 - 4 files changed, 6 deletions(-) diff --git a/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/components/settings/settings.tsx b/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/components/settings/settings.tsx index eaab5d56b1b46..94c4c1fdbaad9 100644 --- a/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/components/settings/settings.tsx +++ b/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/components/settings/settings.tsx @@ -31,9 +31,6 @@ export const Settings: React.FC = () => { return ( Date: Fri, 30 Sep 2022 04:08:51 -0700 Subject: [PATCH 42/72] Respect `default_field: false` when generating index settings (#142277) --- .../template/default_settings.test.ts | 5 +++++ .../epm/elasticsearch/template/default_settings.ts | 14 ++++++++------ .../fleet/server/services/epm/fields/field.ts | 1 + 3 files changed, 14 insertions(+), 6 deletions(-) diff --git a/x-pack/plugins/fleet/server/services/epm/elasticsearch/template/default_settings.test.ts b/x-pack/plugins/fleet/server/services/epm/elasticsearch/template/default_settings.test.ts index df1c87105bcf2..bb2be99b868bc 100644 --- a/x-pack/plugins/fleet/server/services/epm/elasticsearch/template/default_settings.test.ts +++ b/x-pack/plugins/fleet/server/services/epm/elasticsearch/template/default_settings.test.ts @@ -48,6 +48,11 @@ describe('buildDefaultSettings', () => { name: 'field5Wildcard', type: 'wildcard', }, + { + name: 'field6NotDefault', + type: 'keyword', + default_field: false, + }, ], }); diff --git a/x-pack/plugins/fleet/server/services/epm/elasticsearch/template/default_settings.ts b/x-pack/plugins/fleet/server/services/epm/elasticsearch/template/default_settings.ts index 5accf7b120f9e..b15eb01117825 100644 --- a/x-pack/plugins/fleet/server/services/epm/elasticsearch/template/default_settings.ts +++ b/x-pack/plugins/fleet/server/services/epm/elasticsearch/template/default_settings.ts @@ -11,19 +11,20 @@ import type { Field, Fields } from '../../fields/field'; const QUERY_DEFAULT_FIELD_TYPES = ['keyword', 'text', 'match_only_text', 'wildcard']; const QUERY_DEFAULT_FIELD_LIMIT = 1024; -const flattenFieldsToNameAndType = ( +const flattenAndExtractFields = ( fields: Fields, path: string = '' -): Array> => { - let newFields: Array> = []; +): Array> => { + let newFields: Array> = []; fields.forEach((field) => { const fieldName = path ? `${path}.${field.name}` : field.name; newFields.push({ name: fieldName, type: field.type, + default_field: field.default_field, }); if (field.fields && field.fields.length) { - newFields = newFields.concat(flattenFieldsToNameAndType(field.fields, fieldName)); + newFields = newFields.concat(flattenAndExtractFields(field.fields, fieldName)); } }); return newFields; @@ -45,8 +46,9 @@ export function buildDefaultSettings({ const logger = appContextService.getLogger(); // Find all field names to set `index.query.default_field` to, which will be // the first 1024 keyword or text fields - const defaultFields = flattenFieldsToNameAndType(fields).filter( - (field) => field.type && QUERY_DEFAULT_FIELD_TYPES.includes(field.type) + const defaultFields = flattenAndExtractFields(fields).filter( + (field) => + field.type && QUERY_DEFAULT_FIELD_TYPES.includes(field.type) && field.default_field !== false ); if (defaultFields.length > QUERY_DEFAULT_FIELD_LIMIT) { logger.warn( diff --git a/x-pack/plugins/fleet/server/services/epm/fields/field.ts b/x-pack/plugins/fleet/server/services/epm/fields/field.ts index e970a2fea1459..b8af566463896 100644 --- a/x-pack/plugins/fleet/server/services/epm/fields/field.ts +++ b/x-pack/plugins/fleet/server/services/epm/fields/field.ts @@ -37,6 +37,7 @@ export interface Field { include_in_root?: boolean; null_value?: string; dimension?: boolean; + default_field?: boolean; // Meta fields metric_type?: string; From c23579feb62f4ce452b74ecfb9411c056cef687e Mon Sep 17 00:00:00 2001 From: Faisal Kanout Date: Fri, 30 Sep 2022 14:37:15 +0200 Subject: [PATCH 43/72] [Actionable Observability] - Fix Alert tab goes blank in APM because of Alert Details page feature flag (#142188) * Add the o11y context to the alert table config * Fix checks * Make the feature flag optional * optional config for the check * Made option only for alertDetails --- .../public/config/register_alerts_table_configuration.tsx | 6 ++++-- .../components/alerts_flyout/alerts_flyout_footer.tsx | 2 +- .../alerts/components/observability_actions.test.tsx | 1 + .../pages/alerts/components/observability_actions.tsx | 8 ++++---- .../alerts_table_t_grid/alerts_table_t_grid.tsx | 5 +++-- .../containers/alerts_table_t_grid/get_row_actions.tsx | 7 ++++++- x-pack/plugins/observability/public/plugin.ts | 5 ++++- 7 files changed, 23 insertions(+), 11 deletions(-) diff --git a/x-pack/plugins/observability/public/config/register_alerts_table_configuration.tsx b/x-pack/plugins/observability/public/config/register_alerts_table_configuration.tsx index b9600088af3bf..bc41b8d803285 100644 --- a/x-pack/plugins/observability/public/config/register_alerts_table_configuration.tsx +++ b/x-pack/plugins/observability/public/config/register_alerts_table_configuration.tsx @@ -16,9 +16,11 @@ import { addDisplayNames } from '../pages/alerts/containers/alerts_table_t_grid/ import { columns as alertO11yColumns } from '../pages/alerts/containers/alerts_table_t_grid/alerts_table_t_grid'; import { getRowActions } from '../pages/alerts/containers/alerts_table_t_grid/get_row_actions'; import type { ObservabilityRuleTypeRegistry } from '../rules/create_observability_rule_type_registry'; +import type { ConfigSchema } from '../plugin'; const getO11yAlertsTableConfiguration = ( - observabilityRuleTypeRegistry: ObservabilityRuleTypeRegistry + observabilityRuleTypeRegistry: ObservabilityRuleTypeRegistry, + config: ConfigSchema ) => ({ id: observabilityFeatureId, casesFeatureId, @@ -33,7 +35,7 @@ const getO11yAlertsTableConfiguration = ( }, }, ], - useActionsColumn: getRowActions(observabilityRuleTypeRegistry), + useActionsColumn: getRowActions(observabilityRuleTypeRegistry, config), useBulkActions: useBulkAddToCaseActions, useInternalFlyout: () => { const { header, body, footer } = useToGetInternalFlyout(observabilityRuleTypeRegistry); diff --git a/x-pack/plugins/observability/public/pages/alerts/components/alerts_flyout/alerts_flyout_footer.tsx b/x-pack/plugins/observability/public/pages/alerts/components/alerts_flyout/alerts_flyout_footer.tsx index 3a6bcb8d28f26..eecadba66b614 100644 --- a/x-pack/plugins/observability/public/pages/alerts/components/alerts_flyout/alerts_flyout_footer.tsx +++ b/x-pack/plugins/observability/public/pages/alerts/components/alerts_flyout/alerts_flyout_footer.tsx @@ -18,7 +18,7 @@ export default function AlertsFlyoutFooter({ alert, isInApp }: FlyoutProps & { i const { http } = services; const prepend = http?.basePath.prepend; const getAlertDetailsButton = () => { - if (!config.unsafe.alertDetails.enabled || !alert) return <>; + if (!config?.unsafe?.alertDetails.enabled || !alert) return <>; return ( ({ describe('ObservabilityActions component', () => { const setup = async (pageId: string) => { const props: ObservabilityActionsProps = { + config, eventId: '6d4c6d74-d51a-495c-897d-88ced3b95e30', ecsData: { _id: '6d4c6d74-d51a-495c-897d-88ced3b95e30', diff --git a/x-pack/plugins/observability/public/pages/alerts/components/observability_actions.tsx b/x-pack/plugins/observability/public/pages/alerts/components/observability_actions.tsx index eddead1fa90de..2ebb4629ba7bd 100644 --- a/x-pack/plugins/observability/public/pages/alerts/components/observability_actions.tsx +++ b/x-pack/plugins/observability/public/pages/alerts/components/observability_actions.tsx @@ -19,7 +19,6 @@ import React, { useMemo, useState, useCallback } from 'react'; import { CaseAttachmentsWithoutOwner } from '@kbn/cases-plugin/public'; import { CommentType } from '@kbn/cases-plugin/common'; import type { ActionProps } from '@kbn/timelines-plugin/common'; -import { usePluginContext } from '../../../hooks/use_plugin_context'; import { useKibana } from '../../../utils/kibana_react'; import { useGetUserCasesPermissions } from '../../../hooks/use_get_user_cases_permissions'; import { parseAlert } from './parse_alert'; @@ -33,6 +32,7 @@ import { RULE_DETAILS_PAGE_ID } from '../../rule_details/types'; import type { TopAlert } from '../containers/alerts_page/types'; import { ObservabilityRuleTypeRegistry } from '../../..'; import { ALERT_DETAILS_PAGE_ID } from '../../alert_details/types'; +import { ConfigSchema } from '../../../plugin'; export type ObservabilityActionsProps = Pick< ActionProps, @@ -41,6 +41,7 @@ export type ObservabilityActionsProps = Pick< setFlyoutAlert: React.Dispatch>; observabilityRuleTypeRegistry: ObservabilityRuleTypeRegistry; id?: string; + config: ConfigSchema; }; export function ObservabilityActions({ @@ -49,12 +50,12 @@ export function ObservabilityActions({ ecsData, id: pageId, observabilityRuleTypeRegistry, + config, setFlyoutAlert, }: ObservabilityActionsProps) { const dataFieldEs = data.reduce((acc, d) => ({ ...acc, [d.field]: d.value }), {}); const [openActionsPopoverId, setActionsPopover] = useState(null); const { cases, http } = useKibana().services; - const { config } = usePluginContext(); const parseObservabilityAlert = useMemo( () => parseAlert(observabilityRuleTypeRegistry), @@ -108,7 +109,6 @@ export function ObservabilityActions({ selectCaseModal.open({ attachments: caseAttachments }); closeActionsPopover(); }, [caseAttachments, closeActionsPopover, selectCaseModal]); - const actionsMenuItems = useMemo(() => { return [ ...(userCasesPermissions.create && userCasesPermissions.read @@ -143,7 +143,7 @@ export function ObservabilityActions({ : []), ...[ - config.unsafe.alertDetails.enabled && linkToAlert ? ( + config?.unsafe?.alertDetails.enabled && linkToAlert ? ( ().services; - const { observabilityRuleTypeRegistry } = usePluginContext(); + const { observabilityRuleTypeRegistry, config } = usePluginContext(); const [flyoutAlert, setFlyoutAlert] = useState(undefined); const [tGridState, setTGridState] = useState | null>( @@ -210,13 +210,14 @@ export function AlertsTableTGrid(props: AlertsTableTGridProps) { setEventsDeleted={setEventsDeleted} setFlyoutAlert={setFlyoutAlert} observabilityRuleTypeRegistry={observabilityRuleTypeRegistry} + config={config} /> ); }, }, ]; - }, [setEventsDeleted, observabilityRuleTypeRegistry]); + }, [setEventsDeleted, observabilityRuleTypeRegistry, config]); const onStateChange = useCallback( (state: TGridState) => { diff --git a/x-pack/plugins/observability/public/pages/alerts/containers/alerts_table_t_grid/get_row_actions.tsx b/x-pack/plugins/observability/public/pages/alerts/containers/alerts_table_t_grid/get_row_actions.tsx index 26af884840570..0cf6c092dc70a 100644 --- a/x-pack/plugins/observability/public/pages/alerts/containers/alerts_table_t_grid/get_row_actions.tsx +++ b/x-pack/plugins/observability/public/pages/alerts/containers/alerts_table_t_grid/get_row_actions.tsx @@ -9,6 +9,7 @@ import { EcsFieldsResponse } from '@kbn/rule-registry-plugin/common/search_strat import { ObservabilityRuleTypeRegistry } from '../../../../rules/create_observability_rule_type_registry'; import { ObservabilityActions } from '../../components/observability_actions'; import type { ObservabilityActionsProps } from '../../components/observability_actions'; +import type { ConfigSchema } from '../../../../plugin'; const buildData = (alerts: EcsFieldsResponse): ObservabilityActionsProps['data'] => { return Object.entries(alerts).reduce( @@ -17,7 +18,10 @@ const buildData = (alerts: EcsFieldsResponse): ObservabilityActionsProps['data'] ); }; const fakeSetEventsDeleted = () => []; -export const getRowActions = (observabilityRuleTypeRegistry: ObservabilityRuleTypeRegistry) => { +export const getRowActions = ( + observabilityRuleTypeRegistry: ObservabilityRuleTypeRegistry, + config: ConfigSchema +) => { return () => ({ renderCustomActionsRow: ( alert: EcsFieldsResponse, @@ -33,6 +37,7 @@ export const getRowActions = (observabilityRuleTypeRegistry: ObservabilityRuleTy observabilityRuleTypeRegistry={observabilityRuleTypeRegistry} setEventsDeleted={fakeSetEventsDeleted} setFlyoutAlert={setFlyoutAlert} + config={config} /> ); }, diff --git a/x-pack/plugins/observability/public/plugin.ts b/x-pack/plugins/observability/public/plugin.ts index 6c84eb2588a0d..161fe2851ae3a 100644 --- a/x-pack/plugins/observability/public/plugin.ts +++ b/x-pack/plugins/observability/public/plugin.ts @@ -294,7 +294,10 @@ export class Plugin const { getO11yAlertsTableConfiguration } = await import( './config/register_alerts_table_configuration' ); - return getO11yAlertsTableConfiguration(this.observabilityRuleTypeRegistry); + return getO11yAlertsTableConfiguration( + this.observabilityRuleTypeRegistry, + this.initContext.config.get() + ); }; const { alertsTableConfigurationRegistry } = pluginsStart.triggersActionsUi; From cab963cc823db6dd82fb85a850c3698c8be4f346 Mon Sep 17 00:00:00 2001 From: James Gowdy Date: Fri, 30 Sep 2022 13:41:15 +0100 Subject: [PATCH 44/72] [ML] Api tests for ml/saved_objects/remove_item_from_current_space (#142319) --- .../apis/ml/saved_objects/index.ts | 1 + .../remove_from_current_space.ts | 137 ++++++++++++++++++ 2 files changed, 138 insertions(+) create mode 100644 x-pack/test/api_integration/apis/ml/saved_objects/remove_from_current_space.ts diff --git a/x-pack/test/api_integration/apis/ml/saved_objects/index.ts b/x-pack/test/api_integration/apis/ml/saved_objects/index.ts index f1464095edffe..5139a121e07d1 100644 --- a/x-pack/test/api_integration/apis/ml/saved_objects/index.ts +++ b/x-pack/test/api_integration/apis/ml/saved_objects/index.ts @@ -18,5 +18,6 @@ export default function ({ loadTestFile }: FtrProviderContext) { loadTestFile(require.resolve('./sync_jobs')); loadTestFile(require.resolve('./sync_trained_models')); loadTestFile(require.resolve('./update_jobs_spaces')); + loadTestFile(require.resolve('./remove_from_current_space')); }); } diff --git a/x-pack/test/api_integration/apis/ml/saved_objects/remove_from_current_space.ts b/x-pack/test/api_integration/apis/ml/saved_objects/remove_from_current_space.ts new file mode 100644 index 0000000000000..3e98c51ea047e --- /dev/null +++ b/x-pack/test/api_integration/apis/ml/saved_objects/remove_from_current_space.ts @@ -0,0 +1,137 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import expect from '@kbn/expect'; +import { MlSavedObjectType } from '@kbn/ml-plugin/common/types/saved_objects'; +import { FtrProviderContext } from '../../../ftr_provider_context'; +import { USER } from '../../../../functional/services/ml/security_common'; +import { COMMON_REQUEST_HEADERS } from '../../../../functional/services/ml/common_api'; + +export default ({ getService }: FtrProviderContext) => { + const esArchiver = getService('esArchiver'); + const ml = getService('ml'); + const spacesService = getService('spaces'); + const supertest = getService('supertestWithoutAuth'); + + const adJobId = 'fq_single'; + const dfaJobId = 'ihp_od'; + const trainedModelId = 'trained_model'; + const idSpace1 = 'space1'; + const idSpace2 = 'space2'; + const defaultSpaceId = 'default'; + + async function runRequest( + requestBody: { + ids: string[]; + mlSavedObjectType: MlSavedObjectType; + }, + space: string, + expectedStatusCode: number, + user: USER + ) { + const { body, status } = await supertest + .post(`/s/${space}/api/ml/saved_objects/remove_item_from_current_space`) + .auth(user, ml.securityCommon.getPasswordForUser(user)) + .set(COMMON_REQUEST_HEADERS) + .send(requestBody); + ml.api.assertResponseStatusCode(expectedStatusCode, status, body); + + return body; + } + + describe('POST saved_objects/remove_item_from_current_space', () => { + before(async () => { + await ml.testResources.setKibanaTimeZoneToUTC(); + await esArchiver.loadIfNeeded('x-pack/test/functional/es_archives/ml/ihp_outlier'); + + // create spaces + await spacesService.create({ id: idSpace1, name: 'space_one', disabledFeatures: [] }); + await spacesService.create({ id: idSpace2, name: 'space_two', disabledFeatures: [] }); + + // create anomaly detection job + await ml.api.createAnomalyDetectionJob(ml.commonConfig.getADFqSingleMetricJobConfig(adJobId)); + // create data frame analytics job + await ml.api.createDataFrameAnalyticsJob( + ml.commonConfig.getDFAIhpOutlierDetectionJobConfig(dfaJobId) + ); + // Create trained model + const trainedModelConfig = ml.api.createTestTrainedModelConfig(trainedModelId, 'regression'); + await ml.api.createTrainedModel(trainedModelId, trainedModelConfig.body); + + // reassign spaces for all items + await ml.api.updateJobSpaces(adJobId, 'anomaly-detector', [idSpace1, idSpace2], []); + await ml.api.updateJobSpaces(dfaJobId, 'data-frame-analytics', [idSpace1, idSpace2], []); + await ml.api.updateTrainedModelSpaces(trainedModelId, [idSpace1, idSpace2], []); + }); + + after(async () => { + await ml.api.cleanMlIndices(); + await ml.testResources.cleanMLSavedObjects(); + await spacesService.delete(idSpace1); + await spacesService.delete(idSpace2); + }); + + it('should remove AD job from current space', async () => { + await ml.api.assertJobSpaces(adJobId, 'anomaly-detector', [ + defaultSpaceId, + idSpace1, + idSpace2, + ]); + const mlSavedObjectType = 'anomaly-detector'; + const body = await runRequest( + { + ids: [adJobId], + mlSavedObjectType, + }, + idSpace1, + 200, + USER.ML_POWERUSER + ); + + expect(body).to.eql({ [adJobId]: { success: true, type: mlSavedObjectType } }); + await ml.api.assertJobSpaces(adJobId, mlSavedObjectType, [defaultSpaceId, idSpace2]); + }); + + it('should remove DFA job from current space', async () => { + await ml.api.assertJobSpaces(dfaJobId, 'data-frame-analytics', [ + defaultSpaceId, + idSpace1, + idSpace2, + ]); + const mlSavedObjectType = 'data-frame-analytics'; + const body = await runRequest( + { + ids: [dfaJobId], + mlSavedObjectType, + }, + idSpace2, + 200, + USER.ML_POWERUSER + ); + + expect(body).to.eql({ [dfaJobId]: { success: true, type: mlSavedObjectType } }); + await ml.api.assertJobSpaces(dfaJobId, mlSavedObjectType, [defaultSpaceId, idSpace1]); + }); + + it('should remove trained model from current space', async () => { + await ml.api.assertTrainedModelSpaces(trainedModelId, [defaultSpaceId, idSpace1, idSpace2]); + const mlSavedObjectType = 'trained-model'; + const body = await runRequest( + { + ids: [trainedModelId], + mlSavedObjectType, + }, + idSpace2, + 200, + USER.ML_POWERUSER + ); + + expect(body).to.eql({ [trainedModelId]: { success: true, type: mlSavedObjectType } }); + await ml.api.assertTrainedModelSpaces(trainedModelId, [defaultSpaceId, idSpace1]); + }); + }); +}; From d600d3e31f50e1f664e7252ad0459abd9ae9004d Mon Sep 17 00:00:00 2001 From: Philippe Oberti Date: Fri, 30 Sep 2022 07:58:18 -0500 Subject: [PATCH 45/72] [TIP] Reorganize barchart folder within indicators module (#141856) --- .../public/common/utils/barchart.test.ts | 75 ------------------- .../public/common/utils/barchart.ts | 30 -------- .../__snapshots__/wrapper.test.tsx.snap} | 0 .../__snapshots__/barchart.test.tsx.snap} | 0 .../barchart/barchart.stories.tsx} | 8 +- .../barchart/barchart.test.tsx} | 6 +- .../barchart/barchart.tsx} | 6 +- .../index.tsx => barchart/barchart/index.ts} | 2 +- .../field_selector.test.tsx.snap} | 0 .../field_selector.stories.tsx} | 4 +- .../field_selector/field_selector.test.tsx} | 4 +- .../field_selector/field_selector.tsx} | 4 +- .../field_selector/index.ts} | 2 +- .../field_selector}/styles.ts | 0 .../index.tsx => barchart/index.ts} | 2 +- .../barchart/legend_action/index.ts | 8 ++ .../legend_action/legend_action.tsx} | 6 +- .../wrapper.stories.tsx} | 8 +- .../wrapper.test.tsx} | 5 +- .../wrapper.tsx} | 8 +- .../public/modules/indicators/hooks/index.ts | 11 +++ .../hooks/use_aggregated_indicators.test.tsx | 2 +- .../hooks/use_aggregated_indicators.ts | 10 ++- .../modules/indicators/indicators_page.tsx | 2 +- .../fetch_aggregated_indicators.test.ts | 71 +++++++++++++++++- .../services/fetch_aggregated_indicators.ts | 19 ++++- .../modules/indicators/services/index.ts | 9 +++ 27 files changed, 155 insertions(+), 147 deletions(-) delete mode 100644 x-pack/plugins/threat_intelligence/public/common/utils/barchart.test.ts delete mode 100644 x-pack/plugins/threat_intelligence/public/common/utils/barchart.ts rename x-pack/plugins/threat_intelligence/public/modules/indicators/components/{indicators_barchart_wrapper/__snapshots__/indicators_barchart_wrapper.test.tsx.snap => barchart/__snapshots__/wrapper.test.tsx.snap} (100%) rename x-pack/plugins/threat_intelligence/public/modules/indicators/components/{indicators_barchart/__snapshots__/indicators_barchart.test.tsx.snap => barchart/barchart/__snapshots__/barchart.test.tsx.snap} (100%) rename x-pack/plugins/threat_intelligence/public/modules/indicators/components/{indicators_barchart/indicators_barchart.stories.tsx => barchart/barchart/barchart.stories.tsx} (87%) rename x-pack/plugins/threat_intelligence/public/modules/indicators/components/{indicators_barchart/indicators_barchart.test.tsx => barchart/barchart/barchart.test.tsx} (88%) rename x-pack/plugins/threat_intelligence/public/modules/indicators/components/{indicators_barchart/indicators_barchart.tsx => barchart/barchart/barchart.tsx} (89%) rename x-pack/plugins/threat_intelligence/public/modules/indicators/components/{indicators_barchart/index.tsx => barchart/barchart/index.ts} (86%) rename x-pack/plugins/threat_intelligence/public/modules/indicators/components/{indicators_field_selector/__snapshots__/indicators_field_selector.test.tsx.snap => barchart/field_selector/__snapshots__/field_selector.test.tsx.snap} (100%) rename x-pack/plugins/threat_intelligence/public/modules/indicators/components/{indicators_field_selector/indicators_field_selector.stories.tsx => barchart/field_selector/field_selector.stories.tsx} (90%) rename x-pack/plugins/threat_intelligence/public/modules/indicators/components/{indicators_field_selector/indicators_field_selector.test.tsx => barchart/field_selector/field_selector.test.tsx} (90%) rename x-pack/plugins/threat_intelligence/public/modules/indicators/components/{indicators_field_selector/indicators_field_selector.tsx => barchart/field_selector/field_selector.tsx} (94%) rename x-pack/plugins/threat_intelligence/public/modules/indicators/components/{indicators_field_selector/index.tsx => barchart/field_selector/index.ts} (84%) rename x-pack/plugins/threat_intelligence/public/modules/indicators/components/{indicators_field_selector => barchart/field_selector}/styles.ts (100%) rename x-pack/plugins/threat_intelligence/public/modules/indicators/components/{indicators_barchart_wrapper/index.tsx => barchart/index.ts} (84%) create mode 100644 x-pack/plugins/threat_intelligence/public/modules/indicators/components/barchart/legend_action/index.ts rename x-pack/plugins/threat_intelligence/public/modules/indicators/components/{indicator_barchart_legend_action/indicator_barchart_legend_action.tsx => barchart/legend_action/legend_action.tsx} (89%) rename x-pack/plugins/threat_intelligence/public/modules/indicators/components/{indicators_barchart_wrapper/indicators_barchart_wrapper.stories.tsx => barchart/wrapper.stories.tsx} (96%) rename x-pack/plugins/threat_intelligence/public/modules/indicators/components/{indicators_barchart_wrapper/indicators_barchart_wrapper.test.tsx => barchart/wrapper.test.tsx} (96%) rename x-pack/plugins/threat_intelligence/public/modules/indicators/components/{indicators_barchart_wrapper/indicators_barchart_wrapper.tsx => barchart/wrapper.tsx} (90%) create mode 100644 x-pack/plugins/threat_intelligence/public/modules/indicators/hooks/index.ts create mode 100644 x-pack/plugins/threat_intelligence/public/modules/indicators/services/index.ts diff --git a/x-pack/plugins/threat_intelligence/public/common/utils/barchart.test.ts b/x-pack/plugins/threat_intelligence/public/common/utils/barchart.test.ts deleted file mode 100644 index 004071059a739..0000000000000 --- a/x-pack/plugins/threat_intelligence/public/common/utils/barchart.test.ts +++ /dev/null @@ -1,75 +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 { Aggregation } from '../../modules/indicators/services/fetch_aggregated_indicators'; -import { convertAggregationToChartSeries } from './barchart'; - -const aggregation1: Aggregation = { - events: { - buckets: [ - { - doc_count: 0, - key: 1641016800000, - key_as_string: '1 Jan 2022 06:00:00 GMT', - }, - { - doc_count: 10, - key: 1641038400000, - key_as_string: '1 Jan 2022 12:00:00 GMT', - }, - ], - }, - doc_count: 0, - key: '[Filebeat] AbuseCH Malware', -}; -const aggregation2: Aggregation = { - events: { - buckets: [ - { - doc_count: 20, - key: 1641016800000, - key_as_string: '1 Jan 2022 06:00:00 GMT', - }, - { - doc_count: 8, - key: 1641038400000, - key_as_string: '1 Jan 2022 12:00:00 GMT', - }, - ], - }, - doc_count: 0, - key: '[Filebeat] AbuseCH MalwareBazaar', -}; - -describe('barchart', () => { - describe('convertAggregationToChartSeries', () => { - it('should convert Aggregation[] to ChartSeries[]', () => { - expect(convertAggregationToChartSeries([aggregation1, aggregation2])).toEqual([ - { - x: '1 Jan 2022 06:00:00 GMT', - y: 0, - g: '[Filebeat] AbuseCH Malware', - }, - { - x: '1 Jan 2022 12:00:00 GMT', - y: 10, - g: '[Filebeat] AbuseCH Malware', - }, - { - x: '1 Jan 2022 06:00:00 GMT', - y: 20, - g: '[Filebeat] AbuseCH MalwareBazaar', - }, - { - x: '1 Jan 2022 12:00:00 GMT', - y: 8, - g: '[Filebeat] AbuseCH MalwareBazaar', - }, - ]); - }); - }); -}); diff --git a/x-pack/plugins/threat_intelligence/public/common/utils/barchart.ts b/x-pack/plugins/threat_intelligence/public/common/utils/barchart.ts deleted file mode 100644 index c994e7e9f3a3f..0000000000000 --- a/x-pack/plugins/threat_intelligence/public/common/utils/barchart.ts +++ /dev/null @@ -1,30 +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 { - Aggregation, - AggregationValue, - ChartSeries, -} from '../../modules/indicators/services/fetch_aggregated_indicators'; - -/** - * Converts data received from an Elastic search with date_histogram aggregation enabled to something usable in the "@elastic/chart" BarChart component - * @param aggregations An array of {@link Aggregation} objects to process - * @returns An array of {@link ChartSeries} directly usable in a BarChart component - */ -export const convertAggregationToChartSeries = (aggregations: Aggregation[]): ChartSeries[] => - aggregations.reduce( - (accumulated: ChartSeries[], current: Aggregation) => - accumulated.concat( - current.events.buckets.map((val: AggregationValue) => ({ - x: val.key_as_string, - y: val.doc_count, - g: current.key, - })) - ), - [] - ); diff --git a/x-pack/plugins/threat_intelligence/public/modules/indicators/components/indicators_barchart_wrapper/__snapshots__/indicators_barchart_wrapper.test.tsx.snap b/x-pack/plugins/threat_intelligence/public/modules/indicators/components/barchart/__snapshots__/wrapper.test.tsx.snap similarity index 100% rename from x-pack/plugins/threat_intelligence/public/modules/indicators/components/indicators_barchart_wrapper/__snapshots__/indicators_barchart_wrapper.test.tsx.snap rename to x-pack/plugins/threat_intelligence/public/modules/indicators/components/barchart/__snapshots__/wrapper.test.tsx.snap diff --git a/x-pack/plugins/threat_intelligence/public/modules/indicators/components/indicators_barchart/__snapshots__/indicators_barchart.test.tsx.snap b/x-pack/plugins/threat_intelligence/public/modules/indicators/components/barchart/barchart/__snapshots__/barchart.test.tsx.snap similarity index 100% rename from x-pack/plugins/threat_intelligence/public/modules/indicators/components/indicators_barchart/__snapshots__/indicators_barchart.test.tsx.snap rename to x-pack/plugins/threat_intelligence/public/modules/indicators/components/barchart/barchart/__snapshots__/barchart.test.tsx.snap diff --git a/x-pack/plugins/threat_intelligence/public/modules/indicators/components/indicators_barchart/indicators_barchart.stories.tsx b/x-pack/plugins/threat_intelligence/public/modules/indicators/components/barchart/barchart/barchart.stories.tsx similarity index 87% rename from x-pack/plugins/threat_intelligence/public/modules/indicators/components/indicators_barchart/indicators_barchart.stories.tsx rename to x-pack/plugins/threat_intelligence/public/modules/indicators/components/barchart/barchart/barchart.stories.tsx index bb0a1b1205b52..0a8831cfc6ff8 100644 --- a/x-pack/plugins/threat_intelligence/public/modules/indicators/components/indicators_barchart/indicators_barchart.stories.tsx +++ b/x-pack/plugins/threat_intelligence/public/modules/indicators/components/barchart/barchart/barchart.stories.tsx @@ -9,10 +9,10 @@ import moment from 'moment'; import React from 'react'; import { Story } from '@storybook/react'; import { TimeRangeBounds } from '@kbn/data-plugin/common'; -import { StoryProvidersComponent } from '../../../../common/mocks/story_providers'; -import { mockKibanaTimelinesService } from '../../../../common/mocks/mock_kibana_timelines_service'; -import { IndicatorsBarChart } from './indicators_barchart'; -import { ChartSeries } from '../../services/fetch_aggregated_indicators'; +import { StoryProvidersComponent } from '../../../../../common/mocks/story_providers'; +import { mockKibanaTimelinesService } from '../../../../../common/mocks/mock_kibana_timelines_service'; +import { IndicatorsBarChart } from '.'; +import { ChartSeries } from '../../../services'; const mockIndicators: ChartSeries[] = [ { diff --git a/x-pack/plugins/threat_intelligence/public/modules/indicators/components/indicators_barchart/indicators_barchart.test.tsx b/x-pack/plugins/threat_intelligence/public/modules/indicators/components/barchart/barchart/barchart.test.tsx similarity index 88% rename from x-pack/plugins/threat_intelligence/public/modules/indicators/components/indicators_barchart/indicators_barchart.test.tsx rename to x-pack/plugins/threat_intelligence/public/modules/indicators/components/barchart/barchart/barchart.test.tsx index 19542bdf200a5..4a95c0ec890fe 100644 --- a/x-pack/plugins/threat_intelligence/public/modules/indicators/components/indicators_barchart/indicators_barchart.test.tsx +++ b/x-pack/plugins/threat_intelligence/public/modules/indicators/components/barchart/barchart/barchart.test.tsx @@ -9,9 +9,9 @@ import moment from 'moment-timezone'; import React from 'react'; import { render } from '@testing-library/react'; import { TimeRangeBounds } from '@kbn/data-plugin/common'; -import { TestProvidersComponent } from '../../../../common/mocks/test_providers'; -import { IndicatorsBarChart } from './indicators_barchart'; -import { ChartSeries } from '../../services/fetch_aggregated_indicators'; +import { TestProvidersComponent } from '../../../../../common/mocks/test_providers'; +import { IndicatorsBarChart } from '.'; +import { ChartSeries } from '../../../services'; moment.suppressDeprecationWarnings = true; moment.tz.setDefault('UTC'); diff --git a/x-pack/plugins/threat_intelligence/public/modules/indicators/components/indicators_barchart/indicators_barchart.tsx b/x-pack/plugins/threat_intelligence/public/modules/indicators/components/barchart/barchart/barchart.tsx similarity index 89% rename from x-pack/plugins/threat_intelligence/public/modules/indicators/components/indicators_barchart/indicators_barchart.tsx rename to x-pack/plugins/threat_intelligence/public/modules/indicators/components/barchart/barchart/barchart.tsx index d5535f53a862f..2f4fecbd930a2 100644 --- a/x-pack/plugins/threat_intelligence/public/modules/indicators/components/indicators_barchart/indicators_barchart.tsx +++ b/x-pack/plugins/threat_intelligence/public/modules/indicators/components/barchart/barchart/barchart.tsx @@ -9,9 +9,9 @@ import React, { VFC } from 'react'; import { Axis, BarSeries, Chart, Position, ScaleType, Settings } from '@elastic/charts'; import { EuiThemeProvider } from '@elastic/eui'; import { TimeRangeBounds } from '@kbn/data-plugin/common'; -import { IndicatorBarchartLegendAction } from '../indicator_barchart_legend_action/indicator_barchart_legend_action'; -import { barChartTimeAxisLabelFormatter } from '../../../../common/utils/dates'; -import type { ChartSeries } from '../../services/fetch_aggregated_indicators'; +import { IndicatorBarchartLegendAction } from '../legend_action'; +import { barChartTimeAxisLabelFormatter } from '../../../../../common/utils/dates'; +import type { ChartSeries } from '../../../services'; const ID = 'tiIndicator'; const DEFAULT_CHART_HEIGHT = '200px'; diff --git a/x-pack/plugins/threat_intelligence/public/modules/indicators/components/indicators_barchart/index.tsx b/x-pack/plugins/threat_intelligence/public/modules/indicators/components/barchart/barchart/index.ts similarity index 86% rename from x-pack/plugins/threat_intelligence/public/modules/indicators/components/indicators_barchart/index.tsx rename to x-pack/plugins/threat_intelligence/public/modules/indicators/components/barchart/barchart/index.ts index 673d2532ad17f..6c9a52cae6c92 100644 --- a/x-pack/plugins/threat_intelligence/public/modules/indicators/components/indicators_barchart/index.tsx +++ b/x-pack/plugins/threat_intelligence/public/modules/indicators/components/barchart/barchart/index.ts @@ -5,4 +5,4 @@ * 2.0. */ -export * from './indicators_barchart'; +export * from './barchart'; diff --git a/x-pack/plugins/threat_intelligence/public/modules/indicators/components/indicators_field_selector/__snapshots__/indicators_field_selector.test.tsx.snap b/x-pack/plugins/threat_intelligence/public/modules/indicators/components/barchart/field_selector/__snapshots__/field_selector.test.tsx.snap similarity index 100% rename from x-pack/plugins/threat_intelligence/public/modules/indicators/components/indicators_field_selector/__snapshots__/indicators_field_selector.test.tsx.snap rename to x-pack/plugins/threat_intelligence/public/modules/indicators/components/barchart/field_selector/__snapshots__/field_selector.test.tsx.snap diff --git a/x-pack/plugins/threat_intelligence/public/modules/indicators/components/indicators_field_selector/indicators_field_selector.stories.tsx b/x-pack/plugins/threat_intelligence/public/modules/indicators/components/barchart/field_selector/field_selector.stories.tsx similarity index 90% rename from x-pack/plugins/threat_intelligence/public/modules/indicators/components/indicators_field_selector/indicators_field_selector.stories.tsx rename to x-pack/plugins/threat_intelligence/public/modules/indicators/components/barchart/field_selector/field_selector.stories.tsx index 4c7b9d67ea92f..e58dc9a7dcc81 100644 --- a/x-pack/plugins/threat_intelligence/public/modules/indicators/components/indicators_field_selector/indicators_field_selector.stories.tsx +++ b/x-pack/plugins/threat_intelligence/public/modules/indicators/components/barchart/field_selector/field_selector.stories.tsx @@ -8,8 +8,8 @@ import React from 'react'; import { Story } from '@storybook/react'; import { DataView, DataViewField } from '@kbn/data-views-plugin/common'; -import { RawIndicatorFieldId } from '../../../../../common/types/indicator'; -import { IndicatorsFieldSelector } from './indicators_field_selector'; +import { RawIndicatorFieldId } from '../../../../../../common/types/indicator'; +import { IndicatorsFieldSelector } from '.'; const mockIndexPattern: DataView = { fields: [ diff --git a/x-pack/plugins/threat_intelligence/public/modules/indicators/components/indicators_field_selector/indicators_field_selector.test.tsx b/x-pack/plugins/threat_intelligence/public/modules/indicators/components/barchart/field_selector/field_selector.test.tsx similarity index 90% rename from x-pack/plugins/threat_intelligence/public/modules/indicators/components/indicators_field_selector/indicators_field_selector.test.tsx rename to x-pack/plugins/threat_intelligence/public/modules/indicators/components/barchart/field_selector/field_selector.test.tsx index 0d62bbcef6219..bc41fc26c2411 100644 --- a/x-pack/plugins/threat_intelligence/public/modules/indicators/components/indicators_field_selector/indicators_field_selector.test.tsx +++ b/x-pack/plugins/threat_intelligence/public/modules/indicators/components/barchart/field_selector/field_selector.test.tsx @@ -8,8 +8,8 @@ import React from 'react'; import { render } from '@testing-library/react'; import { DataView, DataViewField } from '@kbn/data-views-plugin/common'; -import { TestProvidersComponent } from '../../../../common/mocks/test_providers'; -import { IndicatorsFieldSelector } from './indicators_field_selector'; +import { TestProvidersComponent } from '../../../../../common/mocks/test_providers'; +import { IndicatorsFieldSelector } from '.'; const mockIndexPattern: DataView = { fields: [ diff --git a/x-pack/plugins/threat_intelligence/public/modules/indicators/components/indicators_field_selector/indicators_field_selector.tsx b/x-pack/plugins/threat_intelligence/public/modules/indicators/components/barchart/field_selector/field_selector.tsx similarity index 94% rename from x-pack/plugins/threat_intelligence/public/modules/indicators/components/indicators_field_selector/indicators_field_selector.tsx rename to x-pack/plugins/threat_intelligence/public/modules/indicators/components/barchart/field_selector/field_selector.tsx index df45a003cf168..2707ba250784f 100644 --- a/x-pack/plugins/threat_intelligence/public/modules/indicators/components/indicators_field_selector/indicators_field_selector.tsx +++ b/x-pack/plugins/threat_intelligence/public/modules/indicators/components/barchart/field_selector/field_selector.tsx @@ -10,8 +10,8 @@ import { EuiComboBox } from '@elastic/eui'; import { i18n } from '@kbn/i18n'; import { DataViewField } from '@kbn/data-views-plugin/common'; import { EuiComboBoxOptionOption } from '@elastic/eui/src/components/combo_box/types'; -import { SecuritySolutionDataViewBase } from '../../../../types'; -import { RawIndicatorFieldId } from '../../../../../common/types/indicator'; +import { SecuritySolutionDataViewBase } from '../../../../../types'; +import { RawIndicatorFieldId } from '../../../../../../common/types/indicator'; import { useStyles } from './styles'; export const DROPDOWN_TEST_ID = 'tiIndicatorFieldSelectorDropdown'; diff --git a/x-pack/plugins/threat_intelligence/public/modules/indicators/components/indicators_field_selector/index.tsx b/x-pack/plugins/threat_intelligence/public/modules/indicators/components/barchart/field_selector/index.ts similarity index 84% rename from x-pack/plugins/threat_intelligence/public/modules/indicators/components/indicators_field_selector/index.tsx rename to x-pack/plugins/threat_intelligence/public/modules/indicators/components/barchart/field_selector/index.ts index 34c531bfc0b36..23409f2df2824 100644 --- a/x-pack/plugins/threat_intelligence/public/modules/indicators/components/indicators_field_selector/index.tsx +++ b/x-pack/plugins/threat_intelligence/public/modules/indicators/components/barchart/field_selector/index.ts @@ -5,4 +5,4 @@ * 2.0. */ -export * from './indicators_field_selector'; +export * from './field_selector'; diff --git a/x-pack/plugins/threat_intelligence/public/modules/indicators/components/indicators_field_selector/styles.ts b/x-pack/plugins/threat_intelligence/public/modules/indicators/components/barchart/field_selector/styles.ts similarity index 100% rename from x-pack/plugins/threat_intelligence/public/modules/indicators/components/indicators_field_selector/styles.ts rename to x-pack/plugins/threat_intelligence/public/modules/indicators/components/barchart/field_selector/styles.ts diff --git a/x-pack/plugins/threat_intelligence/public/modules/indicators/components/indicators_barchart_wrapper/index.tsx b/x-pack/plugins/threat_intelligence/public/modules/indicators/components/barchart/index.ts similarity index 84% rename from x-pack/plugins/threat_intelligence/public/modules/indicators/components/indicators_barchart_wrapper/index.tsx rename to x-pack/plugins/threat_intelligence/public/modules/indicators/components/barchart/index.ts index 252dab4799123..77ebb9fb329cb 100644 --- a/x-pack/plugins/threat_intelligence/public/modules/indicators/components/indicators_barchart_wrapper/index.tsx +++ b/x-pack/plugins/threat_intelligence/public/modules/indicators/components/barchart/index.ts @@ -5,4 +5,4 @@ * 2.0. */ -export * from './indicators_barchart_wrapper'; +export * from './wrapper'; diff --git a/x-pack/plugins/threat_intelligence/public/modules/indicators/components/barchart/legend_action/index.ts b/x-pack/plugins/threat_intelligence/public/modules/indicators/components/barchart/legend_action/index.ts new file mode 100644 index 0000000000000..ca82d7dc3a463 --- /dev/null +++ b/x-pack/plugins/threat_intelligence/public/modules/indicators/components/barchart/legend_action/index.ts @@ -0,0 +1,8 @@ +/* + * 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 './legend_action'; diff --git a/x-pack/plugins/threat_intelligence/public/modules/indicators/components/indicator_barchart_legend_action/indicator_barchart_legend_action.tsx b/x-pack/plugins/threat_intelligence/public/modules/indicators/components/barchart/legend_action/legend_action.tsx similarity index 89% rename from x-pack/plugins/threat_intelligence/public/modules/indicators/components/indicator_barchart_legend_action/indicator_barchart_legend_action.tsx rename to x-pack/plugins/threat_intelligence/public/modules/indicators/components/barchart/legend_action/legend_action.tsx index fa573e981f6ca..b792d4e222589 100644 --- a/x-pack/plugins/threat_intelligence/public/modules/indicators/components/indicator_barchart_legend_action/indicator_barchart_legend_action.tsx +++ b/x-pack/plugins/threat_intelligence/public/modules/indicators/components/barchart/legend_action/legend_action.tsx @@ -8,9 +8,9 @@ import React, { useState, VFC } from 'react'; import { EuiButtonIcon, EuiContextMenuPanel, EuiPopover, EuiToolTip } from '@elastic/eui'; import { i18n } from '@kbn/i18n'; -import { FilterInContextMenu } from '../../../query_bar/components/filter_in'; -import { FilterOutContextMenu } from '../../../query_bar/components/filter_out'; -import { AddToTimelineContextMenu } from '../../../timeline/components/add_to_timeline'; +import { FilterInContextMenu } from '../../../../query_bar/components/filter_in'; +import { FilterOutContextMenu } from '../../../../query_bar/components/filter_out'; +import { AddToTimelineContextMenu } from '../../../../timeline/components/add_to_timeline'; export const POPOVER_BUTTON_TEST_ID = 'tiBarchartPopoverButton'; export const TIMELINE_BUTTON_TEST_ID = 'tiBarchartTimelineButton'; diff --git a/x-pack/plugins/threat_intelligence/public/modules/indicators/components/indicators_barchart_wrapper/indicators_barchart_wrapper.stories.tsx b/x-pack/plugins/threat_intelligence/public/modules/indicators/components/barchart/wrapper.stories.tsx similarity index 96% rename from x-pack/plugins/threat_intelligence/public/modules/indicators/components/indicators_barchart_wrapper/indicators_barchart_wrapper.stories.tsx rename to x-pack/plugins/threat_intelligence/public/modules/indicators/components/barchart/wrapper.stories.tsx index ed7be8b06b4af..74fd94d6d562a 100644 --- a/x-pack/plugins/threat_intelligence/public/modules/indicators/components/indicators_barchart_wrapper/indicators_barchart_wrapper.stories.tsx +++ b/x-pack/plugins/threat_intelligence/public/modules/indicators/components/barchart/wrapper.stories.tsx @@ -17,12 +17,8 @@ import { IUiSettingsClient } from '@kbn/core/public'; import { StoryProvidersComponent } from '../../../../common/mocks/story_providers'; import { mockKibanaTimelinesService } from '../../../../common/mocks/mock_kibana_timelines_service'; import { DEFAULT_TIME_RANGE } from '../../../query_bar/hooks/use_filters/utils'; -import { IndicatorsBarChartWrapper } from './indicators_barchart_wrapper'; -import { - Aggregation, - AGGREGATION_NAME, - ChartSeries, -} from '../../services/fetch_aggregated_indicators'; +import { IndicatorsBarChartWrapper } from '.'; +import { Aggregation, AGGREGATION_NAME, ChartSeries } from '../../services'; export default { component: IndicatorsBarChartWrapper, diff --git a/x-pack/plugins/threat_intelligence/public/modules/indicators/components/indicators_barchart_wrapper/indicators_barchart_wrapper.test.tsx b/x-pack/plugins/threat_intelligence/public/modules/indicators/components/barchart/wrapper.test.tsx similarity index 96% rename from x-pack/plugins/threat_intelligence/public/modules/indicators/components/indicators_barchart_wrapper/indicators_barchart_wrapper.test.tsx rename to x-pack/plugins/threat_intelligence/public/modules/indicators/components/barchart/wrapper.test.tsx index ef968be02c224..577afefe80834 100644 --- a/x-pack/plugins/threat_intelligence/public/modules/indicators/components/indicators_barchart_wrapper/indicators_barchart_wrapper.test.tsx +++ b/x-pack/plugins/threat_intelligence/public/modules/indicators/components/barchart/wrapper.test.tsx @@ -10,10 +10,7 @@ import { render } from '@testing-library/react'; import { TimeRange } from '@kbn/es-query'; import { DataView, DataViewField } from '@kbn/data-views-plugin/common'; import { TestProvidersComponent } from '../../../../common/mocks/test_providers'; -import { - CHART_UPDATE_PROGRESS_TEST_ID, - IndicatorsBarChartWrapper, -} from './indicators_barchart_wrapper'; +import { CHART_UPDATE_PROGRESS_TEST_ID, IndicatorsBarChartWrapper } from '.'; import { DEFAULT_TIME_RANGE } from '../../../query_bar/hooks/use_filters/utils'; import moment from 'moment'; diff --git a/x-pack/plugins/threat_intelligence/public/modules/indicators/components/indicators_barchart_wrapper/indicators_barchart_wrapper.tsx b/x-pack/plugins/threat_intelligence/public/modules/indicators/components/barchart/wrapper.tsx similarity index 90% rename from x-pack/plugins/threat_intelligence/public/modules/indicators/components/indicators_barchart_wrapper/indicators_barchart_wrapper.tsx rename to x-pack/plugins/threat_intelligence/public/modules/indicators/components/barchart/wrapper.tsx index aabfecde30243..57ec76d17bd41 100644 --- a/x-pack/plugins/threat_intelligence/public/modules/indicators/components/indicators_barchart_wrapper/indicators_barchart_wrapper.tsx +++ b/x-pack/plugins/threat_intelligence/public/modules/indicators/components/barchart/wrapper.tsx @@ -19,9 +19,9 @@ import { TimeRange } from '@kbn/es-query'; import { TimeRangeBounds } from '@kbn/data-plugin/common'; import { SecuritySolutionDataViewBase } from '../../../../types'; import { RawIndicatorFieldId } from '../../../../../common/types/indicator'; -import { IndicatorsFieldSelector } from '../indicators_field_selector/indicators_field_selector'; -import { IndicatorsBarChart } from '../indicators_barchart/indicators_barchart'; -import { ChartSeries } from '../../services/fetch_aggregated_indicators'; +import { IndicatorsFieldSelector } from './field_selector'; +import { IndicatorsBarChart } from './barchart'; +import { ChartSeries } from '../../services'; const DEFAULT_FIELD = RawIndicatorFieldId.Feed; @@ -33,7 +33,7 @@ export interface IndicatorsBarChartWrapperProps { */ timeRange?: TimeRange; /** - * List of fields coming from the Security Solution sourcerer data view, passed down to the {@link IndicatorFieldSelector} to populate the dropdown. + * List of fields coming from the Security Solution sourcerer data view, passed down to the {@link IndicatorsFieldSelector} to populate the dropdown. */ indexPattern: SecuritySolutionDataViewBase; diff --git a/x-pack/plugins/threat_intelligence/public/modules/indicators/hooks/index.ts b/x-pack/plugins/threat_intelligence/public/modules/indicators/hooks/index.ts new file mode 100644 index 0000000000000..23461fc809957 --- /dev/null +++ b/x-pack/plugins/threat_intelligence/public/modules/indicators/hooks/index.ts @@ -0,0 +1,11 @@ +/* + * 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 './use_aggregated_indicators'; +export * from './use_indicators_filters_context'; +export * from './use_indicators_total_count'; +export * from './use_sourcerer_data_view'; diff --git a/x-pack/plugins/threat_intelligence/public/modules/indicators/hooks/use_aggregated_indicators.test.tsx b/x-pack/plugins/threat_intelligence/public/modules/indicators/hooks/use_aggregated_indicators.test.tsx index 21bff01fab760..f067df33d79d4 100644 --- a/x-pack/plugins/threat_intelligence/public/modules/indicators/hooks/use_aggregated_indicators.test.tsx +++ b/x-pack/plugins/threat_intelligence/public/modules/indicators/hooks/use_aggregated_indicators.test.tsx @@ -12,7 +12,7 @@ import { mockedTimefilterService, TestProvidersComponent, } from '../../../common/mocks/test_providers'; -import { createFetchAggregatedIndicators } from '../services/fetch_aggregated_indicators'; +import { createFetchAggregatedIndicators } from '../services'; jest.mock('../services/fetch_aggregated_indicators'); diff --git a/x-pack/plugins/threat_intelligence/public/modules/indicators/hooks/use_aggregated_indicators.ts b/x-pack/plugins/threat_intelligence/public/modules/indicators/hooks/use_aggregated_indicators.ts index 06b99202288b6..dd603d387c17f 100644 --- a/x-pack/plugins/threat_intelligence/public/modules/indicators/hooks/use_aggregated_indicators.ts +++ b/x-pack/plugins/threat_intelligence/public/modules/indicators/hooks/use_aggregated_indicators.ts @@ -13,7 +13,7 @@ import { useInspector } from '../../../hooks/use_inspector'; import { RawIndicatorFieldId } from '../../../../common/types/indicator'; import { useKibana } from '../../../hooks/use_kibana'; import { DEFAULT_TIME_RANGE } from '../../query_bar/hooks/use_filters/utils'; -import { useSourcererDataView } from './use_sourcerer_data_view'; +import { useSourcererDataView } from '.'; import { ChartSeries, createFetchAggregatedIndicators, @@ -22,11 +22,17 @@ import { export interface UseAggregatedIndicatorsParam { /** - * From and To values passed to the {@link }useAggregatedIndicators} hook + * From and To values passed to the {@link useAggregatedIndicators} hook * to query indicators for the Indicators barchart. */ timeRange?: TimeRange; + /** + * Filters data passed to the {@link useAggregatedIndicators} hook to query indicators. + */ filters: Filter[]; + /** + * Query data passed to the {@link useAggregatedIndicators} hook to query indicators. + */ filterQuery: Query; } diff --git a/x-pack/plugins/threat_intelligence/public/modules/indicators/indicators_page.tsx b/x-pack/plugins/threat_intelligence/public/modules/indicators/indicators_page.tsx index 5ad0413003388..e0b5158274c15 100644 --- a/x-pack/plugins/threat_intelligence/public/modules/indicators/indicators_page.tsx +++ b/x-pack/plugins/threat_intelligence/public/modules/indicators/indicators_page.tsx @@ -7,7 +7,7 @@ import React, { FC, VFC } from 'react'; import { QueryClient, QueryClientProvider } from '@tanstack/react-query'; -import { IndicatorsBarChartWrapper } from './components/indicators_barchart_wrapper/indicators_barchart_wrapper'; +import { IndicatorsBarChartWrapper } from './components/barchart'; import { IndicatorsTable } from './components/indicators_table/indicators_table'; import { useIndicators } from './hooks/use_indicators'; import { DefaultPageLayout } from '../../components/layout'; diff --git a/x-pack/plugins/threat_intelligence/public/modules/indicators/services/fetch_aggregated_indicators.test.ts b/x-pack/plugins/threat_intelligence/public/modules/indicators/services/fetch_aggregated_indicators.test.ts index c5503f1b32a0c..007623943c531 100644 --- a/x-pack/plugins/threat_intelligence/public/modules/indicators/services/fetch_aggregated_indicators.test.ts +++ b/x-pack/plugins/threat_intelligence/public/modules/indicators/services/fetch_aggregated_indicators.test.ts @@ -8,12 +8,54 @@ import { mockedQueryService, mockedSearchService } from '../../../common/mocks/test_providers'; import { BehaviorSubject, throwError } from 'rxjs'; import { RequestAdapter } from '@kbn/inspector-plugin/common'; -import { AGGREGATION_NAME, createFetchAggregatedIndicators } from './fetch_aggregated_indicators'; +import { + Aggregation, + AGGREGATION_NAME, + convertAggregationToChartSeries, + createFetchAggregatedIndicators, +} from '.'; const aggregationResponse = { rawResponse: { aggregations: { [AGGREGATION_NAME]: { buckets: [] } } }, }; +const aggregation1: Aggregation = { + events: { + buckets: [ + { + doc_count: 0, + key: 1641016800000, + key_as_string: '1 Jan 2022 06:00:00 GMT', + }, + { + doc_count: 10, + key: 1641038400000, + key_as_string: '1 Jan 2022 12:00:00 GMT', + }, + ], + }, + doc_count: 0, + key: '[Filebeat] AbuseCH Malware', +}; +const aggregation2: Aggregation = { + events: { + buckets: [ + { + doc_count: 20, + key: 1641016800000, + key_as_string: '1 Jan 2022 06:00:00 GMT', + }, + { + doc_count: 8, + key: 1641038400000, + key_as_string: '1 Jan 2022 12:00:00 GMT', + }, + ], + }, + doc_count: 0, + key: '[Filebeat] AbuseCH MalwareBazaar', +}; + describe('FetchAggregatedIndicatorsService', () => { beforeEach(jest.clearAllMocks); @@ -115,3 +157,30 @@ describe('FetchAggregatedIndicatorsService', () => { }); }); }); + +describe('convertAggregationToChartSeries', () => { + it('should convert Aggregation[] to ChartSeries[]', () => { + expect(convertAggregationToChartSeries([aggregation1, aggregation2])).toEqual([ + { + x: '1 Jan 2022 06:00:00 GMT', + y: 0, + g: '[Filebeat] AbuseCH Malware', + }, + { + x: '1 Jan 2022 12:00:00 GMT', + y: 10, + g: '[Filebeat] AbuseCH Malware', + }, + { + x: '1 Jan 2022 06:00:00 GMT', + y: 20, + g: '[Filebeat] AbuseCH MalwareBazaar', + }, + { + x: '1 Jan 2022 12:00:00 GMT', + y: 8, + g: '[Filebeat] AbuseCH MalwareBazaar', + }, + ]); + }); +}); diff --git a/x-pack/plugins/threat_intelligence/public/modules/indicators/services/fetch_aggregated_indicators.ts b/x-pack/plugins/threat_intelligence/public/modules/indicators/services/fetch_aggregated_indicators.ts index 6cf0fea18b2c3..0edc0cca34e5c 100644 --- a/x-pack/plugins/threat_intelligence/public/modules/indicators/services/fetch_aggregated_indicators.ts +++ b/x-pack/plugins/threat_intelligence/public/modules/indicators/services/fetch_aggregated_indicators.ts @@ -9,7 +9,6 @@ import { TimeRangeBounds } from '@kbn/data-plugin/common'; import type { ISearchStart, QueryStart } from '@kbn/data-plugin/public'; import type { Filter, Query, TimeRange } from '@kbn/es-query'; import { RequestAdapter } from '@kbn/inspector-plugin/common'; -import { convertAggregationToChartSeries } from '../../../common/utils/barchart'; import { calculateBarchartColumnTimeInterval } from '../../../common/utils/dates'; import { RawIndicatorFieldId } from '../../../../common/types/indicator'; import { getIndicatorQueryParams } from '../utils/get_indicator_query_params'; @@ -55,6 +54,24 @@ export interface FetchAggregatedIndicatorsParams { field: string; } +/** + * Converts data received from an Elastic search with date_histogram aggregation enabled to something usable in the "@elastic/chart" BarChart component + * @param aggregations An array of {@link Aggregation} objects to process + * @returns An array of {@link ChartSeries} directly usable in a BarChart component + */ +export const convertAggregationToChartSeries = (aggregations: Aggregation[]): ChartSeries[] => + aggregations.reduce( + (accumulated: ChartSeries[], current: Aggregation) => + accumulated.concat( + current.events.buckets.map((val: AggregationValue) => ({ + x: val.key_as_string, + y: val.doc_count, + g: current.key, + })) + ), + [] + ); + export const createFetchAggregatedIndicators = ({ inspectorAdapter, diff --git a/x-pack/plugins/threat_intelligence/public/modules/indicators/services/index.ts b/x-pack/plugins/threat_intelligence/public/modules/indicators/services/index.ts new file mode 100644 index 0000000000000..3215ff6621597 --- /dev/null +++ b/x-pack/plugins/threat_intelligence/public/modules/indicators/services/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; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +export * from './fetch_aggregated_indicators'; +export * from './fetch_indicators'; From 85463eae67cb49b4fbc1e4f2215397c747238d24 Mon Sep 17 00:00:00 2001 From: Marta Bondyra <4283304+mbondyra@users.noreply.github.com> Date: Fri, 30 Sep 2022 15:06:42 +0200 Subject: [PATCH 46/72] [Lens] fix drag and drop in SQL languages (#142315) Co-authored-by: Kibana Machine <42973632+kibanamachine@users.noreply.github.com> --- .../dimension_panel/droppable/get_drop_props.ts | 4 ++-- .../dimension_panel/droppable/on_drop_handler.ts | 6 +++--- .../lens/public/indexpattern_datasource/indexpattern.tsx | 4 ++-- x-pack/plugins/lens/public/utils.ts | 8 ++++++++ .../lens/public/visualizations/xy/annotations/helpers.tsx | 4 ++-- .../lens/public/visualizations/xy/visualization.tsx | 4 ++-- 6 files changed, 19 insertions(+), 11 deletions(-) diff --git a/x-pack/plugins/lens/public/indexpattern_datasource/dimension_panel/droppable/get_drop_props.ts b/x-pack/plugins/lens/public/indexpattern_datasource/dimension_panel/droppable/get_drop_props.ts index cb1501d1f0ed6..a1f16006fd803 100644 --- a/x-pack/plugins/lens/public/indexpattern_datasource/dimension_panel/droppable/get_drop_props.ts +++ b/x-pack/plugins/lens/public/indexpattern_datasource/dimension_panel/droppable/get_drop_props.ts @@ -18,7 +18,7 @@ import { getOperationDisplay, hasOperationSupportForMultipleFields, } from '../../operations'; -import { isDraggedField, isOperationFromTheSameGroup } from '../../../utils'; +import { isDraggedDataViewField, isOperationFromTheSameGroup } from '../../../utils'; import { hasField } from '../../pure_utils'; import { DragContextState } from '../../../drag_drop/providers'; import { OperationMetadata, DraggedField } from '../../../types'; @@ -82,7 +82,7 @@ export function getDropProps( dataView: indexPatterns[state.layers[target.layerId].indexPatternId], }; - if (isDraggedField(source)) { + if (isDraggedDataViewField(source)) { return getDropPropsForField({ ...props, source, target: targetProps }); } diff --git a/x-pack/plugins/lens/public/indexpattern_datasource/dimension_panel/droppable/on_drop_handler.ts b/x-pack/plugins/lens/public/indexpattern_datasource/dimension_panel/droppable/on_drop_handler.ts index 77444e8ae59ee..232c96610f04c 100644 --- a/x-pack/plugins/lens/public/indexpattern_datasource/dimension_panel/droppable/on_drop_handler.ts +++ b/x-pack/plugins/lens/public/indexpattern_datasource/dimension_panel/droppable/on_drop_handler.ts @@ -4,7 +4,7 @@ * 2.0; you may not use this file except in compliance with the Elastic License * 2.0. */ -import { isDraggedField } from '../../../utils'; +import { isDraggedDataViewField } from '../../../utils'; import { DatasourceDimensionDropHandlerProps, DragDropOperation, @@ -49,7 +49,7 @@ interface DropHandlerProps { export function onDrop(props: DatasourceDimensionDropHandlerProps) { const { target, source, dropType, state, indexPatterns } = props; - if (isDraggedField(source) && isFieldDropType(dropType)) { + if (isDraggedDataViewField(source) && isFieldDropType(dropType)) { return onFieldDrop( { ...props, @@ -143,7 +143,7 @@ function onFieldDrop(props: DropHandlerProps, shouldAddField?: boo ); if ( - !isDraggedField(source) || + !isDraggedDataViewField(source) || !newOperation || (shouldAddField && !hasOperationSupportForMultipleFields(indexPattern, targetColumn, undefined, source.field)) diff --git a/x-pack/plugins/lens/public/indexpattern_datasource/indexpattern.tsx b/x-pack/plugins/lens/public/indexpattern_datasource/indexpattern.tsx index c16ced9ab78f8..fb31c3c1a9a71 100644 --- a/x-pack/plugins/lens/public/indexpattern_datasource/indexpattern.tsx +++ b/x-pack/plugins/lens/public/indexpattern_datasource/indexpattern.tsx @@ -69,7 +69,7 @@ import { isColumnInvalid, cloneLayer, } from './utils'; -import { isDraggedField } from '../utils'; +import { isDraggedDataViewField } from '../utils'; import { normalizeOperationDataType } from './pure_utils'; import { LayerPanel } from './layerpanel'; import { @@ -613,7 +613,7 @@ export function getIndexPatternDatasource({ }; }, getDatasourceSuggestionsForField(state, draggedField, filterLayers, indexPatterns) { - return isDraggedField(draggedField) + return isDraggedDataViewField(draggedField) ? getDatasourceSuggestionsForField( state, draggedField.indexPatternId, diff --git a/x-pack/plugins/lens/public/utils.ts b/x-pack/plugins/lens/public/utils.ts index 181ea104ffa71..c40403cfd0928 100644 --- a/x-pack/plugins/lens/public/utils.ts +++ b/x-pack/plugins/lens/public/utils.ts @@ -248,6 +248,14 @@ export const DONT_CLOSE_DIMENSION_CONTAINER_ON_CLICK_CLASS = 'lensDontCloseDimensionContainerOnClick'; export function isDraggedField(fieldCandidate: unknown): fieldCandidate is DraggedField { + return ( + typeof fieldCandidate === 'object' && + fieldCandidate !== null && + ['id', 'field'].every((prop) => prop in fieldCandidate) + ); +} + +export function isDraggedDataViewField(fieldCandidate: unknown): fieldCandidate is DraggedField { return ( typeof fieldCandidate === 'object' && fieldCandidate !== null && diff --git a/x-pack/plugins/lens/public/visualizations/xy/annotations/helpers.tsx b/x-pack/plugins/lens/public/visualizations/xy/annotations/helpers.tsx index 3c54d67c49131..990d0dd8f94d0 100644 --- a/x-pack/plugins/lens/public/visualizations/xy/annotations/helpers.tsx +++ b/x-pack/plugins/lens/public/visualizations/xy/annotations/helpers.tsx @@ -15,7 +15,7 @@ import { } from '@kbn/event-annotation-plugin/public'; import { EventAnnotationConfig } from '@kbn/event-annotation-plugin/common'; import { IconChartBarAnnotations } from '@kbn/chart-icons'; -import { isDraggedField } from '../../../utils'; +import { isDraggedDataViewField } from '../../../utils'; import { layerTypes } from '../../../../common'; import type { FramePublicAPI, Visualization } from '../../../types'; import { isHorizontalChart } from '../state_helpers'; @@ -185,7 +185,7 @@ export const onAnnotationDrop: Visualization['onDrop'] = ({ const targetAnnotation = targetLayer.annotations.find(({ id }) => id === target.columnId); const targetDataView = frame.dataViews.indexPatterns[targetLayer.indexPatternId]; - if (isDraggedField(source)) { + if (isDraggedDataViewField(source)) { const timeField = targetDataView.timeFieldName; switch (dropType) { case 'field_add': diff --git a/x-pack/plugins/lens/public/visualizations/xy/visualization.tsx b/x-pack/plugins/lens/public/visualizations/xy/visualization.tsx index 6184e3c607a82..a5ccfc02b0fa3 100644 --- a/x-pack/plugins/lens/public/visualizations/xy/visualization.tsx +++ b/x-pack/plugins/lens/public/visualizations/xy/visualization.tsx @@ -21,7 +21,7 @@ import type { IStorageWrapper } from '@kbn/kibana-utils-plugin/public'; import { UnifiedSearchPublicPluginStart } from '@kbn/unified-search-plugin/public'; import { generateId } from '../../id_generator'; import { - isDraggedField, + isDraggedDataViewField, isOperationFromCompatibleGroup, isOperationFromTheSameGroup, renewIDs, @@ -381,7 +381,7 @@ export const getXyVisualization = ({ return; } - if (isDraggedField(dropProps.source)) { + if (isDraggedDataViewField(dropProps.source)) { if (dropProps.source.field.type === 'document') { return; } From 6157f0be8639ec55268ba68ebd3b9f654891c590 Mon Sep 17 00:00:00 2001 From: Rodney Norris Date: Fri, 30 Sep 2022 08:32:23 -0500 Subject: [PATCH 47/72] [Enterprise Search] Add ML Inference Pipeline - Review Step (#142133) * refactor: ml inference config live validation migration validation from when you click create to be a selector that updates as the form values are updated. This is to make it easier to enable/disable the continue button as we introduce steps to the ml inference modal. * ml inference modal: introduce steps Added footer, steps and placeholder components for the test and review steps of the add ml inference pipeline modal. * refactor: abstract ml inference body gen to common Abstracted the code to generate the ml inference pipeline body from the server to common utility functions. We will need these functions in the frontend to display the JSON for review. And we want to use the same code on the frontend and backend. * add ml inference pipeline review Added review component for the ml inference pipeline using a selector in the kea logic to generate the pipeline. In the future this may need to be a part of the state so it can be modified, but for now a selector seemed to fit better when it's read-only. Co-authored-by: Kibana Machine <42973632+kibanamachine@users.noreply.github.com> --- .../ml_inference_pipeline/index.test.ts | 52 ++++++ .../common/ml_inference_pipeline/index.ts | 96 +++++++++++ .../common/types/pipelines.ts | 6 + .../add_ml_inference_pipeline_modal.tsx | 158 ++++++++++++++---- .../ml_inference/configure_pipeline.tsx | 7 +- .../ml_inference/ml_inference_logic.ts | 70 ++++++-- .../ml_inference/review_pipeline.tsx | 49 ++++++ .../pipelines/ml_inference/test_pipeline.tsx | 12 ++ .../pipelines/ml_inference/types.ts | 2 + .../pipelines/ml_inference/utils.ts | 35 +++- .../applications/shared/constants/actions.ts | 4 + ...h_ml_inference_pipeline_processors.test.ts | 40 ----- .../fetch_ml_inference_pipeline_processors.ts | 15 +- .../pipelines/create_pipeline_definitions.ts | 53 +----- .../utils/create_ml_inference_pipeline.ts | 2 +- .../utils/ml_inference_pipeline_utils.ts | 8 +- 16 files changed, 443 insertions(+), 166 deletions(-) create mode 100644 x-pack/plugins/enterprise_search/common/ml_inference_pipeline/index.test.ts create mode 100644 x-pack/plugins/enterprise_search/common/ml_inference_pipeline/index.ts create mode 100644 x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/components/search_index/pipelines/ml_inference/review_pipeline.tsx create mode 100644 x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/components/search_index/pipelines/ml_inference/test_pipeline.tsx diff --git a/x-pack/plugins/enterprise_search/common/ml_inference_pipeline/index.test.ts b/x-pack/plugins/enterprise_search/common/ml_inference_pipeline/index.test.ts new file mode 100644 index 0000000000000..29becfa3e99ae --- /dev/null +++ b/x-pack/plugins/enterprise_search/common/ml_inference_pipeline/index.test.ts @@ -0,0 +1,52 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import { MlTrainedModelConfig } from '@elastic/elasticsearch/lib/api/typesWithBodyKey'; +import { BUILT_IN_MODEL_TAG } from '@kbn/ml-plugin/common/constants/data_frame_analytics'; + +import { getMlModelTypesForModelConfig, BUILT_IN_MODEL_TAG as LOCAL_BUILT_IN_MODEL_TAG } from '.'; + +describe('getMlModelTypesForModelConfig lib function', () => { + const mockModel: MlTrainedModelConfig = { + inference_config: { + ner: {}, + }, + input: { + field_names: [], + }, + model_id: 'test_id', + model_type: 'pytorch', + tags: ['test_tag'], + }; + const builtInMockModel: MlTrainedModelConfig = { + inference_config: { + text_classification: {}, + }, + input: { + field_names: [], + }, + model_id: 'test_id', + model_type: 'lang_ident', + tags: [BUILT_IN_MODEL_TAG], + }; + + it('should return the model type and inference config type', () => { + const expected = ['pytorch', 'ner']; + const response = getMlModelTypesForModelConfig(mockModel); + expect(response.sort()).toEqual(expected.sort()); + }); + + it('should include the built in type', () => { + const expected = ['lang_ident', 'text_classification', BUILT_IN_MODEL_TAG]; + const response = getMlModelTypesForModelConfig(builtInMockModel); + expect(response.sort()).toEqual(expected.sort()); + }); + + it('local BUILT_IN_MODEL_TAG matches ml plugin', () => { + expect(LOCAL_BUILT_IN_MODEL_TAG).toEqual(BUILT_IN_MODEL_TAG); + }); +}); diff --git a/x-pack/plugins/enterprise_search/common/ml_inference_pipeline/index.ts b/x-pack/plugins/enterprise_search/common/ml_inference_pipeline/index.ts new file mode 100644 index 0000000000000..3bc43fa14d7b2 --- /dev/null +++ b/x-pack/plugins/enterprise_search/common/ml_inference_pipeline/index.ts @@ -0,0 +1,96 @@ +/* + * 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 { MlTrainedModelConfig } from '@elastic/elasticsearch/lib/api/typesWithBodyKey'; + +import { MlInferencePipeline } from '../types/pipelines'; + +// Getting an error importing this from @kbn/ml-plugin/common/constants/data_frame_analytics' +// So defining it locally for now with a test to make sure it matches. +export const BUILT_IN_MODEL_TAG = 'prepackaged'; + +export interface MlInferencePipelineParams { + description?: string; + destinationField: string; + model: MlTrainedModelConfig; + pipelineName: string; + sourceField: string; +} + +/** + * Generates the pipeline body for a machine learning inference pipeline + * @param pipelineConfiguration machine learning inference pipeline configuration parameters + * @returns pipeline body + */ +export const generateMlInferencePipelineBody = ({ + description, + destinationField, + model, + pipelineName, + sourceField, +}: MlInferencePipelineParams): MlInferencePipeline => { + // if model returned no input field, insert a placeholder + const modelInputField = + model.input?.field_names?.length > 0 ? model.input.field_names[0] : 'MODEL_INPUT_FIELD'; + return { + description: description ?? '', + processors: [ + { + remove: { + field: `ml.inference.${destinationField}`, + ignore_missing: true, + }, + }, + { + inference: { + field_map: { + [sourceField]: modelInputField, + }, + model_id: model.model_id, + target_field: `ml.inference.${destinationField}`, + }, + }, + { + append: { + field: '_source._ingest.processors', + value: [ + { + model_version: model.version, + pipeline: pipelineName, + processed_timestamp: '{{{ _ingest.timestamp }}}', + types: getMlModelTypesForModelConfig(model), + }, + ], + }, + }, + ], + version: 1, + }; +}; + +/** + * Parses model types list from the given configuration of a trained machine learning model + * @param trainedModel configuration for a trained machine learning model + * @returns list of model types + */ +export const getMlModelTypesForModelConfig = (trainedModel: MlTrainedModelConfig): string[] => { + if (!trainedModel) return []; + + const isBuiltIn = trainedModel.tags?.includes(BUILT_IN_MODEL_TAG); + + return [ + trainedModel.model_type, + ...Object.keys(trainedModel.inference_config || {}), + ...(isBuiltIn ? [BUILT_IN_MODEL_TAG] : []), + ].filter((type): type is string => type !== undefined); +}; + +export const formatPipelineName = (rawName: string) => + rawName + .trim() + .replace(/\s+/g, '_') // Convert whitespaces to underscores + .toLowerCase(); diff --git a/x-pack/plugins/enterprise_search/common/types/pipelines.ts b/x-pack/plugins/enterprise_search/common/types/pipelines.ts index 269f7149cc7b3..8652eb57f9b48 100644 --- a/x-pack/plugins/enterprise_search/common/types/pipelines.ts +++ b/x-pack/plugins/enterprise_search/common/types/pipelines.ts @@ -5,6 +5,8 @@ * 2.0. */ +import { IngestPipeline } from '@elastic/elasticsearch/lib/api/types'; + export interface InferencePipeline { modelState: TrainedModelState; modelStateReason?: string; @@ -19,3 +21,7 @@ export enum TrainedModelState { Started = 'started', Failed = 'failed', } + +export interface MlInferencePipeline extends IngestPipeline { + version?: number; +} diff --git a/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/components/search_index/pipelines/ml_inference/add_ml_inference_pipeline_modal.tsx b/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/components/search_index/pipelines/ml_inference/add_ml_inference_pipeline_modal.tsx index 8b2cfb1d4b5d8..916a295df0050 100644 --- a/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/components/search_index/pipelines/ml_inference/add_ml_inference_pipeline_modal.tsx +++ b/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/components/search_index/pipelines/ml_inference/add_ml_inference_pipeline_modal.tsx @@ -15,6 +15,8 @@ import { EuiCallOut, EuiFlexGroup, EuiFlexItem, + EuiStepsHorizontal, + EuiStepsHorizontalProps, EuiModal, EuiModalBody, EuiModalFooter, @@ -26,11 +28,18 @@ import { import { i18n } from '@kbn/i18n'; +import { + BACK_BUTTON_LABEL, + CANCEL_BUTTON_LABEL, + CONTINUE_BUTTON_LABEL, +} from '../../../../../shared/constants'; import { IndexNameLogic } from '../../index_name_logic'; import { ConfigurePipeline } from './configure_pipeline'; -import { MLInferenceLogic, AddInferencePipelineModal } from './ml_inference_logic'; +import { AddInferencePipelineSteps, MLInferenceLogic } from './ml_inference_logic'; import { NoModelsPanel } from './no_models'; +import { ReviewPipeline } from './review_pipeline'; +import { TestPipeline } from './test_pipeline'; interface AddMLInferencePipelineModalProps { onClose: () => void; @@ -64,15 +73,13 @@ export const AddMLInferencePipelineModal: React.FC { - const { pipelineName, modelID, sourceField } = configuration; - return pipelineName.trim().length === 0 || modelID.length === 0 || sourceField.length === 0; -}; - const AddProcessorContent: React.FC = ({ onClose }) => { - const { addInferencePipelineModal, createErrors, supportedMLModels, isLoading } = - useValues(MLInferenceLogic); - const { createPipeline } = useActions(MLInferenceLogic); + const { + createErrors, + supportedMLModels, + isLoading, + addInferencePipelineModal: { step }, + } = useValues(MLInferenceLogic); if (isLoading) { return ( @@ -103,37 +110,126 @@ const AddProcessorContent: React.FC = ({ onClo )} - + + {step === AddInferencePipelineSteps.Configuration && } + {step === AddInferencePipelineSteps.Test && } + {step === AddInferencePipelineSteps.Review && } - - - - - - {i18n.translate( - 'xpack.enterpriseSearch.content.indices.pipelines.addInferencePipelineModal.footer.cancel', - { - defaultMessage: 'Cancel', - } - )} + + + ); +}; + +const ModalSteps: React.FC = () => { + const { + addInferencePipelineModal: { step }, + isPipelineDataValid, + } = useValues(MLInferenceLogic); + const { setAddInferencePipelineStep } = useActions(MLInferenceLogic); + const navSteps: EuiStepsHorizontalProps['steps'] = [ + { + onClick: () => setAddInferencePipelineStep(AddInferencePipelineSteps.Configuration), + status: isPipelineDataValid ? 'complete' : 'disabled', + title: i18n.translate( + 'xpack.enterpriseSearch.content.indices.transforms.addInferencePipelineModal.steps.configure.title', + { + defaultMessage: 'Configure', + } + ), + }, + { + onClick: () => setAddInferencePipelineStep(AddInferencePipelineSteps.Test), + status: isPipelineDataValid ? 'incomplete' : 'disabled', + title: i18n.translate( + 'xpack.enterpriseSearch.content.indices.transforms.addInferencePipelineModal.steps.test.title', + { + defaultMessage: 'Test', + } + ), + }, + { + onClick: () => setAddInferencePipelineStep(AddInferencePipelineSteps.Review), + status: isPipelineDataValid ? 'incomplete' : 'disabled', + title: i18n.translate( + 'xpack.enterpriseSearch.content.indices.transforms.addInferencePipelineModal.steps.review.title', + { + defaultMessage: 'Review', + } + ), + }, + ]; + switch (step) { + case AddInferencePipelineSteps.Configuration: + navSteps[0].status = isPipelineDataValid ? 'complete' : 'current'; + break; + case AddInferencePipelineSteps.Test: + navSteps[1].status = 'current'; + break; + case AddInferencePipelineSteps.Review: + navSteps[2].status = 'current'; + break; + } + return ; +}; + +const ModalFooter: React.FC = ({ onClose }) => { + const { addInferencePipelineModal: modal, isPipelineDataValid } = useValues(MLInferenceLogic); + const { createPipeline, setAddInferencePipelineStep } = useActions(MLInferenceLogic); + + let nextStep: AddInferencePipelineSteps | undefined; + let previousStep: AddInferencePipelineSteps | undefined; + switch (modal.step) { + case AddInferencePipelineSteps.Test: + nextStep = AddInferencePipelineSteps.Review; + previousStep = AddInferencePipelineSteps.Configuration; + break; + case AddInferencePipelineSteps.Review: + previousStep = AddInferencePipelineSteps.Test; + break; + case AddInferencePipelineSteps.Configuration: + nextStep = AddInferencePipelineSteps.Test; + break; + } + return ( + + + + {previousStep !== undefined ? ( + setAddInferencePipelineStep(previousStep as AddInferencePipelineSteps)} + > + {BACK_BUTTON_LABEL} - - + ) : null} + + + + {CANCEL_BUTTON_LABEL} + + + {nextStep !== undefined ? ( setAddInferencePipelineStep(nextStep as AddInferencePipelineSteps)} + disabled={!isPipelineDataValid} > + {CONTINUE_BUTTON_LABEL} + + ) : ( + {i18n.translate( - 'xpack.enterpriseSearch.content.indices.pipelines.addInferencePipelineModal.footer.create', + 'xpack.enterpriseSearch.content.indices.transforms.addInferencePipelineModal.footer.create', { defaultMessage: 'Create', } )} - - - - + )} + + + ); }; diff --git a/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/components/search_index/pipelines/ml_inference/configure_pipeline.tsx b/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/components/search_index/pipelines/ml_inference/configure_pipeline.tsx index 199d62f914f03..b1d8fd4d074a8 100644 --- a/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/components/search_index/pipelines/ml_inference/configure_pipeline.tsx +++ b/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/components/search_index/pipelines/ml_inference/configure_pipeline.tsx @@ -36,6 +36,7 @@ export const ConfigurePipeline: React.FC = () => { const { destinationField, modelID, pipelineName, sourceField } = configuration; const models = supportedMLModels ?? []; + const nameError = formErrors.pipelineName !== undefined && pipelineName.length > 0; return ( <> @@ -73,7 +74,7 @@ export const ConfigurePipeline: React.FC = () => { } )} helpText={ - formErrors.pipelineName === undefined && + !nameError && i18n.translate( 'xpack.enterpriseSearch.content.indices.pipelines.addInferencePipelineModal.steps.configure.name.helpText', { @@ -82,8 +83,8 @@ export const ConfigurePipeline: React.FC = () => { } ) } - error={formErrors.pipelineName} - isInvalid={formErrors.pipelineName !== undefined} + error={nameError && formErrors.pipelineName} + isInvalid={nameError} > void; createApiError: (error: HttpError) => HttpError; createApiSuccess: typeof CreateMlInferencePipelineApiLogic.actions.apiSuccess; createPipeline: () => void; @@ -49,10 +59,10 @@ interface MLInferenceProcessorsActions { makeMappingRequest: typeof MappingsApiLogic.actions.makeRequest; mappingsApiError(error: HttpError): HttpError; mlModelsApiError(error: HttpError): HttpError; - setCreateErrors(errors: string[]): { errors: string[] }; - setFormErrors: (inputErrors: AddInferencePipelineFormErrors) => { - inputErrors: AddInferencePipelineFormErrors; + setAddInferencePipelineStep: (step: AddInferencePipelineSteps) => { + step: AddInferencePipelineSteps; }; + setCreateErrors(errors: string[]): { errors: string[] }; setIndexName: (indexName: string) => { indexName: string }; setInferencePipelineConfiguration: (configuration: InferencePipelineConfiguration) => { configuration: InferencePipelineConfiguration; @@ -62,6 +72,7 @@ interface MLInferenceProcessorsActions { export interface AddInferencePipelineModal { configuration: InferencePipelineConfiguration; indexName: string; + step: AddInferencePipelineSteps; } interface MLInferenceProcessorsValues { @@ -69,8 +80,10 @@ interface MLInferenceProcessorsValues { createErrors: string[]; formErrors: AddInferencePipelineFormErrors; isLoading: boolean; + isPipelineDataValid: boolean; mappingData: typeof MappingsApiLogic.values.data; mappingStatus: Status; + mlInferencePipeline?: MlInferencePipeline; mlModelsData: typeof MLModelsApiLogic.values.data; mlModelsStatus: typeof MLModelsApiLogic.values.apiStatus; sourceFields: string[] | undefined; @@ -83,6 +96,7 @@ export const MLInferenceLogic = kea< actions: { clearFormErrors: true, createPipeline: true, + setAddInferencePipelineStep: (step: AddInferencePipelineSteps) => ({ step }), setCreateErrors: (errors: string[]) => ({ errors }), setFormErrors: (inputErrors: AddInferencePipelineFormErrors) => ({ inputErrors }), setIndexName: (indexName: string) => ({ indexName }), @@ -124,12 +138,6 @@ export const MLInferenceLogic = kea< const { addInferencePipelineModal: { configuration, indexName }, } = values; - const validationErrors = validateInferencePipelineConfiguration(configuration); - if (validationErrors !== undefined) { - actions.setFormErrors(validationErrors); - return; - } - actions.clearFormErrors(); actions.makeCreatePipelineRequest({ indexName, @@ -155,8 +163,10 @@ export const MLInferenceLogic = kea< ...EMPTY_PIPELINE_CONFIGURATION, }, indexName: '', + step: AddInferencePipelineSteps.Configuration, }, { + setAddInferencePipelineStep: (modal, { step }) => ({ ...modal, step }), setIndexName: (modal, { indexName }) => ({ ...modal, indexName }), setInferencePipelineConfiguration: (modal, { configuration }) => ({ ...modal, @@ -171,21 +181,47 @@ export const MLInferenceLogic = kea< setCreateErrors: (_, { errors }) => errors, }, ], - formErrors: [ - {}, - { - clearFormErrors: () => ({}), - setFormErrors: (_, { inputErrors }) => inputErrors, - }, - ], }, selectors: ({ selectors }) => ({ + formErrors: [ + () => [selectors.addInferencePipelineModal], + (modal: AddInferencePipelineModal) => + validateInferencePipelineConfiguration(modal.configuration), + ], isLoading: [ () => [selectors.mlModelsStatus, selectors.mappingStatus], (mlModelsStatus, mappingStatus) => !API_REQUEST_COMPLETE_STATUSES.includes(mlModelsStatus) || !API_REQUEST_COMPLETE_STATUSES.includes(mappingStatus), ], + isPipelineDataValid: [ + () => [selectors.formErrors], + (errors: AddInferencePipelineFormErrors) => Object.keys(errors).length === 0, + ], + mlInferencePipeline: [ + () => [ + selectors.isPipelineDataValid, + selectors.addInferencePipelineModal, + selectors.mlModelsData, + ], + ( + isPipelineDataValid: boolean, + { configuration }: AddInferencePipelineModal, + models: MLInferenceProcessorsValues['mlModelsData'] + ) => { + if (!isPipelineDataValid) return undefined; + const model = models?.find((mlModel) => mlModel.model_id === configuration.modelID); + if (!model) return undefined; + + return generateMlInferencePipelineBody({ + destinationField: + configuration.destinationField || formatPipelineName(configuration.pipelineName), + model, + pipelineName: configuration.pipelineName, + sourceField: configuration.sourceField, + }); + }, + ], sourceFields: [ () => [selectors.mappingStatus, selectors.mappingData], (status: Status, mapping: IndicesGetMappingIndexMappingRecord) => { diff --git a/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/components/search_index/pipelines/ml_inference/review_pipeline.tsx b/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/components/search_index/pipelines/ml_inference/review_pipeline.tsx new file mode 100644 index 0000000000000..580a5acaac2cc --- /dev/null +++ b/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/components/search_index/pipelines/ml_inference/review_pipeline.tsx @@ -0,0 +1,49 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import React from 'react'; + +import { useValues } from 'kea'; + +import { EuiCodeBlock, EuiSpacer, EuiText } from '@elastic/eui'; + +import { i18n } from '@kbn/i18n'; + +import { MLInferenceLogic } from './ml_inference_logic'; + +export const ReviewPipeline: React.FC = () => { + const { mlInferencePipeline } = useValues(MLInferenceLogic); + return ( + <> + +

+ {i18n.translate( + 'xpack.enterpriseSearch.content.indices.pipelines.addInferencePipelineModal.steps.review.title', + { + defaultMessage: 'Pipeline configuration', + } + )} +

+
+ + {JSON.stringify(mlInferencePipeline ?? {}, null, 2)} + + + +

+ {i18n.translate( + 'xpack.enterpriseSearch.content.indices.pipelines.addInferencePipelineModal.steps.review.description', + { + defaultMessage: + "This pipeline will be created and injected as a processor into your default pipeline for this index. You'll be able to use this new pipeline independently as well.", + } + )} +

+
+ + ); +}; diff --git a/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/components/search_index/pipelines/ml_inference/test_pipeline.tsx b/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/components/search_index/pipelines/ml_inference/test_pipeline.tsx new file mode 100644 index 0000000000000..523973ad2d3d1 --- /dev/null +++ b/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/components/search_index/pipelines/ml_inference/test_pipeline.tsx @@ -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. + */ + +import React from 'react'; + +export const TestPipeline: React.FC = () => { + return
Test Pipeline
; +}; diff --git a/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/components/search_index/pipelines/ml_inference/types.ts b/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/components/search_index/pipelines/ml_inference/types.ts index 9ada53d224c8e..29ad5e9193fdb 100644 --- a/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/components/search_index/pipelines/ml_inference/types.ts +++ b/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/components/search_index/pipelines/ml_inference/types.ts @@ -14,5 +14,7 @@ export interface InferencePipelineConfiguration { export interface AddInferencePipelineFormErrors { destinationField?: string; + modelID?: string; pipelineName?: string; + sourceField?: string; } diff --git a/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/components/search_index/pipelines/ml_inference/utils.ts b/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/components/search_index/pipelines/ml_inference/utils.ts index b788a522d395f..8e168586a4819 100644 --- a/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/components/search_index/pipelines/ml_inference/utils.ts +++ b/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/components/search_index/pipelines/ml_inference/utils.ts @@ -41,17 +41,34 @@ export const isValidPipelineName = (input: string): boolean => { return input.length > 0 && VALID_PIPELINE_NAME_REGEX.test(input); }; +const INVALID_PIPELINE_NAME_ERROR = i18n.translate( + 'xpack.enterpriseSearch.content.indices.pipelines.addInferencePipelineModal.steps.configure.invalidPipelineName', + { + defaultMessage: 'Name must only contain letters, numbers, underscores, and hyphens.', + } +); +const FIELD_REQUIRED_ERROR = i18n.translate( + 'xpack.enterpriseSearch.content.indices.pipelines.addInferencePipelineModal.steps.configure.emptyValueError', + { + defaultMessage: 'Field is required.', + } +); + export const validateInferencePipelineConfiguration = ( config: InferencePipelineConfiguration -): AddInferencePipelineFormErrors | undefined => { +): AddInferencePipelineFormErrors => { const errors: AddInferencePipelineFormErrors = {}; - if (!isValidPipelineName(config.pipelineName)) { - errors.pipelineName = i18n.translate( - 'xpack.enterpriseSearch.content.indices.pipelines.addInferencePipelineModal.steps.configure.invalidPipelineName', - { - defaultMessage: 'Name must only contain letters, numbers, underscores, and hyphens.', - } - ); - return errors; + if (config.pipelineName.trim().length === 0) { + errors.pipelineName = FIELD_REQUIRED_ERROR; + } else if (!isValidPipelineName(config.pipelineName)) { + errors.pipelineName = INVALID_PIPELINE_NAME_ERROR; } + if (config.modelID.trim().length === 0) { + errors.modelID = FIELD_REQUIRED_ERROR; + } + if (config.sourceField.trim().length === 0) { + errors.sourceField = FIELD_REQUIRED_ERROR; + } + + return errors; }; diff --git a/x-pack/plugins/enterprise_search/public/applications/shared/constants/actions.ts b/x-pack/plugins/enterprise_search/public/applications/shared/constants/actions.ts index d43217fba1443..f163158462f0d 100644 --- a/x-pack/plugins/enterprise_search/public/applications/shared/constants/actions.ts +++ b/x-pack/plugins/enterprise_search/public/applications/shared/constants/actions.ts @@ -45,6 +45,10 @@ export const CONTINUE_BUTTON_LABEL = i18n.translate( { defaultMessage: 'Continue' } ); +export const BACK_BUTTON_LABEL = i18n.translate('xpack.enterpriseSearch.actions.backButtonLabel', { + defaultMessage: 'Back', +}); + export const CLOSE_BUTTON_LABEL = i18n.translate( 'xpack.enterpriseSearch.actions.closeButtonLabel', { defaultMessage: 'Close' } diff --git a/x-pack/plugins/enterprise_search/server/lib/indices/fetch_ml_inference_pipeline_processors.test.ts b/x-pack/plugins/enterprise_search/server/lib/indices/fetch_ml_inference_pipeline_processors.test.ts index 79d4600bb31e4..bb3324cf641d6 100644 --- a/x-pack/plugins/enterprise_search/server/lib/indices/fetch_ml_inference_pipeline_processors.test.ts +++ b/x-pack/plugins/enterprise_search/server/lib/indices/fetch_ml_inference_pipeline_processors.test.ts @@ -5,15 +5,12 @@ * 2.0. */ -import { MlTrainedModelConfig } from '@elastic/elasticsearch/lib/api/typesWithBodyKey'; import { ElasticsearchClient } from '@kbn/core/server'; -import { BUILT_IN_MODEL_TAG } from '@kbn/ml-plugin/common/constants/data_frame_analytics'; import { InferencePipeline, TrainedModelState } from '../../../common/types/pipelines'; import { fetchAndAddTrainedModelData, - getMlModelTypesForModelConfig, getMlModelConfigsForModelIds, fetchMlInferencePipelineProcessorNames, fetchMlInferencePipelineProcessors, @@ -320,43 +317,6 @@ describe('fetchPipelineProcessorInferenceData lib function', () => { }); }); -describe('getMlModelTypesForModelConfig lib function', () => { - const mockModel: MlTrainedModelConfig = { - inference_config: { - ner: {}, - }, - input: { - field_names: [], - }, - model_id: 'test_id', - model_type: 'pytorch', - tags: ['test_tag'], - }; - const builtInMockModel: MlTrainedModelConfig = { - inference_config: { - text_classification: {}, - }, - input: { - field_names: [], - }, - model_id: 'test_id', - model_type: 'lang_ident', - tags: [BUILT_IN_MODEL_TAG], - }; - - it('should return the model type and inference config type', () => { - const expected = ['pytorch', 'ner']; - const response = getMlModelTypesForModelConfig(mockModel); - expect(response.sort()).toEqual(expected.sort()); - }); - - it('should include the built in type', () => { - const expected = ['lang_ident', 'text_classification', BUILT_IN_MODEL_TAG]; - const response = getMlModelTypesForModelConfig(builtInMockModel); - expect(response.sort()).toEqual(expected.sort()); - }); -}); - describe('getMlModelConfigsForModelIds lib function', () => { const mockClient = { ml: { diff --git a/x-pack/plugins/enterprise_search/server/lib/indices/fetch_ml_inference_pipeline_processors.ts b/x-pack/plugins/enterprise_search/server/lib/indices/fetch_ml_inference_pipeline_processors.ts index 95839a9b6ac20..72867ad717065 100644 --- a/x-pack/plugins/enterprise_search/server/lib/indices/fetch_ml_inference_pipeline_processors.ts +++ b/x-pack/plugins/enterprise_search/server/lib/indices/fetch_ml_inference_pipeline_processors.ts @@ -5,10 +5,9 @@ * 2.0. */ -import { MlTrainedModelConfig } from '@elastic/elasticsearch/lib/api/typesWithBodyKey'; import { ElasticsearchClient } from '@kbn/core/server'; -import { BUILT_IN_MODEL_TAG } from '@kbn/ml-plugin/common/constants/data_frame_analytics'; +import { getMlModelTypesForModelConfig } from '../../../common/ml_inference_pipeline'; import { InferencePipeline, TrainedModelState } from '../../../common/types/pipelines'; import { getInferencePipelineNameFromIndexName } from '../../utils/ml_inference_pipeline_utils'; @@ -70,18 +69,6 @@ export const fetchPipelineProcessorInferenceData = async ( ); }; -export const getMlModelTypesForModelConfig = (trainedModel: MlTrainedModelConfig): string[] => { - if (!trainedModel) return []; - - const isBuiltIn = trainedModel.tags?.includes(BUILT_IN_MODEL_TAG); - - return [ - trainedModel.model_type, - ...Object.keys(trainedModel.inference_config || {}), - ...(isBuiltIn ? [BUILT_IN_MODEL_TAG] : []), - ].filter((type): type is string => type !== undefined); -}; - export const getMlModelConfigsForModelIds = async ( client: ElasticsearchClient, trainedModelNames: string[] diff --git a/x-pack/plugins/enterprise_search/server/lib/pipelines/create_pipeline_definitions.ts b/x-pack/plugins/enterprise_search/server/lib/pipelines/create_pipeline_definitions.ts index bcb33f9f82b36..f32590fb516c5 100644 --- a/x-pack/plugins/enterprise_search/server/lib/pipelines/create_pipeline_definitions.ts +++ b/x-pack/plugins/enterprise_search/server/lib/pipelines/create_pipeline_definitions.ts @@ -5,20 +5,16 @@ * 2.0. */ -import { IngestPipeline } from '@elastic/elasticsearch/lib/api/types'; import { ElasticsearchClient } from '@kbn/core/server'; +import { generateMlInferencePipelineBody } from '../../../common/ml_inference_pipeline'; +import { MlInferencePipeline } from '../../../common/types/pipelines'; import { getInferencePipelineNameFromIndexName } from '../../utils/ml_inference_pipeline_utils'; -import { getMlModelTypesForModelConfig } from '../indices/fetch_ml_inference_pipeline_processors'; export interface CreatedPipelines { created: string[]; } -export interface MlInferencePipeline extends IngestPipeline { - version?: number; -} - /** * Used to create index-specific Ingest Pipelines to be used in conjunction with Enterprise Search * ingestion mechanisms. Three pipelines are created: @@ -237,43 +233,10 @@ export const formatMlPipelineBody = async ( // this will raise a 404 if model doesn't exist const models = await esClient.ml.getTrainedModels({ model_id: modelId }); const model = models.trained_model_configs[0]; - // if model returned no input field, insert a placeholder - const modelInputField = - model.input?.field_names?.length > 0 ? model.input.field_names[0] : 'MODEL_INPUT_FIELD'; - const modelTypes = getMlModelTypesForModelConfig(model); - const modelVersion = model.version; - return { - description: '', - processors: [ - { - remove: { - field: `ml.inference.${destinationField}`, - ignore_missing: true, - }, - }, - { - inference: { - field_map: { - [sourceField]: modelInputField, - }, - model_id: modelId, - target_field: `ml.inference.${destinationField}`, - }, - }, - { - append: { - field: '_source._ingest.processors', - value: [ - { - model_version: modelVersion, - pipeline: pipelineName, - processed_timestamp: '{{{ _ingest.timestamp }}}', - types: modelTypes, - }, - ], - }, - }, - ], - version: 1, - }; + return generateMlInferencePipelineBody({ + destinationField, + model, + pipelineName, + sourceField, + }); }; diff --git a/x-pack/plugins/enterprise_search/server/utils/create_ml_inference_pipeline.ts b/x-pack/plugins/enterprise_search/server/utils/create_ml_inference_pipeline.ts index dfcd8d4884972..da4bce12d71ef 100644 --- a/x-pack/plugins/enterprise_search/server/utils/create_ml_inference_pipeline.ts +++ b/x-pack/plugins/enterprise_search/server/utils/create_ml_inference_pipeline.ts @@ -8,6 +8,7 @@ import { IngestGetPipelineResponse, IngestPipeline } from '@elastic/elasticsearch/lib/api/types'; import { ElasticsearchClient } from '@kbn/core/server'; +import { formatPipelineName } from '../../common/ml_inference_pipeline'; import { ErrorCode } from '../../common/types/error_codes'; import { formatMlPipelineBody } from '../lib/pipelines/create_pipeline_definitions'; @@ -15,7 +16,6 @@ import { formatMlPipelineBody } from '../lib/pipelines/create_pipeline_definitio import { getInferencePipelineNameFromIndexName, getPrefixedInferencePipelineProcessorName, - formatPipelineName, } from './ml_inference_pipeline_utils'; /** diff --git a/x-pack/plugins/enterprise_search/server/utils/ml_inference_pipeline_utils.ts b/x-pack/plugins/enterprise_search/server/utils/ml_inference_pipeline_utils.ts index 6547034f25403..e92db3d263a63 100644 --- a/x-pack/plugins/enterprise_search/server/utils/ml_inference_pipeline_utils.ts +++ b/x-pack/plugins/enterprise_search/server/utils/ml_inference_pipeline_utils.ts @@ -5,6 +5,8 @@ * 2.0. */ +import { formatPipelineName } from '../../common/ml_inference_pipeline'; + export const getInferencePipelineNameFromIndexName = (indexName: string) => `${indexName}@ml-inference`; @@ -12,9 +14,3 @@ export const getPrefixedInferencePipelineProcessorName = (pipelineName: string) pipelineName.startsWith('ml-inference-') ? formatPipelineName(pipelineName) : `ml-inference-${formatPipelineName(pipelineName)}`; - -export const formatPipelineName = (rawName: string) => - rawName - .trim() - .replace(/\s+/g, '_') // Convert whitespaces to underscores - .toLowerCase(); From 067484b9b3d1c21f9d596a85b0537727a7747229 Mon Sep 17 00:00:00 2001 From: Alexey Antonov Date: Fri, 30 Sep 2022 16:48:09 +0300 Subject: [PATCH 48/72] [Lens] don't allow to drag and drop a single element (#141793) * [wip][Lens] don't allow to drag and drop a single element * do some cleanup * push some changes * update field_inputs * some cleanup * fix styles * push some code * push some changes * fix some tests * push some changes * add padding * fix styles * first attempt at cleaning up markup and styles * change the name of color to bgColor, pass isDragging state * Update default_bucket_container.tsx more overlooked copy * fix JEST * Update x-pack/plugins/lens/public/shared_components/drag_drop_bucket/fields_bucket_container.tsx Co-authored-by: Michael Marcialis * Update x-pack/plugins/lens/public/shared_components/drag_drop_bucket/default_bucket_container.tsx Co-authored-by: Michael Marcialis * Update x-pack/plugins/lens/public/shared_components/drag_drop_bucket/default_bucket_container.tsx Co-authored-by: Michael Marcialis * Update x-pack/plugins/lens/public/shared_components/drag_drop_bucket/default_bucket_container.tsx Co-authored-by: Michael Marcialis * Update x-pack/plugins/lens/public/shared_components/drag_drop_bucket/default_bucket_container.tsx Co-authored-by: Michael Marcialis * Update x-pack/plugins/lens/public/shared_components/drag_drop_bucket/buckets.tsx Co-authored-by: Michael Marcialis * Update x-pack/plugins/lens/public/shared_components/drag_drop_bucket/buckets.tsx Co-authored-by: Michael Marcialis * Update x-pack/plugins/lens/public/shared_components/drag_drop_bucket/fields_bucket_container.tsx Co-authored-by: Michael Marcialis * Update x-pack/plugins/lens/public/shared_components/drag_drop_bucket/fields_bucket_container.tsx Co-authored-by: Michael Marcialis * Update x-pack/plugins/lens/public/shared_components/drag_drop_bucket/default_bucket_container.tsx Co-authored-by: Michael Marcialis * fix JEST Co-authored-by: Kibana Machine <42973632+kibanamachine@users.noreply.github.com> Co-authored-by: Marta Bondyra <4283304+mbondyra@users.noreply.github.com> Co-authored-by: Michael Marcialis Co-authored-by: Marta Bondyra Co-authored-by: Michael Marcialis --- .../definitions/filters/filters.test.tsx | 4 +- .../definitions/filters/filters.tsx | 10 +- .../definitions/ranges/advanced_editor.tsx | 22 +- .../definitions/ranges/ranges.test.tsx | 4 +- .../definitions/terms/field_inputs.tsx | 239 ++++++------------ .../drag_drop_bucket/buckets.test.tsx | 5 +- .../drag_drop_bucket/buckets.tsx | 206 ++++++--------- .../default_bucket_container.tsx | 93 +++++++ .../fields_bucket_container.tsx | 86 +++++++ .../drag_drop_bucket/index.tsx | 11 + .../drag_drop_bucket/new_bucket_button.tsx | 37 +++ .../drag_drop_bucket/types.ts | 23 ++ .../lens/public/shared_components/index.ts | 3 +- .../annotations_config_panel/index.scss | 7 +- .../tooltip_annotation_panel.tsx | 172 +++++-------- .../translations/translations/fr-FR.json | 3 - .../translations/translations/ja-JP.json | 3 - .../translations/translations/zh-CN.json | 3 - 18 files changed, 494 insertions(+), 437 deletions(-) create mode 100644 x-pack/plugins/lens/public/shared_components/drag_drop_bucket/default_bucket_container.tsx create mode 100644 x-pack/plugins/lens/public/shared_components/drag_drop_bucket/fields_bucket_container.tsx create mode 100644 x-pack/plugins/lens/public/shared_components/drag_drop_bucket/index.tsx create mode 100644 x-pack/plugins/lens/public/shared_components/drag_drop_bucket/new_bucket_button.tsx create mode 100644 x-pack/plugins/lens/public/shared_components/drag_drop_bucket/types.ts diff --git a/x-pack/plugins/lens/public/indexpattern_datasource/operations/definitions/filters/filters.test.tsx b/x-pack/plugins/lens/public/indexpattern_datasource/operations/definitions/filters/filters.test.tsx index 299896e5ffe65..2b227674c26e9 100644 --- a/x-pack/plugins/lens/public/indexpattern_datasource/operations/definitions/filters/filters.test.tsx +++ b/x-pack/plugins/lens/public/indexpattern_datasource/operations/definitions/filters/filters.test.tsx @@ -399,8 +399,8 @@ describe('filters', () => { ); instance - .find('[data-test-subj="lns-customBucketContainer-remove"]') - .at(2) + .find('[data-test-subj="lns-customBucketContainer-remove-1"]') + .at(0) .simulate('click'); expect(updateLayerSpy).toHaveBeenCalledWith({ ...layer, diff --git a/x-pack/plugins/lens/public/indexpattern_datasource/operations/definitions/filters/filters.tsx b/x-pack/plugins/lens/public/indexpattern_datasource/operations/definitions/filters/filters.tsx index b972129109e1e..434dbb092bdb0 100644 --- a/x-pack/plugins/lens/public/indexpattern_datasource/operations/definitions/filters/filters.tsx +++ b/x-pack/plugins/lens/public/indexpattern_datasource/operations/definitions/filters/filters.tsx @@ -235,13 +235,14 @@ export const FilterList = ({ droppableId="FILTERS_DROPPABLE_AREA" items={localFilters} > - {localFilters?.map((filter: FilterValue, idx: number) => { + {localFilters?.map((filter, idx, arrayRef) => { const isInvalid = !isQueryValid(filter.input, indexPattern); + const id = filter.id; return ( { + const addNewRange = useCallback(() => { const newRangeId = generateId(); setLocalRanges([ @@ -228,13 +228,13 @@ export const AdvancedRangeEditor = ({ { id: newRangeId, from: localRanges[localRanges.length - 1].to, - to: Infinity, + to: Number.POSITIVE_INFINITY, label: '', }, ]); setActiveRangeId(newRangeId); - }; + }, [localRanges]); const changeActiveRange = (rangeId: string) => { let newActiveRangeId = rangeId; @@ -264,11 +264,10 @@ export const AdvancedRangeEditor = ({ <> {}} droppableId="RANGES_DROPPABLE_AREA" items={localRanges} > - {localRanges.map((range: LocalRangeType, idx: number) => ( + {localRanges.map((range, idx, arrayRef) => ( { - const newRanges = localRanges.filter((_, i) => i !== idx); + const newRanges = arrayRef.filter((_, i) => i !== idx); setLocalRanges(newRanges); }} removeTitle={i18n.translate('xpack.lens.indexPattern.ranges.deleteRange', { defaultMessage: 'Delete range', })} - isNotRemovable={localRanges.length === 1} + isNotRemovable={arrayRef.length === 1} + isNotDraggable={arrayRef.length < 2} > changeActiveRange('')} setRange={(newRange: LocalRangeType) => { - const newRanges = [...localRanges]; + const newRanges = [...arrayRef]; if (newRange.id === newRanges[idx].id) { newRanges[idx] = newRange; } else { @@ -320,9 +320,7 @@ export const AdvancedRangeEditor = ({ ))} { - addNewRange(); - }} + onClick={addNewRange} label={i18n.translate('xpack.lens.indexPattern.ranges.addRange', { defaultMessage: 'Add range', })} diff --git a/x-pack/plugins/lens/public/indexpattern_datasource/operations/definitions/ranges/ranges.test.tsx b/x-pack/plugins/lens/public/indexpattern_datasource/operations/definitions/ranges/ranges.test.tsx index 907a9f685215a..874559ae66c19 100644 --- a/x-pack/plugins/lens/public/indexpattern_datasource/operations/definitions/ranges/ranges.test.tsx +++ b/x-pack/plugins/lens/public/indexpattern_datasource/operations/definitions/ranges/ranges.test.tsx @@ -797,8 +797,8 @@ describe('ranges', () => { // This series of act closures are made to make it work properly the update flush act(() => { instance - .find('[data-test-subj="lns-customBucketContainer-remove"]') - .last() + .find('[data-test-subj="lns-customBucketContainer-remove-1"]') + .at(0) .simulate('click'); }); diff --git a/x-pack/plugins/lens/public/indexpattern_datasource/operations/definitions/terms/field_inputs.tsx b/x-pack/plugins/lens/public/indexpattern_datasource/operations/definitions/terms/field_inputs.tsx index f140fdb9807ac..d22fc5392f2cc 100644 --- a/x-pack/plugins/lens/public/indexpattern_datasource/operations/definitions/terms/field_inputs.tsx +++ b/x-pack/plugins/lens/public/indexpattern_datasource/operations/definitions/terms/field_inputs.tsx @@ -5,24 +5,16 @@ * 2.0. */ -import React, { useCallback, useMemo, useState } from 'react'; -import { - EuiButtonIcon, - EuiDraggable, - EuiFlexGroup, - EuiFlexItem, - EuiIcon, - htmlIdGenerator, - EuiPanel, - useEuiTheme, -} from '@elastic/eui'; +import React, { useCallback, useMemo } from 'react'; +import { htmlIdGenerator } from '@elastic/eui'; import { i18n } from '@kbn/i18n'; import { ExistingFieldsMap, IndexPattern } from '../../../../types'; import { DragDropBuckets, + FieldsBucketContainer, NewBucketButton, - TooltipWrapper, useDebouncedValue, + DraggableBucketContainer, } from '../../../../shared_components'; import { FieldSelect } from '../../../dimension_panel/field_select'; import type { TermsIndexPatternColumn } from './types'; @@ -61,9 +53,6 @@ export function FieldInputs({ operationSupportMatrix, invalidFields, }: FieldInputsProps) { - const { euiTheme } = useEuiTheme(); - const [isDragging, setIsDragging] = useState(false); - const onChangeWrapped = useCallback( (values: WrappedValue[]) => onChange(values.filter(removeNewEmptyField).map(({ value }) => value)), @@ -97,154 +86,90 @@ export function FieldInputs({ ); const disableActions = - (localValues.length === 2 && localValues.some(({ isNew }) => isNew)) || - localValues.length === 1; + localValues.length === 1 || localValues.filter(({ isNew }) => !isNew).length < 2; const localValuesFilled = localValues.filter(({ isNew }) => !isNew); return ( <> -
{ + handleInputChange(updatedValues); }} + droppableId="TOP_TERMS_DROPPABLE_AREA" + items={localValues} + bgColor="subdued" > - { - handleInputChange(updatedValues); - setIsDragging(false); - }} - className="lnsIndexPatternDimensionEditor__droppable" - onDragStart={() => { - setIsDragging(true); - }} - droppableId="TOP_TERMS_DROPPABLE_AREA" - items={localValues} - > - {localValues.map(({ id, value, isNew }, index) => { - // need to filter the available fields for multiple terms - // * a scripted field should be removed - // * a field of unsupported type should be removed - // * a field that has been used - // * a scripted field was used in a singular term, should be marked as invalid for multi-terms - const filteredOperationByField = Object.keys(operationSupportMatrix.operationByField) - .filter((key) => { - if (key === value) { - return true; - } - const field = indexPattern.getFieldByName(key); - if (index === 0) { - return !rawValuesLookup.has(key) && field && supportedTypes.has(field.type); - } else { - return ( - !rawValuesLookup.has(key) && - field && - !field.scripted && - supportedTypes.has(field.type) - ); - } - }) - .reduce((memo, key) => { - memo[key] = operationSupportMatrix.operationByField[key]; - return memo; - }, {}); + {localValues.map(({ id, value, isNew }, index, arrayRef) => { + // need to filter the available fields for multiple terms + // * a scripted field should be removed + // * a field of unsupported type should be removed + // * a field that has been used + // * a scripted field was used in a singular term, should be marked as invalid for multi-terms + const filteredOperationByField = Object.keys(operationSupportMatrix.operationByField) + .filter((key) => { + if (key === value) { + return true; + } + const field = indexPattern.getFieldByName(key); + if (index === 0) { + return !rawValuesLookup.has(key) && field && supportedTypes.has(field.type); + } else { + return ( + !rawValuesLookup.has(key) && + field && + !field.scripted && + supportedTypes.has(field.type) + ); + } + }) + .reduce((memo, key) => { + memo[key] = operationSupportMatrix.operationByField[key]; + return memo; + }, {}); - const shouldShowError = Boolean( - value && - ((indexPattern.getFieldByName(value)?.scripted && localValuesFilled.length > 1) || - invalidFields?.includes(value)) - ); - return ( - - {(provided) => ( - - - - - - - { - onFieldSelectChange(choice, index); - }} - isInvalid={shouldShowError} - data-test-subj={ - localValues.length !== 1 - ? `indexPattern-dimension-field-${index}` - : undefined - } - /> - - - - { - handleInputChange(localValues.filter((_, i) => i !== index)); - }} - data-test-subj={`indexPattern-terms-removeField-${index}`} - isDisabled={disableActions && !isNew} - /> - - - - - )} - - ); - })} - -
+ const shouldShowError = Boolean( + value && + ((indexPattern.getFieldByName(value)?.scripted && localValuesFilled.length > 1) || + invalidFields?.includes(value)) + ); + const itemId = (value ?? 'newField') + id; + + return ( + { + handleInputChange(arrayRef.filter((_, i) => i !== index)); + }} + removeTitle={i18n.translate('xpack.lens.indexPattern.terms.deleteButtonLabel', { + defaultMessage: 'Delete', + })} + isNotRemovable={disableActions && !isNew} + isNotDraggable={arrayRef.length < 2} + data-test-subj={`indexPattern-terms`} + Container={FieldsBucketContainer} + isInsidePanel={true} + > + { + onFieldSelectChange(choice, index); + }} + isInvalid={shouldShowError} + data-test-subj={ + localValues.length !== 1 ? `indexPattern-dimension-field-${index}` : undefined + } + /> + + ); + })} + { handleInputChange([...localValues, { id: generateId(), value: undefined, isNew: true }]); diff --git a/x-pack/plugins/lens/public/shared_components/drag_drop_bucket/buckets.test.tsx b/x-pack/plugins/lens/public/shared_components/drag_drop_bucket/buckets.test.tsx index aba0cbfc40a6e..2336495c9a316 100644 --- a/x-pack/plugins/lens/public/shared_components/drag_drop_bucket/buckets.test.tsx +++ b/x-pack/plugins/lens/public/shared_components/drag_drop_bucket/buckets.test.tsx @@ -63,14 +63,13 @@ describe('buckets shared components', () => { it('should render invalid component', () => { const instance = mount(); const iconProps = instance.find(EuiIcon).first().props(); - expect(iconProps.color).toEqual('danger'); + expect(iconProps.color).toEqual('#BD271E'); expect(iconProps.type).toEqual('alert'); - expect(iconProps.title).toEqual('invalid'); }); it('should call onRemoveClick when remove icon is clicked', () => { const instance = mount(); const removeIcon = instance - .find('[data-test-subj="lns-customBucketContainer-remove"]') + .find('[data-test-subj="lns-customBucketContainer-remove-0"]') .first(); removeIcon.simulate('click'); expect(defaultProps.onRemoveClick).toHaveBeenCalled(); diff --git a/x-pack/plugins/lens/public/shared_components/drag_drop_bucket/buckets.tsx b/x-pack/plugins/lens/public/shared_components/drag_drop_bucket/buckets.tsx index 720d8c85ca486..7d0893cdd54ee 100644 --- a/x-pack/plugins/lens/public/shared_components/drag_drop_bucket/buckets.tsx +++ b/x-pack/plugins/lens/public/shared_components/drag_drop_bucket/buckets.tsx @@ -5,162 +5,110 @@ * 2.0. */ -import React from 'react'; -import { i18n } from '@kbn/i18n'; +import React, { useCallback, useState } from 'react'; +import type { Assign } from '@kbn/utility-types'; import { - EuiFlexGroup, - EuiFlexItem, EuiPanel, - EuiButtonIcon, - EuiIcon, - EuiDragDropContext, - euiDragDropReorder, EuiDraggable, EuiDroppable, - EuiButtonEmpty, + EuiPanelProps, + EuiDragDropContext, + DragDropContextProps, + euiDragDropReorder, + useEuiTheme, } from '@elastic/eui'; - -export const NewBucketButton = ({ - label, - onClick, - ['data-test-subj']: dataTestSubj, - isDisabled, - className, -}: { - label: string; - onClick: () => void; - 'data-test-subj'?: string; - isDisabled?: boolean; - className?: string; -}) => ( - - {label} - -); - -interface BucketContainerProps { - isInvalid?: boolean; - invalidMessage: string; - onRemoveClick: () => void; - removeTitle: string; - isNotRemovable?: boolean; - children: React.ReactNode; - dataTestSubj?: string; -} - -const BucketContainer = ({ - isInvalid, - invalidMessage, - onRemoveClick, - removeTitle, - children, - dataTestSubj, - isNotRemovable, -}: BucketContainerProps) => { - return ( - - - {/* Empty for spacing */} - - - - {children} - - - - - - ); -}; +import { DefaultBucketContainer } from './default_bucket_container'; +import type { BucketContainerProps } from './types'; export const DraggableBucketContainer = ({ id, - idx, children, + isInsidePanel, + Container = DefaultBucketContainer, ...bucketContainerProps -}: { - id: string; - idx: number; - children: React.ReactNode; -} & BucketContainerProps) => { +}: Assign< + Omit, + { + id: string; + children: React.ReactNode; + isInsidePanel?: boolean; + Container?: React.FunctionComponent; + } +>) => { + const { euiTheme } = useEuiTheme(); + return ( - {(provided) => {children}} + {(provided, state) => ( + + {children} + + )} ); }; -interface DraggableLocation { - droppableId: string; - index: number; -} - -export const DragDropBuckets = ({ +export function DragDropBuckets({ items, onDragStart, onDragEnd, droppableId, children, - className, + bgColor, }: { - items: any; // eslint-disable-line @typescript-eslint/no-explicit-any - onDragStart: () => void; - onDragEnd: (items: any) => void; // eslint-disable-line @typescript-eslint/no-explicit-any + items: T[]; droppableId: string; children: React.ReactElement[]; - className?: string; -}) => { - const handleDragEnd = ({ - source, - destination, - }: { - source?: DraggableLocation; - destination?: DraggableLocation; - }) => { - if (source && destination) { - const newItems = euiDragDropReorder(items, source.index, destination.index); - onDragEnd(newItems); - } - }; + onDragStart?: () => void; + onDragEnd?: (items: T[]) => void; + bgColor?: EuiPanelProps['color']; +}) { + const [isDragging, setIsDragging] = useState(false); + + const handleDragEnd: DragDropContextProps['onDragEnd'] = useCallback( + ({ source, destination }) => { + setIsDragging(false); + if (source && destination) { + onDragEnd?.(euiDragDropReorder(items, source.index, destination.index)); + } + }, + [items, onDragEnd] + ); + + const handleDragStart: DragDropContextProps['onDragStart'] = useCallback(() => { + setIsDragging(true); + onDragStart?.(); + }, [onDragStart]); + return ( - - - {children} - + + + + {children} + + ); -}; +} diff --git a/x-pack/plugins/lens/public/shared_components/drag_drop_bucket/default_bucket_container.tsx b/x-pack/plugins/lens/public/shared_components/drag_drop_bucket/default_bucket_container.tsx new file mode 100644 index 0000000000000..bfae243dc1ac5 --- /dev/null +++ b/x-pack/plugins/lens/public/shared_components/drag_drop_bucket/default_bucket_container.tsx @@ -0,0 +1,93 @@ +/* + * 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 { i18n } from '@kbn/i18n'; +import { + EuiButtonIcon, + EuiFlexGroup, + EuiFlexItem, + EuiIcon, + EuiPanel, + useEuiTheme, +} from '@elastic/eui'; +import type { BucketContainerProps } from './types'; +import { TooltipWrapper } from '../tooltip_wrapper'; + +export const DefaultBucketContainer = ({ + idx, + isInvalid, + invalidMessage, + onRemoveClick, + removeTitle, + children, + draggableProvided, + isNotRemovable, + isNotDraggable, + 'data-test-subj': dataTestSubj = 'lns-customBucketContainer', +}: BucketContainerProps) => { + const { euiTheme } = useEuiTheme(); + + return ( + + + + + + + + {children} + + + + + + + + ); +}; diff --git a/x-pack/plugins/lens/public/shared_components/drag_drop_bucket/fields_bucket_container.tsx b/x-pack/plugins/lens/public/shared_components/drag_drop_bucket/fields_bucket_container.tsx new file mode 100644 index 0000000000000..eedcba3fee5ec --- /dev/null +++ b/x-pack/plugins/lens/public/shared_components/drag_drop_bucket/fields_bucket_container.tsx @@ -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 React from 'react'; +import { i18n } from '@kbn/i18n'; +import { + EuiButtonIcon, + EuiFlexGroup, + EuiFlexItem, + EuiIcon, + EuiPanel, + useEuiTheme, +} from '@elastic/eui'; +import { TooltipWrapper } from '..'; +import type { BucketContainerProps } from './types'; + +export const FieldsBucketContainer = ({ + idx, + onRemoveClick, + removeTitle, + children, + draggableProvided, + isNotRemovable, + isNotDraggable, + isDragging, + 'data-test-subj': dataTestSubj = 'lns-fieldsBucketContainer', +}: BucketContainerProps) => { + const { euiTheme } = useEuiTheme(); + + return ( + + + + + + + + + {children} + + + + + + + + + ); +}; diff --git a/x-pack/plugins/lens/public/shared_components/drag_drop_bucket/index.tsx b/x-pack/plugins/lens/public/shared_components/drag_drop_bucket/index.tsx new file mode 100644 index 0000000000000..127471dc2cca5 --- /dev/null +++ b/x-pack/plugins/lens/public/shared_components/drag_drop_bucket/index.tsx @@ -0,0 +1,11 @@ +/* + * 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 { NewBucketButton } from './new_bucket_button'; +export { FieldsBucketContainer } from './fields_bucket_container'; + +export * from './buckets'; diff --git a/x-pack/plugins/lens/public/shared_components/drag_drop_bucket/new_bucket_button.tsx b/x-pack/plugins/lens/public/shared_components/drag_drop_bucket/new_bucket_button.tsx new file mode 100644 index 0000000000000..38b74ca7c83fb --- /dev/null +++ b/x-pack/plugins/lens/public/shared_components/drag_drop_bucket/new_bucket_button.tsx @@ -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 React from 'react'; +import { EuiButtonEmpty } from '@elastic/eui'; + +interface NewBucketButtonProps { + label: string; + onClick: () => void; + isDisabled?: boolean; + className?: string; + 'data-test-subj'?: string; +} + +export const NewBucketButton = ({ + label, + onClick, + isDisabled, + className, + 'data-test-subj': dataTestSubj = 'lns-newBucket-add', +}: NewBucketButtonProps) => ( + + {label} + +); diff --git a/x-pack/plugins/lens/public/shared_components/drag_drop_bucket/types.ts b/x-pack/plugins/lens/public/shared_components/drag_drop_bucket/types.ts new file mode 100644 index 0000000000000..fe08048e875c2 --- /dev/null +++ b/x-pack/plugins/lens/public/shared_components/drag_drop_bucket/types.ts @@ -0,0 +1,23 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import React from 'react'; +import type { DraggableProvided } from 'react-beautiful-dnd'; + +export interface BucketContainerProps { + children: React.ReactNode; + removeTitle: string; + idx: number; + onRemoveClick: () => void; + isDragging?: boolean; + draggableProvided?: DraggableProvided; + isInvalid?: boolean; + invalidMessage?: string; + isNotRemovable?: boolean; + isNotDraggable?: boolean; + 'data-test-subj'?: string; +} diff --git a/x-pack/plugins/lens/public/shared_components/index.ts b/x-pack/plugins/lens/public/shared_components/index.ts index 3f30eb64ff2c9..a2fcc9c54882d 100644 --- a/x-pack/plugins/lens/public/shared_components/index.ts +++ b/x-pack/plugins/lens/public/shared_components/index.ts @@ -17,7 +17,8 @@ export { NewBucketButton, DraggableBucketContainer, DragDropBuckets, -} from './drag_drop_bucket/buckets'; + FieldsBucketContainer, +} from './drag_drop_bucket'; export { RangeInputField } from './range_input_field'; export { BucketAxisBoundsControl, diff --git a/x-pack/plugins/lens/public/visualizations/xy/xy_config_panel/annotations_config_panel/index.scss b/x-pack/plugins/lens/public/visualizations/xy/xy_config_panel/annotations_config_panel/index.scss index 2b59be0b044f9..93bf0e2c72662 100644 --- a/x-pack/plugins/lens/public/visualizations/xy/xy_config_panel/annotations_config_panel/index.scss +++ b/x-pack/plugins/lens/public/visualizations/xy/xy_config_panel/annotations_config_panel/index.scss @@ -14,11 +14,6 @@ margin-top: $euiSizeXS; } -.lnsConfigPanelAnnotations__droppable { - padding: $euiSizeXS; - border-radius: $euiBorderRadiusSmall; -} - .lnsConfigPanelAnnotations__fieldPicker { cursor: pointer; -} \ No newline at end of file +} diff --git a/x-pack/plugins/lens/public/visualizations/xy/xy_config_panel/annotations_config_panel/tooltip_annotation_panel.tsx b/x-pack/plugins/lens/public/visualizations/xy/xy_config_panel/annotations_config_panel/tooltip_annotation_panel.tsx index c44f76427e0a7..20a99e8458fc0 100644 --- a/x-pack/plugins/lens/public/visualizations/xy/xy_config_panel/annotations_config_panel/tooltip_annotation_panel.tsx +++ b/x-pack/plugins/lens/public/visualizations/xy/xy_config_panel/annotations_config_panel/tooltip_annotation_panel.tsx @@ -5,19 +5,9 @@ * 2.0. */ -import { - htmlIdGenerator, - EuiButtonIcon, - EuiDraggable, - EuiFlexGroup, - EuiFlexItem, - EuiIcon, - EuiPanel, - useEuiTheme, - EuiText, -} from '@elastic/eui'; +import { htmlIdGenerator, EuiFlexItem, EuiPanel, EuiText } from '@elastic/eui'; import { i18n } from '@kbn/i18n'; -import React, { useCallback, useMemo, useState } from 'react'; +import React, { useCallback, useMemo } from 'react'; import { QueryPointEventAnnotationConfig } from '@kbn/event-annotation-plugin/common'; import type { ExistingFieldsMap, IndexPattern } from '../../../../types'; import { @@ -28,8 +18,12 @@ import { useDebouncedValue, NewBucketButton, DragDropBuckets, + DraggableBucketContainer, + FieldsBucketContainer, } from '../../../../shared_components'; +export const MAX_TOOLTIP_FIELDS_SIZE = 2; + const generateId = htmlIdGenerator(); const supportedTypes = new Set(['string', 'boolean', 'number', 'ip', 'date']); @@ -60,8 +54,6 @@ export function TooltipSection({ existingFields, invalidFields, }: FieldInputsProps) { - const { euiTheme } = useEuiTheme(); - const [isDragging, setIsDragging] = useState(false); const onChangeWrapped = useCallback( (values: WrappedValue[]) => { setConfig({ @@ -108,6 +100,7 @@ export function TooltipSection({ label={i18n.translate('xpack.lens.xyChart.annotation.tooltip.addField', { defaultMessage: 'Add field', })} + isDisabled={localValues.length > MAX_TOOLTIP_FIELDS_SIZE} /> ); @@ -132,7 +125,7 @@ export function TooltipSection({ ); } const currentExistingField = existingFields[indexPattern.title]; - const disableActions = localValues.length === 2 && localValues.some(({ isNew }) => isNew); + const options = indexPattern.fields .filter( ({ displayName, type }) => @@ -154,107 +147,62 @@ export function TooltipSection({ ) .sort((a, b) => a.label.localeCompare(b.label)); - const isDragDisabled = localValues.length < 2; - return ( <> -
{ + handleInputChange(updatedValues); }} + droppableId="ANNOTATION_TOOLTIP_DROPPABLE_AREA" + items={localValues} + bgColor="subdued" > - { - handleInputChange(updatedValues); - setIsDragging(false); - }} - onDragStart={() => { - setIsDragging(true); - }} - droppableId="ANNOTATION_TOOLTIP_DROPPABLE_AREA" - items={localValues} - className="lnsConfigPanelAnnotations__droppable" - > - {localValues.map(({ id, value, isNew }, index) => { - const fieldIsValid = value ? Boolean(indexPattern.getFieldByName(value)) : true; - return ( - - {(provided) => ( - - - {/* Empty for spacing */} - - - - - - - - { - handleInputChange(localValues.filter((_, i) => i !== index)); - }} - data-test-subj={`lnsXY-annotation-tooltip-removeField-${index}`} - isDisabled={disableActions && !isNew} - /> - - - - )} - - ); - })} - -
+ {localValues.map(({ id, value, isNew }, index, arrayRef) => { + const fieldIsValid = value ? Boolean(indexPattern.getFieldByName(value)) : true; + + return ( + { + handleInputChange(arrayRef.filter((_, i) => i !== index)); + }} + removeTitle={i18n.translate( + 'xpack.lens.xyChart.annotation.tooltip.deleteButtonLabel', + { + defaultMessage: 'Delete', + } + )} + isNotDraggable={arrayRef.length < 2} + Container={FieldsBucketContainer} + isInsidePanel={true} + data-test-subj={`lnsXY-annotation-tooltip-${index}`} + > + { + onFieldSelectChange(choice, index); + }} + fieldIsInvalid={!fieldIsValid} + className="lnsConfigPanelAnnotations__fieldPicker" + data-test-subj={`lnsXY-annotation-tooltip-field-picker--${index}`} + autoFocus={isNew && value == null} + /> + + ); + })} + {newBucketButton} ); diff --git a/x-pack/plugins/translations/translations/fr-FR.json b/x-pack/plugins/translations/translations/fr-FR.json index 51944419d0017..4ab7756b5fb43 100644 --- a/x-pack/plugins/translations/translations/fr-FR.json +++ b/x-pack/plugins/translations/translations/fr-FR.json @@ -17838,10 +17838,7 @@ "xpack.lens.indexPattern.terms.addaFilter": "Ajouter un champ", "xpack.lens.indexPattern.terms.addRegex": "Utiliser une expression régulière", "xpack.lens.indexPattern.terms.advancedSettings": "Avancé", - "xpack.lens.indexPattern.terms.deleteButtonAriaLabel": "Supprimer", - "xpack.lens.indexPattern.terms.deleteButtonDisabled": "Cette fonction nécessite au minimum un champ défini.", "xpack.lens.indexPattern.terms.deleteButtonLabel": "Supprimer", - "xpack.lens.indexPattern.terms.dragToReorder": "Faire glisser pour réorganiser", "xpack.lens.indexPattern.terms.exclude": "Exclure les valeurs", "xpack.lens.indexPattern.terms.include": "Inclure les valeurs", "xpack.lens.indexPattern.terms.includeExcludePatternPlaceholder": "Entrer une expression régulière pour filtrer les valeurs", diff --git a/x-pack/plugins/translations/translations/ja-JP.json b/x-pack/plugins/translations/translations/ja-JP.json index be3158df0ac4c..c01a643d5e953 100644 --- a/x-pack/plugins/translations/translations/ja-JP.json +++ b/x-pack/plugins/translations/translations/ja-JP.json @@ -17821,10 +17821,7 @@ "xpack.lens.indexPattern.terms.addaFilter": "フィールドの追加", "xpack.lens.indexPattern.terms.addRegex": "正規表現を使用", "xpack.lens.indexPattern.terms.advancedSettings": "高度な設定", - "xpack.lens.indexPattern.terms.deleteButtonAriaLabel": "削除", - "xpack.lens.indexPattern.terms.deleteButtonDisabled": "この関数には定義された1つのフィールドの最小値が必須です", "xpack.lens.indexPattern.terms.deleteButtonLabel": "削除", - "xpack.lens.indexPattern.terms.dragToReorder": "ドラッグして並べ替え", "xpack.lens.indexPattern.terms.exclude": "値を除外", "xpack.lens.indexPattern.terms.include": "値を含める", "xpack.lens.indexPattern.terms.includeExcludePatternPlaceholder": "値をフィルターするには正規表現を入力します", diff --git a/x-pack/plugins/translations/translations/zh-CN.json b/x-pack/plugins/translations/translations/zh-CN.json index f3d3ffc9fb7f2..75eab045500e7 100644 --- a/x-pack/plugins/translations/translations/zh-CN.json +++ b/x-pack/plugins/translations/translations/zh-CN.json @@ -17846,10 +17846,7 @@ "xpack.lens.indexPattern.terms.addaFilter": "添加字段", "xpack.lens.indexPattern.terms.addRegex": "使用正则表达式", "xpack.lens.indexPattern.terms.advancedSettings": "高级", - "xpack.lens.indexPattern.terms.deleteButtonAriaLabel": "删除", - "xpack.lens.indexPattern.terms.deleteButtonDisabled": "此函数需要至少定义一个字段", "xpack.lens.indexPattern.terms.deleteButtonLabel": "删除", - "xpack.lens.indexPattern.terms.dragToReorder": "拖动以重新排序", "xpack.lens.indexPattern.terms.exclude": "排除值", "xpack.lens.indexPattern.terms.include": "包括值", "xpack.lens.indexPattern.terms.includeExcludePatternPlaceholder": "输入正则表达式以筛选值", From 1854694db8546bc0db402547d73ba23be515bb12 Mon Sep 17 00:00:00 2001 From: "Joey F. Poon" Date: Fri, 30 Sep 2022 09:47:21 -0500 Subject: [PATCH 49/72] [Security Solution] add new permission properties for endpoint rbac (#142243) Co-authored-by: kibanamachine <42973632+kibanamachine@users.noreply.github.com> --- .../endpoint/service/authz/authz.test.ts | 69 +++++++- .../common/endpoint/service/authz/authz.ts | 164 +++++++++++++++++- .../common/endpoint/types/authz.ts | 30 ++++ 3 files changed, 245 insertions(+), 18 deletions(-) diff --git a/x-pack/plugins/security_solution/common/endpoint/service/authz/authz.test.ts b/x-pack/plugins/security_solution/common/endpoint/service/authz/authz.test.ts index d8f65cf07d28f..e5b2f78c25472 100644 --- a/x-pack/plugins/security_solution/common/endpoint/service/authz/authz.test.ts +++ b/x-pack/plugins/security_solution/common/endpoint/service/authz/authz.test.ts @@ -110,24 +110,60 @@ describe('Endpoint Authz service', () => { describe('and endpoint rbac is enabled', () => { it.each<[EndpointAuthzKeyList[number], string]>([ + ['canWriteEndpointList', 'writeEndpointList'], + ['canReadEndpointList', 'readEndpointList'], + ['canWritePolicyManagement', 'writePolicyManagement'], + ['canReadPolicyManagement', 'readPolicyManagement'], + ['canWriteActionsLogManagement', 'writeActionsLogManagement'], + ['canReadActionsLogManagement', 'readActionsLogManagement'], ['canIsolateHost', 'writeHostIsolation'], ['canUnIsolateHost', 'writeHostIsolation'], ['canKillProcess', 'writeProcessOperations'], ['canSuspendProcess', 'writeProcessOperations'], ['canGetRunningProcesses', 'writeProcessOperations'], + ['canWriteFileOperations', 'writeFileOperations'], + ['canWriteTrustedApplications', 'writeTrustedApplications'], + ['canReadTrustedApplications', 'readTrustedApplications'], + ['canWriteHostIsolationExceptions', 'writeHostIsolationExceptions'], + ['canReadHostIsolationExceptions', 'readHostIsolationExceptions'], + ['canWriteBlocklist', 'writeBlocklist'], + ['canReadBlocklist', 'readBlocklist'], + ['canWriteEventFilters', 'writeEventFilters'], + ['canReadEventFilters', 'readEventFilters'], ])('%s should be true if `packagePrivilege.%s` is `true`', (auth) => { const authz = calculateEndpointAuthz(licenseService, fleetAuthz, userRoles, true); expect(authz[auth]).toBe(true); }); - it.each<[EndpointAuthzKeyList[number], string]>([ - ['canIsolateHost', 'writeHostIsolation'], - ['canUnIsolateHost', 'writeHostIsolation'], - ['canKillProcess', 'writeProcessOperations'], - ['canSuspendProcess', 'writeProcessOperations'], - ['canGetRunningProcesses', 'writeProcessOperations'], - ])('%s should be false if `packagePrivilege.%s` is `false`', (auth, privilege) => { - fleetAuthz.packagePrivileges!.endpoint.actions[privilege].executePackageAction = false; + it.each<[EndpointAuthzKeyList[number], string[]]>([ + ['canWriteEndpointList', ['writeEndpointList']], + ['canReadEndpointList', ['writeEndpointList', 'readEndpointList']], + ['canWritePolicyManagement', ['writePolicyManagement']], + ['canReadPolicyManagement', ['writePolicyManagement', 'readPolicyManagement']], + ['canWriteActionsLogManagement', ['writeActionsLogManagement']], + ['canReadActionsLogManagement', ['writeActionsLogManagement', 'readActionsLogManagement']], + ['canIsolateHost', ['writeHostIsolation']], + ['canUnIsolateHost', ['writeHostIsolation']], + ['canKillProcess', ['writeProcessOperations']], + ['canSuspendProcess', ['writeProcessOperations']], + ['canGetRunningProcesses', ['writeProcessOperations']], + ['canWriteFileOperations', ['writeFileOperations']], + ['canWriteTrustedApplications', ['writeTrustedApplications']], + ['canReadTrustedApplications', ['writeTrustedApplications', 'readTrustedApplications']], + ['canWriteHostIsolationExceptions', ['writeHostIsolationExceptions']], + [ + 'canReadHostIsolationExceptions', + ['writeHostIsolationExceptions', 'readHostIsolationExceptions'], + ], + ['canWriteBlocklist', ['writeBlocklist']], + ['canReadBlocklist', ['writeBlocklist', 'readBlocklist']], + ['canWriteEventFilters', ['writeEventFilters']], + ['canReadEventFilters', ['writeEventFilters', 'readEventFilters']], + ])('%s should be false if `packagePrivilege.%s` is `false`', (auth, privileges) => { + // read permission checks for write || read so we need to set both to false + privileges.forEach((privilege) => { + fleetAuthz.packagePrivileges!.endpoint.actions[privilege].executePackageAction = false; + }); const authz = calculateEndpointAuthz(licenseService, fleetAuthz, userRoles, true); expect(authz[auth]).toBe(false); }); @@ -139,13 +175,28 @@ describe('Endpoint Authz service', () => { expect(getEndpointAuthzInitialState()).toEqual({ canAccessFleet: false, canAccessEndpointManagement: false, + canCreateArtifactsByPolicy: false, + canWriteEndpointList: false, + canReadEndpointList: false, + canWritePolicyManagement: false, + canReadPolicyManagement: false, + canWriteActionsLogManagement: false, + canReadActionsLogManagement: false, canIsolateHost: false, canUnIsolateHost: true, - canCreateArtifactsByPolicy: false, canKillProcess: false, canSuspendProcess: false, canGetRunningProcesses: false, canAccessResponseConsole: false, + canWriteFileOperations: false, + canWriteTrustedApplications: false, + canReadTrustedApplications: false, + canWriteHostIsolationExceptions: false, + canReadHostIsolationExceptions: false, + canWriteBlocklist: false, + canReadBlocklist: false, + canWriteEventFilters: false, + canReadEventFilters: false, }); }); }); diff --git a/x-pack/plugins/security_solution/common/endpoint/service/authz/authz.ts b/x-pack/plugins/security_solution/common/endpoint/service/authz/authz.ts index 9e280f383cae3..dde2a7f92b1e0 100644 --- a/x-pack/plugins/security_solution/common/endpoint/service/authz/authz.ts +++ b/x-pack/plugins/security_solution/common/endpoint/service/authz/authz.ts @@ -5,11 +5,23 @@ * 2.0. */ -import type { FleetAuthz } from '@kbn/fleet-plugin/common'; +import type { ENDPOINT_PRIVILEGES } from '@kbn/fleet-plugin/common'; +import { type FleetAuthz } from '@kbn/fleet-plugin/common'; import type { LicenseService } from '../../../license'; import type { EndpointAuthz } from '../../types/authz'; import type { MaybeImmutable } from '../../types'; +function hasPermission( + fleetAuthz: FleetAuthz, + isEndpointRbacEnabled: boolean, + hasEndpointManagementAccess: boolean, + privilege: typeof ENDPOINT_PRIVILEGES[number] +) { + return isEndpointRbacEnabled + ? fleetAuthz.packagePrivileges?.endpoint?.actions[privilege].executePackageAction ?? false + : hasEndpointManagementAccess; +} + /** * Used by both the server and the UI to generate the Authorization for access to Endpoint related * functionality @@ -27,19 +39,128 @@ export const calculateEndpointAuthz = ( const isPlatinumPlusLicense = licenseService.isPlatinumPlus(); const isEnterpriseLicense = licenseService.isEnterprise(); const hasEndpointManagementAccess = userRoles.includes('superuser'); - const canIsolateHost = isEndpointRbacEnabled - ? fleetAuthz.packagePrivileges?.endpoint?.actions?.writeHostIsolation?.executePackageAction || - false - : hasEndpointManagementAccess; - const canWriteProcessOperations = isEndpointRbacEnabled - ? fleetAuthz.packagePrivileges?.endpoint?.actions?.writeProcessOperations - ?.executePackageAction || false - : hasEndpointManagementAccess; + const canWriteEndpointList = hasPermission( + fleetAuthz, + isEndpointRbacEnabled, + hasEndpointManagementAccess, + 'writeEndpointList' + ); + const canReadEndpointList = + canWriteEndpointList || + hasPermission( + fleetAuthz, + isEndpointRbacEnabled, + hasEndpointManagementAccess, + 'readEndpointList' + ); + const canWritePolicyManagement = hasPermission( + fleetAuthz, + isEndpointRbacEnabled, + hasEndpointManagementAccess, + 'writePolicyManagement' + ); + const canReadPolicyManagement = + canWritePolicyManagement || + hasPermission( + fleetAuthz, + isEndpointRbacEnabled, + hasEndpointManagementAccess, + 'readPolicyManagement' + ); + const canWriteActionsLogManagement = hasPermission( + fleetAuthz, + isEndpointRbacEnabled, + hasEndpointManagementAccess, + 'writeActionsLogManagement' + ); + const canReadActionsLogManagement = + canWriteActionsLogManagement || + hasPermission( + fleetAuthz, + isEndpointRbacEnabled, + hasEndpointManagementAccess, + 'readActionsLogManagement' + ); + const canIsolateHost = hasPermission( + fleetAuthz, + isEndpointRbacEnabled, + hasEndpointManagementAccess, + 'writeHostIsolation' + ); + const canWriteProcessOperations = hasPermission( + fleetAuthz, + isEndpointRbacEnabled, + hasEndpointManagementAccess, + 'writeProcessOperations' + ); + const canWriteTrustedApplications = hasPermission( + fleetAuthz, + isEndpointRbacEnabled, + hasEndpointManagementAccess, + 'writeTrustedApplications' + ); + const canReadTrustedApplications = + canWriteTrustedApplications || + hasPermission( + fleetAuthz, + isEndpointRbacEnabled, + hasEndpointManagementAccess, + 'readTrustedApplications' + ); + const canWriteHostIsolationExceptions = hasPermission( + fleetAuthz, + isEndpointRbacEnabled, + hasEndpointManagementAccess, + 'writeHostIsolationExceptions' + ); + const canReadHostIsolationExceptions = + canWriteHostIsolationExceptions || + hasPermission( + fleetAuthz, + isEndpointRbacEnabled, + hasEndpointManagementAccess, + 'readHostIsolationExceptions' + ); + const canWriteBlocklist = hasPermission( + fleetAuthz, + isEndpointRbacEnabled, + hasEndpointManagementAccess, + 'writeBlocklist' + ); + const canReadBlocklist = + canWriteBlocklist || + hasPermission(fleetAuthz, isEndpointRbacEnabled, hasEndpointManagementAccess, 'readBlocklist'); + const canWriteEventFilters = hasPermission( + fleetAuthz, + isEndpointRbacEnabled, + hasEndpointManagementAccess, + 'writeEventFilters' + ); + const canReadEventFilters = + canWriteEventFilters || + hasPermission( + fleetAuthz, + isEndpointRbacEnabled, + hasEndpointManagementAccess, + 'readEventFilters' + ); + const canWriteFileOperations = hasPermission( + fleetAuthz, + isEndpointRbacEnabled, + hasEndpointManagementAccess, + 'writeFileOperations' + ); return { canAccessFleet: fleetAuthz?.fleet.all ?? userRoles.includes('superuser'), canAccessEndpointManagement: hasEndpointManagementAccess, canCreateArtifactsByPolicy: hasEndpointManagementAccess && isPlatinumPlusLicense, + canWriteEndpointList, + canReadEndpointList, + canWritePolicyManagement, + canReadPolicyManagement, + canWriteActionsLogManagement, + canReadActionsLogManagement, // Response Actions canIsolateHost: canIsolateHost && isPlatinumPlusLicense, canUnIsolateHost: canIsolateHost, @@ -47,6 +168,16 @@ export const calculateEndpointAuthz = ( canSuspendProcess: canWriteProcessOperations && isEnterpriseLicense, canGetRunningProcesses: canWriteProcessOperations && isEnterpriseLicense, canAccessResponseConsole: hasEndpointManagementAccess && isEnterpriseLicense, + canWriteFileOperations: canWriteFileOperations && isEnterpriseLicense, + // artifacts + canWriteTrustedApplications, + canReadTrustedApplications, + canWriteHostIsolationExceptions: canWriteHostIsolationExceptions && isPlatinumPlusLicense, + canReadHostIsolationExceptions, + canWriteBlocklist, + canReadBlocklist, + canWriteEventFilters, + canReadEventFilters, }; }; @@ -55,11 +186,26 @@ export const getEndpointAuthzInitialState = (): EndpointAuthz => { canAccessFleet: false, canAccessEndpointManagement: false, canCreateArtifactsByPolicy: false, + canWriteEndpointList: false, + canReadEndpointList: false, + canWritePolicyManagement: false, + canReadPolicyManagement: false, + canWriteActionsLogManagement: false, + canReadActionsLogManagement: false, canIsolateHost: false, canUnIsolateHost: true, canKillProcess: false, canSuspendProcess: false, canGetRunningProcesses: false, canAccessResponseConsole: false, + canWriteFileOperations: false, + canWriteTrustedApplications: false, + canReadTrustedApplications: false, + canWriteHostIsolationExceptions: false, + canReadHostIsolationExceptions: false, + canWriteBlocklist: false, + canReadBlocklist: false, + canWriteEventFilters: false, + canReadEventFilters: false, }; }; diff --git a/x-pack/plugins/security_solution/common/endpoint/types/authz.ts b/x-pack/plugins/security_solution/common/endpoint/types/authz.ts index e237e4ba1fe9c..b8ca15d69d1a6 100644 --- a/x-pack/plugins/security_solution/common/endpoint/types/authz.ts +++ b/x-pack/plugins/security_solution/common/endpoint/types/authz.ts @@ -16,6 +16,18 @@ export interface EndpointAuthz { canAccessEndpointManagement: boolean; /** if user has permissions to create Artifacts by Policy */ canCreateArtifactsByPolicy: boolean; + /** if user has write permissions to endpoint list */ + canWriteEndpointList: boolean; + /** if user has read permissions to endpoint list */ + canReadEndpointList: boolean; + /** if user has write permissions for policy management */ + canWritePolicyManagement: boolean; + /** if user has read permissions for policy management */ + canReadPolicyManagement: boolean; + /** if user has write permissions for actions log management */ + canWriteActionsLogManagement: boolean; + /** if user has read permissions for actions log management */ + canReadActionsLogManagement: boolean; /** If user has permissions to isolate hosts */ canIsolateHost: boolean; /** If user has permissions to un-isolate (release) hosts */ @@ -28,6 +40,24 @@ export interface EndpointAuthz { canGetRunningProcesses: boolean; /** If user has permissions to use the Response Actions Console */ canAccessResponseConsole: boolean; + /** If user has write permissions to use file operations */ + canWriteFileOperations: boolean; + /** if user has write permissions for trusted applications */ + canWriteTrustedApplications: boolean; + /** if user has read permissions for trusted applications */ + canReadTrustedApplications: boolean; + /** if user has write permissions for host isolation exceptions */ + canWriteHostIsolationExceptions: boolean; + /** if user has read permissions for host isolation exceptions */ + canReadHostIsolationExceptions: boolean; + /** if user has write permissions for blocklist entries */ + canWriteBlocklist: boolean; + /** if user has read permissions for blocklist entries */ + canReadBlocklist: boolean; + /** if user has write permissions for event filters */ + canWriteEventFilters: boolean; + /** if user has read permissions for event filters */ + canReadEventFilters: boolean; } export type EndpointAuthzKeyList = Array; From 62734e6236c8c945db0fc7d6c03d299d0833f61d Mon Sep 17 00:00:00 2001 From: Giorgos Bamparopoulos Date: Fri, 30 Sep 2022 16:03:55 +0100 Subject: [PATCH 50/72] Remove output_id from apm package policy (#142331) --- .../runtime_attachment/runtime_attachment.stories.tsx | 2 -- .../apm_policy_form/edit_apm_policy_form.stories.tsx | 1 - .../server/routes/fleet/get_apm_package_policy_definition.ts | 1 - x-pack/plugins/apm/server/routes/fleet/source_maps.test.ts | 1 - 4 files changed, 5 deletions(-) diff --git a/x-pack/plugins/apm/public/components/fleet_integration/apm_agents/runtime_attachment/runtime_attachment.stories.tsx b/x-pack/plugins/apm/public/components/fleet_integration/apm_agents/runtime_attachment/runtime_attachment.stories.tsx index fd3ee2f3e4552..bef88a78f6845 100644 --- a/x-pack/plugins/apm/public/components/fleet_integration/apm_agents/runtime_attachment/runtime_attachment.stories.tsx +++ b/x-pack/plugins/apm/public/components/fleet_integration/apm_agents/runtime_attachment/runtime_attachment.stories.tsx @@ -118,7 +118,6 @@ const policy = { namespace: 'default', policy_id: 'policy-elastic-agent-on-cloud', enabled: true, - output_id: '', inputs: [ { type: 'apm', @@ -341,7 +340,6 @@ const newPolicy = { namespace: 'default', policy_id: 'policy-elastic-agent-on-cloud', enabled: true, - output_id: '', package: { name: 'apm', title: 'Elastic APM', diff --git a/x-pack/plugins/apm/public/components/fleet_integration/apm_policy_form/edit_apm_policy_form.stories.tsx b/x-pack/plugins/apm/public/components/fleet_integration/apm_policy_form/edit_apm_policy_form.stories.tsx index c1bfa7ac6cf6f..b4243124766ab 100644 --- a/x-pack/plugins/apm/public/components/fleet_integration/apm_policy_form/edit_apm_policy_form.stories.tsx +++ b/x-pack/plugins/apm/public/components/fleet_integration/apm_policy_form/edit_apm_policy_form.stories.tsx @@ -81,7 +81,6 @@ const policy = { namespace: 'default', enabled: true, policy_id: 'policy-elastic-agent-on-cloud', - output_id: '', package: { name: 'apm', version: '8.3.0', diff --git a/x-pack/plugins/apm/server/routes/fleet/get_apm_package_policy_definition.ts b/x-pack/plugins/apm/server/routes/fleet/get_apm_package_policy_definition.ts index 023ba2755ea9a..d2eea5db4ef17 100644 --- a/x-pack/plugins/apm/server/routes/fleet/get_apm_package_policy_definition.ts +++ b/x-pack/plugins/apm/server/routes/fleet/get_apm_package_policy_definition.ts @@ -40,7 +40,6 @@ export async function getApmPackagePolicyDefinition({ namespace: 'default', enabled: true, policy_id: POLICY_ELASTIC_AGENT_ON_CLOUD, - output_id: '', inputs: [ { type: 'apm', diff --git a/x-pack/plugins/apm/server/routes/fleet/source_maps.test.ts b/x-pack/plugins/apm/server/routes/fleet/source_maps.test.ts index d4f9b79e516ce..0f617b076ab83 100644 --- a/x-pack/plugins/apm/server/routes/fleet/source_maps.test.ts +++ b/x-pack/plugins/apm/server/routes/fleet/source_maps.test.ts @@ -19,7 +19,6 @@ const packagePolicy = { namespace: 'default', policy_id: '7a87c160-c961-11eb-81e2-f7327d61c92a', enabled: true, - output_id: '', inputs: [ { policy_template: 'apmserver', From 6f3613bccd263ab1e6081fe0810d7669c4bd319f Mon Sep 17 00:00:00 2001 From: spalger Date: Fri, 30 Sep 2022 10:15:09 -0500 Subject: [PATCH 51/72] skip flaky jest suite (#142312) --- .../indicators/hooks/use_aggregated_indicators.test.tsx | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/x-pack/plugins/threat_intelligence/public/modules/indicators/hooks/use_aggregated_indicators.test.tsx b/x-pack/plugins/threat_intelligence/public/modules/indicators/hooks/use_aggregated_indicators.test.tsx index f067df33d79d4..7791020d58e02 100644 --- a/x-pack/plugins/threat_intelligence/public/modules/indicators/hooks/use_aggregated_indicators.test.tsx +++ b/x-pack/plugins/threat_intelligence/public/modules/indicators/hooks/use_aggregated_indicators.test.tsx @@ -28,7 +28,8 @@ const renderUseAggregatedIndicators = () => wrapper: TestProvidersComponent, }); -describe('useAggregatedIndicators()', () => { +// FLAKY: https://github.com/elastic/kibana/issues/142312 +describe.skip('useAggregatedIndicators()', () => { beforeEach(jest.clearAllMocks); type MockedCreateFetchAggregatedIndicators = jest.MockedFunction< From 93b97bf5b2aece91bf56f620a84a197e3b055152 Mon Sep 17 00:00:00 2001 From: Marco Liberati Date: Fri, 30 Sep 2022 17:50:01 +0200 Subject: [PATCH 52/72] [Lens] Add control for global filters to the annotation layer menu (#141615) * :sparkles: Add ignore global filters feature * :white_check_mark: Fix tests * :wrench: Remove unused translations * :recycle: Make it simpler * :white_check_mark: Fix test * :wrench: slighlty increase bundle limit size * :wrench: Forward layer flag to event config * :recycle: refactor actions code to include viz custom actions * :bug: Flip the logic * :fire: Remove unused file * :sparkles: Migrate ignore flag to annotation layers * :white_check_mark: Add unit test for default dataView --- .../lib/configurations/xy/layers.test.ts | 84 ++++++++++++++- .../lib/configurations/xy/layers.ts | 26 +++-- .../layer_actions/clone_layer_action.tsx | 4 +- .../layer_actions/layer_actions.tsx | 102 +++++++++--------- .../layer_actions/remove_layer_action.tsx | 5 +- .../config_panel/layer_actions/types.ts | 17 --- .../editor_frame/config_panel/layer_panel.tsx | 45 ++++++-- x-pack/plugins/lens/public/types.ts | 22 ++++ .../visualizations/xy/annotations/actions.ts | 54 ++++++++++ .../public/visualizations/xy/to_expression.ts | 5 +- .../visualizations/xy/visualization.test.ts | 77 +++++++++++++ .../visualizations/xy/visualization.tsx | 25 +++-- .../annotations_panel.tsx | 46 ++++---- .../annotations_config_panel/helpers.ts | 1 + 14 files changed, 387 insertions(+), 126 deletions(-) delete mode 100644 x-pack/plugins/lens/public/editor_frame_service/editor_frame/config_panel/layer_actions/types.ts create mode 100644 x-pack/plugins/lens/public/visualizations/xy/annotations/actions.ts diff --git a/src/plugins/vis_types/timeseries/public/convert_to_lens/lib/configurations/xy/layers.test.ts b/src/plugins/vis_types/timeseries/public/convert_to_lens/lib/configurations/xy/layers.test.ts index dd4926e7aeb7e..6c94971397d3e 100644 --- a/src/plugins/vis_types/timeseries/public/convert_to_lens/lib/configurations/xy/layers.test.ts +++ b/src/plugins/vis_types/timeseries/public/convert_to_lens/lib/configurations/xy/layers.test.ts @@ -309,6 +309,27 @@ describe('getLayers', () => { ], series: [createSeries({ metrics: staticValueMetric })], }); + const panelWithSingleAnnotationDefaultDataView = createPanel({ + annotations: [ + { + fields: 'geo.src,host', + template: 'Security Error from {{geo.src}} on {{host}}', + query_string: { + query: 'tags:error AND tags:security', + language: 'lucene', + }, + id: 'ann1', + color: 'rgba(211,49,21,0.7)', + time_field: 'timestamp', + icon: 'fa-asterisk', + ignore_global_filters: 1, + ignore_panel_filters: 1, + hidden: true, + index_pattern: '', + }, + ], + series: [createSeries({ metrics: staticValueMetric })], + }); test.each<[string, [Record, Panel], Array>]>([ [ @@ -521,6 +542,14 @@ describe('getLayers', () => { timeField: 'timestamp', type: 'query', }, + ], + indexPatternId: 'test', + }, + { + layerId: 'test-id', + layerType: 'annotations', + ignoreGlobalFilters: false, + annotations: [ { color: '#0000FF', filter: { @@ -567,6 +596,51 @@ describe('getLayers', () => { }, ], ], + [ + 'annotation layer gets correct dataView when none is defined', + [dataSourceLayersWithStatic, panelWithSingleAnnotationDefaultDataView], + [ + { + layerType: 'referenceLine', + accessors: ['column-id-1'], + layerId: 'test-layer-1', + yConfig: [ + { + forAccessor: 'column-id-1', + axisMode: 'right', + color: '#68BC00', + fill: 'below', + }, + ], + }, + { + layerId: 'test-id', + layerType: 'annotations', + ignoreGlobalFilters: true, + annotations: [ + { + color: '#D33115', + extraFields: ['geo.src'], + filter: { + language: 'lucene', + query: 'tags:error AND tags:security', + type: 'kibana_query', + }, + icon: 'asterisk', + id: 'ann1', + isHidden: true, + key: { + type: 'point_in_time', + }, + label: 'Event', + timeField: 'timestamp', + type: 'query', + }, + ], + indexPatternId: 'default', + }, + ], + ], ])('should return %s', async (_, input, expected) => { const layers = await getLayers(...input, indexPatternsService as DataViewsPublicPluginStart); expect(layers).toEqual(expected.map(expect.objectContaining)); @@ -583,8 +657,14 @@ const mockedIndices = [ ] as unknown as DataView[]; const indexPatternsService = { - getDefault: jest.fn(() => Promise.resolve({ id: 'default', title: 'index' })), - get: jest.fn(() => Promise.resolve(mockedIndices[0])), + getDefault: jest.fn(() => + Promise.resolve({ + id: 'default', + title: 'index', + getFieldByName: (name: string) => ({ aggregatable: name !== 'host' }), + }) + ), + get: jest.fn((id) => Promise.resolve({ ...mockedIndices[0], id })), find: jest.fn((search: string, size: number) => { if (size !== 1) { // shouldn't request more than one data view since there is a significant performance penalty diff --git a/src/plugins/vis_types/timeseries/public/convert_to_lens/lib/configurations/xy/layers.ts b/src/plugins/vis_types/timeseries/public/convert_to_lens/lib/configurations/xy/layers.ts index 7cc2aea19cbd9..ec0e24e2db873 100644 --- a/src/plugins/vis_types/timeseries/public/convert_to_lens/lib/configurations/xy/layers.ts +++ b/src/plugins/vis_types/timeseries/public/convert_to_lens/lib/configurations/xy/layers.ts @@ -63,7 +63,7 @@ function getColor( } function nonNullable(value: T): value is NonNullable { - return value !== null && value !== undefined; + return value != null; } export const getLayers = async ( @@ -132,16 +132,22 @@ export const getLayers = async ( return nonAnnotationsLayers; } - const annotationsByIndexPattern = groupBy( - model.annotations, - (a) => typeof a.index_pattern === 'object' && 'id' in a.index_pattern && a.index_pattern.id - ); + const annotationsByIndexPatternAndIgnoreFlag = groupBy(model.annotations, (a) => { + const id = typeof a.index_pattern === 'object' && 'id' in a.index_pattern && a.index_pattern.id; + return `${id}-${Boolean(a.ignore_global_filters)}`; + }); try { const annotationsLayers: Array = await Promise.all( - Object.entries(annotationsByIndexPattern).map(async ([indexPatternId, annotations]) => { + Object.values(annotationsByIndexPatternAndIgnoreFlag).map(async (annotations) => { + const [firstAnnotation] = annotations; + const indexPatternId = + typeof firstAnnotation.index_pattern === 'string' + ? firstAnnotation.index_pattern + : firstAnnotation.index_pattern?.id; const convertedAnnotations: EventAnnotationConfig[] = []; - const { indexPattern } = (await fetchIndexPattern({ id: indexPatternId }, dataViews)) || {}; + const { indexPattern } = + (await fetchIndexPattern(indexPatternId && { id: indexPatternId }, dataViews)) || {}; if (indexPattern) { annotations.forEach((a: Annotation) => { @@ -153,9 +159,9 @@ export const getLayers = async ( return { layerId: v4(), layerType: 'annotations', - ignoreGlobalFilters: true, + ignoreGlobalFilters: Boolean(firstAnnotation.ignore_global_filters), annotations: convertedAnnotations, - indexPatternId, + indexPatternId: indexPattern.id!, }; } }) @@ -173,7 +179,7 @@ const convertAnnotation = ( ): EventAnnotationConfig | undefined => { const extraFields = annotation.fields ?.replace(/\s/g, '') - ?.split(',') + .split(',') .map((field) => { const dataViewField = dataView.getFieldByName(field); return dataViewField && dataViewField.aggregatable ? field : undefined; diff --git a/x-pack/plugins/lens/public/editor_frame_service/editor_frame/config_panel/layer_actions/clone_layer_action.tsx b/x-pack/plugins/lens/public/editor_frame_service/editor_frame/config_panel/layer_actions/clone_layer_action.tsx index 26d4c1f04f41a..97d0cf73b80dd 100644 --- a/x-pack/plugins/lens/public/editor_frame_service/editor_frame/config_panel/layer_actions/clone_layer_action.tsx +++ b/x-pack/plugins/lens/public/editor_frame_service/editor_frame/config_panel/layer_actions/clone_layer_action.tsx @@ -6,8 +6,8 @@ */ import { i18n } from '@kbn/i18n'; -import { Visualization } from '../../../..'; -import { LayerAction } from './types'; +import type { LayerAction } from '../../../../types'; +import type { Visualization } from '../../../..'; interface CloneLayerAction { execute: () => void; diff --git a/x-pack/plugins/lens/public/editor_frame_service/editor_frame/config_panel/layer_actions/layer_actions.tsx b/x-pack/plugins/lens/public/editor_frame_service/editor_frame/config_panel/layer_actions/layer_actions.tsx index b9ca695882ef2..bc1c41caa650b 100644 --- a/x-pack/plugins/lens/public/editor_frame_service/editor_frame/config_panel/layer_actions/layer_actions.tsx +++ b/x-pack/plugins/lens/public/editor_frame_service/editor_frame/config_panel/layer_actions/layer_actions.tsx @@ -5,9 +5,8 @@ * 2.0. */ -import React, { useState, useCallback, useMemo } from 'react'; +import React, { useState, useCallback } from 'react'; import { i18n } from '@kbn/i18n'; -import type { CoreStart } from '@kbn/core/public'; import { EuiButtonIcon, EuiContextMenuPanel, @@ -18,13 +17,28 @@ import { EuiText, EuiOutsideClickDetector, } from '@elastic/eui'; -import type { LayerType, Visualization } from '../../../..'; -import type { LayerAction } from './types'; - +import type { CoreStart } from '@kbn/core/public'; +import type { LayerType } from '../../../..'; +import type { LayerAction, Visualization } from '../../../../types'; import { getCloneLayerAction } from './clone_layer_action'; import { getRemoveLayerAction } from './remove_layer_action'; export interface LayerActionsProps { + layerIndex: number; + actions: LayerAction[]; +} + +/** @internal **/ +export const getSharedActions = ({ + core, + layerIndex, + layerType, + activeVisualization, + isOnlyLayer, + isTextBasedLanguage, + onCloneLayer, + onRemoveLayer, +}: { onRemoveLayer: () => void; onCloneLayer: () => void; layerIndex: number; @@ -33,14 +47,25 @@ export interface LayerActionsProps { layerType?: LayerType; isTextBasedLanguage?: boolean; core: Pick; -} +}) => [ + getCloneLayerAction({ + execute: onCloneLayer, + layerIndex, + activeVisualization, + isTextBasedLanguage, + }), + getRemoveLayerAction({ + execute: onRemoveLayer, + layerIndex, + activeVisualization, + layerType, + isOnlyLayer, + core, + }), +]; /** @internal **/ -const InContextMenuActions = ( - props: LayerActionsProps & { - actions: LayerAction[]; - } -) => { +const InContextMenuActions = (props: LayerActionsProps) => { const dataTestSubject = `lnsLayerSplitButton--${props.layerIndex}`; const [isPopoverOpen, setPopover] = useState(false); const splitButtonPopoverId = useGeneratedHtmlId({ @@ -105,47 +130,24 @@ const InContextMenuActions = ( }; export const LayerActions = (props: LayerActionsProps) => { - const compatibleActions = useMemo( - () => - [ - getCloneLayerAction({ - execute: props.onCloneLayer, - layerIndex: props.layerIndex, - activeVisualization: props.activeVisualization, - isTextBasedLanguage: props.isTextBasedLanguage, - }), - getRemoveLayerAction({ - execute: props.onRemoveLayer, - layerIndex: props.layerIndex, - activeVisualization: props.activeVisualization, - layerType: props.layerType, - isOnlyLayer: props.isOnlyLayer, - core: props.core, - }), - ].filter((i) => i.isCompatible), - [props] - ); - - if (!compatibleActions.length) { + if (!props.actions.length) { return null; } - if (compatibleActions.length > 1) { - return ; - } else { - const [{ displayName, execute, icon, color, 'data-test-subj': dataTestSubj }] = - compatibleActions; - - return ( - - ); + if (props.actions.length > 1) { + return ; } + const [{ displayName, execute, icon, color, 'data-test-subj': dataTestSubj }] = props.actions; + + return ( + + ); }; diff --git a/x-pack/plugins/lens/public/editor_frame_service/editor_frame/config_panel/layer_actions/remove_layer_action.tsx b/x-pack/plugins/lens/public/editor_frame_service/editor_frame/config_panel/layer_actions/remove_layer_action.tsx index 32a18d1535697..58a4248b51857 100644 --- a/x-pack/plugins/lens/public/editor_frame_service/editor_frame/config_panel/layer_actions/remove_layer_action.tsx +++ b/x-pack/plugins/lens/public/editor_frame_service/editor_frame/config_panel/layer_actions/remove_layer_action.tsx @@ -22,10 +22,9 @@ import { import { i18n } from '@kbn/i18n'; import { toMountPoint } from '@kbn/kibana-react-plugin/public'; import { Storage } from '@kbn/kibana-utils-plugin/public'; -import { LayerAction } from './types'; -import { Visualization } from '../../../../types'; +import type { LayerAction, Visualization } from '../../../../types'; import { LOCAL_STORAGE_LENS_KEY } from '../../../../settings_storage'; -import { LayerType, layerTypes } from '../../../..'; +import { type LayerType, layerTypes } from '../../../..'; interface RemoveLayerAction { execute: () => void; diff --git a/x-pack/plugins/lens/public/editor_frame_service/editor_frame/config_panel/layer_actions/types.ts b/x-pack/plugins/lens/public/editor_frame_service/editor_frame/config_panel/layer_actions/types.ts deleted file mode 100644 index 4614874777cc2..0000000000000 --- a/x-pack/plugins/lens/public/editor_frame_service/editor_frame/config_panel/layer_actions/types.ts +++ /dev/null @@ -1,17 +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 { IconType, EuiButtonIconColor } from '@elastic/eui'; - -/** @internal **/ -export interface LayerAction { - displayName: string; - execute: () => void | Promise; - icon: IconType; - color?: EuiButtonIconColor; - isCompatible: boolean; - 'data-test-subj'?: string; -} diff --git a/x-pack/plugins/lens/public/editor_frame_service/editor_frame/config_panel/layer_panel.tsx b/x-pack/plugins/lens/public/editor_frame_service/editor_frame/config_panel/layer_panel.tsx index e40281fa1f3ea..3d1068ebd521f 100644 --- a/x-pack/plugins/lens/public/editor_frame_service/editor_frame/config_panel/layer_panel.tsx +++ b/x-pack/plugins/lens/public/editor_frame_service/editor_frame/config_panel/layer_panel.tsx @@ -43,6 +43,7 @@ import { selectDatasourceStates, } from '../../../state_management'; import { onDropForVisualization } from './buttons/drop_targets_utils'; +import { getSharedActions } from './layer_actions/layer_actions'; const initialActiveDimensionState = { isNew: false, @@ -310,6 +311,39 @@ export function LayerPanel( const [datasource] = Object.values(framePublicAPI.datasourceLayers); const isTextBasedLanguage = Boolean(datasource?.isTextBasedLanguage()); + const compatibleActions = useMemo( + () => + [ + ...(activeVisualization.getSupportedActionsForLayer?.( + layerId, + visualizationState, + updateVisualization + ) || []), + ...getSharedActions({ + activeVisualization, + core, + layerIndex, + layerType: activeVisualization.getLayerType(layerId, visualizationState), + isOnlyLayer, + isTextBasedLanguage, + onCloneLayer, + onRemoveLayer, + }), + ].filter((i) => i.isCompatible), + [ + activeVisualization, + core, + isOnlyLayer, + isTextBasedLanguage, + layerId, + layerIndex, + onCloneLayer, + onRemoveLayer, + updateVisualization, + visualizationState, + ] + ); + return ( <>
@@ -332,16 +366,7 @@ export function LayerPanel( /> - + {(layerDatasource || activeVisualization.renderLayerPanel) && } diff --git a/x-pack/plugins/lens/public/types.ts b/x-pack/plugins/lens/public/types.ts index 486ddef88ee99..2ccc393a09326 100644 --- a/x-pack/plugins/lens/public/types.ts +++ b/x-pack/plugins/lens/public/types.ts @@ -30,6 +30,7 @@ import type { IndexPatternAggRestrictions } from '@kbn/data-plugin/public'; import type { FieldSpec, DataViewSpec } from '@kbn/data-views-plugin/common'; import type { FieldFormatParams } from '@kbn/field-formats-plugin/common'; import { SearchResponseWarning } from '@kbn/data-plugin/public/search/types'; +import type { EuiButtonIconColor } from '@elastic/eui'; import type { DraggingIdentifier, DragDropIdentifier, DragContextState } from './drag_drop'; import type { DateRange, LayerType, SortingHint } from '../common'; import type { @@ -506,6 +507,17 @@ export interface DatasourceDataPanelProps { usedIndexPatterns?: string[]; } +/** @internal **/ +export interface LayerAction { + displayName: string; + description?: string; + execute: () => void | Promise; + icon: IconType; + color?: EuiButtonIconColor; + isCompatible: boolean; + 'data-test-subj'?: string; +} + interface SharedDimensionProps { /** Visualizations can restrict operations based on their own rules. * For example, limiting to only bucketed or only numeric operations. @@ -962,6 +974,16 @@ export interface Visualization { staticValue?: unknown; }>; }>; + /** + * returns a list of custom actions supported by the visualization layer. + * Default actions like delete/clear are not included in this list and are managed by the editor frame + * */ + getSupportedActionsForLayer?: ( + layerId: string, + state: T, + setState: StateSetter + ) => LayerAction[]; + /** returns the type string of the given layer */ getLayerType: (layerId: string, state?: T) => LayerType | undefined; /* returns the type of removal operation to perform for the specific layer in the current state */ getRemoveOperation?: (state: T, layerId: string) => 'remove' | 'clear'; diff --git a/x-pack/plugins/lens/public/visualizations/xy/annotations/actions.ts b/x-pack/plugins/lens/public/visualizations/xy/annotations/actions.ts new file mode 100644 index 0000000000000..d7d3c9ca8a56a --- /dev/null +++ b/x-pack/plugins/lens/public/visualizations/xy/annotations/actions.ts @@ -0,0 +1,54 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import { i18n } from '@kbn/i18n'; +import type { LayerAction, StateSetter } from '../../../types'; +import type { XYState, XYAnnotationLayerConfig } from '../types'; + +export const createAnnotationActions = ({ + state, + layer, + layerIndex, + setState, +}: { + state: XYState; + layer: XYAnnotationLayerConfig; + layerIndex: number; + setState: StateSetter; +}): LayerAction[] => { + const label = !layer.ignoreGlobalFilters + ? i18n.translate('xpack.lens.xyChart.annotations.ignoreGlobalFiltersLabel', { + defaultMessage: 'Ignore global filters', + }) + : i18n.translate('xpack.lens.xyChart.annotations.keepGlobalFiltersLabel', { + defaultMessage: 'Keep global filters', + }); + return [ + { + displayName: label, + description: !layer.ignoreGlobalFilters + ? i18n.translate('xpack.lens.xyChart.annotations.ignoreGlobalFiltersDescription', { + defaultMessage: + 'All the dimensions configured in this layer ignore filters defined at kibana level.', + }) + : i18n.translate('xpack.lens.xyChart.annotations.keepGlobalFiltersDescription', { + defaultMessage: + 'All the dimensions configured in this layer respect filters defined at kibana level.', + }), + execute: () => { + const newLayers = [...state.layers]; + newLayers[layerIndex] = { ...layer, ignoreGlobalFilters: !layer.ignoreGlobalFilters }; + return setState({ ...state, layers: newLayers }); + }, + icon: !layer.ignoreGlobalFilters ? 'eyeClosed' : 'eye', + isCompatible: true, + 'data-test-subj': !layer.ignoreGlobalFilters + ? 'lnsXY_annotationLayer_ignoreFilters' + : 'lnsXY_annotationLayer_keepFilters', + }, + ]; +}; diff --git a/x-pack/plugins/lens/public/visualizations/xy/to_expression.ts b/x-pack/plugins/lens/public/visualizations/xy/to_expression.ts index 345e8ffcb5b19..bf75018f111ee 100644 --- a/x-pack/plugins/lens/public/visualizations/xy/to_expression.ts +++ b/x-pack/plugins/lens/public/visualizations/xy/to_expression.ts @@ -190,7 +190,10 @@ export const buildExpression = ( annotations: layer.annotations.map((c) => ({ ...c, label: uniqueLabels[c.id], - ignoreGlobalFilters: layer.ignoreGlobalFilters, + ...(c.type === 'query' + ? // Move the ignore flag at the event level + { ignoreGlobalFilters: layer.ignoreGlobalFilters } + : {}), })), }; }); diff --git a/x-pack/plugins/lens/public/visualizations/xy/visualization.test.ts b/x-pack/plugins/lens/public/visualizations/xy/visualization.test.ts index c62d2c1195e5f..e76633b349924 100644 --- a/x-pack/plugins/lens/public/visualizations/xy/visualization.test.ts +++ b/x-pack/plugins/lens/public/visualizations/xy/visualization.test.ts @@ -2857,4 +2857,81 @@ describe('xy_visualization', () => { }); }); }); + + describe('getSupportedActionsForLayer', () => { + it('should return no actions for a data layer', () => { + expect( + xyVisualization.getSupportedActionsForLayer?.('first', exampleState(), jest.fn()) + ).toHaveLength(0); + }); + + it('should return one action for an annotation layer', () => { + const baseState = exampleState(); + expect( + xyVisualization.getSupportedActionsForLayer?.( + 'annotation', + { + ...baseState, + layers: [ + ...baseState.layers, + { + layerId: 'annotation', + layerType: layerTypes.ANNOTATIONS, + annotations: [exampleAnnotation2], + ignoreGlobalFilters: true, + indexPatternId: 'myIndexPattern', + }, + ], + }, + jest.fn() + ) + ).toEqual([ + expect.objectContaining({ + displayName: 'Keep global filters', + description: + 'All the dimensions configured in this layer respect filters defined at kibana level.', + icon: 'eye', + isCompatible: true, + 'data-test-subj': 'lnsXY_annotationLayer_keepFilters', + }), + ]); + }); + + it('should return an action that performs a state update on click', () => { + const baseState = exampleState(); + const setState = jest.fn(); + const [action] = xyVisualization.getSupportedActionsForLayer?.( + 'annotation', + { + ...baseState, + layers: [ + ...baseState.layers, + { + layerId: 'annotation', + layerType: layerTypes.ANNOTATIONS, + annotations: [exampleAnnotation2], + ignoreGlobalFilters: true, + indexPatternId: 'myIndexPattern', + }, + ], + }, + setState + )!; + action.execute(); + + expect(setState).toHaveBeenCalledWith( + expect.objectContaining({ + layers: expect.arrayContaining([ + { + layerId: 'annotation', + layerType: layerTypes.ANNOTATIONS, + annotations: [exampleAnnotation2], + ignoreGlobalFilters: false, + indexPatternId: 'myIndexPattern', + }, + ]), + }) + ); + }); + }); }); diff --git a/x-pack/plugins/lens/public/visualizations/xy/visualization.tsx b/x-pack/plugins/lens/public/visualizations/xy/visualization.tsx index a5ccfc02b0fa3..c013f0cd1d079 100644 --- a/x-pack/plugins/lens/public/visualizations/xy/visualization.tsx +++ b/x-pack/plugins/lens/public/visualizations/xy/visualization.tsx @@ -32,13 +32,13 @@ import { DimensionEditor } from './xy_config_panel/dimension_editor'; import { LayerHeader, LayerHeaderContent } from './xy_config_panel/layer_header'; import { Visualization, AccessorConfig, FramePublicAPI } from '../../types'; import { - State, + type State, + type XYLayerConfig, + type XYDataLayerConfig, + type SeriesType, + type XYSuggestion, + type PersistedState, visualizationTypes, - XYLayerConfig, - XYDataLayerConfig, - SeriesType, - XYSuggestion, - PersistedState, } from './types'; import { layerTypes } from '../../../common'; import { @@ -84,12 +84,13 @@ import { validateLayersForDimension, } from './visualization_helpers'; import { groupAxesByType } from './axes_configuration'; -import { XYState } from './types'; +import type { XYState } from './types'; import { ReferenceLinePanel } from './xy_config_panel/reference_line_config_panel'; import { AnnotationsPanel } from './xy_config_panel/annotations_config_panel'; import { DimensionTrigger } from '../../shared_components/dimension_trigger'; import { defaultAnnotationLabel } from './annotations/helpers'; import { onDropForVisualization } from '../../editor_frame_service/editor_frame/config_panel/buttons/drop_targets_utils'; +import { createAnnotationActions } from './annotations/actions'; const XY_ID = 'lnsXY'; export const getXyVisualization = ({ @@ -240,6 +241,16 @@ export const getXyVisualization = ({ ]; }, + getSupportedActionsForLayer(layerId, state, setState) { + const layerIndex = state.layers.findIndex((l) => l.layerId === layerId); + const layer = state.layers[layerIndex]; + const actions = []; + if (isAnnotationsLayer(layer)) { + actions.push(...createAnnotationActions({ state, layerIndex, layer, setState })); + } + return actions; + }, + onIndexPatternChange(state, indexPatternId, layerId) { const layerIndex = state.layers.findIndex((l) => l.layerId === layerId); const layer = state.layers[layerIndex]; diff --git a/x-pack/plugins/lens/public/visualizations/xy/xy_config_panel/annotations_config_panel/annotations_panel.tsx b/x-pack/plugins/lens/public/visualizations/xy/xy_config_panel/annotations_config_panel/annotations_panel.tsx index a6e1cd6b2ac34..480c0773f4520 100644 --- a/x-pack/plugins/lens/public/visualizations/xy/xy_config_panel/annotations_config_panel/annotations_panel.tsx +++ b/x-pack/plugins/lens/public/visualizations/xy/xy_config_panel/annotations_config_panel/annotations_panel.tsx @@ -352,7 +352,11 @@ export const AnnotationsPanel = ( defaultMessage: 'Color', })} /> - setAnnotations({ isHidden: ev.target.checked })} /> @@ -384,31 +388,25 @@ export const AnnotationsPanel = ( ); }; -const ConfigPanelHideSwitch = ({ +const ConfigPanelGenericSwitch = ({ + label, + ['data-test-subj']: dataTestSubj, value, onChange, }: { + label: string; + 'data-test-subj': string; value: boolean; onChange: (event: EuiSwitchEvent) => void; -}) => { - return ( - - - - ); -}; +}) => ( + + + +); diff --git a/x-pack/plugins/lens/public/visualizations/xy/xy_config_panel/annotations_config_panel/helpers.ts b/x-pack/plugins/lens/public/visualizations/xy/xy_config_panel/annotations_config_panel/helpers.ts index 2ca0f9530bbe1..89fbdfd38fcf1 100644 --- a/x-pack/plugins/lens/public/visualizations/xy/xy_config_panel/annotations_config_panel/helpers.ts +++ b/x-pack/plugins/lens/public/visualizations/xy/xy_config_panel/annotations_config_panel/helpers.ts @@ -97,6 +97,7 @@ export const sanitizeProperties = (annotation: EventAnnotationConfig) => { 'textField', 'filter', 'extraFields', + 'ignoreGlobalFilters', ]); return lineAnnotation; } From f415b3b98f4c5c1c60447f9d907b94a5ceacd6a9 Mon Sep 17 00:00:00 2001 From: Yara Tercero Date: Fri, 30 Sep 2022 09:17:56 -0700 Subject: [PATCH 53/72] [Security Solution][Exceptions] - Make exceptions read only when displaying deleted rule details (#142258) ### Summary Addresses 141899. --- .../components/all_exception_items_table/index.test.tsx | 6 ++++++ .../components/all_exception_items_table/index.tsx | 7 +++++-- .../detection_engine/rules/all/exceptions/translations.ts | 2 +- .../pages/detection_engine/rules/details/index.tsx | 2 ++ 4 files changed, 14 insertions(+), 3 deletions(-) diff --git a/x-pack/plugins/security_solution/public/detection_engine/rule_exceptions/components/all_exception_items_table/index.test.tsx b/x-pack/plugins/security_solution/public/detection_engine/rule_exceptions/components/all_exception_items_table/index.test.tsx index d34cf07aa9146..139d171088ec9 100644 --- a/x-pack/plugins/security_solution/public/detection_engine/rule_exceptions/components/all_exception_items_table/index.test.tsx +++ b/x-pack/plugins/security_solution/public/detection_engine/rule_exceptions/components/all_exception_items_table/index.test.tsx @@ -109,6 +109,7 @@ describe('ExceptionsViewer', () => { ], }} listType={ExceptionListTypeEnum.DETECTION} + isViewReadOnly={false} /> ); @@ -146,6 +147,7 @@ describe('ExceptionsViewer', () => { ], }} listType={ExceptionListTypeEnum.DETECTION} + isViewReadOnly={false} /> ); @@ -183,6 +185,7 @@ describe('ExceptionsViewer', () => { ], }} listType={ExceptionListTypeEnum.ENDPOINT} + isViewReadOnly={false} /> ); @@ -226,6 +229,7 @@ describe('ExceptionsViewer', () => { ], }} listType={ExceptionListTypeEnum.DETECTION} + isViewReadOnly={false} /> ); @@ -268,6 +272,7 @@ describe('ExceptionsViewer', () => { ], }} listType={ExceptionListTypeEnum.DETECTION} + isViewReadOnly={false} /> ); @@ -301,6 +306,7 @@ describe('ExceptionsViewer', () => { ], }} listType={ExceptionListTypeEnum.DETECTION} + isViewReadOnly={false} /> ); diff --git a/x-pack/plugins/security_solution/public/detection_engine/rule_exceptions/components/all_exception_items_table/index.tsx b/x-pack/plugins/security_solution/public/detection_engine/rule_exceptions/components/all_exception_items_table/index.tsx index d090f5a3bc590..ffe07bb2c5dfb 100644 --- a/x-pack/plugins/security_solution/public/detection_engine/rule_exceptions/components/all_exception_items_table/index.tsx +++ b/x-pack/plugins/security_solution/public/detection_engine/rule_exceptions/components/all_exception_items_table/index.tsx @@ -75,12 +75,15 @@ export interface GetExceptionItemProps { interface ExceptionsViewerProps { rule: Rule | null; listType: ExceptionListTypeEnum; + /* Used for when displaying exceptions for a rule that has since been deleted, forcing read only view */ + isViewReadOnly: boolean; onRuleChange?: () => void; } const ExceptionsViewerComponent = ({ rule, listType, + isViewReadOnly, onRuleChange, }: ExceptionsViewerProps): JSX.Element => { const { services } = useKibana(); @@ -337,8 +340,8 @@ const ExceptionsViewerComponent = ({ // User privileges checks useEffect((): void => { - setReadOnly(!canUserCRUD || !hasIndexWrite); - }, [setReadOnly, canUserCRUD, hasIndexWrite]); + setReadOnly(isViewReadOnly || !canUserCRUD || !hasIndexWrite); + }, [setReadOnly, isViewReadOnly, canUserCRUD, hasIndexWrite]); useEffect(() => { if (exceptionListsToQuery.length > 0) { diff --git a/x-pack/plugins/security_solution/public/detections/pages/detection_engine/rules/all/exceptions/translations.ts b/x-pack/plugins/security_solution/public/detections/pages/detection_engine/rules/all/exceptions/translations.ts index 8baf21db15c0d..3d817adb2605c 100644 --- a/x-pack/plugins/security_solution/public/detections/pages/detection_engine/rules/all/exceptions/translations.ts +++ b/x-pack/plugins/security_solution/public/detections/pages/detection_engine/rules/all/exceptions/translations.ts @@ -157,7 +157,7 @@ export const referenceErrorMessage = (referenceCount: number) => export const EXCEPTION_LIST_SEARCH_PLACEHOLDER = i18n.translate( 'xpack.securitySolution.detectionEngine.rules.all.exceptions.searchPlaceholder', { - defaultMessage: 'Search by name or list_id', + defaultMessage: 'Search by name or list id', } ); diff --git a/x-pack/plugins/security_solution/public/detections/pages/detection_engine/rules/details/index.tsx b/x-pack/plugins/security_solution/public/detections/pages/detection_engine/rules/details/index.tsx index 5149269c57d9c..0393fcf239f7d 100644 --- a/x-pack/plugins/security_solution/public/detections/pages/detection_engine/rules/details/index.tsx +++ b/x-pack/plugins/security_solution/public/detections/pages/detection_engine/rules/details/index.tsx @@ -871,6 +871,7 @@ const RuleDetailsPageComponent: React.FC = ({ rule={rule} listType={ExceptionListTypeEnum.DETECTION} onRuleChange={refreshRule} + isViewReadOnly={!isExistingRule} data-test-subj="exceptionTab" /> @@ -881,6 +882,7 @@ const RuleDetailsPageComponent: React.FC = ({ rule={rule} listType={ExceptionListTypeEnum.ENDPOINT} onRuleChange={refreshRule} + isViewReadOnly={!isExistingRule} data-test-subj="endpointExceptionsTab" /> From e7c29831735f8b7abbc7670c191c0b4d4be16d90 Mon Sep 17 00:00:00 2001 From: "Quynh Nguyen (Quinn)" <43350163+qn895@users.noreply.github.com> Date: Fri, 30 Sep 2022 11:33:56 -0500 Subject: [PATCH 54/72] [ML] Fix date picker not allowing unpause when refresh interval is 0 (#142005) Co-authored-by: Kibana Machine <42973632+kibanamachine@users.noreply.github.com> --- x-pack/plugins/aiops/kibana.json | 2 +- .../date_picker_wrapper.tsx | 237 +++++++++++++----- .../public/hooks/use_aiops_app_context.ts | 2 + .../date_picker_wrapper.tsx | 215 ++++++++++++---- .../hooks/use_time_filter.ts | 21 ++ .../aiops/explain_log_rate_spikes.tsx | 1 + .../application/aiops/log_categorization.tsx | 1 + .../date_picker_wrapper.test.tsx | 7 +- .../date_picker_wrapper.tsx | 18 +- 9 files changed, 380 insertions(+), 124 deletions(-) diff --git a/x-pack/plugins/aiops/kibana.json b/x-pack/plugins/aiops/kibana.json index 6648816b07843..ce8057bc03f04 100755 --- a/x-pack/plugins/aiops/kibana.json +++ b/x-pack/plugins/aiops/kibana.json @@ -15,6 +15,6 @@ "licensing" ], "optionalPlugins": [], - "requiredBundles": ["fieldFormats"], + "requiredBundles": ["fieldFormats", "kibanaReact"], "extraPublicDirs": ["common"] } diff --git a/x-pack/plugins/aiops/public/components/date_picker_wrapper/date_picker_wrapper.tsx b/x-pack/plugins/aiops/public/components/date_picker_wrapper/date_picker_wrapper.tsx index 605f130594bc8..6b3e57200b90b 100644 --- a/x-pack/plugins/aiops/public/components/date_picker_wrapper/date_picker_wrapper.tsx +++ b/x-pack/plugins/aiops/public/components/date_picker_wrapper/date_picker_wrapper.tsx @@ -7,19 +7,33 @@ // TODO Consolidate with duplicate component `DatePickerWrapper` in // `x-pack/plugins/data_visualizer/public/application/common/components/date_picker_wrapper/date_picker_wrapper.tsx` - +// `x-pack/plugins/ml/public/application/components/navigation_menu/date_picker_wrapper/date_picker_wrapper.tsx` import React, { FC, useCallback, useEffect, useMemo, useState } from 'react'; import { Subscription } from 'rxjs'; import { debounce } from 'lodash'; -import { EuiSuperDatePicker, OnRefreshProps } from '@elastic/eui'; +import { + EuiButton, + EuiFlexGroup, + EuiFlexItem, + EuiSuperDatePicker, + OnRefreshProps, + OnTimeChangeProps, +} from '@elastic/eui'; import type { TimeRange } from '@kbn/es-query'; -import { TimeHistoryContract, UI_SETTINGS } from '@kbn/data-plugin/public'; +import { TimefilterContract, TimeHistoryContract, UI_SETTINGS } from '@kbn/data-plugin/public'; +import { i18n } from '@kbn/i18n'; +import { FormattedMessage } from '@kbn/i18n-react'; +import useObservable from 'react-use/lib/useObservable'; +import { map } from 'rxjs/operators'; +import { toMountPoint, wrapWithTheme } from '@kbn/kibana-react-plugin/public'; import { useUrlState } from '../../hooks/use_url_state'; import { useAiopsAppContext } from '../../hooks/use_aiops_app_context'; import { aiopsRefresh$ } from '../../application/services/timefilter_refresh_service'; +const DEFAULT_REFRESH_INTERVAL_MS = 5000; + interface TimePickerQuickRange { from: string; to: string; @@ -49,19 +63,64 @@ function getRecentlyUsedRangesFactory(timeHistory: TimeHistoryContract) { }; } -function updateLastRefresh(timeRange: OnRefreshProps) { +function updateLastRefresh(timeRange?: OnRefreshProps) { aiopsRefresh$.next({ lastRefresh: Date.now(), timeRange }); } +export const useRefreshIntervalUpdates = (timefilter: TimefilterContract) => { + return useObservable( + timefilter.getRefreshIntervalUpdate$().pipe(map(timefilter.getRefreshInterval)), + timefilter.getRefreshInterval() + ); +}; + +export const useTimeRangeUpdates = (timefilter: TimefilterContract, absolute = false) => { + const getTimeCallback = absolute + ? timefilter.getAbsoluteTime.bind(timefilter) + : timefilter.getTime.bind(timefilter); + + return useObservable(timefilter.getTimeUpdate$().pipe(map(getTimeCallback)), getTimeCallback()); +}; + export const DatePickerWrapper: FC = () => { - const { uiSettings, data } = useAiopsAppContext(); - const { timefilter, history } = data.query.timefilter; + const services = useAiopsAppContext(); + const { toasts } = services.notifications; + const config = services.uiSettings; + + const { timefilter, history } = services.data.query.timefilter; + const theme$ = services.theme.theme$; const [globalState, setGlobalState] = useUrlState('_g'); const getRecentlyUsedRanges = getRecentlyUsedRangesFactory(history); - const refreshInterval: RefreshInterval = - globalState?.refreshInterval ?? timefilter.getRefreshInterval(); + const timeFilterRefreshInterval = useRefreshIntervalUpdates(timefilter); + const time = useTimeRangeUpdates(timefilter); + + useEffect( + function syncTimRangeFromUrlState() { + if (globalState?.time !== undefined) { + timefilter.setTime({ + from: globalState.time.from, + to: globalState.time.to, + }); + } + }, + // eslint-disable-next-line react-hooks/exhaustive-deps + [globalState?.time?.from, globalState?.time?.to, globalState?.time?.ts] + ); + + useEffect( + function syncRefreshIntervalFromUrlState() { + if (globalState?.refreshInterval !== undefined) { + timefilter.setRefreshInterval({ + pause: !!globalState?.refreshInterval?.pause, + value: globalState?.refreshInterval?.value, + }); + } + }, + // eslint-disable-next-line react-hooks/exhaustive-deps + [globalState?.refreshInterval] + ); // eslint-disable-next-line react-hooks/exhaustive-deps const setRefreshInterval = useCallback( @@ -71,7 +130,6 @@ export const DatePickerWrapper: FC = () => { [setGlobalState] ); - const [time, setTime] = useState(timefilter.getTime()); const [recentlyUsedRanges, setRecentlyUsedRanges] = useState(getRecentlyUsedRanges()); const [isAutoRefreshSelectorEnabled, setIsAutoRefreshSelectorEnabled] = useState( timefilter.isAutoRefreshSelectorEnabled() @@ -80,8 +138,69 @@ export const DatePickerWrapper: FC = () => { timefilter.isTimeRangeSelectorEnabled() ); - const dateFormat = uiSettings.get('dateFormat'); - const timePickerQuickRanges = uiSettings.get( + const refreshInterval = useMemo( + (): RefreshInterval => globalState?.refreshInterval ?? timeFilterRefreshInterval, + // eslint-disable-next-line react-hooks/exhaustive-deps + [JSON.stringify(globalState?.refreshInterval), timeFilterRefreshInterval] + ); + + useEffect( + function warnAboutShortRefreshInterval() { + const isResolvedFromUrlState = !!globalState?.refreshInterval; + const isTooShort = refreshInterval.value < DEFAULT_REFRESH_INTERVAL_MS; + + // Only warn about short interval with enabled auto-refresh. + if (!isTooShort || refreshInterval.pause) return; + + toasts.addWarning( + { + title: isResolvedFromUrlState + ? i18n.translate('xpack.aiops.datePicker.shortRefreshIntervalURLWarningMessage', { + defaultMessage: + 'The refresh interval in the URL is shorter than the minimum supported by Machine Learning.', + }) + : i18n.translate( + 'xpack.aiops.datePicker.shortRefreshIntervalTimeFilterWarningMessage', + { + defaultMessage: + 'The refresh interval in Advanced Settings is shorter than the minimum supported by Machine Learning.', + } + ), + text: toMountPoint( + wrapWithTheme( + + + , + theme$ + ) + ), + }, + { toastLifeTimeMs: 30000 } + ); + }, + // eslint-disable-next-line react-hooks/exhaustive-deps + [ + // eslint-disable-next-line react-hooks/exhaustive-deps + JSON.stringify(refreshInterval), + // eslint-disable-next-line react-hooks/exhaustive-deps + JSON.stringify(globalState?.refreshInterval), + setRefreshInterval, + ] + ); + + const dateFormat = config.get('dateFormat'); + const timePickerQuickRanges = config.get( UI_SETTINGS.TIMEPICKER_QUICK_RANGES ); @@ -97,22 +216,7 @@ export const DatePickerWrapper: FC = () => { useEffect(() => { const subscriptions = new Subscription(); - const refreshIntervalUpdate$ = timefilter.getRefreshIntervalUpdate$(); - if (refreshIntervalUpdate$ !== undefined) { - subscriptions.add( - refreshIntervalUpdate$.subscribe((r) => { - setRefreshInterval(timefilter.getRefreshInterval()); - }) - ); - } - const timeUpdate$ = timefilter.getTimeUpdate$(); - if (timeUpdate$ !== undefined) { - subscriptions.add( - timeUpdate$.subscribe((v) => { - setTime(timefilter.getTime()); - }) - ); - } + const enabledUpdated$ = timefilter.getEnabledUpdated$(); if (enabledUpdated$ !== undefined) { subscriptions.add( @@ -126,15 +230,21 @@ export const DatePickerWrapper: FC = () => { return function cleanup() { subscriptions.unsubscribe(); }; - }, [setRefreshInterval, timefilter]); - - function updateFilter({ start, end }: Duration) { - const newTime = { from: start, to: end }; - // Update timefilter for controllers listening for changes - timefilter.setTime(newTime); - setTime(newTime); - setRecentlyUsedRanges(getRecentlyUsedRanges()); - } + // eslint-disable-next-line react-hooks/exhaustive-deps + }, []); + + const updateTimeFilter = useCallback( + ({ start, end }: OnTimeChangeProps) => { + setRecentlyUsedRanges(getRecentlyUsedRanges()); + setGlobalState('time', { + from: start, + to: end, + ...(start === 'now' || end === 'now' ? { ts: Date.now() } : {}), + }); + }, + // eslint-disable-next-line react-hooks/exhaustive-deps + [setGlobalState] + ); function updateInterval({ isPaused: pause, @@ -146,26 +256,41 @@ export const DatePickerWrapper: FC = () => { setRefreshInterval({ pause, value }); } - /** - * Enforce pause when it's set to false with 0 refresh interval. - */ - const isPaused = refreshInterval.pause || (!refreshInterval.pause && !refreshInterval.value); - return isAutoRefreshSelectorEnabled || isTimeRangeSelectorEnabled ? ( -
- -
+ + + + + + {isTimeRangeSelectorEnabled ? null : ( + + updateLastRefresh()} + data-test-subj="aiOpsRefreshPageButton" + > + + + + )} + ) : null; }; diff --git a/x-pack/plugins/aiops/public/hooks/use_aiops_app_context.ts b/x-pack/plugins/aiops/public/hooks/use_aiops_app_context.ts index 3c44ae7bdb0a3..ddbfca3eb8b11 100644 --- a/x-pack/plugins/aiops/public/hooks/use_aiops_app_context.ts +++ b/x-pack/plugins/aiops/public/hooks/use_aiops_app_context.ts @@ -15,6 +15,7 @@ import type { ChartsPluginStart } from '@kbn/charts-plugin/public'; import type { FieldFormatsStart } from '@kbn/field-formats-plugin/public'; import type { SharePluginStart } from '@kbn/share-plugin/public'; import type { CoreStart, CoreSetup, HttpStart, IUiSettingsClient } from '@kbn/core/public'; +import type { ThemeServiceStart } from '@kbn/core/public'; export interface AiopsAppDependencies { application: CoreStart['application']; @@ -24,6 +25,7 @@ export interface AiopsAppDependencies { http: HttpStart; notifications: CoreSetup['notifications']; storage: IStorageWrapper; + theme: ThemeServiceStart; uiSettings: IUiSettingsClient; unifiedSearch: UnifiedSearchPublicPluginStart; share: SharePluginStart; diff --git a/x-pack/plugins/data_visualizer/public/application/common/components/date_picker_wrapper/date_picker_wrapper.tsx b/x-pack/plugins/data_visualizer/public/application/common/components/date_picker_wrapper/date_picker_wrapper.tsx index 7130841d0a6ac..12d6b257ec292 100644 --- a/x-pack/plugins/data_visualizer/public/application/common/components/date_picker_wrapper/date_picker_wrapper.tsx +++ b/x-pack/plugins/data_visualizer/public/application/common/components/date_picker_wrapper/date_picker_wrapper.tsx @@ -5,17 +5,35 @@ * 2.0. */ +// TODO Consolidate with duplicate component `DatePickerWrapper` in +// `x-pack/plugins/aiops/public/components/date_picker_wrapper/date_picker_wrapper.tsx` + import React, { FC, useCallback, useEffect, useMemo, useState } from 'react'; import { Subscription } from 'rxjs'; import { debounce } from 'lodash'; -import { EuiSuperDatePicker, OnRefreshProps } from '@elastic/eui'; +import { + EuiButton, + EuiFlexGroup, + EuiFlexItem, + EuiSuperDatePicker, + OnRefreshProps, + OnTimeChangeProps, +} from '@elastic/eui'; import type { TimeRange } from '@kbn/es-query'; import { TimeHistoryContract, UI_SETTINGS } from '@kbn/data-plugin/public'; - -import { useUrlState } from '../../util/url_state'; +import { i18n } from '@kbn/i18n'; +import { wrapWithTheme } from '@kbn/kibana-react-plugin/public'; +import { FormattedMessage } from '@kbn/i18n-react'; +import { + useRefreshIntervalUpdates, + useTimeRangeUpdates, +} from '../../../index_data_visualizer/hooks/use_time_filter'; import { useDataVisualizerKibana } from '../../../kibana_context'; import { dataVisualizerRefresh$ } from '../../../index_data_visualizer/services/timefilter_refresh_service'; +import { useUrlState } from '../../util/url_state'; + +const DEFAULT_REFRESH_INTERVAL_MS = 5000; interface TimePickerQuickRange { from: string; @@ -46,20 +64,52 @@ function getRecentlyUsedRangesFactory(timeHistory: TimeHistoryContract) { }; } -function updateLastRefresh(timeRange: OnRefreshProps) { +function updateLastRefresh(timeRange?: OnRefreshProps) { dataVisualizerRefresh$.next({ lastRefresh: Date.now(), timeRange }); } +// FIXME: Consolidate this component with ML and AIOps's component export const DatePickerWrapper: FC = () => { - const { services } = useDataVisualizerKibana(); + const { + services, + notifications: { toasts }, + } = useDataVisualizerKibana(); const config = services.uiSettings; + const theme$ = services.theme.theme$; + const { timefilter, history } = services.data.query.timefilter; const [globalState, setGlobalState] = useUrlState('_g'); const getRecentlyUsedRanges = getRecentlyUsedRangesFactory(history); - const refreshInterval: RefreshInterval = - globalState?.refreshInterval ?? timefilter.getRefreshInterval(); + const timeFilterRefreshInterval = useRefreshIntervalUpdates(); + const time = useTimeRangeUpdates(); + + useEffect( + function syncTimRangeFromUrlState() { + if (globalState?.time !== undefined) { + timefilter.setTime({ + from: globalState.time.from, + to: globalState.time.to, + }); + } + }, + // eslint-disable-next-line react-hooks/exhaustive-deps + [globalState?.time?.from, globalState?.time?.to, globalState?.time?.ts] + ); + + useEffect( + function syncRefreshIntervalFromUrlState() { + if (globalState?.refreshInterval !== undefined) { + timefilter.setRefreshInterval({ + pause: !!globalState?.refreshInterval?.pause, + value: globalState?.refreshInterval?.value, + }); + } + }, + // eslint-disable-next-line react-hooks/exhaustive-deps + [globalState?.refreshInterval] + ); // eslint-disable-next-line react-hooks/exhaustive-deps const setRefreshInterval = useCallback( @@ -69,7 +119,6 @@ export const DatePickerWrapper: FC = () => { [setGlobalState] ); - const [time, setTime] = useState(timefilter.getTime()); const [recentlyUsedRanges, setRecentlyUsedRanges] = useState(getRecentlyUsedRanges()); const [isAutoRefreshSelectorEnabled, setIsAutoRefreshSelectorEnabled] = useState( timefilter.isAutoRefreshSelectorEnabled() @@ -78,6 +127,57 @@ export const DatePickerWrapper: FC = () => { timefilter.isTimeRangeSelectorEnabled() ); + const refreshInterval = useMemo( + (): RefreshInterval => globalState?.refreshInterval ?? timeFilterRefreshInterval, + // eslint-disable-next-line react-hooks/exhaustive-deps + [JSON.stringify(globalState?.refreshInterval), timeFilterRefreshInterval] + ); + + useEffect( + function warnAboutShortRefreshInterval() { + const isTooShort = refreshInterval.value < DEFAULT_REFRESH_INTERVAL_MS; + + // Only warn about short interval with enabled auto-refresh. + if (!isTooShort || refreshInterval.pause) return; + + toasts.warning({ + title: i18n.translate( + 'xpack.dataVisualizer.index.datePicker.shortRefreshIntervalURLWarningMessage', + { + defaultMessage: + 'The refresh interval in the URL is shorter than the minimum supported by Machine Learning.', + } + ), + body: wrapWithTheme( + + + , + theme$ + ), + toastLifeTimeMs: 30000, + }); + }, + // eslint-disable-next-line react-hooks/exhaustive-deps + [ + // eslint-disable-next-line react-hooks/exhaustive-deps + JSON.stringify(refreshInterval), + // eslint-disable-next-line react-hooks/exhaustive-deps + JSON.stringify(globalState?.refreshInterval), + setRefreshInterval, + ] + ); + const dateFormat = config.get('dateFormat'); const timePickerQuickRanges = config.get( UI_SETTINGS.TIMEPICKER_QUICK_RANGES @@ -95,22 +195,7 @@ export const DatePickerWrapper: FC = () => { useEffect(() => { const subscriptions = new Subscription(); - const refreshIntervalUpdate$ = timefilter.getRefreshIntervalUpdate$(); - if (refreshIntervalUpdate$ !== undefined) { - subscriptions.add( - refreshIntervalUpdate$.subscribe((r) => { - setRefreshInterval(timefilter.getRefreshInterval()); - }) - ); - } - const timeUpdate$ = timefilter.getTimeUpdate$(); - if (timeUpdate$ !== undefined) { - subscriptions.add( - timeUpdate$.subscribe((v) => { - setTime(timefilter.getTime()); - }) - ); - } + const enabledUpdated$ = timefilter.getEnabledUpdated$(); if (enabledUpdated$ !== undefined) { subscriptions.add( @@ -124,15 +209,21 @@ export const DatePickerWrapper: FC = () => { return function cleanup() { subscriptions.unsubscribe(); }; - }, [setRefreshInterval, timefilter]); - - function updateFilter({ start, end }: Duration) { - const newTime = { from: start, to: end }; - // Update timefilter for controllers listening for changes - timefilter.setTime(newTime); - setTime(newTime); - setRecentlyUsedRanges(getRecentlyUsedRanges()); - } + // eslint-disable-next-line react-hooks/exhaustive-deps + }, []); + + const updateTimeFilter = useCallback( + ({ start, end }: OnTimeChangeProps) => { + setRecentlyUsedRanges(getRecentlyUsedRanges()); + setGlobalState('time', { + from: start, + to: end, + ...(start === 'now' || end === 'now' ? { ts: Date.now() } : {}), + }); + }, + // eslint-disable-next-line react-hooks/exhaustive-deps + [setGlobalState] + ); function updateInterval({ isPaused: pause, @@ -144,26 +235,44 @@ export const DatePickerWrapper: FC = () => { setRefreshInterval({ pause, value }); } - /** - * Enforce pause when it's set to false with 0 refresh interval. - */ - const isPaused = refreshInterval.pause || (!refreshInterval.pause && !refreshInterval.value); - return isAutoRefreshSelectorEnabled || isTimeRangeSelectorEnabled ? ( -
- -
+ + + + + + {isTimeRangeSelectorEnabled ? null : ( + + updateLastRefresh()} + data-test-subj="dataVisualizerRefreshPageButton" + > + + + + )} + ) : null; }; diff --git a/x-pack/plugins/data_visualizer/public/application/index_data_visualizer/hooks/use_time_filter.ts b/x-pack/plugins/data_visualizer/public/application/index_data_visualizer/hooks/use_time_filter.ts index 132d03c81c0e6..727c8bab88dc3 100644 --- a/x-pack/plugins/data_visualizer/public/application/index_data_visualizer/hooks/use_time_filter.ts +++ b/x-pack/plugins/data_visualizer/public/application/index_data_visualizer/hooks/use_time_filter.ts @@ -6,6 +6,8 @@ */ import { useEffect } from 'react'; +import useObservable from 'react-use/lib/useObservable'; +import { map } from 'rxjs/operators'; import { useDataVisualizerKibana } from '../../kibana_context'; interface UseTimefilterOptions { @@ -36,3 +38,22 @@ export const useTimefilter = ({ return timefilter; }; + +export const useRefreshIntervalUpdates = () => { + const timefilter = useTimefilter(); + + return useObservable( + timefilter.getRefreshIntervalUpdate$().pipe(map(timefilter.getRefreshInterval)), + timefilter.getRefreshInterval() + ); +}; + +export const useTimeRangeUpdates = (absolute = false) => { + const timefilter = useTimefilter(); + + const getTimeCallback = absolute + ? timefilter.getAbsoluteTime.bind(timefilter) + : timefilter.getTime.bind(timefilter); + + return useObservable(timefilter.getTimeUpdate$().pipe(map(getTimeCallback)), getTimeCallback()); +}; diff --git a/x-pack/plugins/ml/public/application/aiops/explain_log_rate_spikes.tsx b/x-pack/plugins/ml/public/application/aiops/explain_log_rate_spikes.tsx index 2a8ce6e04144c..9cfa17fe71941 100644 --- a/x-pack/plugins/ml/public/application/aiops/explain_log_rate_spikes.tsx +++ b/x-pack/plugins/ml/public/application/aiops/explain_log_rate_spikes.tsx @@ -57,6 +57,7 @@ export const ExplainLogRateSpikesPage: FC = () => { 'storage', 'uiSettings', 'unifiedSearch', + 'theme', ])} /> )} diff --git a/x-pack/plugins/ml/public/application/aiops/log_categorization.tsx b/x-pack/plugins/ml/public/application/aiops/log_categorization.tsx index 899006b5918dd..3f70e0c58324d 100644 --- a/x-pack/plugins/ml/public/application/aiops/log_categorization.tsx +++ b/x-pack/plugins/ml/public/application/aiops/log_categorization.tsx @@ -57,6 +57,7 @@ export const LogCategorizationPage: FC = () => { 'storage', 'uiSettings', 'unifiedSearch', + 'theme', ])} /> )} diff --git a/x-pack/plugins/ml/public/application/components/navigation_menu/date_picker_wrapper/date_picker_wrapper.test.tsx b/x-pack/plugins/ml/public/application/components/navigation_menu/date_picker_wrapper/date_picker_wrapper.test.tsx index 5f263b51364e0..536cc26888a98 100644 --- a/x-pack/plugins/ml/public/application/components/navigation_menu/date_picker_wrapper/date_picker_wrapper.test.tsx +++ b/x-pack/plugins/ml/public/application/components/navigation_menu/date_picker_wrapper/date_picker_wrapper.test.tsx @@ -123,7 +123,7 @@ describe('Navigation Menu: ', () => { refreshSubscription.unsubscribe(); }); - test('should not allow disabled pause with 0 refresh interval', () => { + test('should set interval to default of 5s when pause is disabled and refresh interval is 0', () => { // arrange (useUrlState as jest.Mock).mockReturnValue([{ refreshInterval: { pause: false, value: 0 } }]); @@ -137,9 +137,10 @@ describe('Navigation Menu: ', () => { render(); // assert - expect(displayWarningSpy).not.toHaveBeenCalled(); + // Show warning that the interval set is too short + expect(displayWarningSpy).toHaveBeenCalled(); const calledWith = MockedEuiSuperDatePicker.mock.calls[0][0]; - expect(calledWith.isPaused).toBe(true); + expect(calledWith.isPaused).toBe(false); expect(calledWith.refreshInterval).toBe(5000); }); diff --git a/x-pack/plugins/ml/public/application/components/navigation_menu/date_picker_wrapper/date_picker_wrapper.tsx b/x-pack/plugins/ml/public/application/components/navigation_menu/date_picker_wrapper/date_picker_wrapper.tsx index 75cb787abadc4..75c503a139499 100644 --- a/x-pack/plugins/ml/public/application/components/navigation_menu/date_picker_wrapper/date_picker_wrapper.tsx +++ b/x-pack/plugins/ml/public/application/components/navigation_menu/date_picker_wrapper/date_picker_wrapper.tsx @@ -126,18 +126,11 @@ export const DatePickerWrapper: FC = () => { timefilter.isTimeRangeSelectorEnabled() ); - const refreshInterval = useMemo((): RefreshInterval => { - const resultInterval = globalState?.refreshInterval ?? timeFilterRefreshInterval; - - /** - * Enforce pause when it's set to false with 0 refresh interval. - */ - const pause = resultInterval.pause || (!resultInterval.pause && resultInterval.value <= 0); - const value = resultInterval.value; - - return { value, pause }; + const refreshInterval = useMemo( + (): RefreshInterval => globalState?.refreshInterval ?? timeFilterRefreshInterval, // eslint-disable-next-line react-hooks/exhaustive-deps - }, [JSON.stringify(globalState?.refreshInterval), timeFilterRefreshInterval]); + [JSON.stringify(globalState?.refreshInterval), timeFilterRefreshInterval] + ); useEffect( function warnAboutShortRefreshInterval() { @@ -251,6 +244,9 @@ export const DatePickerWrapper: FC = () => { isPaused: boolean; refreshInterval: number; }) { + if (pause === false && value <= 0) { + setRefreshInterval({ pause, value: 5000 }); + } setRefreshInterval({ pause, value }); } From 874c93c3296a1c53d0ec04a76d8eaf872b758f20 Mon Sep 17 00:00:00 2001 From: Dima Arnautov Date: Fri, 30 Sep 2022 18:46:03 +0200 Subject: [PATCH 55/72] [ML] Show an info callout for new notifications (#142245) * storage context callbacks * ml notifications context * ml notifications context usage * info callout * update icon * add unit tests --- x-pack/plugins/ml/public/application/app.tsx | 5 +- .../ml_page/notifications_indicator.tsx | 56 +------ .../ml/ml_notifications_context.test.tsx | 140 ++++++++++++++++++ .../contexts/ml/ml_notifications_context.tsx | 91 ++++++++++++ .../contexts/storage/storage_context.tsx | 23 +-- .../components/notifications_list.tsx | 25 +++- .../ml/public/application/routing/router.tsx | 10 +- 7 files changed, 279 insertions(+), 71 deletions(-) create mode 100644 x-pack/plugins/ml/public/application/contexts/ml/ml_notifications_context.test.tsx create mode 100644 x-pack/plugins/ml/public/application/contexts/ml/ml_notifications_context.tsx diff --git a/x-pack/plugins/ml/public/application/app.tsx b/x-pack/plugins/ml/public/application/app.tsx index 8d5958c2f5574..1014b4e3a08b3 100644 --- a/x-pack/plugins/ml/public/application/app.tsx +++ b/x-pack/plugins/ml/public/application/app.tsx @@ -15,6 +15,7 @@ import type { UsageCollectionSetup } from '@kbn/usage-collection-plugin/public'; import { Storage } from '@kbn/kibana-utils-plugin/public'; import { KibanaContextProvider, KibanaThemeProvider } from '@kbn/kibana-react-plugin/public'; +import { MlStorageContextProvider } from './contexts/storage'; import { setDependencyCache, clearCache } from './util/dependency_cache'; import { setLicenseCache } from './license'; import type { MlSetupDependencies, MlStartDependencies } from '../plugin'; @@ -109,7 +110,9 @@ const App: FC = ({ coreStart, deps, appMountParams }) => { mlServices: getMlGlobalServices(coreStart.http, deps.usageCollection), }} > - + + + diff --git a/x-pack/plugins/ml/public/application/components/ml_page/notifications_indicator.tsx b/x-pack/plugins/ml/public/application/components/ml_page/notifications_indicator.tsx index d0e3516af3db0..2d95f0c971696 100644 --- a/x-pack/plugins/ml/public/application/components/ml_page/notifications_indicator.tsx +++ b/x-pack/plugins/ml/public/application/components/ml_page/notifications_indicator.tsx @@ -5,7 +5,7 @@ * 2.0. */ -import React, { FC, useEffect, useState } from 'react'; +import React, { FC } from 'react'; import { FormattedMessage } from '@kbn/i18n-react'; import { i18n } from '@kbn/i18n'; import { @@ -15,60 +15,14 @@ import { EuiNotificationBadge, EuiToolTip, } from '@elastic/eui'; -import { combineLatest, of, timer } from 'rxjs'; -import { catchError, switchMap } from 'rxjs/operators'; -import moment from 'moment'; import { FIELD_FORMAT_IDS } from '@kbn/field-formats-plugin/common'; import { useFieldFormatter } from '../../contexts/kibana/use_field_formatter'; -import { useAsObservable } from '../../hooks'; -import { NotificationsCountResponse } from '../../../../common/types/notifications'; -import { useMlKibana } from '../../contexts/kibana'; -import { useStorage } from '../../contexts/storage'; -import { ML_NOTIFICATIONS_LAST_CHECKED_AT } from '../../../../common/types/storage'; - -const NOTIFICATIONS_CHECK_INTERVAL = 60000; +import { useMlNotifications } from '../../contexts/ml/ml_notifications_context'; export const NotificationsIndicator: FC = () => { - const { - services: { - mlServices: { mlApiServices }, - }, - } = useMlKibana(); + const { notificationsCounts, latestRequestedAt } = useMlNotifications(); const dateFormatter = useFieldFormatter(FIELD_FORMAT_IDS.DATE); - const [lastCheckedAt] = useStorage(ML_NOTIFICATIONS_LAST_CHECKED_AT); - const lastCheckedAt$ = useAsObservable(lastCheckedAt); - - /** Holds the value used for the actual request */ - const [lastCheckRequested, setLastCheckRequested] = useState(); - const [notificationsCounts, setNotificationsCounts] = useState(); - - useEffect(function startPollingNotifications() { - const subscription = combineLatest([lastCheckedAt$, timer(0, NOTIFICATIONS_CHECK_INTERVAL)]) - .pipe( - switchMap(([lastChecked]) => { - const lastCheckedAtQuery = lastChecked ?? moment().subtract(7, 'd').valueOf(); - setLastCheckRequested(lastCheckedAtQuery); - // Use the latest check time or 7 days ago by default. - return mlApiServices.notifications.countMessages$({ - lastCheckedAt: lastCheckedAtQuery, - }); - }), - catchError((error) => { - // Fail silently for now - return of({} as NotificationsCountResponse); - }) - ) - .subscribe((response) => { - setNotificationsCounts(response); - }); - - return () => { - subscription.unsubscribe(); - }; - // eslint-disable-next-line react-hooks/exhaustive-deps - }, []); - const errorsAndWarningCount = (notificationsCounts?.error ?? 0) + (notificationsCounts?.warning ?? 0); const hasUnread = notificationsCounts && Object.values(notificationsCounts).some((v) => v > 0); @@ -91,7 +45,7 @@ export const NotificationsIndicator: FC = () => { defaultMessage="There {count, plural, one {is # notification} other {are # notifications}} with error or warning level since {lastCheckedAt}" values={{ count: errorsAndWarningCount, - lastCheckedAt: dateFormatter(lastCheckRequested), + lastCheckedAt: dateFormatter(latestRequestedAt), }} /> } @@ -115,7 +69,7 @@ export const NotificationsIndicator: FC = () => { } > diff --git a/x-pack/plugins/ml/public/application/contexts/ml/ml_notifications_context.test.tsx b/x-pack/plugins/ml/public/application/contexts/ml/ml_notifications_context.test.tsx new file mode 100644 index 0000000000000..4076966942cd8 --- /dev/null +++ b/x-pack/plugins/ml/public/application/contexts/ml/ml_notifications_context.test.tsx @@ -0,0 +1,140 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import { renderHook, act } from '@testing-library/react-hooks'; +import { of } from 'rxjs'; +import { useMlNotifications, MlNotificationsContextProvider } from './ml_notifications_context'; +import { useStorage } from '../storage'; + +const mockCountMessages = jest.fn(() => { + return of({ info: 1, error: 0, warning: 0 }); +}); + +jest.mock('../kibana', () => ({ + useMlKibana: () => { + return { + services: { + mlServices: { + mlApiServices: { + notifications: { + countMessages$: mockCountMessages, + }, + }, + }, + }, + }; + }, +})); + +const mockSetStorageValue = jest.fn(); +jest.mock('../storage', () => ({ + useStorage: jest.fn(() => { + return [undefined, mockSetStorageValue]; + }), +})); + +describe('useMlNotifications', () => { + beforeEach(() => { + jest.useFakeTimers('modern'); + jest.setSystemTime(1663945337063); + }); + + afterEach(() => { + jest.clearAllMocks(); + jest.clearAllTimers(); + jest.useRealTimers(); + }); + + test('returns the default values', () => { + const { result } = renderHook(useMlNotifications, { wrapper: MlNotificationsContextProvider }); + expect(result.current.notificationsCounts).toEqual({ info: 0, error: 0, warning: 0 }); + expect(result.current.latestRequestedAt).toEqual(null); + expect(result.current.lastCheckedAt).toEqual(undefined); + }); + + test('starts polling for notifications with a 1 minute interval during the last week by default ', () => { + const { result } = renderHook(useMlNotifications, { + wrapper: MlNotificationsContextProvider, + }); + + act(() => { + jest.advanceTimersByTime(0); + }); + + expect(mockCountMessages).toHaveBeenCalledTimes(1); + expect(mockCountMessages).toHaveBeenCalledWith({ lastCheckedAt: 1663340537063 }); + expect(result.current.notificationsCounts).toEqual({ info: 1, error: 0, warning: 0 }); + expect(result.current.latestRequestedAt).toEqual(1663340537063); + expect(result.current.lastCheckedAt).toEqual(undefined); + + act(() => { + mockCountMessages.mockReturnValueOnce(of({ info: 1, error: 2, warning: 0 })); + jest.advanceTimersByTime(60000); + }); + + expect(mockCountMessages).toHaveBeenCalledTimes(2); + expect(mockCountMessages).toHaveBeenCalledWith({ lastCheckedAt: 1663340537063 + 60000 }); + expect(result.current.notificationsCounts).toEqual({ info: 1, error: 2, warning: 0 }); + expect(result.current.latestRequestedAt).toEqual(1663340537063 + 60000); + expect(result.current.lastCheckedAt).toEqual(undefined); + }); + + test('starts polling for notifications with a 1 minute interval using the lastCheckedAt from storage', () => { + (useStorage as jest.MockedFunction).mockReturnValue([ + 1664551009292, + mockSetStorageValue, + ]); + const { result } = renderHook(useMlNotifications, { + wrapper: MlNotificationsContextProvider, + }); + + act(() => { + jest.advanceTimersByTime(0); + }); + + expect(mockCountMessages).toHaveBeenCalledTimes(1); + expect(mockCountMessages).toHaveBeenCalledWith({ lastCheckedAt: 1664551009292 }); + expect(result.current.notificationsCounts).toEqual({ info: 1, error: 0, warning: 0 }); + expect(result.current.latestRequestedAt).toEqual(1664551009292); + expect(result.current.lastCheckedAt).toEqual(1664551009292); + }); + + test('switches to polling with the lastCheckedAt from storage when available', () => { + (useStorage as jest.MockedFunction).mockReturnValue([ + undefined, + mockSetStorageValue, + ]); + const { result, rerender } = renderHook(useMlNotifications, { + wrapper: MlNotificationsContextProvider, + }); + + act(() => { + jest.advanceTimersByTime(0); + }); + + expect(mockCountMessages).toHaveBeenCalledTimes(1); + expect(mockCountMessages).toHaveBeenCalledWith({ lastCheckedAt: 1663340537063 }); + expect(result.current.notificationsCounts).toEqual({ info: 1, error: 0, warning: 0 }); + expect(result.current.latestRequestedAt).toEqual(1663340537063); + expect(result.current.lastCheckedAt).toEqual(undefined); + + act(() => { + (useStorage as jest.MockedFunction).mockReturnValue([ + 1664551009292, + mockSetStorageValue, + ]); + }); + + rerender(); + + expect(mockCountMessages).toHaveBeenCalledTimes(2); + expect(mockCountMessages).toHaveBeenCalledWith({ lastCheckedAt: 1664551009292 }); + expect(result.current.notificationsCounts).toEqual({ info: 1, error: 0, warning: 0 }); + expect(result.current.latestRequestedAt).toEqual(1664551009292); + expect(result.current.lastCheckedAt).toEqual(1664551009292); + }); +}); diff --git a/x-pack/plugins/ml/public/application/contexts/ml/ml_notifications_context.tsx b/x-pack/plugins/ml/public/application/contexts/ml/ml_notifications_context.tsx new file mode 100644 index 0000000000000..fef04e9366671 --- /dev/null +++ b/x-pack/plugins/ml/public/application/contexts/ml/ml_notifications_context.tsx @@ -0,0 +1,91 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import React, { FC, useContext, useEffect, useState } from 'react'; +import { combineLatest, of, timer } from 'rxjs'; +import { catchError, switchMap, map, tap } from 'rxjs/operators'; +import moment from 'moment'; +import { useMlKibana } from '../kibana'; +import { useStorage } from '../storage'; +import { ML_NOTIFICATIONS_LAST_CHECKED_AT } from '../../../../common/types/storage'; +import { useAsObservable } from '../../hooks'; +import type { NotificationsCountResponse } from '../../../../common/types/notifications'; + +const NOTIFICATIONS_CHECK_INTERVAL = 60000; + +export const MlNotificationsContext = React.createContext<{ + notificationsCounts: NotificationsCountResponse; + /** Timestamp of the latest notification checked by the user */ + lastCheckedAt: number | null; + /** Holds the value used for the actual request */ + latestRequestedAt: number | null; + setLastCheckedAt: (v: number) => void; +}>({ + notificationsCounts: { info: 0, error: 0, warning: 0 }, + lastCheckedAt: null, + latestRequestedAt: null, + setLastCheckedAt: () => {}, +}); + +export const MlNotificationsContextProvider: FC = ({ children }) => { + const { + services: { + mlServices: { mlApiServices }, + }, + } = useMlKibana(); + + const [lastCheckedAt, setLastCheckedAt] = useStorage(ML_NOTIFICATIONS_LAST_CHECKED_AT); + const lastCheckedAt$ = useAsObservable(lastCheckedAt); + + /** Holds the value used for the actual request */ + const [latestRequestedAt, setLatestRequestedAt] = useState(null); + const [notificationsCounts, setNotificationsCounts] = useState({ + info: 0, + error: 0, + warning: 0, + }); + + useEffect(function startPollingNotifications() { + const subscription = combineLatest([lastCheckedAt$, timer(0, NOTIFICATIONS_CHECK_INTERVAL)]) + .pipe( + // Use the latest check time or 7 days ago by default. + map(([lastChecked]) => lastChecked ?? moment().subtract(7, 'd').valueOf()), + tap((lastCheckedAtQuery) => { + setLatestRequestedAt(lastCheckedAtQuery); + }), + switchMap((lastCheckedAtQuery) => + mlApiServices.notifications.countMessages$({ + lastCheckedAt: lastCheckedAtQuery, + }) + ), + catchError((error) => { + // Fail silently for now + return of({} as NotificationsCountResponse); + }) + ) + .subscribe((response) => { + setNotificationsCounts(response); + }); + + return () => { + subscription.unsubscribe(); + }; + // eslint-disable-next-line react-hooks/exhaustive-deps + }, []); + + return ( + + {children} + + ); +}; + +export function useMlNotifications() { + return useContext(MlNotificationsContext); +} diff --git a/x-pack/plugins/ml/public/application/contexts/storage/storage_context.tsx b/x-pack/plugins/ml/public/application/contexts/storage/storage_context.tsx index c2b00a176c08c..65e2a64ee3181 100644 --- a/x-pack/plugins/ml/public/application/contexts/storage/storage_context.tsx +++ b/x-pack/plugins/ml/public/application/contexts/storage/storage_context.tsx @@ -33,10 +33,12 @@ export const MlStorageContextProvider: FC = ({ children }) => { services: { storage }, } = useMlKibana(); - const initialValue = ML_STORAGE_KEYS.reduce((acc, curr) => { - acc[curr as MlStorageKey] = storage.get(curr); - return acc; - }, {} as Exclude); + const initialValue = useMemo(() => { + return ML_STORAGE_KEYS.reduce((acc, curr) => { + acc[curr as MlStorageKey] = storage.get(curr); + return acc; + }, {} as Exclude); + }, [storage]); const [state, setState] = useState(initialValue); @@ -44,21 +46,20 @@ export const MlStorageContextProvider: FC = ({ children }) => { >(key: K, value: T) => { storage.set(key, value); - const update = { - ...state, + setState((prevState) => ({ + ...prevState, [key]: value, - }; - setState(update); + })); }, - [state, storage] + [storage] ); const removeStorageValue = useCallback( (key: MlStorageKey) => { storage.remove(key); - setState(omit(state, key)); + setState((prevState) => omit(prevState, key)); }, - [state, storage] + [storage] ); useEffect(function updateStorageOnExternalChange() { diff --git a/x-pack/plugins/ml/public/application/notifications/components/notifications_list.tsx b/x-pack/plugins/ml/public/application/notifications/components/notifications_list.tsx index 9ea6aa1b70f00..cd68f366b57a6 100644 --- a/x-pack/plugins/ml/public/application/notifications/components/notifications_list.tsx +++ b/x-pack/plugins/ml/public/application/notifications/components/notifications_list.tsx @@ -22,9 +22,8 @@ import { import { EuiBasicTableColumn } from '@elastic/eui/src/components/basic_table/basic_table'; import { FIELD_FORMAT_IDS } from '@kbn/field-formats-plugin/common'; import useDebounce from 'react-use/lib/useDebounce'; +import { useMlNotifications } from '../../contexts/ml/ml_notifications_context'; import { ML_NOTIFICATIONS_MESSAGE_LEVEL } from '../../../../common/constants/notifications'; -import { ML_NOTIFICATIONS_LAST_CHECKED_AT } from '../../../../common/types/storage'; -import { useStorage } from '../../contexts/storage'; import { SavedObjectsWarning } from '../../components/saved_objects_warning'; import { useTimefilter, useTimeRangeUpdates } from '../../contexts/kibana/use_timefilter'; import { useToastNotificationService } from '../../services/toast_notification_service'; @@ -61,7 +60,8 @@ export const NotificationsList: FC = () => { } = useMlKibana(); const { displayErrorToast } = useToastNotificationService(); - const [lastCheckedAt, setLastCheckedAt] = useStorage(ML_NOTIFICATIONS_LAST_CHECKED_AT); + const { lastCheckedAt, setLastCheckedAt, notificationsCounts, latestRequestedAt } = + useMlNotifications(); const timeFilter = useTimefilter(); const timeRange = useTimeRangeUpdates(); @@ -280,10 +280,29 @@ export const NotificationsList: FC = () => { ]; }, []); + const newNotificationsCount = Object.values(notificationsCounts).reduce((a, b) => a + b); + return ( <> + {newNotificationsCount ? ( + <> + + } + iconType="bell" + /> + + + ) : null} + = ({ pageDeps }) => ( - - + + - - + + ); From 764fe0ae43fe54e515ae8afd105df7028b0640c7 Mon Sep 17 00:00:00 2001 From: Steph Milovic Date: Fri, 30 Sep 2022 11:00:19 -0600 Subject: [PATCH 56/72] paywall fixes (#142366) --- .../common/components/paywall/index.tsx | 29 +++++++++++++----- .../common/components/paywall/translations.ts | 13 ++------ .../public/common/images/entity_paywall.png | Bin 0 -> 222838 bytes .../overview/pages/entity_analytics.tsx | 2 +- .../public/overview/pages/translations.ts | 3 +- 5 files changed, 27 insertions(+), 20 deletions(-) create mode 100644 x-pack/plugins/security_solution/public/common/images/entity_paywall.png diff --git a/x-pack/plugins/security_solution/public/common/components/paywall/index.tsx b/x-pack/plugins/security_solution/public/common/components/paywall/index.tsx index 53c21172f0318..ee93861db2d7e 100644 --- a/x-pack/plugins/security_solution/public/common/components/paywall/index.tsx +++ b/x-pack/plugins/security_solution/public/common/components/paywall/index.tsx @@ -14,13 +14,15 @@ import { EuiText, EuiButton, EuiTextColor, + EuiImage, } from '@elastic/eui'; import styled from 'styled-components'; import { useNavigation } from '../../lib/kibana'; import * as i18n from './translations'; +import paywallPng from '../../images/entity_paywall.png'; const PaywallDiv = styled.div` - max-width: 85%; + max-width: 75%; margin: 0 auto; .euiCard__betaBadgeWrapper { .euiCard__betaBadge { @@ -31,8 +33,15 @@ const PaywallDiv = styled.div` padding: 0 15%; } `; +const StyledEuiCard = styled(EuiCard)` + span.euiTitle { + max-width: 540px; + display: block; + margin: 0 auto; + } +`; -export const Paywall = memo(({ featureDescription }: { featureDescription?: string }) => { +export const Paywall = memo(({ heading }: { heading?: string }) => { const { getAppUrl, navigateTo } = useNavigation(); const subscriptionUrl = getAppUrl({ appId: 'management', @@ -43,25 +52,24 @@ export const Paywall = memo(({ featureDescription }: { featureDescription?: stri }, [navigateTo, subscriptionUrl]); return ( - } display="subdued" title={

- {i18n.UPGRADE_CTA} + {heading}

} description={false} + paddingSize="xl" >

- - {i18n.UPGRADE_MESSAGE(featureDescription)} - + {i18n.UPGRADE_MESSAGE}

@@ -73,7 +81,12 @@ export const Paywall = memo(({ featureDescription }: { featureDescription?: stri
-
+ + + + + +
); }); diff --git a/x-pack/plugins/security_solution/public/common/components/paywall/translations.ts b/x-pack/plugins/security_solution/public/common/components/paywall/translations.ts index 0062e7baa4118..a78fda1e90fa7 100644 --- a/x-pack/plugins/security_solution/public/common/components/paywall/translations.ts +++ b/x-pack/plugins/security_solution/public/common/components/paywall/translations.ts @@ -11,17 +11,10 @@ export const PLATINUM = i18n.translate('xpack.securitySolution.paywall.platinum' defaultMessage: 'Platinum', }); -export const UPGRADE_CTA = i18n.translate('xpack.securitySolution.paywall.upgradeButton', { - defaultMessage: 'Available from Platinum', +export const UPGRADE_MESSAGE = i18n.translate('xpack.securitySolution.paywall.upgradeMessage', { + defaultMessage: 'This feature is available with Platinum or higher subscription', }); -export const UPGRADE_MESSAGE = (description?: string) => - i18n.translate('xpack.securitySolution.paywall.upgradeMessage', { - values: { description: description ? description : 'this feature' }, - defaultMessage: - 'To turn use {description}, you must upgrade your license to Platinum, start a free 30-days trial, or spin up a cloud deployment on AWS, GCP, or Azure.', - }); - -export const UPGRADE_BUTTON = i18n.translate('xpack.securitySolution.paywall.upgradeCta', { +export const UPGRADE_BUTTON = i18n.translate('xpack.securitySolution.paywall.upgradeButton', { defaultMessage: 'Upgrade to Platinum', }); diff --git a/x-pack/plugins/security_solution/public/common/images/entity_paywall.png b/x-pack/plugins/security_solution/public/common/images/entity_paywall.png new file mode 100644 index 0000000000000000000000000000000000000000..9c88f4670db42d9abe42f46e76eb74c16b5a629b GIT binary patch literal 222838 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

d^F7l$yW6Y;oPlx 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ⅇ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 { )} {!isPlatinumOrTrialLicense && capabilitiesFetched ? ( - + ) : isSourcererLoading ? ( ) : ( diff --git a/x-pack/plugins/security_solution/public/overview/pages/translations.ts b/x-pack/plugins/security_solution/public/overview/pages/translations.ts index 55dc208ec11c8..d4c4e2b17d115 100644 --- a/x-pack/plugins/security_solution/public/overview/pages/translations.ts +++ b/x-pack/plugins/security_solution/public/overview/pages/translations.ts @@ -53,7 +53,8 @@ export const DETECTION_RESPONSE_TITLE = i18n.translate( export const ENTITY_ANALYTICS_LICENSE_DESC = i18n.translate( 'xpack.securitySolution.entityAnalytics.pageDesc', { - defaultMessage: 'Entity Analytics features', + defaultMessage: + 'Detect threats from users and devices within your network with Entity Analytics', } ); From ab901040249a6a5cb0e5e47694cbaae4a85ee64a Mon Sep 17 00:00:00 2001 From: Stratoula Kalafateli Date: Fri, 30 Sep 2022 20:35:58 +0300 Subject: [PATCH 57/72] [Lens] Displays the Explore field in Discover button if the capabilities are correct (#142332) --- .../field_item.test.tsx | 31 +++++++++++++++++++ .../indexpattern_datasource/field_item.tsx | 3 +- x-pack/plugins/lens/public/types.ts | 5 ++- 3 files changed, 36 insertions(+), 3 deletions(-) diff --git a/x-pack/plugins/lens/public/indexpattern_datasource/field_item.test.tsx b/x-pack/plugins/lens/public/indexpattern_datasource/field_item.test.tsx index 3c6ddbe5e849d..64de29b0691c3 100644 --- a/x-pack/plugins/lens/public/indexpattern_datasource/field_item.test.tsx +++ b/x-pack/plugins/lens/public/indexpattern_datasource/field_item.test.tsx @@ -54,6 +54,11 @@ const mockedServices = { getRedirectUrl: jest.fn(() => 'discover_url'), }, } as unknown as DiscoverStart, + application: { + capabilities: { + discover: { save: true, saveQuery: true, show: true }, + }, + }, }; const InnerFieldItemWrapper: React.FC = (props) => { @@ -460,4 +465,30 @@ describe('IndexPattern Field Item', () => { ); expect(exploreInDiscoverBtn.length).toBe(0); }); + + it('should not display Explore in discover button if discover capabilities show is false', async () => { + const services = { + ...mockedServices, + application: { + capabilities: { + discover: { save: false, saveQuery: false, show: false }, + }, + }, + }; + const wrapper = await mountWithIntl( + + + + ); + + await clickField(wrapper, 'bytes'); + + await wrapper.update(); + + const exploreInDiscoverBtn = findTestSubject( + wrapper, + 'lnsFieldListPanel-exploreInDiscover-bytes' + ); + expect(exploreInDiscoverBtn.length).toBe(0); + }); }); diff --git a/x-pack/plugins/lens/public/indexpattern_datasource/field_item.tsx b/x-pack/plugins/lens/public/indexpattern_datasource/field_item.tsx index a91286881197e..6434af979028d 100644 --- a/x-pack/plugins/lens/public/indexpattern_datasource/field_item.tsx +++ b/x-pack/plugins/lens/public/indexpattern_datasource/field_item.tsx @@ -370,8 +370,7 @@ function FieldItemPopoverContents(props: FieldItemProps) { [indexPattern], getEsQueryConfig(services.uiSettings) ); - - if (!services.discover) { + if (!services.discover || !services.application.capabilities.discover.show) { return; } return services.discover.locator!.getRedirectUrl({ diff --git a/x-pack/plugins/lens/public/types.ts b/x-pack/plugins/lens/public/types.ts index 2ccc393a09326..29aff3d428690 100644 --- a/x-pack/plugins/lens/public/types.ts +++ b/x-pack/plugins/lens/public/types.ts @@ -494,7 +494,10 @@ export interface DatasourceDataPanelProps { dragDropContext: DragContextState; setState: StateSetter; showNoDataPopover: () => void; - core: Pick; + core: Pick< + CoreStart, + 'http' | 'notifications' | 'uiSettings' | 'overlays' | 'theme' | 'application' + >; query: Query; dateRange: DateRange; filters: Filter[]; From 659251bcb6884cd33319ed8fdc34d439b5927936 Mon Sep 17 00:00:00 2001 From: Stratoula Kalafateli Date: Fri, 30 Sep 2022 20:36:16 +0300 Subject: [PATCH 58/72] [Lens] Fixes the Search functions input on the formula documentation popover (#142341) --- .../operations/definitions/formula/editor/formula_editor.tsx | 1 - 1 file changed, 1 deletion(-) diff --git a/x-pack/plugins/lens/public/indexpattern_datasource/operations/definitions/formula/editor/formula_editor.tsx b/x-pack/plugins/lens/public/indexpattern_datasource/operations/definitions/formula/editor/formula_editor.tsx index d742b0497a85c..1e9a304ffa8a2 100644 --- a/x-pack/plugins/lens/public/indexpattern_datasource/operations/definitions/formula/editor/formula_editor.tsx +++ b/x-pack/plugins/lens/public/indexpattern_datasource/operations/definitions/formula/editor/formula_editor.tsx @@ -845,7 +845,6 @@ export function FormulaEditor({ anchorPosition="leftCenter" isOpen={isHelpOpen} closePopover={() => setIsHelpOpen(false)} - ownFocus={false} button={ Date: Fri, 30 Sep 2022 20:36:31 +0300 Subject: [PATCH 59/72] [Lens] Fixes the dataview picker selection for multiple layers (#142308) * [Lens] Fix the dataview picker selection for multiple layers * Find dtaview from dataViewsList --- x-pack/plugins/lens/public/app_plugin/lens_top_nav.tsx | 10 +++++++--- 1 file changed, 7 insertions(+), 3 deletions(-) diff --git a/x-pack/plugins/lens/public/app_plugin/lens_top_nav.tsx b/x-pack/plugins/lens/public/app_plugin/lens_top_nav.tsx index e72253f6e2a5f..c381d519f3665 100644 --- a/x-pack/plugins/lens/public/app_plugin/lens_top_nav.tsx +++ b/x-pack/plugins/lens/public/app_plugin/lens_top_nav.tsx @@ -357,10 +357,14 @@ export const LensTopNavMenu = ({ ]); useEffect(() => { - if (indexPatterns.length > 0) { - setCurrentIndexPattern(indexPatterns[0]); + if (activeDatasourceId && datasourceStates[activeDatasourceId].state) { + const dataViewId = datasourceMap[activeDatasourceId].getUsedDataView( + datasourceStates[activeDatasourceId].state + ); + const dataView = dataViewsList.find((pattern) => pattern.id === dataViewId); + setCurrentIndexPattern(dataView ?? indexPatterns[0]); } - }, [indexPatterns]); + }, [activeDatasourceId, datasourceMap, datasourceStates, indexPatterns, dataViewsList]); useEffect(() => { const fetchDataViews = async () => { From ff6406fee196955d98bdf4a200514f4c21575ead Mon Sep 17 00:00:00 2001 From: Steph Milovic Date: Fri, 30 Sep 2022 11:56:30 -0600 Subject: [PATCH 60/72] [Explore] Risk score entity consolidation (#141318) --- .../cti_details/host_risk_summary.test.tsx | 78 ------ .../cti_details/risk_summary.test.tsx | 96 ++++++++ ...host_risk_summary.tsx => risk_summary.tsx} | 67 +++--- .../cti_details/threat_summary_view.tsx | 16 +- .../event_details/cti_details/translations.ts | 67 ++---- .../cti_details/user_risk_summary.tsx | 85 ------- .../risk_score_doc_link.tsx | 2 +- .../components/risk_score/translations.ts | 48 ++++ .../hosts/components/kpi_hosts/index.tsx | 4 +- .../entity_analytics/header/index.test.tsx | 75 +++--- .../host_risk_score/index.test.tsx | 113 --------- .../host_risk_score/translations.ts | 65 ----- .../columns.tsx | 35 ++- .../risk_score/index.test.tsx | 131 ++++++++++ .../{host_risk_score => risk_score}/index.tsx | 134 +++++++---- .../risk_score/translations.ts | 51 ++++ .../user_risk_score/columns.tsx | 69 ------ .../user_risk_score/index.test.tsx | 115 --------- .../user_risk_score/index.tsx | 223 ------------------ .../user_risk_score/translations.ts | 65 ----- .../overview/pages/entity_analytics.tsx | 8 +- .../risk_score/containers/all/index.tsx | 88 +++---- .../containers/feature_status/index.test.ts | 9 +- .../containers/feature_status/index.ts | 13 +- .../users/components/kpi_users/index.tsx | 4 +- .../translations/translations/fr-FR.json | 1 - .../translations/translations/ja-JP.json | 1 - .../translations/translations/zh-CN.json | 1 - 28 files changed, 608 insertions(+), 1056 deletions(-) delete mode 100644 x-pack/plugins/security_solution/public/common/components/event_details/cti_details/host_risk_summary.test.tsx create mode 100644 x-pack/plugins/security_solution/public/common/components/event_details/cti_details/risk_summary.test.tsx rename x-pack/plugins/security_solution/public/common/components/event_details/cti_details/{host_risk_summary.tsx => risk_summary.tsx} (50%) delete mode 100644 x-pack/plugins/security_solution/public/common/components/event_details/cti_details/user_risk_summary.tsx create mode 100644 x-pack/plugins/security_solution/public/common/components/risk_score/translations.ts delete mode 100644 x-pack/plugins/security_solution/public/overview/components/entity_analytics/host_risk_score/index.test.tsx delete mode 100644 x-pack/plugins/security_solution/public/overview/components/entity_analytics/host_risk_score/translations.ts rename x-pack/plugins/security_solution/public/overview/components/entity_analytics/{host_risk_score => risk_score}/columns.tsx (58%) create mode 100644 x-pack/plugins/security_solution/public/overview/components/entity_analytics/risk_score/index.test.tsx rename x-pack/plugins/security_solution/public/overview/components/entity_analytics/{host_risk_score => risk_score}/index.tsx (62%) create mode 100644 x-pack/plugins/security_solution/public/overview/components/entity_analytics/risk_score/translations.ts delete mode 100644 x-pack/plugins/security_solution/public/overview/components/entity_analytics/user_risk_score/columns.tsx delete mode 100644 x-pack/plugins/security_solution/public/overview/components/entity_analytics/user_risk_score/index.test.tsx delete mode 100644 x-pack/plugins/security_solution/public/overview/components/entity_analytics/user_risk_score/index.tsx delete mode 100644 x-pack/plugins/security_solution/public/overview/components/entity_analytics/user_risk_score/translations.ts diff --git a/x-pack/plugins/security_solution/public/common/components/event_details/cti_details/host_risk_summary.test.tsx b/x-pack/plugins/security_solution/public/common/components/event_details/cti_details/host_risk_summary.test.tsx deleted file mode 100644 index 2320b85113c3c..0000000000000 --- a/x-pack/plugins/security_solution/public/common/components/event_details/cti_details/host_risk_summary.test.tsx +++ /dev/null @@ -1,78 +0,0 @@ -/* - * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one - * or more contributor license agreements. Licensed under the Elastic License - * 2.0; you may not use this file except in compliance with the Elastic License - * 2.0. - */ - -import React from 'react'; - -import { render } from '@testing-library/react'; -import { TestProviders } from '../../../mock'; -import { HostRiskSummary } from './host_risk_summary'; -import { RiskSeverity } from '../../../../../common/search_strategy'; -import { getEmptyValue } from '../../empty_value'; - -describe('HostRiskSummary', () => { - it('renders host risk data', () => { - const riskSeverity = RiskSeverity.low; - const hostRisk = { - loading: false, - isModuleEnabled: true, - result: [ - { - '@timestamp': '1641902481', - host: { - name: 'test-host-name', - risk: { - multipliers: [], - calculated_score_norm: 9999, - calculated_level: riskSeverity, - rule_risks: [], - }, - }, - }, - ], - }; - - const { getByText } = render( - - - - ); - - expect(getByText(riskSeverity)).toBeInTheDocument(); - }); - - it('renders spinner when loading', () => { - const hostRisk = { - loading: true, - isModuleEnabled: true, - result: [], - }; - - const { getByTestId } = render( - - - - ); - - expect(getByTestId('loading')).toBeInTheDocument(); - }); - - it('renders empty value when there is no host data', () => { - const hostRisk = { - loading: false, - isModuleEnabled: true, - result: [], - }; - - const { getByText } = render( - - - - ); - - expect(getByText(getEmptyValue())).toBeInTheDocument(); - }); -}); diff --git a/x-pack/plugins/security_solution/public/common/components/event_details/cti_details/risk_summary.test.tsx b/x-pack/plugins/security_solution/public/common/components/event_details/cti_details/risk_summary.test.tsx new file mode 100644 index 0000000000000..a02c7729f4e0a --- /dev/null +++ b/x-pack/plugins/security_solution/public/common/components/event_details/cti_details/risk_summary.test.tsx @@ -0,0 +1,96 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import React from 'react'; + +import { render } from '@testing-library/react'; +import { TestProviders } from '../../../mock'; +import type { RiskEntity } from './risk_summary'; +import * as i18n from './translations'; +import { RiskSummary } from './risk_summary'; +import { RiskScoreEntity, RiskSeverity } from '../../../../../common/search_strategy'; +import { getEmptyValue } from '../../empty_value'; + +describe.each([RiskScoreEntity.host, RiskScoreEntity.user])( + 'RiskSummary entityType: %s', + (riskEntity) => { + it(`renders ${riskEntity} risk data`, () => { + const riskSeverity = RiskSeverity.low; + const risk = { + loading: false, + isModuleEnabled: true, + result: [ + { + '@timestamp': '1641902481', + [riskEntity === RiskScoreEntity.host ? 'host' : 'user']: { + name: 'test-host-name', + risk: { + multipliers: [], + calculated_score_norm: 9999, + calculated_level: riskSeverity, + rule_risks: [], + }, + }, + }, + ], // as unknown as HostRiskScore[] | UserRiskScore[], + } as unknown as RiskEntity['risk']; + + const props = { + riskEntity, + risk, + } as RiskEntity; + + const { getByText } = render( + + + + ); + + expect(getByText(riskSeverity)).toBeInTheDocument(); + expect(getByText(i18n.RISK_DATA_TITLE(riskEntity))).toBeInTheDocument(); + }); + + it('renders spinner when loading', () => { + const risk = { + loading: true, + isModuleEnabled: true, + result: [], + }; + + const props = { + riskEntity, + risk, + } as RiskEntity; + const { getByTestId } = render( + + + + ); + + expect(getByTestId('loading')).toBeInTheDocument(); + }); + + it(`renders empty value when there is no ${riskEntity} data`, () => { + const risk = { + loading: false, + isModuleEnabled: true, + result: [], + }; + const props = { + riskEntity, + risk, + } as RiskEntity; + const { getByText } = render( + + + + ); + + expect(getByText(getEmptyValue())).toBeInTheDocument(); + }); + } +); diff --git a/x-pack/plugins/security_solution/public/common/components/event_details/cti_details/host_risk_summary.tsx b/x-pack/plugins/security_solution/public/common/components/event_details/cti_details/risk_summary.tsx similarity index 50% rename from x-pack/plugins/security_solution/public/common/components/event_details/cti_details/host_risk_summary.tsx rename to x-pack/plugins/security_solution/public/common/components/event_details/cti_details/risk_summary.tsx index c4380550c4220..6f24803165acd 100644 --- a/x-pack/plugins/security_solution/public/common/components/event_details/cti_details/host_risk_summary.tsx +++ b/x-pack/plugins/security_solution/public/common/components/event_details/cti_details/risk_summary.tsx @@ -12,41 +12,52 @@ import * as i18n from './translations'; import { EnrichedDataRow, ThreatSummaryPanelHeader } from './threat_summary_view'; import { RiskScore } from '../../severity/common'; import type { RiskSeverity } from '../../../../../common/search_strategy'; -import type { HostRisk } from '../../../../risk_score/containers'; +import { RiskScoreEntity } from '../../../../../common/search_strategy'; +import type { HostRisk, UserRisk } from '../../../../risk_score/containers'; import { getEmptyValue } from '../../empty_value'; import { RiskScoreDocLink } from '../../risk_score/risk_score_onboarding/risk_score_doc_link'; -import { RiskScoreEntity } from '../../../../../common/search_strategy'; import { RiskScoreHeaderTitle } from '../../risk_score/risk_score_onboarding/risk_score_header_title'; -const HostRiskSummaryComponent: React.FC<{ - hostRisk: HostRisk; - originalHostRisk?: RiskSeverity | undefined; -}> = ({ hostRisk, originalHostRisk }) => { - const currentHostRiskScore = hostRisk?.result?.[0]?.host?.risk?.calculated_level; +interface HostRiskEntity { + originalRisk?: RiskSeverity | undefined; + risk: HostRisk; + riskEntity: RiskScoreEntity.host; +} + +interface UserRiskEntity { + originalRisk?: RiskSeverity | undefined; + risk: UserRisk; + riskEntity: RiskScoreEntity.user; +} + +export type RiskEntity = HostRiskEntity | UserRiskEntity; + +const RiskSummaryComponent: React.FC = ({ risk, riskEntity, originalRisk }) => { + const currentRiskScore = + riskEntity === RiskScoreEntity.host + ? risk?.result?.[0]?.host?.risk?.calculated_level + : risk?.result?.[0]?.user?.risk?.calculated_level; + return ( <> } toolTipContent={ - } + riskScoreEntity={riskEntity} + title={i18n.RISK_SCORE_TITLE(riskEntity)} /> ), }} @@ -54,26 +65,26 @@ const HostRiskSummaryComponent: React.FC<{ } /> - {hostRisk.loading && } + {risk.loading && } - {!hostRisk.loading && ( + {!risk.loading && ( <> + currentRiskScore ? ( + ) : ( getEmptyValue() ) } /> - {originalHostRisk && currentHostRiskScore !== originalHostRisk && ( + {originalRisk && currentRiskScore !== originalRisk && ( <> } + field={i18n.ORIGINAL_RISK_CLASSIFICATION(riskEntity)} + value={} /> )} @@ -83,4 +94,4 @@ const HostRiskSummaryComponent: React.FC<{ ); }; -export const HostRiskSummary = React.memo(HostRiskSummaryComponent); +export const RiskSummary = React.memo(RiskSummaryComponent); diff --git a/x-pack/plugins/security_solution/public/common/components/event_details/cti_details/threat_summary_view.tsx b/x-pack/plugins/security_solution/public/common/components/event_details/cti_details/threat_summary_view.tsx index 485f36b0416af..b3ba2febe5d76 100644 --- a/x-pack/plugins/security_solution/public/common/components/event_details/cti_details/threat_summary_view.tsx +++ b/x-pack/plugins/security_solution/public/common/components/event_details/cti_details/threat_summary_view.tsx @@ -26,10 +26,10 @@ import type { TimelineEventsDetailsItem, RiskSeverity, } from '../../../../../common/search_strategy'; -import { HostRiskSummary } from './host_risk_summary'; -import { UserRiskSummary } from './user_risk_summary'; +import { RiskSummary } from './risk_summary'; import { EnrichmentSummary } from './enrichment_summary'; import type { HostRisk, UserRisk } from '../../../../risk_score/containers'; +import { RiskScoreEntity } from '../../../../../common/search_strategy'; const UppercaseEuiTitle = styled(EuiTitle)` text-transform: uppercase; @@ -161,11 +161,19 @@ const ThreatSummaryViewComponent: React.FC<{ - + - + + i18n.translate('xpack.securitySolution.alertDetails.overview.hostRiskClassification', { + defaultMessage: 'Current {riskEntity} risk classification', + values: { + riskEntity: getRiskEntityTranslation(riskEntity, true), + }, + }); + +export const ORIGINAL_RISK_CLASSIFICATION = (riskEntity: RiskScoreEntity) => + i18n.translate('xpack.securitySolution.alertDetails.overview.originalHostRiskClassification', { + defaultMessage: 'Original {riskEntity} risk classification', + values: { + riskEntity: getRiskEntityTranslation(riskEntity, true), + }, + }); + +export const RISK_DATA_TITLE = (riskEntity: RiskScoreEntity) => + i18n.translate('xpack.securitySolution.alertDetails.overview.hostRiskDataTitle', { + defaultMessage: '{riskEntity} Risk Data', + values: { + riskEntity: getRiskEntityTranslation(riskEntity), + }, + }); diff --git a/x-pack/plugins/security_solution/public/common/components/event_details/cti_details/user_risk_summary.tsx b/x-pack/plugins/security_solution/public/common/components/event_details/cti_details/user_risk_summary.tsx deleted file mode 100644 index 5cda8c903dd1b..0000000000000 --- a/x-pack/plugins/security_solution/public/common/components/event_details/cti_details/user_risk_summary.tsx +++ /dev/null @@ -1,85 +0,0 @@ -/* - * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one - * or more contributor license agreements. Licensed under the Elastic License - * 2.0; you may not use this file except in compliance with the Elastic License - * 2.0. - */ - -import React from 'react'; -import { EuiLoadingSpinner, EuiPanel } from '@elastic/eui'; -import { FormattedMessage } from '@kbn/i18n-react'; -import * as i18n from './translations'; -import { EnrichedDataRow, ThreatSummaryPanelHeader } from './threat_summary_view'; -import { RiskScore } from '../../severity/common'; -import type { RiskSeverity } from '../../../../../common/search_strategy'; -import { RiskScoreEntity } from '../../../../../common/search_strategy'; -import type { UserRisk } from '../../../../risk_score/containers'; -import { getEmptyValue } from '../../empty_value'; -import { RiskScoreDocLink } from '../../risk_score/risk_score_onboarding/risk_score_doc_link'; -import { RiskScoreHeaderTitle } from '../../risk_score/risk_score_onboarding/risk_score_header_title'; - -const UserRiskSummaryComponent: React.FC<{ - userRisk: UserRisk; - originalUserRisk?: RiskSeverity | undefined; -}> = ({ userRisk, originalUserRisk }) => { - const currentUserRiskScore = userRisk?.result?.[0]?.user?.risk?.calculated_level; - return ( - <> - - - } - toolTipContent={ - - } - /> - ), - }} - /> - } - /> - - {userRisk.loading && } - - {!userRisk.loading && ( - <> - - ) : ( - getEmptyValue() - ) - } - /> - {originalUserRisk && currentUserRiskScore !== originalUserRisk && ( - <> - } - /> - - )} - - )} - - - ); -}; -export const UserRiskSummary = React.memo(UserRiskSummaryComponent); diff --git a/x-pack/plugins/security_solution/public/common/components/risk_score/risk_score_onboarding/risk_score_doc_link.tsx b/x-pack/plugins/security_solution/public/common/components/risk_score/risk_score_onboarding/risk_score_doc_link.tsx index 340f63e71bc74..3a74d4614d991 100644 --- a/x-pack/plugins/security_solution/public/common/components/risk_score/risk_score_onboarding/risk_score_doc_link.tsx +++ b/x-pack/plugins/security_solution/public/common/components/risk_score/risk_score_onboarding/risk_score_doc_link.tsx @@ -9,7 +9,7 @@ import { EuiLink } from '@elastic/eui'; import React from 'react'; import { RISKY_HOSTS_DOC_LINK, RISKY_USERS_DOC_LINK } from '../../../../../common/constants'; import { RiskScoreEntity } from '../../../../../common/search_strategy'; -import { LEARN_MORE } from '../../../../overview/components/entity_analytics/host_risk_score/translations'; +import { LEARN_MORE } from '../../../../overview/components/entity_analytics/risk_score/translations'; const RiskScoreDocLinkComponent = ({ riskScoreEntity, diff --git a/x-pack/plugins/security_solution/public/common/components/risk_score/translations.ts b/x-pack/plugins/security_solution/public/common/components/risk_score/translations.ts new file mode 100644 index 0000000000000..f1df3145fd97d --- /dev/null +++ b/x-pack/plugins/security_solution/public/common/components/risk_score/translations.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 { i18n } from '@kbn/i18n'; +import { RiskScoreEntity } from '../../../../common/search_strategy'; + +export const HOST = i18n.translate('xpack.securitySolution.riskScore.overview.hostTitle', { + defaultMessage: 'Host', +}); + +export const HOST_LOWERCASE = i18n.translate( + 'xpack.securitySolution.riskScore.overview.hostLowercase', + { + defaultMessage: 'host', + } +); + +export const USER = i18n.translate('xpack.securitySolution.riskScore.overview.userTitle', { + defaultMessage: 'User', +}); + +export const USER_LOWERCASE = i18n.translate( + 'xpack.securitySolution.riskScore.overview.userLowercase', + { + defaultMessage: 'user', + } +); + +export const RISK_SCORE_TITLE = (riskEntity: RiskScoreEntity) => + i18n.translate('xpack.securitySolution.riskScore.overview.riskScoreTitle', { + defaultMessage: '{riskEntity} Risk Score', + values: { + riskEntity: getRiskEntityTranslation(riskEntity), + }, + }); + +export const getRiskEntityTranslation = (riskEntity: RiskScoreEntity, lowercase = false) => + lowercase + ? riskEntity === RiskScoreEntity.host + ? HOST_LOWERCASE + : USER_LOWERCASE + : riskEntity === RiskScoreEntity.host + ? HOST + : USER; diff --git a/x-pack/plugins/security_solution/public/hosts/components/kpi_hosts/index.tsx b/x-pack/plugins/security_solution/public/hosts/components/kpi_hosts/index.tsx index 5d1b0f58da6ae..3a732072f2be8 100644 --- a/x-pack/plugins/security_solution/public/hosts/components/kpi_hosts/index.tsx +++ b/x-pack/plugins/security_solution/public/hosts/components/kpi_hosts/index.tsx @@ -14,7 +14,7 @@ import type { HostsKpiProps } from './types'; import { CallOutSwitcher } from '../../../common/components/callouts'; import * as i18n from './translations'; import { RiskScoreDocLink } from '../../../common/components/risk_score/risk_score_onboarding/risk_score_doc_link'; -import { getHostRiskIndex, RiskQueries, RiskScoreEntity } from '../../../../common/search_strategy'; +import { getHostRiskIndex, RiskScoreEntity } from '../../../../common/search_strategy'; import { useRiskScoreFeatureStatus } from '../../../risk_score/containers/feature_status'; import { useSpaceId } from '../../../common/hooks/use_space_id'; @@ -23,7 +23,7 @@ export const HostsKpiComponent = React.memo( const spaceId = useSpaceId(); const defaultIndex = spaceId ? getHostRiskIndex(spaceId) : undefined; const { isEnabled, isLicenseValid, isLoading } = useRiskScoreFeatureStatus( - RiskQueries.hostsRiskScore, + RiskScoreEntity.host, defaultIndex ); diff --git a/x-pack/plugins/security_solution/public/overview/components/entity_analytics/header/index.test.tsx b/x-pack/plugins/security_solution/public/overview/components/entity_analytics/header/index.test.tsx index c7e7eb411d4f8..b60264b39eaee 100644 --- a/x-pack/plugins/security_solution/public/overview/components/entity_analytics/header/index.test.tsx +++ b/x-pack/plugins/security_solution/public/overview/components/entity_analytics/header/index.test.tsx @@ -5,7 +5,7 @@ * 2.0. */ -import { act, fireEvent, render } from '@testing-library/react'; +import { act, fireEvent, render, waitFor } from '@testing-library/react'; import React from 'react'; import { EntityAnalyticsHeader } from '.'; import { Direction, RiskScoreFields, RiskSeverity } from '../../../../../common/search_strategy'; @@ -44,28 +44,31 @@ jest.mock('react-redux', () => { }; }); -describe('RiskScoreDonutChart', () => { - it('renders critical hosts', () => { +describe('Entity analytics header', () => { + it('renders critical hosts', async () => { const { getByTestId } = render( ); - - expect(getByTestId('critical_hosts_quantity')).toHaveTextContent('99'); + await waitFor(() => { + expect(getByTestId('critical_hosts_quantity')).toHaveTextContent('99'); + }); }); - it('renders critical users', () => { + it('renders critical users', async () => { const { getByTestId } = render( ); - expect(getByTestId('critical_users_quantity')).toHaveTextContent('99'); + await waitFor(() => { + expect(getByTestId('critical_users_quantity')).toHaveTextContent('99'); + }); }); - it('dispatches user risk tab filters actions', () => { + it('dispatches user risk tab filters actions', async () => { const { getByTestId } = render( @@ -76,21 +79,23 @@ describe('RiskScoreDonutChart', () => { fireEvent.click(getByTestId('critical_users_link')); }); - expect(mockDispatch).toHaveBeenCalledWith( - usersActions.updateUserRiskScoreSeverityFilter({ - severitySelection: [RiskSeverity.critical], - }) - ); - - expect(mockDispatch).toHaveBeenCalledWith( - usersActions.updateTableSorting({ - sort: { field: RiskScoreFields.userRiskScore, direction: Direction.desc }, - tableType: UsersTableType.risk, - }) - ); + await waitFor(() => { + expect(mockDispatch).toHaveBeenCalledWith( + usersActions.updateUserRiskScoreSeverityFilter({ + severitySelection: [RiskSeverity.critical], + }) + ); + + expect(mockDispatch).toHaveBeenCalledWith( + usersActions.updateTableSorting({ + sort: { field: RiskScoreFields.userRiskScore, direction: Direction.desc }, + tableType: UsersTableType.risk, + }) + ); + }); }); - it('dispatches host risk tab filters actions', () => { + it('dispatches host risk tab filters actions', async () => { const { getByTestId } = render( @@ -101,18 +106,20 @@ describe('RiskScoreDonutChart', () => { fireEvent.click(getByTestId('critical_hosts_link')); }); - expect(mockDispatch).toHaveBeenCalledWith( - hostsActions.updateHostRiskScoreSeverityFilter({ - severitySelection: [RiskSeverity.critical], - hostsType: HostsType.page, - }) - ); - - expect(mockDispatch).toHaveBeenCalledWith( - hostsActions.updateHostRiskScoreSort({ - sort: { field: RiskScoreFields.hostRiskScore, direction: Direction.desc }, - hostsType: HostsType.page, - }) - ); + await waitFor(() => { + expect(mockDispatch).toHaveBeenCalledWith( + hostsActions.updateHostRiskScoreSeverityFilter({ + severitySelection: [RiskSeverity.critical], + hostsType: HostsType.page, + }) + ); + + expect(mockDispatch).toHaveBeenCalledWith( + hostsActions.updateHostRiskScoreSort({ + sort: { field: RiskScoreFields.hostRiskScore, direction: Direction.desc }, + hostsType: HostsType.page, + }) + ); + }); }); }); diff --git a/x-pack/plugins/security_solution/public/overview/components/entity_analytics/host_risk_score/index.test.tsx b/x-pack/plugins/security_solution/public/overview/components/entity_analytics/host_risk_score/index.test.tsx deleted file mode 100644 index 4f4edd279a568..0000000000000 --- a/x-pack/plugins/security_solution/public/overview/components/entity_analytics/host_risk_score/index.test.tsx +++ /dev/null @@ -1,113 +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 { render } from '@testing-library/react'; -import React from 'react'; -import { TestProviders } from '../../../../common/mock'; -import { EntityAnalyticsHostRiskScores } from '.'; -import { RiskSeverity } from '../../../../../common/search_strategy'; -import type { SeverityCount } from '../../../../common/components/severity/types'; -import { useHostRiskScore, useHostRiskScoreKpi } from '../../../../risk_score/containers'; - -const mockSeverityCount: SeverityCount = { - [RiskSeverity.low]: 1, - [RiskSeverity.high]: 1, - [RiskSeverity.moderate]: 1, - [RiskSeverity.unknown]: 1, - [RiskSeverity.critical]: 1, -}; - -const mockUseQueryToggle = jest - .fn() - .mockReturnValue({ toggleStatus: false, setToggleStatus: jest.fn() }); -jest.mock('../../../../common/containers/query_toggle', () => { - return { - useQueryToggle: () => mockUseQueryToggle(), - }; -}); -const defaultProps = { - data: undefined, - inspect: null, - refetch: () => {}, - isModuleEnabled: true, - isLicenseValid: true, -}; -const mockUseHostRiskScore = useHostRiskScore as jest.Mock; -const mockUseHostRiskScoreKpi = useHostRiskScoreKpi as jest.Mock; -jest.mock('../../../../risk_score/containers'); - -describe('EntityAnalyticsHostRiskScores', () => { - beforeEach(() => { - jest.clearAllMocks(); - mockUseHostRiskScoreKpi.mockReturnValue({ severityCount: mockSeverityCount, loading: false }); - mockUseHostRiskScore.mockReturnValue([false, defaultProps]); - }); - - it('renders enable button when module is disable', () => { - mockUseHostRiskScore.mockReturnValue([false, { ...defaultProps, isModuleEnabled: false }]); - const { getByTestId } = render( - - - - ); - - expect(getByTestId('enable_host_risk_score')).toBeInTheDocument(); - }); - - it("doesn't render enable button when module is enable", () => { - const { queryByTestId } = render( - - - - ); - - expect(queryByTestId('enable_host_risk_score')).not.toBeInTheDocument(); - }); - - it('queries when toggleStatus is true', () => { - mockUseQueryToggle.mockReturnValue({ toggleStatus: true, setToggleStatus: jest.fn() }); - render( - - - - ); - - expect(mockUseHostRiskScore.mock.calls[0][0].skip).toEqual(false); - }); - - it('skips query when toggleStatus is false', () => { - mockUseQueryToggle.mockReturnValue({ toggleStatus: false, setToggleStatus: jest.fn() }); - render( - - - - ); - expect(mockUseHostRiskScore.mock.calls[0][0].skip).toEqual(true); - }); - - it('renders components when toggleStatus is true', () => { - mockUseQueryToggle.mockReturnValue({ toggleStatus: true, setToggleStatus: jest.fn() }); - const { queryByTestId } = render( - - - - ); - - expect(queryByTestId('entity_analytics_content')).toBeInTheDocument(); - }); - - it('does not render components when toggleStatus is false', () => { - mockUseQueryToggle.mockReturnValue({ toggleStatus: false, setToggleStatus: jest.fn() }); - const { queryByTestId } = render( - - - - ); - - expect(queryByTestId('entity_analytics_content')).not.toBeInTheDocument(); - }); -}); diff --git a/x-pack/plugins/security_solution/public/overview/components/entity_analytics/host_risk_score/translations.ts b/x-pack/plugins/security_solution/public/overview/components/entity_analytics/host_risk_score/translations.ts deleted file mode 100644 index a53ad8d558667..0000000000000 --- a/x-pack/plugins/security_solution/public/overview/components/entity_analytics/host_risk_score/translations.ts +++ /dev/null @@ -1,65 +0,0 @@ -/* - * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one - * or more contributor license agreements. Licensed under the Elastic License - * 2.0; you may not use this file except in compliance with the Elastic License - * 2.0. - */ - -import { i18n } from '@kbn/i18n'; - -export const HOST_RISK_TOOLTIP = i18n.translate( - 'xpack.securitySolution.entityAnalytics.hostsRiskDashboard.hostRiskToolTip', - { - defaultMessage: - 'Host risk classification is determined by host risk score. Hosts classified as Critical or High are indicated as risky.', - } -); - -export const HOST_RISK = i18n.translate( - 'xpack.securitySolution.entityAnalytics.hostsRiskDashboard.hostRiskClassificationTitle', - { - defaultMessage: 'Host risk classification', - } -); - -export const HOST_RISK_SCORE = i18n.translate( - 'xpack.securitySolution.entityAnalytics.hostsRiskDashboard.hostRiskScoreTitle', - { - defaultMessage: 'Host risk score', - } -); - -export const HOST_NAME = i18n.translate( - 'xpack.securitySolution.entityAnalytics.hostsRiskDashboard.hostNameTitle', - { - defaultMessage: 'Host Name', - } -); - -export const TOTAL_LABEL = i18n.translate( - 'xpack.securitySolution.entityAnalytics.hostsRiskDashboard.totalLabel', - { - defaultMessage: 'Total', - } -); - -export const VIEW_ALL = i18n.translate( - 'xpack.securitySolution.entityAnalytics.hostsRiskDashboard.viewAllLabel', - { - defaultMessage: 'View all', - } -); - -export const LEARN_MORE = i18n.translate( - 'xpack.securitySolution.entityAnalytics.hostsRiskDashboard.learnMore', - { - defaultMessage: 'Learn more', - } -); - -export const ENABLE_VIA_DEV_TOOLS = i18n.translate( - 'xpack.securitySolution.entityAnalytics.hostsRiskDashboard.enableViaDevToolsButtonTitle', - { - defaultMessage: 'Enable via Dev Tools', - } -); diff --git a/x-pack/plugins/security_solution/public/overview/components/entity_analytics/host_risk_score/columns.tsx b/x-pack/plugins/security_solution/public/overview/components/entity_analytics/risk_score/columns.tsx similarity index 58% rename from x-pack/plugins/security_solution/public/overview/components/entity_analytics/host_risk_score/columns.tsx rename to x-pack/plugins/security_solution/public/overview/components/entity_analytics/risk_score/columns.tsx index 998a356bf4f73..055a172e54b73 100644 --- a/x-pack/plugins/security_solution/public/overview/components/entity_analytics/host_risk_score/columns.tsx +++ b/x-pack/plugins/security_solution/public/overview/components/entity_analytics/risk_score/columns.tsx @@ -8,32 +8,40 @@ import React from 'react'; import type { EuiBasicTableColumn } from '@elastic/eui'; import { EuiIcon, EuiToolTip } from '@elastic/eui'; +import { UsersTableType } from '../../../../users/store/model'; import { getEmptyTagValue } from '../../../../common/components/empty_value'; -import { HostDetailsLink } from '../../../../common/components/links'; +import { HostDetailsLink, UserDetailsLink } from '../../../../common/components/links'; import { HostsTableType } from '../../../../hosts/store/model'; import { RiskScore } from '../../../../common/components/severity/common'; import type { HostRiskScore, RiskSeverity } from '../../../../../common/search_strategy'; -import { RiskScoreFields } from '../../../../../common/search_strategy'; +import { RiskScoreEntity, RiskScoreFields } from '../../../../../common/search_strategy'; import * as i18n from './translations'; type HostRiskScoreColumns = Array>; -export const getHostRiskScoreColumns = (): HostRiskScoreColumns => [ +export const getRiskScoreColumns = (riskEntity: RiskScoreEntity): HostRiskScoreColumns => [ { - field: 'host.name', - name: i18n.HOST_NAME, + field: riskEntity === RiskScoreEntity.host ? 'host.name' : 'user.name', + name: i18n.ENTITY_NAME(riskEntity), truncateText: false, mobileOptions: { show: true }, - render: (hostName: string) => { - if (hostName != null && hostName.length > 0) { - return ; + render: (entityName: string) => { + if (entityName != null && entityName.length > 0) { + return riskEntity === RiskScoreEntity.host ? ( + + ) : ( + + ); } return getEmptyTagValue(); }, }, { - field: RiskScoreFields.hostRiskScore, - name: i18n.HOST_RISK_SCORE, + field: + riskEntity === RiskScoreEntity.host + ? RiskScoreFields.hostRiskScore + : RiskScoreFields.userRiskScore, + name: i18n.RISK_SCORE_TITLE(riskEntity), truncateText: true, mobileOptions: { show: true }, render: (riskScore: number) => { @@ -48,11 +56,12 @@ export const getHostRiskScoreColumns = (): HostRiskScoreColumns => [ }, }, { - field: RiskScoreFields.hostRisk, + field: + riskEntity === RiskScoreEntity.host ? RiskScoreFields.hostRisk : RiskScoreFields.userRisk, name: ( - + <> - {i18n.HOST_RISK} + {i18n.ENTITY_RISK(riskEntity)} diff --git a/x-pack/plugins/security_solution/public/overview/components/entity_analytics/risk_score/index.test.tsx b/x-pack/plugins/security_solution/public/overview/components/entity_analytics/risk_score/index.test.tsx new file mode 100644 index 0000000000000..f5b9d0fcafc2a --- /dev/null +++ b/x-pack/plugins/security_solution/public/overview/components/entity_analytics/risk_score/index.test.tsx @@ -0,0 +1,131 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import { render } from '@testing-library/react'; +import React from 'react'; +import { TestProviders } from '../../../../common/mock'; +import { EntityAnalyticsRiskScores } from '.'; +import { RiskScoreEntity, RiskSeverity } from '../../../../../common/search_strategy'; +import type { SeverityCount } from '../../../../common/components/severity/types'; +import { + useHostRiskScore, + useHostRiskScoreKpi, + useUserRiskScore, + useUserRiskScoreKpi, +} from '../../../../risk_score/containers'; + +const mockSeverityCount: SeverityCount = { + [RiskSeverity.low]: 1, + [RiskSeverity.high]: 1, + [RiskSeverity.moderate]: 1, + [RiskSeverity.unknown]: 1, + [RiskSeverity.critical]: 1, +}; + +const mockUseQueryToggle = jest + .fn() + .mockReturnValue({ toggleStatus: false, setToggleStatus: jest.fn() }); +jest.mock('../../../../common/containers/query_toggle', () => { + return { + useQueryToggle: () => mockUseQueryToggle(), + }; +}); +const defaultProps = { + data: undefined, + inspect: null, + refetch: () => {}, + isModuleEnabled: true, + isLicenseValid: true, +}; +const mockUseHostRiskScore = useHostRiskScore as jest.Mock; +const mockUseHostRiskScoreKpi = useHostRiskScoreKpi as jest.Mock; +const mockUseUserRiskScore = useUserRiskScore as jest.Mock; +const mockUseUserRiskScoreKpi = useUserRiskScoreKpi as jest.Mock; +jest.mock('../../../../risk_score/containers'); + +describe.each([RiskScoreEntity.host, RiskScoreEntity.user])( + 'EntityAnalyticsRiskScores entityType: %s', + (riskEntity) => { + const entity = + riskEntity === RiskScoreEntity.host + ? { mockUseRiskScoreKpi: mockUseHostRiskScoreKpi, mockUseRiskScore: mockUseHostRiskScore } + : { mockUseRiskScoreKpi: mockUseUserRiskScoreKpi, mockUseRiskScore: mockUseUserRiskScore }; + + beforeEach(() => { + jest.clearAllMocks(); + entity.mockUseRiskScoreKpi.mockReturnValue({ + severityCount: mockSeverityCount, + loading: false, + }); + entity.mockUseRiskScore.mockReturnValue([false, defaultProps]); + }); + + it('renders enable button when module is disable', () => { + entity.mockUseRiskScore.mockReturnValue([false, { ...defaultProps, isModuleEnabled: false }]); + const { getByTestId } = render( + + + + ); + + expect(getByTestId(`enable_${riskEntity}_risk_score`)).toBeInTheDocument(); + }); + + it("doesn't render enable button when module is enable", () => { + const { queryByTestId } = render( + + + + ); + + expect(queryByTestId(`enable_${riskEntity}_risk_score`)).not.toBeInTheDocument(); + }); + + it('queries when toggleStatus is true', () => { + mockUseQueryToggle.mockReturnValue({ toggleStatus: true, setToggleStatus: jest.fn() }); + render( + + + + ); + + expect(entity.mockUseRiskScore.mock.calls[0][0].skip).toEqual(false); + }); + + it('skips query when toggleStatus is false', () => { + mockUseQueryToggle.mockReturnValue({ toggleStatus: false, setToggleStatus: jest.fn() }); + render( + + + + ); + expect(entity.mockUseRiskScore.mock.calls[0][0].skip).toEqual(true); + }); + + it('renders components when toggleStatus is true', () => { + mockUseQueryToggle.mockReturnValue({ toggleStatus: true, setToggleStatus: jest.fn() }); + const { queryByTestId } = render( + + + + ); + + expect(queryByTestId('entity_analytics_content')).toBeInTheDocument(); + }); + + it('does not render components when toggleStatus is false', () => { + mockUseQueryToggle.mockReturnValue({ toggleStatus: false, setToggleStatus: jest.fn() }); + const { queryByTestId } = render( + + + + ); + + expect(queryByTestId('entity_analytics_content')).not.toBeInTheDocument(); + }); + } +); diff --git a/x-pack/plugins/security_solution/public/overview/components/entity_analytics/host_risk_score/index.tsx b/x-pack/plugins/security_solution/public/overview/components/entity_analytics/risk_score/index.tsx similarity index 62% rename from x-pack/plugins/security_solution/public/overview/components/entity_analytics/host_risk_score/index.tsx rename to x-pack/plugins/security_solution/public/overview/components/entity_analytics/risk_score/index.tsx index 9bb06fd261ddc..b7796d442569d 100644 --- a/x-pack/plugins/security_solution/public/overview/components/entity_analytics/host_risk_score/index.tsx +++ b/x-pack/plugins/security_solution/public/overview/components/entity_analytics/risk_score/index.tsx @@ -8,15 +8,23 @@ import React, { useEffect, useMemo, useState } from 'react'; import { EuiButtonEmpty, EuiFlexGroup, EuiFlexItem } from '@elastic/eui'; import { useDispatch } from 'react-redux'; +import { EntityAnalyticsUserRiskScoreDisable } from '../../../../common/components/risk_score/risk_score_disabled/user_risk_score.disabled'; +import { getTabsOnUsersUrl } from '../../../../common/components/link_to/redirect_to_users'; +import { UsersTableType } from '../../../../users/store/model'; import { RiskScoresDeprecated } from '../../../../common/components/risk_score/risk_score_deprecated'; import { SeverityFilterGroup } from '../../../../common/components/severity/severity_filter_group'; import { LinkButton, useGetSecuritySolutionLinkProps } from '../../../../common/components/links'; import { getTabsOnHostsUrl } from '../../../../common/components/link_to/redirect_to_hosts'; import { HostsTableType, HostsType } from '../../../../hosts/store/model'; -import { getHostRiskScoreColumns } from './columns'; +import { getRiskScoreColumns } from './columns'; import { LastUpdatedAt } from '../../../../common/components/last_updated_at'; import { HeaderSection } from '../../../../common/components/header_section'; -import { useHostRiskScore, useHostRiskScoreKpi } from '../../../../risk_score/containers'; +import { + useHostRiskScore, + useHostRiskScoreKpi, + useUserRiskScore, + useUserRiskScoreKpi, +} from '../../../../risk_score/containers'; import type { RiskSeverity } from '../../../../../common/search_strategy'; import { EMPTY_SEVERITY_COUNT, RiskScoreEntity } from '../../../../../common/search_strategy'; @@ -30,7 +38,7 @@ import { useQueryToggle } from '../../../../common/containers/query_toggle'; import { hostsActions } from '../../../../hosts/store'; import { RiskScoreDonutChart } from '../common/risk_score_donut_chart'; import { BasicTableWithoutBorderBottom } from '../common/basic_table_without_border_bottom'; -import { RISKY_HOSTS_DOC_LINK } from '../../../../../common/constants'; +import { RISKY_HOSTS_DOC_LINK, RISKY_USERS_DOC_LINK } from '../../../../../common/constants'; import { EntityAnalyticsHostRiskScoreDisable } from '../../../../common/components/risk_score/risk_score_disabled/host_risk_score_disabled'; import { RiskScoreHeaderTitle } from '../../../../common/components/risk_score/risk_score_onboarding/risk_score_header_title'; import { RiskScoresNoDataDetected } from '../../../../common/components/risk_score/risk_score_onboarding/risk_score_no_data_detected'; @@ -38,24 +46,69 @@ import { useRefetchQueries } from '../../../../common/hooks/use_refetch_queries' import { Loader } from '../../../../common/components/loader'; import { Panel } from '../../../../common/components/panel'; import * as commonI18n from '../common/translations'; +import { usersActions } from '../../../../users/store'; -const TABLE_QUERY_ID = 'hostRiskDashboardTable'; -const HOST_RISK_KPI_QUERY_ID = 'headerHostRiskScoreKpiQuery'; +const TABLE_QUERY_ID = (riskEntity: RiskScoreEntity) => + riskEntity === RiskScoreEntity.host ? 'hostRiskDashboardTable' : 'userRiskDashboardTable'; +const RISK_KPI_QUERY_ID = (riskEntity: RiskScoreEntity) => + riskEntity === RiskScoreEntity.host + ? 'headerHostRiskScoreKpiQuery' + : 'headerUserRiskScoreKpiQuery'; -const EntityAnalyticsHostRiskScoresComponent = () => { +const EntityAnalyticsRiskScoresComponent = ({ riskEntity }: { riskEntity: RiskScoreEntity }) => { const { deleteQuery, setQuery, from, to } = useGlobalTime(); const [updatedAt, setUpdatedAt] = useState(Date.now()); - const { toggleStatus, setToggleStatus } = useQueryToggle(TABLE_QUERY_ID); - const columns = useMemo(() => getHostRiskScoreColumns(), []); + const dispatch = useDispatch(); + + const entity = useMemo( + () => + riskEntity === RiskScoreEntity.host + ? { + docLink: RISKY_HOSTS_DOC_LINK, + kpiHook: useHostRiskScoreKpi, + riskScoreHook: useHostRiskScore, + linkProps: { + deepLinkId: SecurityPageName.hosts, + path: getTabsOnHostsUrl(HostsTableType.risk), + onClick: () => { + dispatch( + hostsActions.updateHostRiskScoreSeverityFilter({ + severitySelection: [], + hostsType: HostsType.page, + }) + ); + }, + }, + } + : { + docLink: RISKY_USERS_DOC_LINK, + kpiHook: useUserRiskScoreKpi, + riskScoreHook: useUserRiskScore, + linkProps: { + deepLinkId: SecurityPageName.users, + path: getTabsOnUsersUrl(UsersTableType.risk), + onClick: () => { + dispatch( + usersActions.updateUserRiskScoreSeverityFilter({ + severitySelection: [], + }) + ); + }, + }, + }, + [dispatch, riskEntity] + ); + + const { toggleStatus, setToggleStatus } = useQueryToggle(TABLE_QUERY_ID(riskEntity)); + const columns = useMemo(() => getRiskScoreColumns(riskEntity), [riskEntity]); const [selectedSeverity, setSelectedSeverity] = useState([]); const getSecuritySolutionLinkProps = useGetSecuritySolutionLinkProps(); - const dispatch = useDispatch(); const severityFilter = useMemo(() => { - const [filter] = generateSeverityFilter(selectedSeverity, RiskScoreEntity.host); + const [filter] = generateSeverityFilter(selectedSeverity, riskEntity); return filter ? JSON.stringify(filter.query) : undefined; - }, [selectedSeverity]); + }, [riskEntity, selectedSeverity]); const timerange = useMemo( () => ({ @@ -70,14 +123,14 @@ const EntityAnalyticsHostRiskScoresComponent = () => { loading: isKpiLoading, refetch: refetchKpi, inspect: inspectKpi, - } = useHostRiskScoreKpi({ + } = entity.kpiHook({ filterQuery: severityFilter, skip: !toggleStatus, timerange, }); useQueryInspector({ - queryId: HOST_RISK_KPI_QUERY_ID, + queryId: RISK_KPI_QUERY_ID(riskEntity), loading: isKpiLoading, refetch: refetchKpi, setQuery, @@ -87,7 +140,7 @@ const EntityAnalyticsHostRiskScoresComponent = () => { const [ isTableLoading, { data, inspect, refetch, isDeprecated, isLicenseValid, isModuleEnabled }, - ] = useHostRiskScore({ + ] = entity.riskScoreHook({ filterQuery: severityFilter, skip: !toggleStatus, pagination: { @@ -98,7 +151,7 @@ const EntityAnalyticsHostRiskScoresComponent = () => { }); useQueryInspector({ - queryId: TABLE_QUERY_ID, + queryId: TABLE_QUERY_ID(riskEntity), loading: isTableLoading, refetch, setQuery, @@ -110,21 +163,10 @@ const EntityAnalyticsHostRiskScoresComponent = () => { setUpdatedAt(Date.now()); }, [isTableLoading, isKpiLoading]); // Update the time when data loads - const [goToHostRiskTab, hostRiskTabUrl] = useMemo(() => { - const { onClick, href } = getSecuritySolutionLinkProps({ - deepLinkId: SecurityPageName.hosts, - path: getTabsOnHostsUrl(HostsTableType.risk), - onClick: () => { - dispatch( - hostsActions.updateHostRiskScoreSeverityFilter({ - severitySelection: [], - hostsType: HostsType.page, - }) - ); - }, - }); + const [goToEntityRiskTab, entityRiskTabUrl] = useMemo(() => { + const { onClick, href } = getSecuritySolutionLinkProps(entity.linkProps); return [onClick, href]; - }, [dispatch, getSecuritySolutionLinkProps]); + }, [entity.linkProps, getSecuritySolutionLinkProps]); const refreshPage = useRefetchQueries(); @@ -133,33 +175,33 @@ const EntityAnalyticsHostRiskScoresComponent = () => { } if (!isModuleEnabled && !isTableLoading) { - return ; + return riskEntity === RiskScoreEntity.host ? ( + + ) : ( + + ); } if (isDeprecated && !isTableLoading) { return ( - + ); } if (isModuleEnabled && selectedSeverity.length === 0 && data && data.length === 0) { - return ; + return ; } return ( - + } + title={} titleSize="s" subtitle={ } - id={TABLE_QUERY_ID} + id={TABLE_QUERY_ID(riskEntity)} toggleStatus={toggleStatus} toggleQuery={setToggleStatus} tooltip={commonI18n.HOST_RISK_TABLE_TOOLTIP} @@ -169,7 +211,7 @@ const EntityAnalyticsHostRiskScoresComponent = () => { {i18n.LEARN_MORE} @@ -179,15 +221,15 @@ const EntityAnalyticsHostRiskScoresComponent = () => { {i18n.VIEW_ALL} @@ -206,7 +248,7 @@ const EntityAnalyticsHostRiskScoresComponent = () => { items={data ?? []} columns={columns} loading={isTableLoading} - id={TABLE_QUERY_ID} + id={TABLE_QUERY_ID(riskEntity)} /> @@ -219,5 +261,5 @@ const EntityAnalyticsHostRiskScoresComponent = () => { ); }; -export const EntityAnalyticsHostRiskScores = React.memo(EntityAnalyticsHostRiskScoresComponent); -EntityAnalyticsHostRiskScores.displayName = 'EntityAnalyticsHostRiskScores'; +export const EntityAnalyticsRiskScores = React.memo(EntityAnalyticsRiskScoresComponent); +EntityAnalyticsRiskScores.displayName = 'EntityAnalyticsRiskScores'; diff --git a/x-pack/plugins/security_solution/public/overview/components/entity_analytics/risk_score/translations.ts b/x-pack/plugins/security_solution/public/overview/components/entity_analytics/risk_score/translations.ts new file mode 100644 index 0000000000000..9ca0f659e14f4 --- /dev/null +++ b/x-pack/plugins/security_solution/public/overview/components/entity_analytics/risk_score/translations.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 { i18n } from '@kbn/i18n'; +import { getRiskEntityTranslation } from '../../../../common/components/risk_score/translations'; +import type { RiskScoreEntity } from '../../../../../common/search_strategy'; +export * from '../../../../common/components/risk_score/translations'; + +export const ENTITY_RISK_TOOLTIP = (riskEntity: RiskScoreEntity) => + i18n.translate('xpack.securitySolution.entityAnalytics.riskDashboard.riskToolTip', { + defaultMessage: + '{riskEntity} risk classification is determined by {riskEntityLowercase} risk score. {riskEntity}s classified as Critical or High are indicated as risky.', + values: { + riskEntity: getRiskEntityTranslation(riskEntity), + riskEntityLowercase: getRiskEntityTranslation(riskEntity, true), + }, + }); + +export const ENTITY_RISK = (riskEntity: RiskScoreEntity) => + i18n.translate('xpack.securitySolution.entityAnalytics.riskDashboard.riskClassificationTitle', { + defaultMessage: '{riskEntity} risk classification', + values: { + riskEntity: getRiskEntityTranslation(riskEntity), + }, + }); + +export const ENTITY_NAME = (riskEntity: RiskScoreEntity) => + i18n.translate('xpack.securitySolution.entityAnalytics.riskDashboard.nameTitle', { + defaultMessage: '{riskEntity} Name', + values: { + riskEntity: getRiskEntityTranslation(riskEntity), + }, + }); + +export const VIEW_ALL = i18n.translate( + 'xpack.securitySolution.entityAnalytics.riskDashboard.viewAllLabel', + { + defaultMessage: 'View all', + } +); + +export const LEARN_MORE = i18n.translate( + 'xpack.securitySolution.entityAnalytics.riskDashboard.learnMore', + { + defaultMessage: 'Learn more', + } +); diff --git a/x-pack/plugins/security_solution/public/overview/components/entity_analytics/user_risk_score/columns.tsx b/x-pack/plugins/security_solution/public/overview/components/entity_analytics/user_risk_score/columns.tsx deleted file mode 100644 index 05f532617d5cc..0000000000000 --- a/x-pack/plugins/security_solution/public/overview/components/entity_analytics/user_risk_score/columns.tsx +++ /dev/null @@ -1,69 +0,0 @@ -/* - * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one - * or more contributor license agreements. Licensed under the Elastic License - * 2.0; you may not use this file except in compliance with the Elastic License - * 2.0. - */ - -import React from 'react'; -import type { EuiBasicTableColumn } from '@elastic/eui'; -import { EuiIcon, EuiToolTip } from '@elastic/eui'; -import { getEmptyTagValue } from '../../../../common/components/empty_value'; -import { RiskScore } from '../../../../common/components/severity/common'; -import * as i18n from './translations'; -import { UsersTableType } from '../../../../users/store/model'; -import type { RiskSeverity, UserRiskScore } from '../../../../../common/search_strategy'; -import { RiskScoreFields } from '../../../../../common/search_strategy'; -import { UserDetailsLink } from '../../../../common/components/links'; - -type UserRiskScoreColumns = Array>; - -export const getUserRiskScoreColumns = (): UserRiskScoreColumns => [ - { - field: 'user.name', - name: i18n.USER_NAME, - truncateText: false, - mobileOptions: { show: true }, - render: (userName: string) => { - if (userName != null && userName.length > 0) { - return ; - } - return getEmptyTagValue(); - }, - }, - { - field: RiskScoreFields.userRiskScore, - name: i18n.USER_RISK_SCORE, - truncateText: true, - mobileOptions: { show: true }, - render: (riskScore: number) => { - if (riskScore != null) { - return ( - - {riskScore.toFixed(2)} - - ); - } - return getEmptyTagValue(); - }, - }, - { - field: RiskScoreFields.userRisk, - name: ( - - <> - {i18n.USER_RISK} - - - - ), - truncateText: false, - mobileOptions: { show: true }, - render: (risk: RiskSeverity) => { - if (risk != null) { - return ; - } - return getEmptyTagValue(); - }, - }, -]; diff --git a/x-pack/plugins/security_solution/public/overview/components/entity_analytics/user_risk_score/index.test.tsx b/x-pack/plugins/security_solution/public/overview/components/entity_analytics/user_risk_score/index.test.tsx deleted file mode 100644 index 6ddfd912e832f..0000000000000 --- a/x-pack/plugins/security_solution/public/overview/components/entity_analytics/user_risk_score/index.test.tsx +++ /dev/null @@ -1,115 +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 { render } from '@testing-library/react'; -import React from 'react'; -import { TestProviders } from '../../../../common/mock'; -import { EntityAnalyticsUserRiskScores } from '.'; -import { RiskSeverity } from '../../../../../common/search_strategy'; -import type { SeverityCount } from '../../../../common/components/severity/types'; -import { useUserRiskScore, useUserRiskScoreKpi } from '../../../../risk_score/containers'; - -const mockSeverityCount: SeverityCount = { - [RiskSeverity.low]: 1, - [RiskSeverity.high]: 1, - [RiskSeverity.moderate]: 1, - [RiskSeverity.unknown]: 1, - [RiskSeverity.critical]: 1, -}; - -const mockUseQueryToggle = jest - .fn() - .mockReturnValue({ toggleStatus: false, setToggleStatus: jest.fn() }); -jest.mock('../../../../common/containers/query_toggle', () => { - return { - useQueryToggle: () => mockUseQueryToggle(), - }; -}); - -const defaultProps = { - data: undefined, - inspect: null, - refetch: () => {}, - isModuleEnabled: true, - isLicenseValid: true, -}; - -const mockUseUserRiskScore = useUserRiskScore as jest.Mock; -const mockUseUserRiskScoreKpi = useUserRiskScoreKpi as jest.Mock; -jest.mock('../../../../risk_score/containers'); - -describe('EntityAnalyticsUserRiskScores', () => { - beforeEach(() => { - jest.clearAllMocks(); - mockUseUserRiskScoreKpi.mockReturnValue({ severityCount: mockSeverityCount, loading: false }); - mockUseUserRiskScore.mockReturnValue([false, defaultProps]); - }); - - it('renders enable button when module is disable', () => { - mockUseUserRiskScore.mockReturnValue([false, { ...defaultProps, isModuleEnabled: false }]); - const { getByTestId } = render( - - - - ); - - expect(getByTestId('enable_user_risk_score')).toBeInTheDocument(); - }); - - it("doesn't render enable button when module is enable", () => { - const { queryByTestId } = render( - - - - ); - - expect(queryByTestId('enable_user_risk_score')).not.toBeInTheDocument(); - }); - - it('queries when toggleStatus is true', () => { - mockUseQueryToggle.mockReturnValue({ toggleStatus: true, setToggleStatus: jest.fn() }); - render( - - - - ); - - expect(mockUseUserRiskScore.mock.calls[0][0].skip).toEqual(false); - }); - - it('skips query when toggleStatus is false', () => { - mockUseQueryToggle.mockReturnValue({ toggleStatus: false, setToggleStatus: jest.fn() }); - render( - - - - ); - expect(mockUseUserRiskScore.mock.calls[0][0].skip).toEqual(true); - }); - - it('renders components when toggleStatus is true', () => { - mockUseQueryToggle.mockReturnValue({ toggleStatus: true, setToggleStatus: jest.fn() }); - const { queryByTestId } = render( - - - - ); - - expect(queryByTestId('entity_analytics_content')).toBeInTheDocument(); - }); - - it('does not render components when toggleStatus is false', () => { - mockUseQueryToggle.mockReturnValue({ toggleStatus: false, setToggleStatus: jest.fn() }); - const { queryByTestId } = render( - - - - ); - - expect(queryByTestId('entity_analytics_content')).not.toBeInTheDocument(); - }); -}); diff --git a/x-pack/plugins/security_solution/public/overview/components/entity_analytics/user_risk_score/index.tsx b/x-pack/plugins/security_solution/public/overview/components/entity_analytics/user_risk_score/index.tsx deleted file mode 100644 index cf01417d0eab3..0000000000000 --- a/x-pack/plugins/security_solution/public/overview/components/entity_analytics/user_risk_score/index.tsx +++ /dev/null @@ -1,223 +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, { useEffect, useMemo, useState } from 'react'; -import { EuiButtonEmpty, EuiFlexGroup, EuiFlexItem } from '@elastic/eui'; -import { useDispatch } from 'react-redux'; -import { RiskScoresDeprecated } from '../../../../common/components/risk_score/risk_score_deprecated'; -import { SeverityFilterGroup } from '../../../../common/components/severity/severity_filter_group'; -import { LinkButton, useGetSecuritySolutionLinkProps } from '../../../../common/components/links'; -import { LastUpdatedAt } from '../../../../common/components/last_updated_at'; -import { HeaderSection } from '../../../../common/components/header_section'; -import type { RiskSeverity } from '../../../../../common/search_strategy'; -import { EMPTY_SEVERITY_COUNT, RiskScoreEntity } from '../../../../../common/search_strategy'; -import { SecurityPageName } from '../../../../app/types'; -import * as i18n from './translations'; -import { generateSeverityFilter } from '../../../../hosts/store/helpers'; - -import { useQueryInspector } from '../../../../common/components/page/manage_query'; -import { useGlobalTime } from '../../../../common/containers/use_global_time'; -import { InspectButtonContainer } from '../../../../common/components/inspect'; -import { useQueryToggle } from '../../../../common/containers/query_toggle'; -import { usersActions } from '../../../../users/store'; -import { getUserRiskScoreColumns } from './columns'; -import { useUserRiskScore, useUserRiskScoreKpi } from '../../../../risk_score/containers'; -import { UsersTableType } from '../../../../users/store/model'; -import { getTabsOnUsersUrl } from '../../../../common/components/link_to/redirect_to_users'; -import { RiskScoreDonutChart } from '../common/risk_score_donut_chart'; -import { BasicTableWithoutBorderBottom } from '../common/basic_table_without_border_bottom'; - -import { RISKY_USERS_DOC_LINK } from '../../../../../common/constants'; -import { EntityAnalyticsUserRiskScoreDisable } from '../../../../common/components/risk_score/risk_score_disabled/user_risk_score.disabled'; -import { RiskScoreHeaderTitle } from '../../../../common/components/risk_score/risk_score_onboarding/risk_score_header_title'; -import { RiskScoresNoDataDetected } from '../../../../common/components/risk_score/risk_score_onboarding/risk_score_no_data_detected'; -import { useRefetchQueries } from '../../../../common/hooks/use_refetch_queries'; -import { Loader } from '../../../../common/components/loader'; -import { Panel } from '../../../../common/components/panel'; -import * as commonI18n from '../common/translations'; - -const TABLE_QUERY_ID = 'userRiskDashboardTable'; -const USER_RISK_KPI_QUERY_ID = 'headerUserRiskScoreKpiQuery'; - -const EntityAnalyticsUserRiskScoresComponent = () => { - const { deleteQuery, setQuery, from, to } = useGlobalTime(); - const [updatedAt, setUpdatedAt] = useState(Date.now()); - const { toggleStatus, setToggleStatus } = useQueryToggle(TABLE_QUERY_ID); - const columns = useMemo(() => getUserRiskScoreColumns(), []); - const [selectedSeverity, setSelectedSeverity] = useState([]); - const getSecuritySolutionLinkProps = useGetSecuritySolutionLinkProps(); - const dispatch = useDispatch(); - - const severityFilter = useMemo(() => { - const [filter] = generateSeverityFilter(selectedSeverity, RiskScoreEntity.user); - - return filter ? JSON.stringify(filter.query) : undefined; - }, [selectedSeverity]); - - const timerange = useMemo( - () => ({ - from, - to, - }), - [from, to] - ); - - const { - severityCount, - loading: isKpiLoading, - refetch: refetchKpi, - inspect: inspectKpi, - } = useUserRiskScoreKpi({ - filterQuery: severityFilter, - skip: !toggleStatus, - timerange, - }); - - const [ - isTableLoading, - { data, inspect, refetch, isLicenseValid, isDeprecated, isModuleEnabled }, - ] = useUserRiskScore({ - filterQuery: severityFilter, - skip: !toggleStatus, - pagination: { - cursorStart: 0, - querySize: 5, - }, - timerange, - }); - - useQueryInspector({ - queryId: TABLE_QUERY_ID, - loading: isTableLoading, - refetch, - setQuery, - deleteQuery, - inspect, - }); - - useQueryInspector({ - queryId: USER_RISK_KPI_QUERY_ID, - loading: isKpiLoading, - refetch: refetchKpi, - setQuery, - deleteQuery, - inspect: inspectKpi, - }); - - useEffect(() => { - setUpdatedAt(Date.now()); - }, [isTableLoading, isKpiLoading]); // Update the time when data loads - - const [goToUserRiskTab, userRiskTabUrl] = useMemo(() => { - const { onClick, href } = getSecuritySolutionLinkProps({ - deepLinkId: SecurityPageName.users, - path: getTabsOnUsersUrl(UsersTableType.risk), - onClick: () => { - dispatch( - usersActions.updateUserRiskScoreSeverityFilter({ - severitySelection: [], - }) - ); - }, - }); - return [onClick, href]; - }, [dispatch, getSecuritySolutionLinkProps]); - - const refreshPage = useRefetchQueries(); - - if (!isLicenseValid) { - return null; - } - - if (!isModuleEnabled && !isTableLoading) { - return ; - } - - if (isDeprecated && !isTableLoading) { - return ( - - ); - } - - if (isModuleEnabled && selectedSeverity.length === 0 && data && data.length === 0) { - return ; - } - - return ( - - - } - titleSize="s" - subtitle={ - - } - id={TABLE_QUERY_ID} - toggleStatus={toggleStatus} - toggleQuery={setToggleStatus} - tooltip={commonI18n.USER_RISK_TABLE_TOOLTIP} - > - {toggleStatus && ( - - - - {i18n.LEARN_MORE} - - - - - - - - {i18n.VIEW_ALL} - - - - )} - - {toggleStatus && ( - - - - - - - - - )} - {(isTableLoading || isKpiLoading) && ( - - )} - - - ); -}; - -export const EntityAnalyticsUserRiskScores = React.memo(EntityAnalyticsUserRiskScoresComponent); -EntityAnalyticsUserRiskScores.displayName = 'EntityAnalyticsUserRiskScores'; diff --git a/x-pack/plugins/security_solution/public/overview/components/entity_analytics/user_risk_score/translations.ts b/x-pack/plugins/security_solution/public/overview/components/entity_analytics/user_risk_score/translations.ts deleted file mode 100644 index 058033758549a..0000000000000 --- a/x-pack/plugins/security_solution/public/overview/components/entity_analytics/user_risk_score/translations.ts +++ /dev/null @@ -1,65 +0,0 @@ -/* - * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one - * or more contributor license agreements. Licensed under the Elastic License - * 2.0; you may not use this file except in compliance with the Elastic License - * 2.0. - */ - -import { i18n } from '@kbn/i18n'; - -export const USER_RISK_TOOLTIP = i18n.translate( - 'xpack.securitySolution.entityAnalytics.usersRiskDashboard.userRiskToolTip', - { - defaultMessage: - 'User risk classification is determined by User risk score. Users classified as Critical or High are indicated as risky.', - } -); - -export const USER_RISK = i18n.translate( - 'xpack.securitySolution.entityAnalytics.usersRiskDashboard.userRiskClassificationTitle', - { - defaultMessage: 'User risk classification', - } -); - -export const USER_RISK_SCORE = i18n.translate( - 'xpack.securitySolution.entityAnalytics.usersRiskDashboard.userRiskScoreTitle', - { - defaultMessage: 'User risk score', - } -); - -export const USER_NAME = i18n.translate( - 'xpack.securitySolution.entityAnalytics.usersRiskDashboard.userNameTitle', - { - defaultMessage: 'User Name', - } -); - -export const TOTAL_LABEL = i18n.translate( - 'xpack.securitySolution.entityAnalytics.usersRiskDashboard.totalLabel', - { - defaultMessage: 'Total', - } -); - -export const VIEW_ALL = i18n.translate( - 'xpack.securitySolution.entityAnalytics.usersRiskDashboard.viewAllLabel', - { - defaultMessage: 'View all', - } -); - -export const LEARN_MORE = i18n.translate( - 'xpack.securitySolution.entityAnalytics.usersRiskDashboard.learnMore', - { - defaultMessage: 'Learn more', - } -); - -export const ENABLE_VIA_DEV_TOOLS = i18n.translate( - 'xpack.securitySolution.entityAnalytics.usersRiskDashboard.enableViaDevToolsButtonTitle', - { - defaultMessage: 'Enable via Dev Tools', - } -); diff --git a/x-pack/plugins/security_solution/public/overview/pages/entity_analytics.tsx b/x-pack/plugins/security_solution/public/overview/pages/entity_analytics.tsx index 910e89f9b38ce..94fcd69e962c6 100644 --- a/x-pack/plugins/security_solution/public/overview/pages/entity_analytics.tsx +++ b/x-pack/plugins/security_solution/public/overview/pages/entity_analytics.tsx @@ -7,6 +7,8 @@ import React from 'react'; import { EuiFlexGroup, EuiFlexItem, EuiLoadingSpinner } from '@elastic/eui'; +import { EntityAnalyticsRiskScores } from '../components/entity_analytics/risk_score'; +import { RiskScoreEntity } from '../../../common/search_strategy'; import { ENTITY_ANALYTICS } from '../../app/translations'; import { Paywall } from '../../common/components/paywall'; import { useMlCapabilities } from '../../common/components/ml/hooks/use_ml_capabilities'; @@ -18,9 +20,7 @@ import { HeaderPage } from '../../common/components/header_page'; import { LandingPageComponent } from '../../common/components/landing_page'; import * as i18n from './translations'; -import { EntityAnalyticsHostRiskScores } from '../components/entity_analytics/host_risk_score'; import { EntityAnalyticsHeader } from '../components/entity_analytics/header'; -import { EntityAnalyticsUserRiskScores } from '../components/entity_analytics/user_risk_score'; import { EntityAnalyticsAnomalies } from '../components/entity_analytics/anomalies'; import { SiemSearchBar } from '../../common/components/search_bar'; import { InputsModelId } from '../../common/store/inputs/constants'; @@ -55,11 +55,11 @@ const EntityAnalyticsComponent = () => { - + - + diff --git a/x-pack/plugins/security_solution/public/risk_score/containers/all/index.tsx b/x-pack/plugins/security_solution/public/risk_score/containers/all/index.tsx index 9c5671640f87a..00b16daa46109 100644 --- a/x-pack/plugins/security_solution/public/risk_score/containers/all/index.tsx +++ b/x-pack/plugins/security_solution/public/risk_score/containers/all/index.tsx @@ -11,9 +11,10 @@ import { useRiskScoreFeatureStatus } from '../feature_status'; import { createFilter } from '../../../common/containers/helpers'; import type { RiskScoreSortField, StrategyResponseType } from '../../../../common/search_strategy'; import { - getHostRiskIndex, - getUserRiskIndex, RiskQueries, + getUserRiskIndex, + RiskScoreEntity, + getHostRiskIndex, } from '../../../../common/search_strategy'; import type { ESQuery } from '../../../../common/typed_json'; @@ -51,8 +52,7 @@ export interface UseRiskScoreParams { } interface UseRiskScore extends UseRiskScoreParams { - defaultIndex: string | undefined; - factoryQueryType: T; + riskEntity: T; } export const initialResult: Omit< @@ -63,64 +63,48 @@ export const initialResult: Omit< data: undefined, }; -export const useHostRiskScore = (params?: UseRiskScoreParams) => { - const { - timerange, - onlyLatest = true, - filterQuery, - sort, - skip = false, - pagination, - } = params ?? {}; - const spaceId = useSpaceId(); - const defaultIndex = spaceId ? getHostRiskIndex(spaceId, onlyLatest) : undefined; - +// use this function instead of directly using useRiskScore +// typescript is happy with the type specific hooks +export const useHostRiskScore = ( + params?: UseRiskScoreParams +): [boolean, RiskScoreState] => { return useRiskScore({ - timerange, - onlyLatest, - filterQuery, - sort, - skip, - pagination, - defaultIndex, - factoryQueryType: RiskQueries.hostsRiskScore, + ...params, + riskEntity: RiskScoreEntity.host, }); }; -export const useUserRiskScore = (params?: UseRiskScoreParams) => { - const { - timerange, - onlyLatest = true, - filterQuery, - sort, - skip = false, - pagination, - } = params ?? {}; - const spaceId = useSpaceId(); - const defaultIndex = spaceId ? getUserRiskIndex(spaceId, onlyLatest) : undefined; - - return useRiskScore({ - timerange, - onlyLatest, - filterQuery, - sort, - skip, - pagination, - defaultIndex, - factoryQueryType: RiskQueries.usersRiskScore, +// use this function instead of directly using useRiskScore +// typescript is happy with the type specific hooks +export const useUserRiskScore = ( + params?: UseRiskScoreParams +): [boolean, RiskScoreState] => + useRiskScore({ + ...params, + riskEntity: RiskScoreEntity.user, }); -}; -const useRiskScore = ({ +const useRiskScore = ({ timerange, - onlyLatest, + onlyLatest = true, filterQuery, sort, skip = false, pagination, - defaultIndex, - factoryQueryType, -}: UseRiskScore): [boolean, RiskScoreState] => { + riskEntity, +}: UseRiskScore): [ + boolean, + RiskScoreState +] => { + const spaceId = useSpaceId(); + const defaultIndex = spaceId + ? riskEntity === RiskScoreEntity.host + ? getHostRiskIndex(spaceId, onlyLatest) + : getUserRiskIndex(spaceId, onlyLatest) + : undefined; + const factoryQueryType = + riskEntity === RiskScoreEntity.host ? RiskQueries.hostsRiskScore : RiskQueries.usersRiskScore; + const { querySize, cursorStart } = pagination || {}; const { addError } = useAppToasts(); @@ -131,7 +115,7 @@ const useRiskScore = { test('does not search if license is not valid, and initial isDeprecated state is false', () => { mockUseMlCapabilities.mockReturnValue({ isPlatinumOrTrialLicense: false }); const { result } = renderHook( - () => useRiskScoreFeatureStatus(RiskQueries.hostsRiskScore, 'the_right_one'), + () => useRiskScoreFeatureStatus(RiskScoreEntity.host, 'the_right_one'), { wrapper: TestProviders, } @@ -60,7 +61,7 @@ describe(`risk score feature status`, () => { test('runs search if feature is enabled, and initial isDeprecated state is true', () => { const { result } = renderHook( - () => useRiskScoreFeatureStatus(RiskQueries.hostsRiskScore, 'the_right_one'), + () => useRiskScoreFeatureStatus(RiskScoreEntity.host, 'the_right_one'), { wrapper: TestProviders, } @@ -76,7 +77,7 @@ describe(`risk score feature status`, () => { test('updates state after search returns isDeprecated = false', () => { const { result, rerender } = renderHook( - () => useRiskScoreFeatureStatus(RiskQueries.hostsRiskScore, 'the_right_one'), + () => useRiskScoreFeatureStatus(RiskScoreEntity.host, 'the_right_one'), { wrapper: TestProviders, } diff --git a/x-pack/plugins/security_solution/public/risk_score/containers/feature_status/index.ts b/x-pack/plugins/security_solution/public/risk_score/containers/feature_status/index.ts index 0099ed0df3f09..4cb6507c559f3 100644 --- a/x-pack/plugins/security_solution/public/risk_score/containers/feature_status/index.ts +++ b/x-pack/plugins/security_solution/public/risk_score/containers/feature_status/index.ts @@ -8,7 +8,7 @@ import { useCallback, useEffect, useMemo } from 'react'; import { useMlCapabilities } from '../../../common/components/ml/hooks/use_ml_capabilities'; import { REQUEST_NAMES, useFetch } from '../../../common/hooks/use_fetch'; -import { RiskQueries, RiskScoreEntity } from '../../../../common/search_strategy'; +import type { RiskScoreEntity } from '../../../../common/search_strategy'; import { getRiskScoreIndexStatus } from './api'; interface RiskScoresFeatureStatus { @@ -24,15 +24,10 @@ interface RiskScoresFeatureStatus { } export const useRiskScoreFeatureStatus = ( - factoryQueryType: RiskQueries.hostsRiskScore | RiskQueries.usersRiskScore, + riskEntity: RiskScoreEntity.host | RiskScoreEntity.user, defaultIndex?: string ): RiskScoresFeatureStatus => { const { isPlatinumOrTrialLicense, capabilitiesFetched } = useMlCapabilities(); - const entity = useMemo( - () => - factoryQueryType === RiskQueries.hostsRiskScore ? RiskScoreEntity.host : RiskScoreEntity.user, - [factoryQueryType] - ); const { fetch, data, isLoading, error } = useFetch( REQUEST_NAMES.GET_RISK_SCORE_DEPRECATED, @@ -52,10 +47,10 @@ export const useRiskScoreFeatureStatus = ( const searchIndexStatus = useCallback( (indexName: string) => { fetch({ - query: { indexName, entity }, + query: { indexName, entity: riskEntity }, }); }, - [entity, fetch] + [riskEntity, fetch] ); useEffect(() => { diff --git a/x-pack/plugins/security_solution/public/users/components/kpi_users/index.tsx b/x-pack/plugins/security_solution/public/users/components/kpi_users/index.tsx index 831ca2bdc76f6..06edd96073866 100644 --- a/x-pack/plugins/security_solution/public/users/components/kpi_users/index.tsx +++ b/x-pack/plugins/security_solution/public/users/components/kpi_users/index.tsx @@ -15,7 +15,7 @@ import { TotalUsersKpi } from './total_users'; import { CallOutSwitcher } from '../../../common/components/callouts'; import * as i18n from './translations'; import { RiskScoreDocLink } from '../../../common/components/risk_score/risk_score_onboarding/risk_score_doc_link'; -import { getUserRiskIndex, RiskQueries, RiskScoreEntity } from '../../../../common/search_strategy'; +import { getUserRiskIndex, RiskScoreEntity } from '../../../../common/search_strategy'; import { useSpaceId } from '../../../common/hooks/use_space_id'; import { useRiskScoreFeatureStatus } from '../../../risk_score/containers/feature_status'; @@ -24,7 +24,7 @@ export const UsersKpiComponent = React.memo( const spaceId = useSpaceId(); const defaultIndex = spaceId ? getUserRiskIndex(spaceId) : undefined; const { isEnabled, isLicenseValid, isLoading } = useRiskScoreFeatureStatus( - RiskQueries.usersRiskScore, + RiskScoreEntity.user, defaultIndex ); diff --git a/x-pack/plugins/translations/translations/fr-FR.json b/x-pack/plugins/translations/translations/fr-FR.json index 4ab7756b5fb43..151159fa0980b 100644 --- a/x-pack/plugins/translations/translations/fr-FR.json +++ b/x-pack/plugins/translations/translations/fr-FR.json @@ -25859,7 +25859,6 @@ "xpack.securitySolution.alertDetails.overview.highlightedFields.alertPrevalenceTooltip": "Nombre total d'alertes de même valeur dans la plage temporelle actuellement sélectionnée. Cette valeur n'est pas affectée par d'autres filtres.", "xpack.securitySolution.alertDetails.overview.highlightedFields.field": "Champ", "xpack.securitySolution.alertDetails.overview.highlightedFields.value": "Valeur", - "xpack.securitySolution.alertDetails.overview.hostRiskDataTitle": "Données de risque de l’hôte", "xpack.securitySolution.alertDetails.overview.insights": "Informations exploitables", "xpack.securitySolution.alertDetails.overview.insights.related_alerts_by_process_ancestry": "Alertes connexes par processus ancêtre", "xpack.securitySolution.alertDetails.overview.insights.related_alerts_by_process_ancestry_error": "Impossible de récupérer les alertes.", diff --git a/x-pack/plugins/translations/translations/ja-JP.json b/x-pack/plugins/translations/translations/ja-JP.json index c01a643d5e953..5465a9a7be7f5 100644 --- a/x-pack/plugins/translations/translations/ja-JP.json +++ b/x-pack/plugins/translations/translations/ja-JP.json @@ -25834,7 +25834,6 @@ "xpack.securitySolution.alertDetails.overview.highlightedFields.alertPrevalenceTooltip": "現在選択した時間範囲内で同じ値のアラートの合計件数。この値は追加のフィルターによる影響は受けません。", "xpack.securitySolution.alertDetails.overview.highlightedFields.field": "フィールド", "xpack.securitySolution.alertDetails.overview.highlightedFields.value": "値", - "xpack.securitySolution.alertDetails.overview.hostRiskDataTitle": "ホストリスクデータ", "xpack.securitySolution.alertDetails.overview.insights": "インサイト", "xpack.securitySolution.alertDetails.overview.insights.related_alerts_by_process_ancestry": "上位プロセス別関連アラート", "xpack.securitySolution.alertDetails.overview.insights.related_alerts_by_process_ancestry_error": "アラートを取得できませんでした。", diff --git a/x-pack/plugins/translations/translations/zh-CN.json b/x-pack/plugins/translations/translations/zh-CN.json index 75eab045500e7..e2de967852a88 100644 --- a/x-pack/plugins/translations/translations/zh-CN.json +++ b/x-pack/plugins/translations/translations/zh-CN.json @@ -25868,7 +25868,6 @@ "xpack.securitySolution.alertDetails.overview.highlightedFields.alertPrevalenceTooltip": "在当前选定的时间范围内具有相同值的告警的总计数。此值不受其他筛选影响。", "xpack.securitySolution.alertDetails.overview.highlightedFields.field": "字段", "xpack.securitySolution.alertDetails.overview.highlightedFields.value": "值", - "xpack.securitySolution.alertDetails.overview.hostRiskDataTitle": "主机风险数据", "xpack.securitySolution.alertDetails.overview.insights": "洞见", "xpack.securitySolution.alertDetails.overview.insights.related_alerts_by_process_ancestry": "按进程体系列出相关告警", "xpack.securitySolution.alertDetails.overview.insights.related_alerts_by_process_ancestry_error": "无法获取告警。", From 36abd986dd54cf2e5432fee0d7aaa6d37890c84a Mon Sep 17 00:00:00 2001 From: nastasha-solomon <79124755+nastasha-solomon@users.noreply.github.com> Date: Fri, 30 Sep 2022 14:52:36 -0400 Subject: [PATCH 61/72] [BUG] Osquery doc updates (#139583) Co-authored-by: Joe Peeples --- .../images/live-query-check-results.png | Bin 142848 -> 355410 bytes docs/osquery/osquery.asciidoc | 7 +++---- 2 files changed, 3 insertions(+), 4 deletions(-) diff --git a/docs/osquery/images/live-query-check-results.png b/docs/osquery/images/live-query-check-results.png index cd1362e7e977dc6fd8617b08522894fbe8dae480..6b84a3bf9f7ca5a6d9e8e521989035c7492b2a5f 100644 GIT binary patch literal 355410 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

fda*cUz4p^zl>BZ<>y;PXW`hmyV|$_?r#A zZ_5#%J{HZoH%55R*R~N;% z_kXkD>1{z`=1VoP|JtR$z2G;82l$@DQ;x®t|Bo%P^Tf|* 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

v~Q6&(;ZwL10uZEA?qSYN%98amu4r*(J z7f(7&4j7n=uO5R<2t#UcV)6I~x|V4l)2JR2V~ZN<>Xopbv+bt~TjC5Fd0$ujhYoS5 zKF5Iu+Ab*;@Wt*pNp0&9CiX@MLxW@Y_ZVwnK#F3J7fb&Fui1Pz_;b+^S)|Fu@w3Y- zxSG1=VtsV+A*{_Mq<%2la;`O$A606X7Y;vW{(Hz;axC<_q-{1R` z{y@&J9y!^?xRe+b0mwO(y#@Z=vUWbkUyyUOWc=Z5d+v$mp1`VX@Z*+I1+jEc#zY3k zp}s;66;~ul8O`r_qaRR`4=D!u*!#E;wzYuVtrC}YUS2G*%JckdG*xfBWq9AuTyAsj)D8wP_ndODi*kuucjnXv6XVUDl8cg zk2Y{>?pNrFQDH&9o0C#kLT52hM8fjZiDHyI4+KBPuk->lFC8Mb1mnMB zqQAbOGf&0uDSk>Dk*WWdD#UG>Lv{`M5mso6Bw(F8_(C&fDi#Xzl4o6Yc{c@5>s5;i zV6S7qHo7Q(vEo3S2!r%ss%(u*QB+s`!v`mXSKa&;v+rJ_qj!1GzuRud2>F5xSH+G+ zOjvJbNhnaW4eI`Z74q^q+)``E<5w{I)~z!?%cgMs-lmA=D)Z`2(O2Vv-puFoBkFrO zYQ6i*KQH3k(L3BnLRxf4$RCr!?<@c>+izK&*B=4C;hb-$C^lGN?UKDY%;$G^0Zj=^tMqpDyqR&7#OZkLp z^`KQEW`1CQ#LSAe{%HN)hLK`^%89~W{;@%z(&w*23!{TopcvLJv-`{^xxJ#e!TCtG z87ZSRzIXGojM)KO>Y{4dAY~X|%Pbn&(^$(GMNd;VLjm*Vz1&7-?ss5cJ=Cx7z_=E4eYQM5&i%4XRhBBk z`ggaD@@h}zw)H_fKRktq74urR(j9VCe}ykifao96c~<|e-7ja*j`5-55*?Qq;ouhSWJ@0-`I)7Wc1CRwlwy4dt%Dw0OzlN--7HVW4 z=H?V&T*+Ut6xRdApz0HBF~~-w5C!fH&svvazO4d&=67gK$Tiy7Isb(Sk^84f8*Alq z?o&Q^`&n7FXLA9R zY^jLmt9uHB-2F;z14xMTZ=R@pGC>|=YE)AVQ<)rI+u2`}L0Bl~tnCbPNA>z}{DIfG zC7r&58ke0BnJba=sQE!t;nn`+vHPuFZxnx_o_}PeAhrLD_0kVvd_L=fM$=QQV(FyC z@d-dXze+n4qj}=VXPzl%RWYZw-A4#l)Ai;leEh!|~gf8PfZNPN`T$ zOV>nha<_fj`K;6mKlF_xB4(Iq+2=~g&BP;VBMa|3Dh@F61NBFjQ-^dltHK&#t=OAq zKi}37+G#qQ(s4an z`qj`q*MgBW%XT5S*%591>$60qX0vRcALtN)nBmg5YL#hr4FGh0A)DSw=RX`CVOyeS z!2B1{Z5b7TTN8T=z4cuk!?ptdT5U)_-?v>5*jn zE+@vXNd{0mE`ahlcy|+&2*%NN1_{&4lEkaggZDv_uQ#bW9-0Ux#3PUZ-9=qAT#Cci zWf^)00+uV`J{ZhIAe592O)kC0W{#xSA^*M||KD&Qd_E|92=?@Rx zF6o~Q_VZ&KDQqHvr0+ct*yA4v^Nnzk;$Cu%(iMPd_Eh*-FT&V04_%#U2A+N5b*RsC zNNJDvX@?0#Ir@MuonTr5j~L0(RMnmsZTxwX9e0PDe)mv>6sDgMg-Cmwr*<-gB6G;R zHq&^mA&PEGHPa>rD)juDTsqAPVJ^M-He^^VsHY|E-et8o4XEbHRfOgCD-GUZx+R`A z_VF1Jx;z|6@kE=87T25X8h(l2y_U_UpQ%`?1MxY}t1a%$S7#p_O~x$&V5j6UTE}SE z7N@8Qe6=0ZBcgPMPHpV!k6zpauL)jjZZRXLqM(}EmYnI{*9+byt|kvLLInlkS^?A? z{hf2!(>)%h8q;X0BN?i5R8kdCe`Mb{SFJdf=dNAgQv0yWn*0l!BDG>1nomjE8hLMY z{j5%WkEe+L0-VjM32)}fZyIpgu;>W=qWQ+U-h`fUorz`NDsweQprS}P*&LyXo|N9U z_Xv!?3n_HBKtIEk_#*;%B1lZRLXleZ>WW5MbqUf7d=JzP zahp6C;-Z73rD~m0S=GK7FF`_;M!wJzAn}L++XY=`|4o**lRLl*ZRaNnioV!rOK-*D z$l#&jM5PyWLhIbsdiJL0x&JxOH`jq?PT7wHs5PLAtPix=1mDI}J=yE}))JA+lDWSk zjeK)+7H`_bI(hu{xN)$EY`Xh*Y4LRZ@V5IL{h%@z={t|h#)__tybx6`RpdQ8M{&GV254AjTRaXD9 zEO8mFDl3hASW|Yd$z6G`;2|j8q3zKC%QI!yup}$8izPS`3!YhPYdzJogQ-Tn*ek%- zV3Y`LnrR=iK3i5K4-Wlu+EP8~Sk6SD_vstdJ`STIq^|ALlFo_75cTD}rELGTA! zUUP`EmK3$STHDIhGvC;R2VY^dRQ6n(mS=k7+p_o6z|z%J1SpkjN`cwlmY5md!s-z1 zL!_|BCf+%nHlj6SXQUik0$CP6e7?b?nDTp#Tr<`?IomIL zgU~CyNpIiwY>i!fB69_-a`k5j-cQ`&x8s@+_L}#bi@o`FOb;Jow@BL0ak1H|4nBbB z5@RAnQGa~O@~oAm^hSJwWk~Us=?|$K@1LY{Y-|r8z*xpmfm=UN{Ro9 z(y;f_*oQ};gx5W({96FyKS|}MqvcK>f04>V8s0e8X{tDD^+M!w<-7%;4haYZAbGd6 zk(2LPKmZ$vnp}M7I>d&#IIudvJC4;n=%h@!_%7_T(uomG)O0Nr%XVzb zJ}9nLtU?3aRm%?WptI`gU_|I$x)!^MM(?tZ7N-u`V-%xQxpIvzqT zWHGhjEcAQJ)*fA^Yfw`zicFU;$MB(tZR^9Hw58CIXnHztI`)^J%B39F@~$sa%#6?q zpm%8zPq@c}!{Rc_#6Rf^KlTe@e_KVwvuzi5Z3>YYmz+&I87LIuql!|kc6$y+oHz34PU7f6*3fyZcc;3$Xm17Fa@to=J2OJHE0$E7*>eOy+Za1&#TJfX(Vr z$$rPPM4ERc^XnDUV=>I9T7>r@ibzXkHzxj@8dVrv`N+pF2+2!KkH#%>c6BG;k^8B2ITy_3xbps#;htCiKE+}#PKQob2=4frNJ(^N{9NrJr}1zN z?hNm7$7lC=xvv$OVb*Ya(yfS_Wd^pVOxI_(3|amh^#o?(w3(t*9zSv!WG)1V*2znD z^wE{bIej;+A3=I0&a+L*%qV;{B<5={zM{C3-e=_GDBH+$Gn3EiE_G&H%3ZX5p7yPwrtIuSCE8oy!Cj@@S&wG)lE zK0%{vf}yTIE<&+?^IGjr+m@Y_GZoknOM^fdk}V%4DV#JIbj&Q11`*Czq<|CV4j;I9 z_=yNHlUf>k#Gmj?N*!sKBPvnbIAj^&$ zYmoQMGU;6nkto8C+j(TjD*{%FALN1hze7CW_dQdiYL6jXq^4s9d%r71sQ{V$Hml+F z$al$U!3lbI_(dy_uvD$;2J4b-rBdPiwC9IA@YHO}2>qLBRpMh6YxU~mjLZf+7mHBR zS{4<^Q@q;}WkWzF&nGf}I%Bl;a?QF2#Ii-a&}tFUz8_Lh@l37_67Cu>bZ*!%5M#xR zbzgx@Hyb@MU00Wx=wUupG8 z;g6Ff4o`nN6W}>3e{NB>yD}RlphI@Bl4s=a5raZ2o2K$B8aZ0`<#crwpOrq6cPCS` zI>~}-vsm=u4SG5~#rqp$<~1e#)Td}cGErY$vT=z%2DU{FHed8S>Y3}0-zvfXJ(8b& zbI@i|cmSVITBRQfq^`0 zH(Pn(Tu0>p!2Qz>_!g-cBG_^#05mZ-LWohNtPz3Gux6c@(I|E#W8GhOX&IP{UR!4g= z9?5&G4I9qvJsOUQJ|$84JYYoKy!{X(MBqO94zk7wpAZI7+|MG&|CmK85K10@`ni~` z?{!43&-DK5k|zkY*l<7DSeUi4^0}XU+-=&^$flZ&aWUFGTH2Mn+DWQy#zh?W<4>kp zd6f?Z@}r_sA8b7D;)Bd%E~uTPGNw3J4{#AsYmYO@OlMg02-bE61v={;zZd$*pu%ah zl=nHVM9fL*4*G{qu1f}B7vV|$e%F0~PM&)Frl+w@xhHF`sGB4iU&nDVz{hm6Z&SV_ zj~vj+lke%|Dv68lvu4uDYHD9D*j}jr>X5u~$fv)t2$l-I`UjmH0_f!P`Eh_wp8SVS zUfN5WnZsswVdNTHs5(bCN9ZWBe~s4i;|l{-pr{P@fQ>(#lbUuV@}51-y|jCAFmU&* zRBHFR8^i0%l@LBxuG;cX4|~Vf?{@?vvvyaTBMTK?7HWUd$q{n?qLYv1D}U-W+!uIq z+~{2%`J!LdE@GY(HfmhH>M@?U3I%lXKKy7vC#U`?pnjC36vfy^vu@HxTdj;{sOVrJ z3}i3|x@h9g}3qRb;j(XdU&jlW(gnjBHx(4p!z9k ze?)>ii}5Q7Kq;DRc4RpW_y}7U{dx@wa>~tLyIrm+L(eXwA=rKLCwpTIng=aMnGCN> zk&MR&2L=m8Jj+mGNeZ29>1ezw(8NA6s&q&9uQd&85!P&Oy)mvd<6bN(fupG5(zg~H z;=zxo>fC5H=iX`fi6(4;G>cc`ptmL>r45V|CU!3B)zb4?s*r-&LVsv}fe)p@)XBBMCTz6)3LC)5H?s+= z{{bg|bq^;;{wJK=H?hTX`^|6hlT51|90Yu7jk*j8H}i&yhT_J^hroq2kf=QVhPftE zrcm{1ujF&w5Lql0-Hyd>_64`%kvVrQ^m{t_Lw5LD>$Qkzs(`YiAEYQsxkb?9_$oe6 zJ-Udo?%f&t9#4A%(L5EEk9{Gnik8$GO1an#LLZ@P@5vL6(yi4VwG!!#kScR*M??(v zpFuA607M6b67Ep-6d*q49{C%SBHvDm7F=uWYFsYMGNclxEoG6h2*Sll^M9TRTPj$^tSrXxLcY|1| z!q_~cBY(`!>s)1a=Qq*?p?A?*@6$**m%S(Go;DS?6lplG7ET?XEcHZM+JJ&X$O;d_ zBdb~-3Vy@bEVLi4p(m*5U3v5IFNe&ew3XgO5(v2LV*wLp(ee9*L#YJ-`UqmeBrPc7-+U`B;7rQ0{NLvXn^nd(3!V zX~E95O!1Jc;R923cicd3;Lgr)<8>R?4$~r(-`zNT`n7%k50vJso$5Mimq?lzXp)H{ zqSF6wq9z&roPejkzB5kl4$IYx$oHmE{F=BV<&GsYMB?btcD%afjn=zbQ_d%z1F8bG8&cst)tUSwXyoc@$YIc4 zdk3g~!m$DaO@30iw*Fw~vGr+PouC*qb;kq`)Rk^9OKwnT6F#SFdv-W=<}-G+b8Vy_dm?BexOeIi!=aC<1*$C1zqq*R z+M+MVv7z(idVl^WuH5BAq4uR*?d{i=EsBC~4t4t_kB}~UlIHYf3j{n|qUa7DKuMQh zMKtfi<#BI~qlr24kkTf7r)ve)yk7Pn*4)3PT2KYD@L|5L1i~FKcPs<%XgQDbA4zki~jn9W^9$76#umE_QMdp5=Kl*R>;6juCz9mQKy;;BaGVyQ4* zpM7t8pGUP3qP9rEEdv@w9okT@)r5WrO6{Svx7Xu@nby&Nq(zh-H6Yb3Apf7VaRT#CaLD4WRcI|!e)HOhFsS#sfJ zk1)ZHb7;ZS$gbK zUEi0OUS5ClJ>$GdK6~Idr{?39n17(l4`C4dYj#$4`#m8IJ@YlrGW8H7H=gZm^p66w zl~<$$B6XuQ%KEl*z_DFsoT-t-+{;DJ479S3T4weEQpmPLxeQa|pnu zit6kM(ac;Qo_@(USF@0{QLhPN4D{~_BRSnMGQHl-A~PW#K4&8tx`&siM*OtTR|`6C zT39*ek?AAgG4$eLH*7q;G&A3!WSW!8v2&YrQ6PMFnt11OHzPPm?gU%xc5knMhjJ)8 zx%SZ<3{=;zRZ8D|=4MT|#LQJ7zd-$U++)k79x-G4RqeC8r{Q1)5}JRiuPiEdc`!c`SuKjF%z}NXT)t4p=v4F=ad^cn*maw3g^$7XounS%PnSJL> zv8N~96PA-1ZBlSG@o%2e`{4#!i$Tt60^{8#Y>hGtNOc~!i=tw?UVM8nVTSkB8!5{= z?WLtff0^IqN3RZarjxcRTu?ji(be2~ceonSLZfpqC>HsCpXCp>0X0&9 zx>H=pb$29dFwBJQxk_^B3gs2UT{K(s7Tj%pJbNU4>@5@do$)Et(T|eo&#^Kl`%f|= z;S+s3oPYc_6$^sN|6*Jqh29X2URX$U$gXX7llg@)FIDH_IF~(SAquVk zX!litu~4i{pmi^%hkj?U`=#1mF|O(CtZ@M-5?%(0r<9Zx826}Y?S*tc zwGr>E*h90GA@Ih|qOn){tb`#HC%lFK?7Y>0rB-53QPCvg$b7S%;V|%}%9p-K&OoIW zg!D|)MQ_@|CHxbKk_B~?qgdU$CmF%3EnF?Eqr~%AE5cJ>X@tMi&@%q z%xN(~aRoIRwXBH26Ao=v5)}4GnT*LaTzbPsPP}dg4>dC__{>OYehtce z5K*obaxRdT?#d{!u64OY+n(%jzxyPi`(atyqGP6Krrt>{OTxIflGQC(+xX~susLkK zKmPZM!2_}M;4>$o62C&F{w?cjvFO*j4(b_qN4=^Vl|7LbBTH6Di`ZCbVo5Nj9WIUL zB1jmuaP((mSJ(sxKD_a-fs3C*#9gsi2+K+Vjy^ zA%X+j{g1A_QKYioyD1ZA*~xB)e#dyFGEh50=1Kk5If?6)U;wx^XkU=6u5z4Y2yiMXrDaxFQoqp&Fo!;nph4w@$^64N+JLHQfvBC<4L2N3D zGWGtIMyJ5lL#$c4byB=*0tdsmH|9}|`2|-C`JnI9D>jA+(<-#&INpm6h%~A%*EeUDE7|1!3WQ>?%)J> zxoc5751+3oeG!kQ+3X3h90%#W>CAA~O$)V}lMWqRwZ*UzdEo8L-nrIWNAfY3${>2!7Mvl zbkVHOxq59y@_hVN%ej2rfdW2Gdr`V6A->lQw~L(qr~O9Jx7M+W z5Qgq>@dD1n%56TCym%htgru0DO*S@=^>64wIx+Il=X-X2Gtlky)EqMUBbG2em~h0! z7U@G6zpInd(j@lxz}%V`Gfq`!URs+#FdvhDC4=w>n4bRrl)`3RB1!bL=`Ub+{ zIF-~rFx|u!B-$NqB+oR2C4sutkfwT-E^Zpv7#y30q8mXOcj?wI18s@iTfaYvkr-r( zZPUoS!Uq|h;vY{8GgB@>l5%e(9bE9ErNs2@2}^& zV4hQ!gXdyid`>@)$!vKF>H%;{VV@iESMZ&6I*d8E_|7p9K+~ry8~NYE#)uqJG8rF1 z77d$kgVgIGw~TpMIW0Gc{(4gzTB_(o2DB8@%`iS~LWl}%=d#&NNozFU-ksBy%V{Vo z_IDdave-zys%W^ud3~*G<;ae*KB%#st@s|6o%9r-(|dZ0C8Cf5_oAHlO_`c+*PCPp zSs2a%1}O}3FUt5DrU|0q6^aHC+#tcFl{=QEq-SQMl&TW%0e!$**rGU)h>`{8+CNa+ z%0C}&9mG6%-dquUJ^dq-4N{JH+-;_kZ8nq^I}pz2TG3&wwV~~@3@{%+V|W6IAGVye{BUVb9Nwjr2K)!m+~qHzdBmO4d_|N?g~Er^ z@2PAegIAlL&mP+!e?@(OLQm2(x%o!icd%%$LVpHU62>cyFduDEuPz5>#2Kt`=iXHR~A}-`*on{ zpq|$=m>(|to8UaM``WwVQbS~{5wB&t#&1opdLCWPR+-u~->X8m9e^lzbrbHkLQ$kZ z&vd*Yax_O%m>HxEx&cPy$G`yyM*D*EpvD>FpICQ{A5tVHUWydn>}Bd1{KQd75+d~E z4qLx+Q_W*7pHw)lpvHX0{%2=kv*|Ye_pcpU^RR7$m*=OphAT+So0Y~EKBY(P$w!*I z(`=QI@AYwVLd)0LtDokJj2z9cPu8H)w@bxxjre(4>vl=aWxn%G zlasmS+yPP_shJ{ky56*>MMO%hspN9$?-g?u4&NvSOTbsplt>xZ;W%b&zYSwhQ_|?{ z$GG20Rh>brrTU*GI`vH|uij$up~YnD`Repw`}c;$HDmk(XijdWh^`NnMmH~(ipxt* z1hMsUHy=s+T`lU~q%%KCj84~+L%C|_)%}}LtAJfedjCE%%ROnb`&EF3QWt@B`RFA)5-B|P$tYS%|3rsSyvXWKxCOql{M3fJp6@lrHEVR*cqNs2xmCMf^A^&-ep7*~JDeeEKF4j7iqNxv zWJT4i??Bkj7B`4M>HMpBv{+dUdexV`RsZ4ib+hsI#Lr;gBvnF4dFngk`m0Wx6Cixb z9P!#c*-TMK^AE4;*!2z1qUjy8M=NTJ5*BlW+>pfRU9ZpVuN4{CPx~mow1c8meQ$xG z(Laje)Ggz?uQ((yO!;{0Fid9nE8;w!53eBupK$F(qnV>Svhj3As*_=lP9w_{Y-9KM zk&G@|6M|SosC>noWc^D8 z?!Sd9$M8j=qWB3{*dwy>KDE+XMT{n#(QWV1CX0DsI%$q#?F%g#PZyAJwl+OGl}MwW z<*hoLCC11?SWIH&ylZ?oG*N36yi~?pimF*5;W3QC=Yde9m556cS}eJJP0mYM;S*ft z*Sbnh`H~k=Ok<@h@bl-y-PovW@{kbJmaCB6X?UF5tf%zZ+dneK5yswJoxIehK_|wP z@OH-(#>Ude=H^#7Y35m?IILbqFi!pTAXBJ(w~aZPUo@84TOy7_>Mna$W~K*8M(=ak zsL|M4%<L@P?*g&E|CrwAn9>fvTuDu&~VU+`GSidSZ*tt%oY=LdYg@>#}r$37MeL^~0Ju9)bmv(mqk@ zGp5qsM;#DIB+>SWyk;_U8||ZJuPkr4V}kn#J1FTJCu{Lh<;w>xeX&=rIKxD|))9Uo zlpNo5@BR0xf|QSWs;ULPI?NJ*?(uE}^o?_QAc?o6O!aH!fQ?RQg)WhGz6;*X_q5-c z+^l-_i%+@L6H#wELb;&SntQ;w_mZ88HbA`RUP-;+dS*Fa2*Qc%;Z|MmuAH@84m`R@ zXB;qlur^$P%UP?YR|2w!)_!&aHoH-X54S~*^O}?){4(_^puD~GbLA7II+4OzrT8#f zZ*D&min4AY#iq@kDTxIT7SE)IiZavc^SZ+$a#A0&HunT3YnW89a(mH|6O3qsX|GD{y(2zRk#|xTw?z#7%A~GOUULwCa(8 zIMp%IXy~4#zbHi}{T8`-BwPPE(%5M(f-etESp5P^wzUopGJ1@31-<#}mgBYVSw@`m z&#fc2*qPWFu7QW8-cyUBI9+HJ(;wHma8({{-N+#K3PFM2w*M_gxIh}YwiNML9+Wr7 z^s9F#;(lLPXqyl9wy2})x<{DMxkchy8`e5EZ4`$-D+5WY>$oh0SfHZ0 zNcs{!NTZI&$h*I|%jx`AbAL(8rg1Cc`LJdv?o&k-iRdi@&d_HD0GvQ)W?AaaH8rm@ z@Ca?k3+b%dEqqAJ0qyF!3Xz-T(#&!(QM={fEGNr}WsD(b4DK^7y_ALww`<9KcRQ}p zHpsF4a8P-5ZU7%iU|huaK!js8e^bqaf%xTigblNN`hsRQQ?XzEo))2MdZXV{hsT!e zU#ReYT&>F;2ZLYX*aHckrVU_A>Q1K||0)u71DA+@9%hj`TlrI{UqB$CJ9N9Tq4APag6LwY}zgM!1u>oNw@dX;SU!$@aamsgUYEXY@|0T>BzFW_L#oXR5d&fT6(4Luwy*s{JFDxNJ zO~&tOACB!XG4Nt+>k|MhSJe4{$mX#GYg zWxpA;b5ybRGhBBn&Fk_K0-lWiulu;>TXmm9UF15=xG^UsGSYgh`si0u+hDNacUDi_62ddb!FEWF{b`xg96 zKXAOz)DYjHi(!fK@I_JV`|%<*OE!{NZe@#H+4MLq?evA8B=f)PcIL~~#3JcwywRNv z5y!hvx%FYj&w`-L3U@o?7W~_Oa*J(S@49MN>A-%fEHl$=idl97#|&S0 zjDOa?ke6sK8jnGfmfLQJRq|VO7;Pk-Gm_2p%1m*b>{S$;S3$K#{pTod$>VfYR_?Sn zmj%*|8*Co1wccoS=eE_U*DI@IsNn^hAj+U6wLdw(HLkB#qMgdAxf*fPwN~x9a{69^ z-k1)f zUDsVaKw9Ta#Sgp-_2iSg1S{9!844xWwnUcft&frW zxywWq&KdMoyzhSp|*(a0mDPMK8ICDIDZX;4A`!uF_q(iW5 zrx?NuUwcbDf{-N*o64OTDBC#sUh+16q$u6Ja>QWTuLRAM)qEN7lV}FW6D7_Hjr@^5 zfUQ~omA{?p`Ni{5Y|)|p$Bn)lW3zVTBZli7HX8#rd6xQd1kxGUMW}YJ&!_0pY5RcM;@@>_KL`k)Y&rc&oYtqt|z^jt*Y)C(=~J={92NY z8=Z*oa+ut;( zicyHa2#})v#{68=NWL8PF;-6Y%PqsxYLl&EoC)!U>et{yLuZVAmeVFrGZ|wo8w&w2 zt$0VNWieOo)D+YM5eKi`QeE;H24xYaWkfoQq$F3AOm*cRoe{YX{ z@=_3Sa=~*rqy52Ib;M*q0RsGAr~7kGaN`hkt44DF)^Z0sb*63|D+8Yg@Tg=hhYTOz z2xrlwbX7}y%#=fr6C%v)f9fKz|+7jl7ZpupCtK*~({Gbs1P+w)9pglZYX-e5Gm%XP`)||OlHO2-Edv~{Y zn&kfR{&7FxNH6HYggA2-o2<#2lW3Y5YScq;LDerSYD)fwyEhz7`i1N^Z;9~{QNBua z7Ird|{dqZ!0-#`E##aRPW5(c413S&=VXZ0zKtFuiSPV3d5j2Hz}@KE5UjiTu5 zLxB6wSAjza6Zx`DAzD$YqHzBgkMD>aO~Mi#-|wv{3*|9NEKPxe-=7yFpo2b|D=$td z?Ia33O$?65>yctl=|nu>yC}|t%0Hu!=Yr=6v*3Wd@IZiYq{_Z^T;B{G$BtssVtgw; zo!NUi+~6pmAGESPJ|LqZ5%8a0_B+~^(=d_DXIS^QM;wd5(L^yat^<7{K>YOn1$Pwo zaQ)RhkKYTF^Nr_dGW4lnyno=Kf>P4lAr#8>SfGU=1&gV|$Stj2xvsu9l7Z~%gCH=G z|9G3A?c~67LUa2Y{(My?cHfesEJWZxTGYN&F*R!Z_Ww_}^uH|O-yMk(3lQsJn~_7F z{Ofi8*A@TmQ3H6U6T4KVe>Jy%caeXwNOF${9wDM7p(^kG<+1+lMgHXv2M}N+Gu}=A za<2b_%Mphlz#|Azw!YVS0!q95oks*OR6xWM?~3$4_o)B3YYJfB+Z)0QU*UIu>v9j^ zEaBiu{%-^Rm*)My4fyZu_WyGa6ex0_Unz@xvGQ7N-B+OMF|`75^6!P44%4!ZtFkbZ zc6l)8CSCP$*Q1s+>sK=jTy_4Be3Nvw{UTc6=cu7R=9BNqEdz7c%j`Dm0RnGuwB36R zUL=eK=7Ygk{W8|^f9e}bly-{8Wln2yVf>bR5-KnA-aYWR-vgjT_TnLfsgM~8o;2Je zmk=)c!F4>km(>5vH)Out#;?b#53Mh_HiiD?D1Za-?3!`~cPYYST7+C9G{r;Q7oX0Ad?3rt;@WlV_OvMPsM~!En|L%Bf zjS9wN^%?(6;lJ4u(O{xt#Nhgy(*|)ZXaQ z=8al`cHjJwg7Y`6`u}#ne`9a|zv+I~6cfv36{!ekL_G9b{Tfv6cjb~?Z)m8f#_0)7 zP9g~HR-0j~Ev;l>Owt1}g&Rv`FyFhi?#RX!pI`z`QshSj5dfXs*?z`fUigTRi`>zA zBS_R$!Bc=1#^Xc1Yk%qjJ5fgs|z(SG@???eMBNUXvf@RLtdBuIHz(?(JQ)dz;n=k<>c#p$WjM0SzN)>a$^7mvwi8+ z&Vp@{QYJLFCipcOn{RYzlvwMwzm*%nX!je>LvOeYi_GTg`c-FjI{Z{8J^^U^0vDcb z@!OKU-2Dcok*wQiW>#@`b9Hu6Rpv7po6^BM6fJj@KklL$`Hl}YXGDsk+nw=a`Qf|i zU+o89GF!~jJt_WyO2ry6-{|!9B|po4^Jd%ae$#boIR+O0=U`hiYo}ixV1x6{`rgE_ z&3+R5|GfP|{7Q6`J9O~c^R?SiH{Q{vp%#~ybL@((uFdQjt#}k;_)vP66DHcs{#Jf* zNS34&3O6CycfA>bpQkftJps+ZNS`;6ms(QWP_G>)8}~yB7ODoJO(yziJun`^`Maa) z$^nk)!`%j3RD6`nT2!IAvg6;9&zcb*9ld`@(1s{vqP@M#bhia<)5@>%zmvTD=*?r_ zCMs8}05^Cz%geqyX*p(y%wOlTd3N#X4rzOTJ8Mn0?mw1NeYSU8Z%p8JJHPUQf z!m0l$dvC)$+wV8su`Dh~QjHh$#jpn(p0ygKNUoa;rp3)46Z=kgZ7O-cDd$|^^&(J_xK% zKP|x3qCq}*E)^~mJE8ItV1 ziz*{J{Hk7RH6e~|oeHG}z8LL8orTIp5lFp&$I6eODCqgZ$pwqfs?p`vwy|4pN+FJM z2p^({9yW^oy&W-|OTzTm+`cq_U~U2gq$ceoAh-`fCL&yCugQ0mVO1I0k1;Cpso6H3 zD8lpzu?TrQ*Hphx@?J;A1+f$8gc+al^k0sw$2RuVGSFU~S}f!gEL^{HusQe@n&U}K z23@aqQ-8vWGR)g(;M=e|M5Nc+v%5EMT*vlMulhriJ+nX-e(TuEF{kNjXKA^x7nyvi zQHY}U<5kqa=OVpP{kKvUC!2oG`$Rf%WLU1{$Ag#d-E585*NB2!qH+(zp~D)T%^ZU7 z`R*c&>U7cIr(_prbo(i{?_?`Y^!YtOqFcA3vepJ3LT)VLZb2TvY976S1#$0}TPPWC z-MwRw<~>eOcQKaUwp>c9VBf;FtsN;>w{eT#marQZ?N8WK`OIoD`)j|xR=3NpH0RCQ zwzj+YoMhi!RNYJz+uH{ozu>Q&#oU>YkOaRa`K6)|KMoWqD2|>y4(hnek0nN)<)W5+ zoRLJgRhzDH0;kNYmB3-_H`jZtI7pG~c;?tlEK<0U0qM{9wDR7~_K~Ze-sIJ1%KUyW zt)U1{#5Vp>0!i0^cy;(4%N@(^Q(wu%OibHGa@+ARHbG)Hc%UW>Hd*&Zdy2v7W-#Y| zJ&nMxIeB`-Di}h7_ss)^yhI>p<;D2|wnLk6iP0?9_Xji{A4EY5%a}bM5fbI`FpGb} zeE3HAfP%{`&L}A3geyI3lvYawQanYIJ<7yzN=v25q8Dd8q%mNjDY&ITy|WjYbzRfY zT8=TGUL%Smeb;6gM>nk;J|aa;CyciGTGDF2EDn7lAVif_yL93=KJ)Gn3%TW9#iy2Q zEW%JYrkiEF0%!+oe_@p^9Rw06m{@O?&vU!9Aa#�C62a$e$nY;Ex%!Obt8ep9Zm> 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⪙dn<#E9p-=uewVKbbV@fQp#JVw%DcR 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

&ao&jnNg<2aZsi@1KL8QO>1f61 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
|u0o1R!*Jt6k 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 literal 142848 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 WtD3OqQVRn7lMwwXQZA(D|Gxl=ygnuX diff --git a/docs/osquery/osquery.asciidoc b/docs/osquery/osquery.asciidoc index 66edbc95526eb..e854904b6baf4 100644 --- a/docs/osquery/osquery.asciidoc +++ b/docs/osquery/osquery.asciidoc @@ -61,12 +61,11 @@ TIP: To save a single query for future use, click *Save for later* and define th [[osquery-view-history]] == View or rerun previous live queries -The *Live queries history* section on the *Live queries* tab shows a log of queries run over the last 30 days. -Each query has the following options: +The *Live queries history* section on the *Live queries* tab shows a log of queries run over the last 30 days. From the Live queries table, you can: -* Click image:images/play-icon.png[Right-pointing triangle] to rerun a query. +* Click the run icon (image:images/play-icon.png[Right-pointing triangle]) to rerun a single query or a query pack. -* Click image:images/table-icon.png[Table icon] to view the query <> and <>. +* Click the table icon (image:images/table-icon.png[Table icon]) to examine the <> for a single query or a query pack. From the results table, you can also find the query <>. + [role="screenshot"] image::images/live-query-check-results.png[Results of OSquery] From e17ce2ef312b00c1671ea1bb59535fedbe29dd70 Mon Sep 17 00:00:00 2001 From: Kibana Machine <42973632+kibanamachine@users.noreply.github.com> Date: Fri, 30 Sep 2022 13:19:42 -0600 Subject: [PATCH 62/72] skip failing test suite (#141782) --- .../spaces_only/apis/bulk_create.ts | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/x-pack/test/saved_object_api_integration/spaces_only/apis/bulk_create.ts b/x-pack/test/saved_object_api_integration/spaces_only/apis/bulk_create.ts index 4e5059933dd74..34e18b76088f1 100644 --- a/x-pack/test/saved_object_api_integration/spaces_only/apis/bulk_create.ts +++ b/x-pack/test/saved_object_api_integration/spaces_only/apis/bulk_create.ts @@ -116,7 +116,8 @@ export default function ({ getService }: FtrProviderContext) { }); }; - describe('_bulk_create', () => { + // Failing: See https://github.com/elastic/kibana/issues/141782 + describe.skip('_bulk_create', () => { getTestScenarios([false, true]).spaces.forEach(({ spaceId, modifier: overwrite }) => { const suffix = overwrite ? ' with overwrite enabled' : ''; const tests = createTests(overwrite!, spaceId); From ed8cf20f3a075e8ef460f65a060f2b26420dcef4 Mon Sep 17 00:00:00 2001 From: Kibana Machine <42973632+kibanamachine@users.noreply.github.com> Date: Fri, 30 Sep 2022 15:02:41 -0600 Subject: [PATCH 63/72] skip failing test suite (#142118) --- x-pack/test/functional/apps/ml/data_frame_analytics/cloning.ts | 1 + 1 file changed, 1 insertion(+) diff --git a/x-pack/test/functional/apps/ml/data_frame_analytics/cloning.ts b/x-pack/test/functional/apps/ml/data_frame_analytics/cloning.ts index 7d6cc5ea9881a..a3314aabce725 100644 --- a/x-pack/test/functional/apps/ml/data_frame_analytics/cloning.ts +++ b/x-pack/test/functional/apps/ml/data_frame_analytics/cloning.ts @@ -16,6 +16,7 @@ export default function ({ getService }: FtrProviderContext) { const ml = getService('ml'); // FLAKY: https://github.com/elastic/kibana/issues/142118 + // Failing: See https://github.com/elastic/kibana/issues/142118 describe.skip('jobs cloning supported by UI form', function () { const testDataList: Array<{ suiteTitle: string; From 1b09c8268e4df1bd3f5ade13ade672eceb9ceb74 Mon Sep 17 00:00:00 2001 From: Philippe Oberti Date: Fri, 30 Sep 2022 16:10:09 -0500 Subject: [PATCH 64/72] [TIP] Fix barchart legend rendering issue (#142268) * [TIP] Fix barchart legend rendering issue - set minimum width - vertically align context menu button - remove value displayed in legend --- .../indicators/components/barchart/barchart/barchart.tsx | 5 +++-- .../components/barchart/legend_action/legend_action.tsx | 3 ++- 2 files changed, 5 insertions(+), 3 deletions(-) diff --git a/x-pack/plugins/threat_intelligence/public/modules/indicators/components/barchart/barchart/barchart.tsx b/x-pack/plugins/threat_intelligence/public/modules/indicators/components/barchart/barchart/barchart.tsx index 2f4fecbd930a2..f15a1f2e4cd3a 100644 --- a/x-pack/plugins/threat_intelligence/public/modules/indicators/components/barchart/barchart/barchart.tsx +++ b/x-pack/plugins/threat_intelligence/public/modules/indicators/components/barchart/barchart/barchart.tsx @@ -16,6 +16,7 @@ import type { ChartSeries } from '../../../services'; const ID = 'tiIndicator'; const DEFAULT_CHART_HEIGHT = '200px'; const DEFAULT_CHART_WIDTH = '100%'; +const DEFAULT_LEGEND_SIZE = 200; export interface IndicatorsBarChartProps { /** @@ -27,7 +28,7 @@ export interface IndicatorsBarChartProps { */ dateRange: TimeRangeBounds; /** - * Indicator field selected in the IndicatorFieldSelector component, passed to the {@link AddToTimeline} to populate the timeline. + * Indicator field selected in the IndicatorFieldSelector component, passed to AddToTimeline to populate the timeline. */ field: string; /** @@ -50,8 +51,8 @@ export const IndicatorsBarChart: VFC = ({ } /> setPopover(!isPopoverOpen)} + onClick={() => setPopover((prevIsPopoverOpen) => !prevIsPopoverOpen)} + style={{ height: '100%' }} /> } From a0d395d4a733bb640789175b347399384b966fc2 Mon Sep 17 00:00:00 2001 From: Kibana Machine <42973632+kibanamachine@users.noreply.github.com> Date: Fri, 30 Sep 2022 22:39:27 -0600 Subject: [PATCH 65/72] [api-docs] Daily api_docs build (#142422) --- api_docs/actions.mdx | 2 +- api_docs/advanced_settings.mdx | 2 +- api_docs/aiops.mdx | 2 +- api_docs/alerting.mdx | 2 +- api_docs/apm.mdx | 2 +- api_docs/banners.mdx | 2 +- api_docs/bfetch.mdx | 2 +- api_docs/canvas.mdx | 2 +- api_docs/cases.mdx | 2 +- api_docs/charts.mdx | 2 +- api_docs/cloud.mdx | 2 +- api_docs/cloud_experiments.mdx | 2 +- api_docs/cloud_security_posture.mdx | 2 +- api_docs/console.mdx | 2 +- api_docs/controls.mdx | 2 +- api_docs/core.mdx | 2 +- api_docs/custom_integrations.mdx | 2 +- api_docs/dashboard.mdx | 2 +- api_docs/dashboard_enhanced.mdx | 2 +- api_docs/data.mdx | 2 +- api_docs/data_query.mdx | 2 +- api_docs/data_search.mdx | 2 +- api_docs/data_view_editor.mdx | 2 +- api_docs/data_view_field_editor.mdx | 2 +- api_docs/data_view_management.mdx | 2 +- api_docs/data_views.devdocs.json | 255 ++++++++++++++++++ api_docs/data_views.mdx | 4 +- api_docs/data_visualizer.mdx | 2 +- api_docs/deprecations_by_api.mdx | 2 +- api_docs/deprecations_by_plugin.mdx | 2 +- api_docs/deprecations_by_team.mdx | 2 +- api_docs/dev_tools.mdx | 2 +- api_docs/discover.mdx | 2 +- api_docs/discover_enhanced.mdx | 2 +- api_docs/embeddable.mdx | 2 +- api_docs/embeddable_enhanced.mdx | 2 +- api_docs/encrypted_saved_objects.mdx | 2 +- api_docs/enterprise_search.mdx | 2 +- api_docs/es_ui_shared.mdx | 2 +- api_docs/event_annotation.mdx | 2 +- api_docs/event_log.mdx | 2 +- api_docs/expression_error.mdx | 2 +- api_docs/expression_gauge.mdx | 2 +- api_docs/expression_heatmap.mdx | 2 +- api_docs/expression_image.mdx | 2 +- api_docs/expression_legacy_metric_vis.mdx | 2 +- api_docs/expression_metric.mdx | 2 +- api_docs/expression_metric_vis.mdx | 2 +- api_docs/expression_partition_vis.mdx | 2 +- api_docs/expression_repeat_image.mdx | 2 +- api_docs/expression_reveal_image.mdx | 2 +- api_docs/expression_shape.mdx | 2 +- api_docs/expression_tagcloud.mdx | 2 +- api_docs/expression_x_y.mdx | 2 +- api_docs/expressions.mdx | 2 +- api_docs/features.mdx | 2 +- api_docs/field_formats.mdx | 2 +- api_docs/file_upload.mdx | 2 +- api_docs/files.mdx | 2 +- api_docs/fleet.mdx | 2 +- api_docs/global_search.mdx | 2 +- api_docs/guided_onboarding.mdx | 2 +- api_docs/home.mdx | 2 +- api_docs/index_lifecycle_management.mdx | 2 +- api_docs/index_management.mdx | 2 +- api_docs/infra.mdx | 2 +- api_docs/inspector.mdx | 2 +- api_docs/interactive_setup.mdx | 2 +- api_docs/kbn_ace.mdx | 2 +- api_docs/kbn_aiops_components.mdx | 2 +- api_docs/kbn_aiops_utils.mdx | 2 +- api_docs/kbn_alerts.mdx | 2 +- api_docs/kbn_analytics.mdx | 2 +- api_docs/kbn_analytics_client.mdx | 2 +- ..._analytics_shippers_elastic_v3_browser.mdx | 2 +- ...n_analytics_shippers_elastic_v3_common.mdx | 2 +- ...n_analytics_shippers_elastic_v3_server.mdx | 2 +- api_docs/kbn_analytics_shippers_fullstory.mdx | 2 +- api_docs/kbn_apm_config_loader.mdx | 2 +- api_docs/kbn_apm_synthtrace.mdx | 2 +- api_docs/kbn_apm_utils.mdx | 2 +- api_docs/kbn_axe_config.mdx | 2 +- api_docs/kbn_chart_icons.mdx | 2 +- api_docs/kbn_ci_stats_core.mdx | 2 +- api_docs/kbn_ci_stats_performance_metrics.mdx | 2 +- api_docs/kbn_ci_stats_reporter.mdx | 2 +- api_docs/kbn_cli_dev_mode.mdx | 2 +- api_docs/kbn_coloring.mdx | 2 +- api_docs/kbn_config.mdx | 2 +- api_docs/kbn_config_mocks.mdx | 2 +- api_docs/kbn_config_schema.mdx | 2 +- .../kbn_content_management_table_list.mdx | 2 +- api_docs/kbn_core_analytics_browser.mdx | 2 +- .../kbn_core_analytics_browser_internal.mdx | 2 +- api_docs/kbn_core_analytics_browser_mocks.mdx | 2 +- api_docs/kbn_core_analytics_server.mdx | 2 +- .../kbn_core_analytics_server_internal.mdx | 2 +- api_docs/kbn_core_analytics_server_mocks.mdx | 2 +- api_docs/kbn_core_application_browser.mdx | 2 +- .../kbn_core_application_browser_internal.mdx | 2 +- .../kbn_core_application_browser_mocks.mdx | 2 +- api_docs/kbn_core_application_common.mdx | 2 +- api_docs/kbn_core_apps_browser_internal.mdx | 2 +- api_docs/kbn_core_apps_browser_mocks.mdx | 2 +- api_docs/kbn_core_base_browser_mocks.mdx | 2 +- api_docs/kbn_core_base_common.mdx | 2 +- api_docs/kbn_core_base_server_internal.mdx | 2 +- api_docs/kbn_core_base_server_mocks.mdx | 2 +- .../kbn_core_capabilities_browser_mocks.mdx | 2 +- api_docs/kbn_core_capabilities_common.mdx | 2 +- api_docs/kbn_core_capabilities_server.mdx | 2 +- .../kbn_core_capabilities_server_mocks.mdx | 2 +- api_docs/kbn_core_chrome_browser.mdx | 2 +- api_docs/kbn_core_chrome_browser_mocks.mdx | 2 +- api_docs/kbn_core_config_server_internal.mdx | 2 +- api_docs/kbn_core_deprecations_browser.mdx | 2 +- ...kbn_core_deprecations_browser_internal.mdx | 2 +- .../kbn_core_deprecations_browser_mocks.mdx | 2 +- api_docs/kbn_core_deprecations_common.mdx | 2 +- api_docs/kbn_core_deprecations_server.mdx | 2 +- .../kbn_core_deprecations_server_internal.mdx | 2 +- .../kbn_core_deprecations_server_mocks.mdx | 2 +- api_docs/kbn_core_doc_links_browser.mdx | 2 +- api_docs/kbn_core_doc_links_browser_mocks.mdx | 2 +- api_docs/kbn_core_doc_links_server.mdx | 2 +- api_docs/kbn_core_doc_links_server_mocks.mdx | 2 +- ...e_elasticsearch_client_server_internal.mdx | 2 +- ...core_elasticsearch_client_server_mocks.mdx | 2 +- api_docs/kbn_core_elasticsearch_server.mdx | 2 +- ...kbn_core_elasticsearch_server_internal.mdx | 2 +- .../kbn_core_elasticsearch_server_mocks.mdx | 2 +- .../kbn_core_environment_server_internal.mdx | 2 +- .../kbn_core_environment_server_mocks.mdx | 2 +- .../kbn_core_execution_context_browser.mdx | 2 +- ...ore_execution_context_browser_internal.mdx | 2 +- ...n_core_execution_context_browser_mocks.mdx | 2 +- .../kbn_core_execution_context_common.mdx | 2 +- .../kbn_core_execution_context_server.mdx | 2 +- ...core_execution_context_server_internal.mdx | 2 +- ...bn_core_execution_context_server_mocks.mdx | 2 +- api_docs/kbn_core_fatal_errors_browser.mdx | 2 +- .../kbn_core_fatal_errors_browser_mocks.mdx | 2 +- api_docs/kbn_core_http_browser.mdx | 2 +- api_docs/kbn_core_http_browser_internal.mdx | 2 +- api_docs/kbn_core_http_browser_mocks.mdx | 2 +- api_docs/kbn_core_http_common.mdx | 2 +- .../kbn_core_http_context_server_mocks.mdx | 2 +- ...re_http_request_handler_context_server.mdx | 2 +- .../kbn_core_http_router_server_internal.mdx | 2 +- .../kbn_core_http_router_server_mocks.mdx | 2 +- api_docs/kbn_core_http_server.mdx | 2 +- api_docs/kbn_core_http_server_internal.mdx | 2 +- api_docs/kbn_core_http_server_mocks.mdx | 2 +- api_docs/kbn_core_i18n_browser.mdx | 2 +- api_docs/kbn_core_i18n_browser_mocks.mdx | 2 +- api_docs/kbn_core_i18n_server.mdx | 2 +- api_docs/kbn_core_i18n_server_internal.mdx | 2 +- api_docs/kbn_core_i18n_server_mocks.mdx | 2 +- .../kbn_core_injected_metadata_browser.mdx | 2 +- ...n_core_injected_metadata_browser_mocks.mdx | 2 +- ...kbn_core_integrations_browser_internal.mdx | 2 +- .../kbn_core_integrations_browser_mocks.mdx | 2 +- api_docs/kbn_core_lifecycle_browser.mdx | 2 +- api_docs/kbn_core_lifecycle_browser_mocks.mdx | 2 +- api_docs/kbn_core_logging_server.mdx | 2 +- api_docs/kbn_core_logging_server_internal.mdx | 2 +- api_docs/kbn_core_logging_server_mocks.mdx | 2 +- ...ore_metrics_collectors_server_internal.mdx | 2 +- ...n_core_metrics_collectors_server_mocks.mdx | 2 +- api_docs/kbn_core_metrics_server.mdx | 2 +- api_docs/kbn_core_metrics_server_internal.mdx | 2 +- api_docs/kbn_core_metrics_server_mocks.mdx | 2 +- api_docs/kbn_core_mount_utils_browser.mdx | 2 +- api_docs/kbn_core_node_server.mdx | 2 +- api_docs/kbn_core_node_server_internal.mdx | 2 +- api_docs/kbn_core_node_server_mocks.mdx | 2 +- api_docs/kbn_core_notifications_browser.mdx | 2 +- ...bn_core_notifications_browser_internal.mdx | 2 +- .../kbn_core_notifications_browser_mocks.mdx | 2 +- api_docs/kbn_core_overlays_browser.mdx | 2 +- .../kbn_core_overlays_browser_internal.mdx | 2 +- api_docs/kbn_core_overlays_browser_mocks.mdx | 2 +- api_docs/kbn_core_plugins_browser.mdx | 2 +- api_docs/kbn_core_plugins_browser_mocks.mdx | 2 +- api_docs/kbn_core_preboot_server.mdx | 2 +- api_docs/kbn_core_preboot_server_mocks.mdx | 2 +- api_docs/kbn_core_rendering_browser_mocks.mdx | 2 +- .../kbn_core_saved_objects_api_browser.mdx | 2 +- .../kbn_core_saved_objects_api_server.mdx | 2 +- ...core_saved_objects_api_server_internal.mdx | 2 +- ...bn_core_saved_objects_api_server_mocks.mdx | 2 +- ...ore_saved_objects_base_server_internal.mdx | 2 +- ...n_core_saved_objects_base_server_mocks.mdx | 2 +- api_docs/kbn_core_saved_objects_browser.mdx | 2 +- ...bn_core_saved_objects_browser_internal.mdx | 2 +- .../kbn_core_saved_objects_browser_mocks.mdx | 2 +- api_docs/kbn_core_saved_objects_common.mdx | 2 +- ..._objects_import_export_server_internal.mdx | 2 +- ...ved_objects_import_export_server_mocks.mdx | 2 +- ...aved_objects_migration_server_internal.mdx | 2 +- ...e_saved_objects_migration_server_mocks.mdx | 2 +- api_docs/kbn_core_saved_objects_server.mdx | 2 +- ...kbn_core_saved_objects_server_internal.mdx | 2 +- .../kbn_core_saved_objects_server_mocks.mdx | 2 +- .../kbn_core_saved_objects_utils_server.mdx | 2 +- api_docs/kbn_core_status_common.mdx | 2 +- api_docs/kbn_core_status_common_internal.mdx | 2 +- api_docs/kbn_core_status_server.mdx | 2 +- api_docs/kbn_core_status_server_internal.mdx | 2 +- api_docs/kbn_core_status_server_mocks.mdx | 2 +- ...core_test_helpers_deprecations_getters.mdx | 2 +- ...n_core_test_helpers_http_setup_browser.mdx | 2 +- api_docs/kbn_core_theme_browser.mdx | 2 +- api_docs/kbn_core_theme_browser_internal.mdx | 2 +- api_docs/kbn_core_theme_browser_mocks.mdx | 2 +- api_docs/kbn_core_ui_settings_browser.mdx | 2 +- .../kbn_core_ui_settings_browser_internal.mdx | 2 +- .../kbn_core_ui_settings_browser_mocks.mdx | 2 +- api_docs/kbn_core_ui_settings_common.mdx | 2 +- api_docs/kbn_core_ui_settings_server.mdx | 2 +- .../kbn_core_ui_settings_server_internal.mdx | 2 +- .../kbn_core_ui_settings_server_mocks.mdx | 2 +- api_docs/kbn_core_usage_data_server.mdx | 2 +- .../kbn_core_usage_data_server_internal.mdx | 2 +- api_docs/kbn_core_usage_data_server_mocks.mdx | 2 +- api_docs/kbn_crypto.mdx | 2 +- api_docs/kbn_crypto_browser.mdx | 2 +- api_docs/kbn_datemath.mdx | 2 +- api_docs/kbn_dev_cli_errors.mdx | 2 +- api_docs/kbn_dev_cli_runner.mdx | 2 +- api_docs/kbn_dev_proc_runner.mdx | 2 +- api_docs/kbn_dev_utils.mdx | 2 +- api_docs/kbn_doc_links.mdx | 2 +- api_docs/kbn_docs_utils.mdx | 2 +- api_docs/kbn_ebt_tools.mdx | 2 +- api_docs/kbn_es_archiver.mdx | 2 +- api_docs/kbn_es_errors.mdx | 2 +- api_docs/kbn_es_query.mdx | 2 +- api_docs/kbn_es_types.mdx | 2 +- api_docs/kbn_eslint_plugin_imports.mdx | 2 +- api_docs/kbn_field_types.mdx | 2 +- api_docs/kbn_find_used_node_modules.mdx | 2 +- .../kbn_ftr_common_functional_services.mdx | 2 +- api_docs/kbn_generate.mdx | 2 +- api_docs/kbn_get_repo_files.mdx | 2 +- api_docs/kbn_handlebars.mdx | 2 +- api_docs/kbn_hapi_mocks.mdx | 2 +- api_docs/kbn_home_sample_data_card.mdx | 2 +- api_docs/kbn_home_sample_data_tab.mdx | 2 +- api_docs/kbn_i18n.mdx | 2 +- api_docs/kbn_import_resolver.mdx | 2 +- api_docs/kbn_interpreter.mdx | 2 +- api_docs/kbn_io_ts_utils.mdx | 2 +- api_docs/kbn_jest_serializers.mdx | 2 +- api_docs/kbn_journeys.mdx | 2 +- api_docs/kbn_kibana_manifest_schema.mdx | 2 +- api_docs/kbn_logging.mdx | 2 +- api_docs/kbn_logging_mocks.mdx | 2 +- api_docs/kbn_managed_vscode_config.mdx | 2 +- api_docs/kbn_mapbox_gl.mdx | 2 +- api_docs/kbn_ml_agg_utils.mdx | 2 +- api_docs/kbn_ml_is_populated_object.mdx | 2 +- api_docs/kbn_ml_string_hash.mdx | 2 +- api_docs/kbn_monaco.mdx | 2 +- api_docs/kbn_optimizer.mdx | 2 +- api_docs/kbn_optimizer_webpack_helpers.mdx | 2 +- api_docs/kbn_osquery_io_ts_types.mdx | 2 +- ..._performance_testing_dataset_extractor.mdx | 2 +- api_docs/kbn_plugin_generator.mdx | 2 +- api_docs/kbn_plugin_helpers.mdx | 2 +- api_docs/kbn_react_field.mdx | 2 +- api_docs/kbn_repo_source_classifier.mdx | 2 +- api_docs/kbn_rule_data_utils.mdx | 2 +- .../kbn_securitysolution_autocomplete.mdx | 2 +- api_docs/kbn_securitysolution_es_utils.mdx | 2 +- ...ritysolution_exception_list_components.mdx | 2 +- api_docs/kbn_securitysolution_hook_utils.mdx | 2 +- ..._securitysolution_io_ts_alerting_types.mdx | 2 +- .../kbn_securitysolution_io_ts_list_types.mdx | 2 +- api_docs/kbn_securitysolution_io_ts_types.mdx | 2 +- api_docs/kbn_securitysolution_io_ts_utils.mdx | 2 +- api_docs/kbn_securitysolution_list_api.mdx | 2 +- .../kbn_securitysolution_list_constants.mdx | 2 +- api_docs/kbn_securitysolution_list_hooks.mdx | 2 +- api_docs/kbn_securitysolution_list_utils.mdx | 2 +- api_docs/kbn_securitysolution_rules.mdx | 2 +- api_docs/kbn_securitysolution_t_grid.mdx | 2 +- api_docs/kbn_securitysolution_utils.mdx | 2 +- api_docs/kbn_server_http_tools.mdx | 2 +- api_docs/kbn_server_route_repository.mdx | 2 +- api_docs/kbn_shared_svg.mdx | 2 +- ...ared_ux_avatar_user_profile_components.mdx | 2 +- ...hared_ux_button_exit_full_screen_mocks.mdx | 2 +- api_docs/kbn_shared_ux_button_toolbar.mdx | 2 +- api_docs/kbn_shared_ux_card_no_data.mdx | 2 +- api_docs/kbn_shared_ux_card_no_data_mocks.mdx | 2 +- .../kbn_shared_ux_link_redirect_app_mocks.mdx | 2 +- .../kbn_shared_ux_page_analytics_no_data.mdx | 2 +- ...shared_ux_page_analytics_no_data_mocks.mdx | 2 +- .../kbn_shared_ux_page_kibana_no_data.mdx | 2 +- ...bn_shared_ux_page_kibana_no_data_mocks.mdx | 2 +- .../kbn_shared_ux_page_kibana_template.mdx | 2 +- ...n_shared_ux_page_kibana_template_mocks.mdx | 2 +- api_docs/kbn_shared_ux_page_no_data.mdx | 2 +- .../kbn_shared_ux_page_no_data_config.mdx | 2 +- ...bn_shared_ux_page_no_data_config_mocks.mdx | 2 +- api_docs/kbn_shared_ux_page_no_data_mocks.mdx | 2 +- api_docs/kbn_shared_ux_page_solution_nav.mdx | 2 +- .../kbn_shared_ux_prompt_no_data_views.mdx | 2 +- ...n_shared_ux_prompt_no_data_views_mocks.mdx | 2 +- api_docs/kbn_shared_ux_router.mdx | 2 +- api_docs/kbn_shared_ux_router_mocks.mdx | 2 +- api_docs/kbn_shared_ux_storybook_config.mdx | 2 +- api_docs/kbn_shared_ux_storybook_mock.mdx | 2 +- api_docs/kbn_shared_ux_utility.mdx | 2 +- api_docs/kbn_some_dev_log.mdx | 2 +- api_docs/kbn_sort_package_json.mdx | 2 +- api_docs/kbn_std.mdx | 2 +- api_docs/kbn_stdio_dev_helpers.mdx | 2 +- api_docs/kbn_storybook.mdx | 2 +- api_docs/kbn_telemetry_tools.mdx | 2 +- api_docs/kbn_test.mdx | 2 +- api_docs/kbn_test_jest_helpers.mdx | 2 +- api_docs/kbn_test_subj_selector.mdx | 2 +- api_docs/kbn_tooling_log.mdx | 2 +- api_docs/kbn_type_summarizer.mdx | 2 +- api_docs/kbn_type_summarizer_core.mdx | 2 +- api_docs/kbn_typed_react_router_config.mdx | 2 +- api_docs/kbn_ui_theme.mdx | 2 +- api_docs/kbn_user_profile_components.mdx | 2 +- api_docs/kbn_utility_types.mdx | 2 +- api_docs/kbn_utility_types_jest.mdx | 2 +- api_docs/kbn_utils.mdx | 2 +- api_docs/kbn_yarn_lock_validator.mdx | 2 +- api_docs/kibana_overview.mdx | 2 +- api_docs/kibana_react.mdx | 2 +- api_docs/kibana_utils.mdx | 2 +- api_docs/kubernetes_security.mdx | 2 +- api_docs/lens.devdocs.json | 157 ++++++++++- api_docs/lens.mdx | 4 +- api_docs/license_api_guard.mdx | 2 +- api_docs/license_management.mdx | 2 +- api_docs/licensing.mdx | 2 +- api_docs/lists.mdx | 2 +- api_docs/management.mdx | 2 +- api_docs/maps.mdx | 2 +- api_docs/maps_ems.mdx | 2 +- api_docs/ml.mdx | 2 +- api_docs/monitoring.mdx | 2 +- api_docs/monitoring_collection.mdx | 2 +- api_docs/navigation.mdx | 2 +- api_docs/newsfeed.mdx | 2 +- api_docs/observability.mdx | 2 +- api_docs/osquery.mdx | 2 +- api_docs/plugin_directory.mdx | 12 +- api_docs/presentation_util.mdx | 2 +- api_docs/profiling.mdx | 2 +- api_docs/remote_clusters.mdx | 2 +- api_docs/reporting.mdx | 2 +- api_docs/rollup.mdx | 2 +- api_docs/rule_registry.mdx | 2 +- api_docs/runtime_fields.mdx | 2 +- api_docs/saved_objects.mdx | 2 +- api_docs/saved_objects_finder.mdx | 2 +- api_docs/saved_objects_management.mdx | 2 +- api_docs/saved_objects_tagging.mdx | 2 +- api_docs/saved_objects_tagging_oss.mdx | 2 +- api_docs/saved_search.mdx | 2 +- api_docs/screenshot_mode.mdx | 2 +- api_docs/screenshotting.mdx | 2 +- api_docs/security.mdx | 2 +- api_docs/security_solution.mdx | 2 +- api_docs/session_view.mdx | 2 +- api_docs/share.mdx | 2 +- api_docs/snapshot_restore.mdx | 2 +- api_docs/spaces.mdx | 2 +- api_docs/stack_alerts.mdx | 2 +- api_docs/stack_connectors.mdx | 2 +- api_docs/task_manager.mdx | 2 +- api_docs/telemetry.mdx | 2 +- api_docs/telemetry_collection_manager.mdx | 2 +- api_docs/telemetry_collection_xpack.mdx | 2 +- api_docs/telemetry_management_section.mdx | 2 +- api_docs/threat_intelligence.mdx | 2 +- api_docs/timelines.mdx | 2 +- api_docs/transform.mdx | 2 +- api_docs/triggers_actions_ui.mdx | 2 +- api_docs/ui_actions.devdocs.json | 15 ++ api_docs/ui_actions.mdx | 4 +- api_docs/ui_actions_enhanced.mdx | 2 +- api_docs/unified_field_list.mdx | 2 +- api_docs/unified_search.devdocs.json | 56 +++- api_docs/unified_search.mdx | 4 +- api_docs/unified_search_autocomplete.mdx | 4 +- api_docs/url_forwarding.mdx | 2 +- api_docs/usage_collection.mdx | 2 +- api_docs/ux.mdx | 2 +- api_docs/vis_default_editor.mdx | 2 +- api_docs/vis_type_gauge.mdx | 2 +- api_docs/vis_type_heatmap.mdx | 2 +- api_docs/vis_type_pie.mdx | 2 +- api_docs/vis_type_table.mdx | 2 +- api_docs/vis_type_timelion.mdx | 2 +- api_docs/vis_type_timeseries.mdx | 2 +- api_docs/vis_type_vega.mdx | 2 +- api_docs/vis_type_vislib.mdx | 2 +- api_docs/vis_type_xy.mdx | 2 +- api_docs/visualizations.mdx | 2 +- 408 files changed, 894 insertions(+), 417 deletions(-) diff --git a/api_docs/actions.mdx b/api_docs/actions.mdx index 27394a9d1337c..48d75bc3ce7cb 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: 2022-09-30 +date: 2022-10-01 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'actions'] --- import actionsObj from './actions.devdocs.json'; diff --git a/api_docs/advanced_settings.mdx b/api_docs/advanced_settings.mdx index 50e964f1d4fce..ee9b4276cce64 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: 2022-09-30 +date: 2022-10-01 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'advancedSettings'] --- import advancedSettingsObj from './advanced_settings.devdocs.json'; diff --git a/api_docs/aiops.mdx b/api_docs/aiops.mdx index 97c9deaf7e160..9d860aa24355e 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: 2022-09-30 +date: 2022-10-01 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'aiops'] --- import aiopsObj from './aiops.devdocs.json'; diff --git a/api_docs/alerting.mdx b/api_docs/alerting.mdx index 1d4419372cb8d..e72baca86cbf6 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: 2022-09-30 +date: 2022-10-01 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'alerting'] --- import alertingObj from './alerting.devdocs.json'; diff --git a/api_docs/apm.mdx b/api_docs/apm.mdx index 894f1a4124006..020843029e21c 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: 2022-09-30 +date: 2022-10-01 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'apm'] --- import apmObj from './apm.devdocs.json'; diff --git a/api_docs/banners.mdx b/api_docs/banners.mdx index a88ae007a49f1..b792f664c347f 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: 2022-09-30 +date: 2022-10-01 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'banners'] --- import bannersObj from './banners.devdocs.json'; diff --git a/api_docs/bfetch.mdx b/api_docs/bfetch.mdx index 9aa4dc3dc6cbd..a343745fd134b 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: 2022-09-30 +date: 2022-10-01 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'bfetch'] --- import bfetchObj from './bfetch.devdocs.json'; diff --git a/api_docs/canvas.mdx b/api_docs/canvas.mdx index 98d04fe776c11..74326b5f4e705 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: 2022-09-30 +date: 2022-10-01 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'canvas'] --- import canvasObj from './canvas.devdocs.json'; diff --git a/api_docs/cases.mdx b/api_docs/cases.mdx index 8e0ec02de9523..6d8fcf94ddb84 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: 2022-09-30 +date: 2022-10-01 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'cases'] --- import casesObj from './cases.devdocs.json'; diff --git a/api_docs/charts.mdx b/api_docs/charts.mdx index 0daa29277e4c5..f2eb1e6d668cd 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: 2022-09-30 +date: 2022-10-01 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'charts'] --- import chartsObj from './charts.devdocs.json'; diff --git a/api_docs/cloud.mdx b/api_docs/cloud.mdx index 8794f842b3462..a7f1c3bd483c0 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: 2022-09-30 +date: 2022-10-01 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'cloud'] --- import cloudObj from './cloud.devdocs.json'; diff --git a/api_docs/cloud_experiments.mdx b/api_docs/cloud_experiments.mdx index 67f93229e1310..4cd830231b266 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: 2022-09-30 +date: 2022-10-01 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'cloudExperiments'] --- import cloudExperimentsObj from './cloud_experiments.devdocs.json'; diff --git a/api_docs/cloud_security_posture.mdx b/api_docs/cloud_security_posture.mdx index e1a21c6f2cc8b..7afab612c4a7a 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: 2022-09-30 +date: 2022-10-01 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'cloudSecurityPosture'] --- import cloudSecurityPostureObj from './cloud_security_posture.devdocs.json'; diff --git a/api_docs/console.mdx b/api_docs/console.mdx index 8ba5fe4e37288..1ace57ec36bdc 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: 2022-09-30 +date: 2022-10-01 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'console'] --- import consoleObj from './console.devdocs.json'; diff --git a/api_docs/controls.mdx b/api_docs/controls.mdx index b0885214467d7..1e2f85a3b6c6c 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: 2022-09-30 +date: 2022-10-01 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'controls'] --- import controlsObj from './controls.devdocs.json'; diff --git a/api_docs/core.mdx b/api_docs/core.mdx index 38ceacd3fae04..e3d2f1354aea8 100644 --- a/api_docs/core.mdx +++ b/api_docs/core.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/core title: "core" image: https://source.unsplash.com/400x175/?github description: API docs for the core plugin -date: 2022-09-30 +date: 2022-10-01 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'core'] --- import coreObj from './core.devdocs.json'; diff --git a/api_docs/custom_integrations.mdx b/api_docs/custom_integrations.mdx index 99cc968190594..62deee07bd7d8 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: 2022-09-30 +date: 2022-10-01 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'customIntegrations'] --- import customIntegrationsObj from './custom_integrations.devdocs.json'; diff --git a/api_docs/dashboard.mdx b/api_docs/dashboard.mdx index f429f17719091..abecd96470ec6 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: 2022-09-30 +date: 2022-10-01 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'dashboard'] --- import dashboardObj from './dashboard.devdocs.json'; diff --git a/api_docs/dashboard_enhanced.mdx b/api_docs/dashboard_enhanced.mdx index 1b406c8cf22e8..6a49051f2936a 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: 2022-09-30 +date: 2022-10-01 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'dashboardEnhanced'] --- import dashboardEnhancedObj from './dashboard_enhanced.devdocs.json'; diff --git a/api_docs/data.mdx b/api_docs/data.mdx index 6b45be67575ce..44fc64c6bdf41 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: 2022-09-30 +date: 2022-10-01 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'data'] --- import dataObj from './data.devdocs.json'; diff --git a/api_docs/data_query.mdx b/api_docs/data_query.mdx index 9c7512fae8261..a82d817ae1317 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: 2022-09-30 +date: 2022-10-01 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'data.query'] --- import dataQueryObj from './data_query.devdocs.json'; diff --git a/api_docs/data_search.mdx b/api_docs/data_search.mdx index 6131baf378500..3e7214a59cc2f 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: 2022-09-30 +date: 2022-10-01 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'data.search'] --- import dataSearchObj from './data_search.devdocs.json'; diff --git a/api_docs/data_view_editor.mdx b/api_docs/data_view_editor.mdx index eb804887cbbb7..288b3ee585f51 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: 2022-09-30 +date: 2022-10-01 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'dataViewEditor'] --- import dataViewEditorObj from './data_view_editor.devdocs.json'; diff --git a/api_docs/data_view_field_editor.mdx b/api_docs/data_view_field_editor.mdx index 0360e887a0f14..f0c7b8022d144 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: 2022-09-30 +date: 2022-10-01 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'dataViewFieldEditor'] --- import dataViewFieldEditorObj from './data_view_field_editor.devdocs.json'; diff --git a/api_docs/data_view_management.mdx b/api_docs/data_view_management.mdx index cf20215434912..9840337f75a70 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: 2022-09-30 +date: 2022-10-01 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 c868634158667..cc6bd0a259d02 100644 --- a/api_docs/data_views.devdocs.json +++ b/api_docs/data_views.devdocs.json @@ -4164,6 +4164,45 @@ "returnComment": [], "children": [] }, + { + "parentPluginId": "dataViews", + "id": "def-public.DataViewsServicePublic.getIndices", + "type": "Function", + "tags": [], + "label": "getIndices", + "description": [], + "signature": [ + "(props: { pattern: string; showAllIndices?: boolean | undefined; isRollupIndex: (indexName: string) => boolean; }) => Promise<", + { + "pluginId": "dataViews", + "scope": "public", + "docId": "kibDataViewsPluginApi", + "section": "def-public.MatchedItem", + "text": "MatchedItem" + }, + "[]>" + ], + "path": "src/plugins/data_views/public/data_views_service_public.ts", + "deprecated": false, + "trackAdoption": false, + "returnComment": [], + "children": [ + { + "parentPluginId": "dataViews", + "id": "def-public.DataViewsServicePublic.getIndices.$1", + "type": "Object", + "tags": [], + "label": "props", + "description": [], + "signature": [ + "{ pattern: string; showAllIndices?: boolean | undefined; isRollupIndex: (indexName: string) => boolean; }" + ], + "path": "src/plugins/data_views/public/data_views_service_public.ts", + "deprecated": false, + "trackAdoption": false + } + ] + }, { "parentPluginId": "dataViews", "id": "def-public.DataViewsServicePublic.hasData", @@ -5398,6 +5437,101 @@ "path": "src/plugins/data_views/public/data_views_service_public.ts", "deprecated": false, "trackAdoption": false + }, + { + "parentPluginId": "dataViews", + "id": "def-public.DataViewsServicePublicDeps.getIndices", + "type": "Function", + "tags": [], + "label": "getIndices", + "description": [], + "signature": [ + "(props: { pattern: string; showAllIndices?: boolean | undefined; isRollupIndex: (indexName: string) => boolean; }) => Promise<", + { + "pluginId": "dataViews", + "scope": "public", + "docId": "kibDataViewsPluginApi", + "section": "def-public.MatchedItem", + "text": "MatchedItem" + }, + "[]>" + ], + "path": "src/plugins/data_views/public/data_views_service_public.ts", + "deprecated": false, + "trackAdoption": false, + "children": [ + { + "parentPluginId": "dataViews", + "id": "def-public.DataViewsServicePublicDeps.getIndices.$1", + "type": "Object", + "tags": [], + "label": "props", + "description": [], + "path": "src/plugins/data_views/public/data_views_service_public.ts", + "deprecated": false, + "trackAdoption": false, + "children": [ + { + "parentPluginId": "dataViews", + "id": "def-public.DataViewsServicePublicDeps.getIndices.$1.pattern", + "type": "string", + "tags": [], + "label": "pattern", + "description": [], + "path": "src/plugins/data_views/public/data_views_service_public.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "dataViews", + "id": "def-public.DataViewsServicePublicDeps.getIndices.$1.showAllIndices", + "type": "CompoundType", + "tags": [], + "label": "showAllIndices", + "description": [], + "signature": [ + "boolean | undefined" + ], + "path": "src/plugins/data_views/public/data_views_service_public.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "dataViews", + "id": "def-public.DataViewsServicePublicDeps.getIndices.$1.isRollupIndex", + "type": "Function", + "tags": [], + "label": "isRollupIndex", + "description": [], + "signature": [ + "(indexName: string) => boolean" + ], + "path": "src/plugins/data_views/public/data_views_service_public.ts", + "deprecated": false, + "trackAdoption": false, + "children": [ + { + "parentPluginId": "dataViews", + "id": "def-public.DataViewsServicePublicDeps.getIndices.$1.isRollupIndex.$1", + "type": "string", + "tags": [], + "label": "indexName", + "description": [], + "signature": [ + "string" + ], + "path": "src/plugins/data_views/public/data_views_service_public.ts", + "deprecated": false, + "trackAdoption": false, + "isRequired": true + } + ], + "returnComment": [] + } + ] + } + ], + "returnComment": [] } ], "initialIsOpen": false @@ -5906,6 +6040,68 @@ ], "initialIsOpen": false }, + { + "parentPluginId": "dataViews", + "id": "def-public.MatchedItem", + "type": "Interface", + "tags": [], + "label": "MatchedItem", + "description": [], + "path": "src/plugins/data_views/public/types.ts", + "deprecated": false, + "trackAdoption": false, + "children": [ + { + "parentPluginId": "dataViews", + "id": "def-public.MatchedItem.name", + "type": "string", + "tags": [], + "label": "name", + "description": [], + "path": "src/plugins/data_views/public/types.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "dataViews", + "id": "def-public.MatchedItem.tags", + "type": "Array", + "tags": [], + "label": "tags", + "description": [], + "signature": [ + { + "pluginId": "dataViews", + "scope": "public", + "docId": "kibDataViewsPluginApi", + "section": "def-public.Tag", + "text": "Tag" + }, + "[]" + ], + "path": "src/plugins/data_views/public/types.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "dataViews", + "id": "def-public.MatchedItem.item", + "type": "Object", + "tags": [], + "label": "item", + "description": [], + "signature": [ + "{ name: string; backing_indices?: string[] | undefined; timestamp_field?: string | undefined; indices?: string[] | undefined; aliases?: string[] | undefined; attributes?: ", + "ResolveIndexResponseItemIndexAttrs", + "[] | undefined; data_stream?: string | undefined; }" + ], + "path": "src/plugins/data_views/public/types.ts", + "deprecated": false, + "trackAdoption": false + } + ], + "initialIsOpen": false + }, { "parentPluginId": "dataViews", "id": "def-public.RuntimeField", @@ -6339,6 +6535,53 @@ } ], "initialIsOpen": false + }, + { + "parentPluginId": "dataViews", + "id": "def-public.Tag", + "type": "Interface", + "tags": [], + "label": "Tag", + "description": [], + "path": "src/plugins/data_views/public/types.ts", + "deprecated": false, + "trackAdoption": false, + "children": [ + { + "parentPluginId": "dataViews", + "id": "def-public.Tag.name", + "type": "string", + "tags": [], + "label": "name", + "description": [], + "path": "src/plugins/data_views/public/types.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "dataViews", + "id": "def-public.Tag.key", + "type": "string", + "tags": [], + "label": "key", + "description": [], + "path": "src/plugins/data_views/public/types.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "dataViews", + "id": "def-public.Tag.color", + "type": "string", + "tags": [], + "label": "color", + "description": [], + "path": "src/plugins/data_views/public/types.ts", + "deprecated": false, + "trackAdoption": false + } + ], + "initialIsOpen": false } ], "enums": [ @@ -6355,6 +6598,18 @@ "deprecated": false, "trackAdoption": false, "initialIsOpen": false + }, + { + "parentPluginId": "dataViews", + "id": "def-public.INDEX_PATTERN_TYPE", + "type": "Enum", + "tags": [], + "label": "INDEX_PATTERN_TYPE", + "description": [], + "path": "src/plugins/data_views/public/types.ts", + "deprecated": false, + "trackAdoption": false, + "initialIsOpen": false } ], "misc": [ diff --git a/api_docs/data_views.mdx b/api_docs/data_views.mdx index 9e9e13d1c714b..9ce3b6c700638 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: 2022-09-30 +date: 2022-10-01 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'dataViews'] --- import dataViewsObj from './data_views.devdocs.json'; @@ -21,7 +21,7 @@ Contact [App Services](https://github.com/orgs/elastic/teams/kibana-app-services | Public API count | Any count | Items lacking comments | Missing exports | |-------------------|-----------|------------------------|-----------------| -| 966 | 0 | 208 | 1 | +| 983 | 0 | 225 | 2 | ## Client diff --git a/api_docs/data_visualizer.mdx b/api_docs/data_visualizer.mdx index a31d748cb362d..05d260b1c544f 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: 2022-09-30 +date: 2022-10-01 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'dataVisualizer'] --- import dataVisualizerObj from './data_visualizer.devdocs.json'; diff --git a/api_docs/deprecations_by_api.mdx b/api_docs/deprecations_by_api.mdx index 32c98155e1b6a..a3d96055c821b 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: 2022-09-30 +date: 2022-10-01 tags: ['contributor', 'dev', 'apidocs', 'kibana'] --- diff --git a/api_docs/deprecations_by_plugin.mdx b/api_docs/deprecations_by_plugin.mdx index 52ccce27de739..4eb2eb95d80e1 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: 2022-09-30 +date: 2022-10-01 tags: ['contributor', 'dev', 'apidocs', 'kibana'] --- diff --git a/api_docs/deprecations_by_team.mdx b/api_docs/deprecations_by_team.mdx index 28ee76e3644fa..4fc141f38747a 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: 2022-09-30 +date: 2022-10-01 tags: ['contributor', 'dev', 'apidocs', 'kibana'] --- diff --git a/api_docs/dev_tools.mdx b/api_docs/dev_tools.mdx index 9753d6519463e..f22d728079646 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: 2022-09-30 +date: 2022-10-01 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'devTools'] --- import devToolsObj from './dev_tools.devdocs.json'; diff --git a/api_docs/discover.mdx b/api_docs/discover.mdx index d99574811ed8e..c744310a34b91 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: 2022-09-30 +date: 2022-10-01 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'discover'] --- import discoverObj from './discover.devdocs.json'; diff --git a/api_docs/discover_enhanced.mdx b/api_docs/discover_enhanced.mdx index 46669e83965b4..b9b4af0426fde 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: 2022-09-30 +date: 2022-10-01 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'discoverEnhanced'] --- import discoverEnhancedObj from './discover_enhanced.devdocs.json'; diff --git a/api_docs/embeddable.mdx b/api_docs/embeddable.mdx index 19cbeac71650f..f09224c581505 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: 2022-09-30 +date: 2022-10-01 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'embeddable'] --- import embeddableObj from './embeddable.devdocs.json'; diff --git a/api_docs/embeddable_enhanced.mdx b/api_docs/embeddable_enhanced.mdx index cad3566677f9a..e1530fd32233e 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: 2022-09-30 +date: 2022-10-01 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'embeddableEnhanced'] --- import embeddableEnhancedObj from './embeddable_enhanced.devdocs.json'; diff --git a/api_docs/encrypted_saved_objects.mdx b/api_docs/encrypted_saved_objects.mdx index 0964ad2d3db43..3f0a323b92794 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: 2022-09-30 +date: 2022-10-01 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'encryptedSavedObjects'] --- import encryptedSavedObjectsObj from './encrypted_saved_objects.devdocs.json'; diff --git a/api_docs/enterprise_search.mdx b/api_docs/enterprise_search.mdx index 25628d88904b8..68f9252a936a6 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: 2022-09-30 +date: 2022-10-01 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'enterpriseSearch'] --- import enterpriseSearchObj from './enterprise_search.devdocs.json'; diff --git a/api_docs/es_ui_shared.mdx b/api_docs/es_ui_shared.mdx index 31bbfd3cfa77e..e4b29fe30fced 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: 2022-09-30 +date: 2022-10-01 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'esUiShared'] --- import esUiSharedObj from './es_ui_shared.devdocs.json'; diff --git a/api_docs/event_annotation.mdx b/api_docs/event_annotation.mdx index 70931ba483ca9..5fc5dd479579e 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: 2022-09-30 +date: 2022-10-01 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'eventAnnotation'] --- import eventAnnotationObj from './event_annotation.devdocs.json'; diff --git a/api_docs/event_log.mdx b/api_docs/event_log.mdx index 57cb17ed7f57d..a1aaa7507ccb7 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: 2022-09-30 +date: 2022-10-01 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'eventLog'] --- import eventLogObj from './event_log.devdocs.json'; diff --git a/api_docs/expression_error.mdx b/api_docs/expression_error.mdx index 87f06ab7f0fc8..a7413684bd039 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: 2022-09-30 +date: 2022-10-01 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'expressionError'] --- import expressionErrorObj from './expression_error.devdocs.json'; diff --git a/api_docs/expression_gauge.mdx b/api_docs/expression_gauge.mdx index e2d8790bf2b71..a882614c990a5 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: 2022-09-30 +date: 2022-10-01 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'expressionGauge'] --- import expressionGaugeObj from './expression_gauge.devdocs.json'; diff --git a/api_docs/expression_heatmap.mdx b/api_docs/expression_heatmap.mdx index 03060b8617a53..9237719c9d201 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: 2022-09-30 +date: 2022-10-01 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'expressionHeatmap'] --- import expressionHeatmapObj from './expression_heatmap.devdocs.json'; diff --git a/api_docs/expression_image.mdx b/api_docs/expression_image.mdx index 7ccb3fec0ef4b..aae35271ff39e 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: 2022-09-30 +date: 2022-10-01 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'expressionImage'] --- import expressionImageObj from './expression_image.devdocs.json'; diff --git a/api_docs/expression_legacy_metric_vis.mdx b/api_docs/expression_legacy_metric_vis.mdx index ea8581c29a05f..df673151690c9 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: 2022-09-30 +date: 2022-10-01 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'expressionLegacyMetricVis'] --- import expressionLegacyMetricVisObj from './expression_legacy_metric_vis.devdocs.json'; diff --git a/api_docs/expression_metric.mdx b/api_docs/expression_metric.mdx index b7d3b7b434519..da11f3077c1aa 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: 2022-09-30 +date: 2022-10-01 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'expressionMetric'] --- import expressionMetricObj from './expression_metric.devdocs.json'; diff --git a/api_docs/expression_metric_vis.mdx b/api_docs/expression_metric_vis.mdx index 901d559b5a7e7..846aa497ea3bb 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: 2022-09-30 +date: 2022-10-01 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'expressionMetricVis'] --- import expressionMetricVisObj from './expression_metric_vis.devdocs.json'; diff --git a/api_docs/expression_partition_vis.mdx b/api_docs/expression_partition_vis.mdx index 4f53bb28008ea..02618661f080e 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: 2022-09-30 +date: 2022-10-01 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'expressionPartitionVis'] --- import expressionPartitionVisObj from './expression_partition_vis.devdocs.json'; diff --git a/api_docs/expression_repeat_image.mdx b/api_docs/expression_repeat_image.mdx index aeff45f40a77f..02f01b4dd86f5 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: 2022-09-30 +date: 2022-10-01 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'expressionRepeatImage'] --- import expressionRepeatImageObj from './expression_repeat_image.devdocs.json'; diff --git a/api_docs/expression_reveal_image.mdx b/api_docs/expression_reveal_image.mdx index 096441865046f..acd06327d8886 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: 2022-09-30 +date: 2022-10-01 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'expressionRevealImage'] --- import expressionRevealImageObj from './expression_reveal_image.devdocs.json'; diff --git a/api_docs/expression_shape.mdx b/api_docs/expression_shape.mdx index 237430ae0fb81..8046b493fef22 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: 2022-09-30 +date: 2022-10-01 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'expressionShape'] --- import expressionShapeObj from './expression_shape.devdocs.json'; diff --git a/api_docs/expression_tagcloud.mdx b/api_docs/expression_tagcloud.mdx index 2316d7e48cc91..3ddfd870314aa 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: 2022-09-30 +date: 2022-10-01 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'expressionTagcloud'] --- import expressionTagcloudObj from './expression_tagcloud.devdocs.json'; diff --git a/api_docs/expression_x_y.mdx b/api_docs/expression_x_y.mdx index 6c70b3fd09b18..0b5d88e7aab73 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: 2022-09-30 +date: 2022-10-01 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'expressionXY'] --- import expressionXYObj from './expression_x_y.devdocs.json'; diff --git a/api_docs/expressions.mdx b/api_docs/expressions.mdx index a2c88ec023169..8c09010151113 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: 2022-09-30 +date: 2022-10-01 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'expressions'] --- import expressionsObj from './expressions.devdocs.json'; diff --git a/api_docs/features.mdx b/api_docs/features.mdx index 821587d02923a..05df2ffc3a487 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: 2022-09-30 +date: 2022-10-01 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'features'] --- import featuresObj from './features.devdocs.json'; diff --git a/api_docs/field_formats.mdx b/api_docs/field_formats.mdx index 77ec5bd6a6db2..fb46fbf3c533b 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: 2022-09-30 +date: 2022-10-01 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'fieldFormats'] --- import fieldFormatsObj from './field_formats.devdocs.json'; diff --git a/api_docs/file_upload.mdx b/api_docs/file_upload.mdx index 71fd5ede2e0a9..ad24537aa0fdc 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: 2022-09-30 +date: 2022-10-01 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'fileUpload'] --- import fileUploadObj from './file_upload.devdocs.json'; diff --git a/api_docs/files.mdx b/api_docs/files.mdx index 5536609e6bf4f..77286018c6236 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: 2022-09-30 +date: 2022-10-01 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'files'] --- import filesObj from './files.devdocs.json'; diff --git a/api_docs/fleet.mdx b/api_docs/fleet.mdx index 61843d4ecb35c..8196936c8efd9 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: 2022-09-30 +date: 2022-10-01 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'fleet'] --- import fleetObj from './fleet.devdocs.json'; diff --git a/api_docs/global_search.mdx b/api_docs/global_search.mdx index 8681c30dcf97c..6908d7194d17b 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: 2022-09-30 +date: 2022-10-01 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'globalSearch'] --- import globalSearchObj from './global_search.devdocs.json'; diff --git a/api_docs/guided_onboarding.mdx b/api_docs/guided_onboarding.mdx index 01249c9253db9..af5a128f54b0d 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: 2022-09-30 +date: 2022-10-01 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'guidedOnboarding'] --- import guidedOnboardingObj from './guided_onboarding.devdocs.json'; diff --git a/api_docs/home.mdx b/api_docs/home.mdx index 21a00dd18b779..8bbe725e782fe 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: 2022-09-30 +date: 2022-10-01 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'home'] --- import homeObj from './home.devdocs.json'; diff --git a/api_docs/index_lifecycle_management.mdx b/api_docs/index_lifecycle_management.mdx index 08133b2e0ce45..9edd7ca01eff0 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: 2022-09-30 +date: 2022-10-01 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'indexLifecycleManagement'] --- import indexLifecycleManagementObj from './index_lifecycle_management.devdocs.json'; diff --git a/api_docs/index_management.mdx b/api_docs/index_management.mdx index e6a58683dd574..0c3c64c38fa9e 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: 2022-09-30 +date: 2022-10-01 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'indexManagement'] --- import indexManagementObj from './index_management.devdocs.json'; diff --git a/api_docs/infra.mdx b/api_docs/infra.mdx index 27d270ef03490..12e3a5944bfec 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: 2022-09-30 +date: 2022-10-01 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'infra'] --- import infraObj from './infra.devdocs.json'; diff --git a/api_docs/inspector.mdx b/api_docs/inspector.mdx index 69d8e811d233c..d5d9c2b4b6937 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: 2022-09-30 +date: 2022-10-01 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'inspector'] --- import inspectorObj from './inspector.devdocs.json'; diff --git a/api_docs/interactive_setup.mdx b/api_docs/interactive_setup.mdx index d425e08214e06..3f156bfcb7b35 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: 2022-09-30 +date: 2022-10-01 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'interactiveSetup'] --- import interactiveSetupObj from './interactive_setup.devdocs.json'; diff --git a/api_docs/kbn_ace.mdx b/api_docs/kbn_ace.mdx index 85eedf5bc8cb1..9033fdf982ef0 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: 2022-09-30 +date: 2022-10-01 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/ace'] --- import kbnAceObj from './kbn_ace.devdocs.json'; diff --git a/api_docs/kbn_aiops_components.mdx b/api_docs/kbn_aiops_components.mdx index 0fcb70c426aac..dae5a070183a3 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: 2022-09-30 +date: 2022-10-01 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/aiops-components'] --- import kbnAiopsComponentsObj from './kbn_aiops_components.devdocs.json'; diff --git a/api_docs/kbn_aiops_utils.mdx b/api_docs/kbn_aiops_utils.mdx index 7a5a7dc343e11..25f9c2c92bfd1 100644 --- a/api_docs/kbn_aiops_utils.mdx +++ b/api_docs/kbn_aiops_utils.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-aiops-utils title: "@kbn/aiops-utils" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/aiops-utils plugin -date: 2022-09-30 +date: 2022-10-01 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/aiops-utils'] --- import kbnAiopsUtilsObj from './kbn_aiops_utils.devdocs.json'; diff --git a/api_docs/kbn_alerts.mdx b/api_docs/kbn_alerts.mdx index d3da6e6fc6278..ca9ca177b00a7 100644 --- a/api_docs/kbn_alerts.mdx +++ b/api_docs/kbn_alerts.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-alerts title: "@kbn/alerts" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/alerts plugin -date: 2022-09-30 +date: 2022-10-01 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/alerts'] --- import kbnAlertsObj from './kbn_alerts.devdocs.json'; diff --git a/api_docs/kbn_analytics.mdx b/api_docs/kbn_analytics.mdx index b19adbf23a6ba..9c5c4346e45a0 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: 2022-09-30 +date: 2022-10-01 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/analytics'] --- import kbnAnalyticsObj from './kbn_analytics.devdocs.json'; diff --git a/api_docs/kbn_analytics_client.mdx b/api_docs/kbn_analytics_client.mdx index cb3267bf94c0f..0f94bac6c9c8a 100644 --- a/api_docs/kbn_analytics_client.mdx +++ b/api_docs/kbn_analytics_client.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-analytics-client title: "@kbn/analytics-client" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/analytics-client plugin -date: 2022-09-30 +date: 2022-10-01 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/analytics-client'] --- import kbnAnalyticsClientObj from './kbn_analytics_client.devdocs.json'; diff --git a/api_docs/kbn_analytics_shippers_elastic_v3_browser.mdx b/api_docs/kbn_analytics_shippers_elastic_v3_browser.mdx index 6f92758ba29f5..71847c01b1eb0 100644 --- a/api_docs/kbn_analytics_shippers_elastic_v3_browser.mdx +++ b/api_docs/kbn_analytics_shippers_elastic_v3_browser.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-analytics-shippers-elastic-v3-browser title: "@kbn/analytics-shippers-elastic-v3-browser" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/analytics-shippers-elastic-v3-browser plugin -date: 2022-09-30 +date: 2022-10-01 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/analytics-shippers-elastic-v3-browser'] --- import kbnAnalyticsShippersElasticV3BrowserObj from './kbn_analytics_shippers_elastic_v3_browser.devdocs.json'; diff --git a/api_docs/kbn_analytics_shippers_elastic_v3_common.mdx b/api_docs/kbn_analytics_shippers_elastic_v3_common.mdx index 42ba3bd8ac0d9..09e9cdc683fa1 100644 --- a/api_docs/kbn_analytics_shippers_elastic_v3_common.mdx +++ b/api_docs/kbn_analytics_shippers_elastic_v3_common.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-analytics-shippers-elastic-v3-common title: "@kbn/analytics-shippers-elastic-v3-common" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/analytics-shippers-elastic-v3-common plugin -date: 2022-09-30 +date: 2022-10-01 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/analytics-shippers-elastic-v3-common'] --- import kbnAnalyticsShippersElasticV3CommonObj from './kbn_analytics_shippers_elastic_v3_common.devdocs.json'; diff --git a/api_docs/kbn_analytics_shippers_elastic_v3_server.mdx b/api_docs/kbn_analytics_shippers_elastic_v3_server.mdx index 9e24183eab48c..14753eade649d 100644 --- a/api_docs/kbn_analytics_shippers_elastic_v3_server.mdx +++ b/api_docs/kbn_analytics_shippers_elastic_v3_server.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-analytics-shippers-elastic-v3-server title: "@kbn/analytics-shippers-elastic-v3-server" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/analytics-shippers-elastic-v3-server plugin -date: 2022-09-30 +date: 2022-10-01 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/analytics-shippers-elastic-v3-server'] --- import kbnAnalyticsShippersElasticV3ServerObj from './kbn_analytics_shippers_elastic_v3_server.devdocs.json'; diff --git a/api_docs/kbn_analytics_shippers_fullstory.mdx b/api_docs/kbn_analytics_shippers_fullstory.mdx index 642cfc316df01..7b98319dfa0d5 100644 --- a/api_docs/kbn_analytics_shippers_fullstory.mdx +++ b/api_docs/kbn_analytics_shippers_fullstory.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-analytics-shippers-fullstory title: "@kbn/analytics-shippers-fullstory" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/analytics-shippers-fullstory plugin -date: 2022-09-30 +date: 2022-10-01 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/analytics-shippers-fullstory'] --- import kbnAnalyticsShippersFullstoryObj from './kbn_analytics_shippers_fullstory.devdocs.json'; diff --git a/api_docs/kbn_apm_config_loader.mdx b/api_docs/kbn_apm_config_loader.mdx index 64f41b4de638f..7e89a7719619f 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: 2022-09-30 +date: 2022-10-01 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/apm-config-loader'] --- import kbnApmConfigLoaderObj from './kbn_apm_config_loader.devdocs.json'; diff --git a/api_docs/kbn_apm_synthtrace.mdx b/api_docs/kbn_apm_synthtrace.mdx index a07ae6ec5b388..a8302426d0f98 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: 2022-09-30 +date: 2022-10-01 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/apm-synthtrace'] --- import kbnApmSynthtraceObj from './kbn_apm_synthtrace.devdocs.json'; diff --git a/api_docs/kbn_apm_utils.mdx b/api_docs/kbn_apm_utils.mdx index ccabe37aa9fbf..8e3217250a2f3 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: 2022-09-30 +date: 2022-10-01 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/apm-utils'] --- import kbnApmUtilsObj from './kbn_apm_utils.devdocs.json'; diff --git a/api_docs/kbn_axe_config.mdx b/api_docs/kbn_axe_config.mdx index 904c2db7eeb95..b96fac650f3bb 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: 2022-09-30 +date: 2022-10-01 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/axe-config'] --- import kbnAxeConfigObj from './kbn_axe_config.devdocs.json'; diff --git a/api_docs/kbn_chart_icons.mdx b/api_docs/kbn_chart_icons.mdx index 3ef51f85a1dd8..2e27eedb97be8 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: 2022-09-30 +date: 2022-10-01 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/chart-icons'] --- import kbnChartIconsObj from './kbn_chart_icons.devdocs.json'; diff --git a/api_docs/kbn_ci_stats_core.mdx b/api_docs/kbn_ci_stats_core.mdx index 4dbba9e0e4bbf..ba566208fe8bb 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: 2022-09-30 +date: 2022-10-01 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/ci-stats-core'] --- import kbnCiStatsCoreObj from './kbn_ci_stats_core.devdocs.json'; diff --git a/api_docs/kbn_ci_stats_performance_metrics.mdx b/api_docs/kbn_ci_stats_performance_metrics.mdx index a3510af5f70b1..71b3793b5edba 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: 2022-09-30 +date: 2022-10-01 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/ci-stats-performance-metrics'] --- import kbnCiStatsPerformanceMetricsObj from './kbn_ci_stats_performance_metrics.devdocs.json'; diff --git a/api_docs/kbn_ci_stats_reporter.mdx b/api_docs/kbn_ci_stats_reporter.mdx index c1bdc23214055..b2e6e11bf6f52 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: 2022-09-30 +date: 2022-10-01 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/ci-stats-reporter'] --- import kbnCiStatsReporterObj from './kbn_ci_stats_reporter.devdocs.json'; diff --git a/api_docs/kbn_cli_dev_mode.mdx b/api_docs/kbn_cli_dev_mode.mdx index dd6763ce0a98c..741e1c8d09dcc 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: 2022-09-30 +date: 2022-10-01 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/cli-dev-mode'] --- import kbnCliDevModeObj from './kbn_cli_dev_mode.devdocs.json'; diff --git a/api_docs/kbn_coloring.mdx b/api_docs/kbn_coloring.mdx index b8a547e074cd5..534685b36cd21 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: 2022-09-30 +date: 2022-10-01 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/coloring'] --- import kbnColoringObj from './kbn_coloring.devdocs.json'; diff --git a/api_docs/kbn_config.mdx b/api_docs/kbn_config.mdx index f2993b49d5f86..3ff3d642b506d 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: 2022-09-30 +date: 2022-10-01 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/config'] --- import kbnConfigObj from './kbn_config.devdocs.json'; diff --git a/api_docs/kbn_config_mocks.mdx b/api_docs/kbn_config_mocks.mdx index 62491682503dc..67fdb94f78f3b 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: 2022-09-30 +date: 2022-10-01 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/config-mocks'] --- import kbnConfigMocksObj from './kbn_config_mocks.devdocs.json'; diff --git a/api_docs/kbn_config_schema.mdx b/api_docs/kbn_config_schema.mdx index cf14ce5a40d53..3b43b92a5565c 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: 2022-09-30 +date: 2022-10-01 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/config-schema'] --- import kbnConfigSchemaObj from './kbn_config_schema.devdocs.json'; diff --git a/api_docs/kbn_content_management_table_list.mdx b/api_docs/kbn_content_management_table_list.mdx index 11c9a0928b583..84ad21fc47fdb 100644 --- a/api_docs/kbn_content_management_table_list.mdx +++ b/api_docs/kbn_content_management_table_list.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-content-management-table-list title: "@kbn/content-management-table-list" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/content-management-table-list plugin -date: 2022-09-30 +date: 2022-10-01 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/content-management-table-list'] --- import kbnContentManagementTableListObj from './kbn_content_management_table_list.devdocs.json'; diff --git a/api_docs/kbn_core_analytics_browser.mdx b/api_docs/kbn_core_analytics_browser.mdx index 76cb685c99f35..8c307425ee040 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: 2022-09-30 +date: 2022-10-01 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-analytics-browser'] --- import kbnCoreAnalyticsBrowserObj from './kbn_core_analytics_browser.devdocs.json'; diff --git a/api_docs/kbn_core_analytics_browser_internal.mdx b/api_docs/kbn_core_analytics_browser_internal.mdx index 6c4d86bf0b722..3212fb673e27f 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: 2022-09-30 +date: 2022-10-01 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-analytics-browser-internal'] --- import kbnCoreAnalyticsBrowserInternalObj from './kbn_core_analytics_browser_internal.devdocs.json'; diff --git a/api_docs/kbn_core_analytics_browser_mocks.mdx b/api_docs/kbn_core_analytics_browser_mocks.mdx index 34614865e7e8f..4e9dd3d54d358 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: 2022-09-30 +date: 2022-10-01 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-analytics-browser-mocks'] --- import kbnCoreAnalyticsBrowserMocksObj from './kbn_core_analytics_browser_mocks.devdocs.json'; diff --git a/api_docs/kbn_core_analytics_server.mdx b/api_docs/kbn_core_analytics_server.mdx index 1342382025c64..7bd027365d6e9 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: 2022-09-30 +date: 2022-10-01 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-analytics-server'] --- import kbnCoreAnalyticsServerObj from './kbn_core_analytics_server.devdocs.json'; diff --git a/api_docs/kbn_core_analytics_server_internal.mdx b/api_docs/kbn_core_analytics_server_internal.mdx index da2faf312d367..76cd9dba2db5c 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: 2022-09-30 +date: 2022-10-01 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-analytics-server-internal'] --- import kbnCoreAnalyticsServerInternalObj from './kbn_core_analytics_server_internal.devdocs.json'; diff --git a/api_docs/kbn_core_analytics_server_mocks.mdx b/api_docs/kbn_core_analytics_server_mocks.mdx index f2810dc16d62c..bfa75dd3afd7a 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: 2022-09-30 +date: 2022-10-01 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-analytics-server-mocks'] --- import kbnCoreAnalyticsServerMocksObj from './kbn_core_analytics_server_mocks.devdocs.json'; diff --git a/api_docs/kbn_core_application_browser.mdx b/api_docs/kbn_core_application_browser.mdx index b002114d3e337..7f9da63f298a2 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: 2022-09-30 +date: 2022-10-01 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-application-browser'] --- import kbnCoreApplicationBrowserObj from './kbn_core_application_browser.devdocs.json'; diff --git a/api_docs/kbn_core_application_browser_internal.mdx b/api_docs/kbn_core_application_browser_internal.mdx index c726e5f8b7876..2f2615a48955e 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: 2022-09-30 +date: 2022-10-01 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-application-browser-internal'] --- import kbnCoreApplicationBrowserInternalObj from './kbn_core_application_browser_internal.devdocs.json'; diff --git a/api_docs/kbn_core_application_browser_mocks.mdx b/api_docs/kbn_core_application_browser_mocks.mdx index fe234ab156ecd..9c806330e3668 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: 2022-09-30 +date: 2022-10-01 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-application-browser-mocks'] --- import kbnCoreApplicationBrowserMocksObj from './kbn_core_application_browser_mocks.devdocs.json'; diff --git a/api_docs/kbn_core_application_common.mdx b/api_docs/kbn_core_application_common.mdx index f0450f42dbb9d..9294b5b708f88 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: 2022-09-30 +date: 2022-10-01 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-application-common'] --- import kbnCoreApplicationCommonObj from './kbn_core_application_common.devdocs.json'; diff --git a/api_docs/kbn_core_apps_browser_internal.mdx b/api_docs/kbn_core_apps_browser_internal.mdx index b486574b88c2c..af582f9ff198f 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: 2022-09-30 +date: 2022-10-01 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-apps-browser-internal'] --- import kbnCoreAppsBrowserInternalObj from './kbn_core_apps_browser_internal.devdocs.json'; diff --git a/api_docs/kbn_core_apps_browser_mocks.mdx b/api_docs/kbn_core_apps_browser_mocks.mdx index 6c09e87c4cc07..8af8f902e5408 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: 2022-09-30 +date: 2022-10-01 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-apps-browser-mocks'] --- import kbnCoreAppsBrowserMocksObj from './kbn_core_apps_browser_mocks.devdocs.json'; diff --git a/api_docs/kbn_core_base_browser_mocks.mdx b/api_docs/kbn_core_base_browser_mocks.mdx index 6f23a43cb533a..aaf8373e9ca7c 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: 2022-09-30 +date: 2022-10-01 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-base-browser-mocks'] --- import kbnCoreBaseBrowserMocksObj from './kbn_core_base_browser_mocks.devdocs.json'; diff --git a/api_docs/kbn_core_base_common.mdx b/api_docs/kbn_core_base_common.mdx index 98cc757ce42de..9ed7dbaa5e2d6 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: 2022-09-30 +date: 2022-10-01 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-base-common'] --- import kbnCoreBaseCommonObj from './kbn_core_base_common.devdocs.json'; diff --git a/api_docs/kbn_core_base_server_internal.mdx b/api_docs/kbn_core_base_server_internal.mdx index 69b473e30ee8a..8186b42e0220e 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: 2022-09-30 +date: 2022-10-01 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-base-server-internal'] --- import kbnCoreBaseServerInternalObj from './kbn_core_base_server_internal.devdocs.json'; diff --git a/api_docs/kbn_core_base_server_mocks.mdx b/api_docs/kbn_core_base_server_mocks.mdx index be0a688924dac..a0c063e840094 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: 2022-09-30 +date: 2022-10-01 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-base-server-mocks'] --- import kbnCoreBaseServerMocksObj from './kbn_core_base_server_mocks.devdocs.json'; diff --git a/api_docs/kbn_core_capabilities_browser_mocks.mdx b/api_docs/kbn_core_capabilities_browser_mocks.mdx index 8eee81e91198b..221ae3385ddd6 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: 2022-09-30 +date: 2022-10-01 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-capabilities-browser-mocks'] --- import kbnCoreCapabilitiesBrowserMocksObj from './kbn_core_capabilities_browser_mocks.devdocs.json'; diff --git a/api_docs/kbn_core_capabilities_common.mdx b/api_docs/kbn_core_capabilities_common.mdx index 48ebe7f76b165..2156646c76f0a 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: 2022-09-30 +date: 2022-10-01 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-capabilities-common'] --- import kbnCoreCapabilitiesCommonObj from './kbn_core_capabilities_common.devdocs.json'; diff --git a/api_docs/kbn_core_capabilities_server.mdx b/api_docs/kbn_core_capabilities_server.mdx index 6c6318b812457..f6c8668e76f26 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: 2022-09-30 +date: 2022-10-01 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-capabilities-server'] --- import kbnCoreCapabilitiesServerObj from './kbn_core_capabilities_server.devdocs.json'; diff --git a/api_docs/kbn_core_capabilities_server_mocks.mdx b/api_docs/kbn_core_capabilities_server_mocks.mdx index 0087fd5a98375..3d39b753f2abb 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: 2022-09-30 +date: 2022-10-01 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-capabilities-server-mocks'] --- import kbnCoreCapabilitiesServerMocksObj from './kbn_core_capabilities_server_mocks.devdocs.json'; diff --git a/api_docs/kbn_core_chrome_browser.mdx b/api_docs/kbn_core_chrome_browser.mdx index cb7a24e95c615..6e6ffeac0f653 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: 2022-09-30 +date: 2022-10-01 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-chrome-browser'] --- import kbnCoreChromeBrowserObj from './kbn_core_chrome_browser.devdocs.json'; diff --git a/api_docs/kbn_core_chrome_browser_mocks.mdx b/api_docs/kbn_core_chrome_browser_mocks.mdx index b98bb79392f8a..203f9a365fdef 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: 2022-09-30 +date: 2022-10-01 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-chrome-browser-mocks'] --- import kbnCoreChromeBrowserMocksObj from './kbn_core_chrome_browser_mocks.devdocs.json'; diff --git a/api_docs/kbn_core_config_server_internal.mdx b/api_docs/kbn_core_config_server_internal.mdx index 83a912dd03fdb..cd573bfd8776c 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: 2022-09-30 +date: 2022-10-01 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-config-server-internal'] --- import kbnCoreConfigServerInternalObj from './kbn_core_config_server_internal.devdocs.json'; diff --git a/api_docs/kbn_core_deprecations_browser.mdx b/api_docs/kbn_core_deprecations_browser.mdx index a3f274459a413..e2134b925ba81 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: 2022-09-30 +date: 2022-10-01 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-deprecations-browser'] --- import kbnCoreDeprecationsBrowserObj from './kbn_core_deprecations_browser.devdocs.json'; diff --git a/api_docs/kbn_core_deprecations_browser_internal.mdx b/api_docs/kbn_core_deprecations_browser_internal.mdx index eeb3c991a0d63..9fc96d5d598f3 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: 2022-09-30 +date: 2022-10-01 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-deprecations-browser-internal'] --- import kbnCoreDeprecationsBrowserInternalObj from './kbn_core_deprecations_browser_internal.devdocs.json'; diff --git a/api_docs/kbn_core_deprecations_browser_mocks.mdx b/api_docs/kbn_core_deprecations_browser_mocks.mdx index 2eb4bda78a5c1..7a6634ac7f8da 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: 2022-09-30 +date: 2022-10-01 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-deprecations-browser-mocks'] --- import kbnCoreDeprecationsBrowserMocksObj from './kbn_core_deprecations_browser_mocks.devdocs.json'; diff --git a/api_docs/kbn_core_deprecations_common.mdx b/api_docs/kbn_core_deprecations_common.mdx index 1edd0ca68c530..edcf87b960941 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: 2022-09-30 +date: 2022-10-01 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-deprecations-common'] --- import kbnCoreDeprecationsCommonObj from './kbn_core_deprecations_common.devdocs.json'; diff --git a/api_docs/kbn_core_deprecations_server.mdx b/api_docs/kbn_core_deprecations_server.mdx index 35470535f96e8..35e8a6ce26327 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: 2022-09-30 +date: 2022-10-01 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-deprecations-server'] --- import kbnCoreDeprecationsServerObj from './kbn_core_deprecations_server.devdocs.json'; diff --git a/api_docs/kbn_core_deprecations_server_internal.mdx b/api_docs/kbn_core_deprecations_server_internal.mdx index b9f9b064de302..8167097daa0d7 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: 2022-09-30 +date: 2022-10-01 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-deprecations-server-internal'] --- import kbnCoreDeprecationsServerInternalObj from './kbn_core_deprecations_server_internal.devdocs.json'; diff --git a/api_docs/kbn_core_deprecations_server_mocks.mdx b/api_docs/kbn_core_deprecations_server_mocks.mdx index 118225780a1f2..b45ecd8257b07 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: 2022-09-30 +date: 2022-10-01 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-deprecations-server-mocks'] --- import kbnCoreDeprecationsServerMocksObj from './kbn_core_deprecations_server_mocks.devdocs.json'; diff --git a/api_docs/kbn_core_doc_links_browser.mdx b/api_docs/kbn_core_doc_links_browser.mdx index c1331c1caec0f..031456455b1ee 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: 2022-09-30 +date: 2022-10-01 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-doc-links-browser'] --- import kbnCoreDocLinksBrowserObj from './kbn_core_doc_links_browser.devdocs.json'; diff --git a/api_docs/kbn_core_doc_links_browser_mocks.mdx b/api_docs/kbn_core_doc_links_browser_mocks.mdx index 7c77af97bad80..381310fcf1546 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: 2022-09-30 +date: 2022-10-01 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-doc-links-browser-mocks'] --- import kbnCoreDocLinksBrowserMocksObj from './kbn_core_doc_links_browser_mocks.devdocs.json'; diff --git a/api_docs/kbn_core_doc_links_server.mdx b/api_docs/kbn_core_doc_links_server.mdx index 3e100243e2116..05f768b81b3ca 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: 2022-09-30 +date: 2022-10-01 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-doc-links-server'] --- import kbnCoreDocLinksServerObj from './kbn_core_doc_links_server.devdocs.json'; diff --git a/api_docs/kbn_core_doc_links_server_mocks.mdx b/api_docs/kbn_core_doc_links_server_mocks.mdx index 83c04c073ea9c..52776680286a7 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: 2022-09-30 +date: 2022-10-01 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-doc-links-server-mocks'] --- import kbnCoreDocLinksServerMocksObj from './kbn_core_doc_links_server_mocks.devdocs.json'; diff --git a/api_docs/kbn_core_elasticsearch_client_server_internal.mdx b/api_docs/kbn_core_elasticsearch_client_server_internal.mdx index ea9ad18fb0ac4..63cc80d8fa739 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: 2022-09-30 +date: 2022-10-01 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-elasticsearch-client-server-internal'] --- import kbnCoreElasticsearchClientServerInternalObj from './kbn_core_elasticsearch_client_server_internal.devdocs.json'; diff --git a/api_docs/kbn_core_elasticsearch_client_server_mocks.mdx b/api_docs/kbn_core_elasticsearch_client_server_mocks.mdx index 524e9382c019f..309f4ef8839d3 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: 2022-09-30 +date: 2022-10-01 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-elasticsearch-client-server-mocks'] --- import kbnCoreElasticsearchClientServerMocksObj from './kbn_core_elasticsearch_client_server_mocks.devdocs.json'; diff --git a/api_docs/kbn_core_elasticsearch_server.mdx b/api_docs/kbn_core_elasticsearch_server.mdx index 2c5d8ce0deeed..d4df75707a940 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: 2022-09-30 +date: 2022-10-01 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-elasticsearch-server'] --- import kbnCoreElasticsearchServerObj from './kbn_core_elasticsearch_server.devdocs.json'; diff --git a/api_docs/kbn_core_elasticsearch_server_internal.mdx b/api_docs/kbn_core_elasticsearch_server_internal.mdx index dd5df0e31e51e..a5ade116a7c0e 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: 2022-09-30 +date: 2022-10-01 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-elasticsearch-server-internal'] --- import kbnCoreElasticsearchServerInternalObj from './kbn_core_elasticsearch_server_internal.devdocs.json'; diff --git a/api_docs/kbn_core_elasticsearch_server_mocks.mdx b/api_docs/kbn_core_elasticsearch_server_mocks.mdx index 3e6df91ab7eb5..9a09fe50975c2 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: 2022-09-30 +date: 2022-10-01 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-elasticsearch-server-mocks'] --- import kbnCoreElasticsearchServerMocksObj from './kbn_core_elasticsearch_server_mocks.devdocs.json'; diff --git a/api_docs/kbn_core_environment_server_internal.mdx b/api_docs/kbn_core_environment_server_internal.mdx index 679fdb16b2af6..7fffb0ccbd3d1 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: 2022-09-30 +date: 2022-10-01 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-environment-server-internal'] --- import kbnCoreEnvironmentServerInternalObj from './kbn_core_environment_server_internal.devdocs.json'; diff --git a/api_docs/kbn_core_environment_server_mocks.mdx b/api_docs/kbn_core_environment_server_mocks.mdx index bdb596d8b29e8..7c8733b369f01 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: 2022-09-30 +date: 2022-10-01 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-environment-server-mocks'] --- import kbnCoreEnvironmentServerMocksObj from './kbn_core_environment_server_mocks.devdocs.json'; diff --git a/api_docs/kbn_core_execution_context_browser.mdx b/api_docs/kbn_core_execution_context_browser.mdx index 2832e5b25baa2..f283e05e563d0 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: 2022-09-30 +date: 2022-10-01 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-execution-context-browser'] --- import kbnCoreExecutionContextBrowserObj from './kbn_core_execution_context_browser.devdocs.json'; diff --git a/api_docs/kbn_core_execution_context_browser_internal.mdx b/api_docs/kbn_core_execution_context_browser_internal.mdx index 765f996d9c461..d40d5501ca99c 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: 2022-09-30 +date: 2022-10-01 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-execution-context-browser-internal'] --- import kbnCoreExecutionContextBrowserInternalObj from './kbn_core_execution_context_browser_internal.devdocs.json'; diff --git a/api_docs/kbn_core_execution_context_browser_mocks.mdx b/api_docs/kbn_core_execution_context_browser_mocks.mdx index dd30432a2a83c..cc1a420ccba12 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: 2022-09-30 +date: 2022-10-01 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-execution-context-browser-mocks'] --- import kbnCoreExecutionContextBrowserMocksObj from './kbn_core_execution_context_browser_mocks.devdocs.json'; diff --git a/api_docs/kbn_core_execution_context_common.mdx b/api_docs/kbn_core_execution_context_common.mdx index f91bd759633c2..25f0346340ea2 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: 2022-09-30 +date: 2022-10-01 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-execution-context-common'] --- import kbnCoreExecutionContextCommonObj from './kbn_core_execution_context_common.devdocs.json'; diff --git a/api_docs/kbn_core_execution_context_server.mdx b/api_docs/kbn_core_execution_context_server.mdx index 06e0a3a543a06..87eb2c5dd2fdc 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: 2022-09-30 +date: 2022-10-01 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-execution-context-server'] --- import kbnCoreExecutionContextServerObj from './kbn_core_execution_context_server.devdocs.json'; diff --git a/api_docs/kbn_core_execution_context_server_internal.mdx b/api_docs/kbn_core_execution_context_server_internal.mdx index 031735030635b..1023c4c175a35 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: 2022-09-30 +date: 2022-10-01 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-execution-context-server-internal'] --- import kbnCoreExecutionContextServerInternalObj from './kbn_core_execution_context_server_internal.devdocs.json'; diff --git a/api_docs/kbn_core_execution_context_server_mocks.mdx b/api_docs/kbn_core_execution_context_server_mocks.mdx index 5a354609a0a38..20aa61f141c8d 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: 2022-09-30 +date: 2022-10-01 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-execution-context-server-mocks'] --- import kbnCoreExecutionContextServerMocksObj from './kbn_core_execution_context_server_mocks.devdocs.json'; diff --git a/api_docs/kbn_core_fatal_errors_browser.mdx b/api_docs/kbn_core_fatal_errors_browser.mdx index d520c20c2d3bb..4fdaf9d97f6fd 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: 2022-09-30 +date: 2022-10-01 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-fatal-errors-browser'] --- import kbnCoreFatalErrorsBrowserObj from './kbn_core_fatal_errors_browser.devdocs.json'; diff --git a/api_docs/kbn_core_fatal_errors_browser_mocks.mdx b/api_docs/kbn_core_fatal_errors_browser_mocks.mdx index bc6c34d1c07f7..81e62c8036e09 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: 2022-09-30 +date: 2022-10-01 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-fatal-errors-browser-mocks'] --- import kbnCoreFatalErrorsBrowserMocksObj from './kbn_core_fatal_errors_browser_mocks.devdocs.json'; diff --git a/api_docs/kbn_core_http_browser.mdx b/api_docs/kbn_core_http_browser.mdx index 3faf57a4c881c..548174fbd5d8a 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: 2022-09-30 +date: 2022-10-01 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-http-browser'] --- import kbnCoreHttpBrowserObj from './kbn_core_http_browser.devdocs.json'; diff --git a/api_docs/kbn_core_http_browser_internal.mdx b/api_docs/kbn_core_http_browser_internal.mdx index 83a7e913c0825..16c6d6b510208 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: 2022-09-30 +date: 2022-10-01 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-http-browser-internal'] --- import kbnCoreHttpBrowserInternalObj from './kbn_core_http_browser_internal.devdocs.json'; diff --git a/api_docs/kbn_core_http_browser_mocks.mdx b/api_docs/kbn_core_http_browser_mocks.mdx index 10055c2130fd2..094479784c51c 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: 2022-09-30 +date: 2022-10-01 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-http-browser-mocks'] --- import kbnCoreHttpBrowserMocksObj from './kbn_core_http_browser_mocks.devdocs.json'; diff --git a/api_docs/kbn_core_http_common.mdx b/api_docs/kbn_core_http_common.mdx index acb60f56ebfc7..41f882912cfec 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: 2022-09-30 +date: 2022-10-01 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-http-common'] --- import kbnCoreHttpCommonObj from './kbn_core_http_common.devdocs.json'; diff --git a/api_docs/kbn_core_http_context_server_mocks.mdx b/api_docs/kbn_core_http_context_server_mocks.mdx index 9130f1f857a9e..b00edeb7d68be 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: 2022-09-30 +date: 2022-10-01 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-http-context-server-mocks'] --- import kbnCoreHttpContextServerMocksObj from './kbn_core_http_context_server_mocks.devdocs.json'; diff --git a/api_docs/kbn_core_http_request_handler_context_server.mdx b/api_docs/kbn_core_http_request_handler_context_server.mdx index 4d1bfc14b6a63..17d48963b8b76 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: 2022-09-30 +date: 2022-10-01 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-http-request-handler-context-server'] --- import kbnCoreHttpRequestHandlerContextServerObj from './kbn_core_http_request_handler_context_server.devdocs.json'; diff --git a/api_docs/kbn_core_http_router_server_internal.mdx b/api_docs/kbn_core_http_router_server_internal.mdx index d548463315b24..2ee35b66a8f69 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: 2022-09-30 +date: 2022-10-01 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-http-router-server-internal'] --- import kbnCoreHttpRouterServerInternalObj from './kbn_core_http_router_server_internal.devdocs.json'; diff --git a/api_docs/kbn_core_http_router_server_mocks.mdx b/api_docs/kbn_core_http_router_server_mocks.mdx index b873c4a15d6e2..750d6c7b3befb 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: 2022-09-30 +date: 2022-10-01 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-http-router-server-mocks'] --- import kbnCoreHttpRouterServerMocksObj from './kbn_core_http_router_server_mocks.devdocs.json'; diff --git a/api_docs/kbn_core_http_server.mdx b/api_docs/kbn_core_http_server.mdx index 7e6e71fa61954..3a9e92dbe6507 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: 2022-09-30 +date: 2022-10-01 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-http-server'] --- import kbnCoreHttpServerObj from './kbn_core_http_server.devdocs.json'; diff --git a/api_docs/kbn_core_http_server_internal.mdx b/api_docs/kbn_core_http_server_internal.mdx index 8186ddd0f39a8..27352519951fb 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: 2022-09-30 +date: 2022-10-01 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-http-server-internal'] --- import kbnCoreHttpServerInternalObj from './kbn_core_http_server_internal.devdocs.json'; diff --git a/api_docs/kbn_core_http_server_mocks.mdx b/api_docs/kbn_core_http_server_mocks.mdx index fdeeded54cd66..2aa52e0dc1c00 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: 2022-09-30 +date: 2022-10-01 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-http-server-mocks'] --- import kbnCoreHttpServerMocksObj from './kbn_core_http_server_mocks.devdocs.json'; diff --git a/api_docs/kbn_core_i18n_browser.mdx b/api_docs/kbn_core_i18n_browser.mdx index cc8e5edcd399e..a8e82e67d22cc 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: 2022-09-30 +date: 2022-10-01 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-i18n-browser'] --- import kbnCoreI18nBrowserObj from './kbn_core_i18n_browser.devdocs.json'; diff --git a/api_docs/kbn_core_i18n_browser_mocks.mdx b/api_docs/kbn_core_i18n_browser_mocks.mdx index 2ca59b2bad48e..10be37f40c29e 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: 2022-09-30 +date: 2022-10-01 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-i18n-browser-mocks'] --- import kbnCoreI18nBrowserMocksObj from './kbn_core_i18n_browser_mocks.devdocs.json'; diff --git a/api_docs/kbn_core_i18n_server.mdx b/api_docs/kbn_core_i18n_server.mdx index ba5a6502efe18..ef29632390089 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: 2022-09-30 +date: 2022-10-01 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-i18n-server'] --- import kbnCoreI18nServerObj from './kbn_core_i18n_server.devdocs.json'; diff --git a/api_docs/kbn_core_i18n_server_internal.mdx b/api_docs/kbn_core_i18n_server_internal.mdx index 8847538b3a2dd..d6ed176629a21 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: 2022-09-30 +date: 2022-10-01 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-i18n-server-internal'] --- import kbnCoreI18nServerInternalObj from './kbn_core_i18n_server_internal.devdocs.json'; diff --git a/api_docs/kbn_core_i18n_server_mocks.mdx b/api_docs/kbn_core_i18n_server_mocks.mdx index e992ae37a3b76..ee1ed897ede0f 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: 2022-09-30 +date: 2022-10-01 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-i18n-server-mocks'] --- import kbnCoreI18nServerMocksObj from './kbn_core_i18n_server_mocks.devdocs.json'; diff --git a/api_docs/kbn_core_injected_metadata_browser.mdx b/api_docs/kbn_core_injected_metadata_browser.mdx index 39b237eedd45f..7b120559dc173 100644 --- a/api_docs/kbn_core_injected_metadata_browser.mdx +++ b/api_docs/kbn_core_injected_metadata_browser.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-injected-metadata-browser title: "@kbn/core-injected-metadata-browser" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-injected-metadata-browser plugin -date: 2022-09-30 +date: 2022-10-01 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-injected-metadata-browser'] --- import kbnCoreInjectedMetadataBrowserObj from './kbn_core_injected_metadata_browser.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 9e750bb7dba99..3e7af178ec124 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: 2022-09-30 +date: 2022-10-01 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-injected-metadata-browser-mocks'] --- import kbnCoreInjectedMetadataBrowserMocksObj from './kbn_core_injected_metadata_browser_mocks.devdocs.json'; diff --git a/api_docs/kbn_core_integrations_browser_internal.mdx b/api_docs/kbn_core_integrations_browser_internal.mdx index ed82f8a5dea47..d2aabf046c88e 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: 2022-09-30 +date: 2022-10-01 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-integrations-browser-internal'] --- import kbnCoreIntegrationsBrowserInternalObj from './kbn_core_integrations_browser_internal.devdocs.json'; diff --git a/api_docs/kbn_core_integrations_browser_mocks.mdx b/api_docs/kbn_core_integrations_browser_mocks.mdx index f9f9e8a948c63..bc12a2785cc02 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: 2022-09-30 +date: 2022-10-01 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-integrations-browser-mocks'] --- import kbnCoreIntegrationsBrowserMocksObj from './kbn_core_integrations_browser_mocks.devdocs.json'; diff --git a/api_docs/kbn_core_lifecycle_browser.mdx b/api_docs/kbn_core_lifecycle_browser.mdx index f9376e67d6990..7480b362f29b9 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: 2022-09-30 +date: 2022-10-01 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-lifecycle-browser'] --- import kbnCoreLifecycleBrowserObj from './kbn_core_lifecycle_browser.devdocs.json'; diff --git a/api_docs/kbn_core_lifecycle_browser_mocks.mdx b/api_docs/kbn_core_lifecycle_browser_mocks.mdx index fa9f4053803d0..f21296396e1de 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: 2022-09-30 +date: 2022-10-01 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-lifecycle-browser-mocks'] --- import kbnCoreLifecycleBrowserMocksObj from './kbn_core_lifecycle_browser_mocks.devdocs.json'; diff --git a/api_docs/kbn_core_logging_server.mdx b/api_docs/kbn_core_logging_server.mdx index 7f27d332faca9..61be5ea720a47 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: 2022-09-30 +date: 2022-10-01 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-logging-server'] --- import kbnCoreLoggingServerObj from './kbn_core_logging_server.devdocs.json'; diff --git a/api_docs/kbn_core_logging_server_internal.mdx b/api_docs/kbn_core_logging_server_internal.mdx index 3d5bfb44851bf..af6dd35e83129 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: 2022-09-30 +date: 2022-10-01 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-logging-server-internal'] --- import kbnCoreLoggingServerInternalObj from './kbn_core_logging_server_internal.devdocs.json'; diff --git a/api_docs/kbn_core_logging_server_mocks.mdx b/api_docs/kbn_core_logging_server_mocks.mdx index 84ab6fff88ffe..a09ca7932e57b 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: 2022-09-30 +date: 2022-10-01 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-logging-server-mocks'] --- import kbnCoreLoggingServerMocksObj from './kbn_core_logging_server_mocks.devdocs.json'; diff --git a/api_docs/kbn_core_metrics_collectors_server_internal.mdx b/api_docs/kbn_core_metrics_collectors_server_internal.mdx index 3e9e378809f2a..c01ad905bc16f 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: 2022-09-30 +date: 2022-10-01 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-metrics-collectors-server-internal'] --- import kbnCoreMetricsCollectorsServerInternalObj from './kbn_core_metrics_collectors_server_internal.devdocs.json'; diff --git a/api_docs/kbn_core_metrics_collectors_server_mocks.mdx b/api_docs/kbn_core_metrics_collectors_server_mocks.mdx index 6f502bf2c3bc2..d31c4dd48ee55 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: 2022-09-30 +date: 2022-10-01 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-metrics-collectors-server-mocks'] --- import kbnCoreMetricsCollectorsServerMocksObj from './kbn_core_metrics_collectors_server_mocks.devdocs.json'; diff --git a/api_docs/kbn_core_metrics_server.mdx b/api_docs/kbn_core_metrics_server.mdx index 85f6d9268f7c9..9f15f6cf73905 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: 2022-09-30 +date: 2022-10-01 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-metrics-server'] --- import kbnCoreMetricsServerObj from './kbn_core_metrics_server.devdocs.json'; diff --git a/api_docs/kbn_core_metrics_server_internal.mdx b/api_docs/kbn_core_metrics_server_internal.mdx index fcc2c94523111..e93ec0476f250 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: 2022-09-30 +date: 2022-10-01 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-metrics-server-internal'] --- import kbnCoreMetricsServerInternalObj from './kbn_core_metrics_server_internal.devdocs.json'; diff --git a/api_docs/kbn_core_metrics_server_mocks.mdx b/api_docs/kbn_core_metrics_server_mocks.mdx index 5683a2d792ef1..5a94cd10fcb04 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: 2022-09-30 +date: 2022-10-01 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-metrics-server-mocks'] --- import kbnCoreMetricsServerMocksObj from './kbn_core_metrics_server_mocks.devdocs.json'; diff --git a/api_docs/kbn_core_mount_utils_browser.mdx b/api_docs/kbn_core_mount_utils_browser.mdx index 8b1732b474d94..43e64914cfb32 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: 2022-09-30 +date: 2022-10-01 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-mount-utils-browser'] --- import kbnCoreMountUtilsBrowserObj from './kbn_core_mount_utils_browser.devdocs.json'; diff --git a/api_docs/kbn_core_node_server.mdx b/api_docs/kbn_core_node_server.mdx index cb8ab729b92d9..557e650a73b5d 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: 2022-09-30 +date: 2022-10-01 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-node-server'] --- import kbnCoreNodeServerObj from './kbn_core_node_server.devdocs.json'; diff --git a/api_docs/kbn_core_node_server_internal.mdx b/api_docs/kbn_core_node_server_internal.mdx index 983e300999f72..a3ebabf7f32c7 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: 2022-09-30 +date: 2022-10-01 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-node-server-internal'] --- import kbnCoreNodeServerInternalObj from './kbn_core_node_server_internal.devdocs.json'; diff --git a/api_docs/kbn_core_node_server_mocks.mdx b/api_docs/kbn_core_node_server_mocks.mdx index 6832c1707041f..804d680bae804 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: 2022-09-30 +date: 2022-10-01 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-node-server-mocks'] --- import kbnCoreNodeServerMocksObj from './kbn_core_node_server_mocks.devdocs.json'; diff --git a/api_docs/kbn_core_notifications_browser.mdx b/api_docs/kbn_core_notifications_browser.mdx index b86953b92d74c..e15645fb9ab88 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: 2022-09-30 +date: 2022-10-01 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-notifications-browser'] --- import kbnCoreNotificationsBrowserObj from './kbn_core_notifications_browser.devdocs.json'; diff --git a/api_docs/kbn_core_notifications_browser_internal.mdx b/api_docs/kbn_core_notifications_browser_internal.mdx index d400da3e6594b..a64c369bcba42 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: 2022-09-30 +date: 2022-10-01 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-notifications-browser-internal'] --- import kbnCoreNotificationsBrowserInternalObj from './kbn_core_notifications_browser_internal.devdocs.json'; diff --git a/api_docs/kbn_core_notifications_browser_mocks.mdx b/api_docs/kbn_core_notifications_browser_mocks.mdx index 457f058a1c212..1192b6244a3a2 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: 2022-09-30 +date: 2022-10-01 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-notifications-browser-mocks'] --- import kbnCoreNotificationsBrowserMocksObj from './kbn_core_notifications_browser_mocks.devdocs.json'; diff --git a/api_docs/kbn_core_overlays_browser.mdx b/api_docs/kbn_core_overlays_browser.mdx index 03fa3b8be0798..0eb8bc161976f 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: 2022-09-30 +date: 2022-10-01 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-overlays-browser'] --- import kbnCoreOverlaysBrowserObj from './kbn_core_overlays_browser.devdocs.json'; diff --git a/api_docs/kbn_core_overlays_browser_internal.mdx b/api_docs/kbn_core_overlays_browser_internal.mdx index 187d1c690e2df..d8b0afcc889b6 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: 2022-09-30 +date: 2022-10-01 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-overlays-browser-internal'] --- import kbnCoreOverlaysBrowserInternalObj from './kbn_core_overlays_browser_internal.devdocs.json'; diff --git a/api_docs/kbn_core_overlays_browser_mocks.mdx b/api_docs/kbn_core_overlays_browser_mocks.mdx index 6dca74dc0384d..7982df2fb243d 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: 2022-09-30 +date: 2022-10-01 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-overlays-browser-mocks'] --- import kbnCoreOverlaysBrowserMocksObj from './kbn_core_overlays_browser_mocks.devdocs.json'; diff --git a/api_docs/kbn_core_plugins_browser.mdx b/api_docs/kbn_core_plugins_browser.mdx index 8ef53aa00edb4..9c70f02f78d00 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: 2022-09-30 +date: 2022-10-01 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-plugins-browser'] --- import kbnCorePluginsBrowserObj from './kbn_core_plugins_browser.devdocs.json'; diff --git a/api_docs/kbn_core_plugins_browser_mocks.mdx b/api_docs/kbn_core_plugins_browser_mocks.mdx index f023cecb27a9a..6bd600cfb198c 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: 2022-09-30 +date: 2022-10-01 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-plugins-browser-mocks'] --- import kbnCorePluginsBrowserMocksObj from './kbn_core_plugins_browser_mocks.devdocs.json'; diff --git a/api_docs/kbn_core_preboot_server.mdx b/api_docs/kbn_core_preboot_server.mdx index 89514146e62f3..be27903d8b485 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: 2022-09-30 +date: 2022-10-01 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-preboot-server'] --- import kbnCorePrebootServerObj from './kbn_core_preboot_server.devdocs.json'; diff --git a/api_docs/kbn_core_preboot_server_mocks.mdx b/api_docs/kbn_core_preboot_server_mocks.mdx index 5f530e17cbf2f..b4745db58332c 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: 2022-09-30 +date: 2022-10-01 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-preboot-server-mocks'] --- import kbnCorePrebootServerMocksObj from './kbn_core_preboot_server_mocks.devdocs.json'; diff --git a/api_docs/kbn_core_rendering_browser_mocks.mdx b/api_docs/kbn_core_rendering_browser_mocks.mdx index 3f6c17f74aba3..47752b2ae6726 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: 2022-09-30 +date: 2022-10-01 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-rendering-browser-mocks'] --- import kbnCoreRenderingBrowserMocksObj from './kbn_core_rendering_browser_mocks.devdocs.json'; diff --git a/api_docs/kbn_core_saved_objects_api_browser.mdx b/api_docs/kbn_core_saved_objects_api_browser.mdx index 4d731485bd3bb..856ab9b0e54bf 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: 2022-09-30 +date: 2022-10-01 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-saved-objects-api-browser'] --- import kbnCoreSavedObjectsApiBrowserObj from './kbn_core_saved_objects_api_browser.devdocs.json'; diff --git a/api_docs/kbn_core_saved_objects_api_server.mdx b/api_docs/kbn_core_saved_objects_api_server.mdx index 6297a248ab161..79709ae898489 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: 2022-09-30 +date: 2022-10-01 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-saved-objects-api-server'] --- import kbnCoreSavedObjectsApiServerObj from './kbn_core_saved_objects_api_server.devdocs.json'; diff --git a/api_docs/kbn_core_saved_objects_api_server_internal.mdx b/api_docs/kbn_core_saved_objects_api_server_internal.mdx index 7784682515d4f..b88c155714125 100644 --- a/api_docs/kbn_core_saved_objects_api_server_internal.mdx +++ b/api_docs/kbn_core_saved_objects_api_server_internal.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-saved-objects-api-server-internal title: "@kbn/core-saved-objects-api-server-internal" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-saved-objects-api-server-internal plugin -date: 2022-09-30 +date: 2022-10-01 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-saved-objects-api-server-internal'] --- import kbnCoreSavedObjectsApiServerInternalObj from './kbn_core_saved_objects_api_server_internal.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 9b590bd554e8a..f28c4920181cf 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: 2022-09-30 +date: 2022-10-01 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-saved-objects-api-server-mocks'] --- import kbnCoreSavedObjectsApiServerMocksObj from './kbn_core_saved_objects_api_server_mocks.devdocs.json'; diff --git a/api_docs/kbn_core_saved_objects_base_server_internal.mdx b/api_docs/kbn_core_saved_objects_base_server_internal.mdx index 321c7d8761b6d..2bf85267549ab 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: 2022-09-30 +date: 2022-10-01 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-saved-objects-base-server-internal'] --- import kbnCoreSavedObjectsBaseServerInternalObj from './kbn_core_saved_objects_base_server_internal.devdocs.json'; diff --git a/api_docs/kbn_core_saved_objects_base_server_mocks.mdx b/api_docs/kbn_core_saved_objects_base_server_mocks.mdx index 13287c8f8e30a..3f364ace01fd9 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: 2022-09-30 +date: 2022-10-01 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-saved-objects-base-server-mocks'] --- import kbnCoreSavedObjectsBaseServerMocksObj from './kbn_core_saved_objects_base_server_mocks.devdocs.json'; diff --git a/api_docs/kbn_core_saved_objects_browser.mdx b/api_docs/kbn_core_saved_objects_browser.mdx index bb9f4b645d23a..2b9b805aa0d51 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: 2022-09-30 +date: 2022-10-01 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-saved-objects-browser'] --- import kbnCoreSavedObjectsBrowserObj from './kbn_core_saved_objects_browser.devdocs.json'; diff --git a/api_docs/kbn_core_saved_objects_browser_internal.mdx b/api_docs/kbn_core_saved_objects_browser_internal.mdx index 676a2bb193658..94ee2b5e95dd7 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: 2022-09-30 +date: 2022-10-01 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-saved-objects-browser-internal'] --- import kbnCoreSavedObjectsBrowserInternalObj from './kbn_core_saved_objects_browser_internal.devdocs.json'; diff --git a/api_docs/kbn_core_saved_objects_browser_mocks.mdx b/api_docs/kbn_core_saved_objects_browser_mocks.mdx index 93c77175614e7..f2e58e7919b5d 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: 2022-09-30 +date: 2022-10-01 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-saved-objects-browser-mocks'] --- import kbnCoreSavedObjectsBrowserMocksObj from './kbn_core_saved_objects_browser_mocks.devdocs.json'; diff --git a/api_docs/kbn_core_saved_objects_common.mdx b/api_docs/kbn_core_saved_objects_common.mdx index 3d80365761236..2f9686598dae2 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: 2022-09-30 +date: 2022-10-01 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-saved-objects-common'] --- import kbnCoreSavedObjectsCommonObj from './kbn_core_saved_objects_common.devdocs.json'; diff --git a/api_docs/kbn_core_saved_objects_import_export_server_internal.mdx b/api_docs/kbn_core_saved_objects_import_export_server_internal.mdx index d9f37e38d76b3..67a62a9d8f82d 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: 2022-09-30 +date: 2022-10-01 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-saved-objects-import-export-server-internal'] --- import kbnCoreSavedObjectsImportExportServerInternalObj from './kbn_core_saved_objects_import_export_server_internal.devdocs.json'; diff --git a/api_docs/kbn_core_saved_objects_import_export_server_mocks.mdx b/api_docs/kbn_core_saved_objects_import_export_server_mocks.mdx index 77f3b314f46f3..f006d43902df5 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: 2022-09-30 +date: 2022-10-01 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-saved-objects-import-export-server-mocks'] --- import kbnCoreSavedObjectsImportExportServerMocksObj from './kbn_core_saved_objects_import_export_server_mocks.devdocs.json'; diff --git a/api_docs/kbn_core_saved_objects_migration_server_internal.mdx b/api_docs/kbn_core_saved_objects_migration_server_internal.mdx index 1a389643784bf..962c7d5ac0112 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: 2022-09-30 +date: 2022-10-01 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-saved-objects-migration-server-internal'] --- import kbnCoreSavedObjectsMigrationServerInternalObj from './kbn_core_saved_objects_migration_server_internal.devdocs.json'; diff --git a/api_docs/kbn_core_saved_objects_migration_server_mocks.mdx b/api_docs/kbn_core_saved_objects_migration_server_mocks.mdx index 5f12f65364d0e..c07112e6ad54c 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: 2022-09-30 +date: 2022-10-01 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-saved-objects-migration-server-mocks'] --- import kbnCoreSavedObjectsMigrationServerMocksObj from './kbn_core_saved_objects_migration_server_mocks.devdocs.json'; diff --git a/api_docs/kbn_core_saved_objects_server.mdx b/api_docs/kbn_core_saved_objects_server.mdx index 945817f8b5ed2..40a150c47507e 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: 2022-09-30 +date: 2022-10-01 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-saved-objects-server'] --- import kbnCoreSavedObjectsServerObj from './kbn_core_saved_objects_server.devdocs.json'; diff --git a/api_docs/kbn_core_saved_objects_server_internal.mdx b/api_docs/kbn_core_saved_objects_server_internal.mdx index 128f95a96f7fc..9d63c473addd9 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: 2022-09-30 +date: 2022-10-01 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-saved-objects-server-internal'] --- import kbnCoreSavedObjectsServerInternalObj from './kbn_core_saved_objects_server_internal.devdocs.json'; diff --git a/api_docs/kbn_core_saved_objects_server_mocks.mdx b/api_docs/kbn_core_saved_objects_server_mocks.mdx index 52533c9b6fe39..27238b71e9474 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: 2022-09-30 +date: 2022-10-01 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-saved-objects-server-mocks'] --- import kbnCoreSavedObjectsServerMocksObj from './kbn_core_saved_objects_server_mocks.devdocs.json'; diff --git a/api_docs/kbn_core_saved_objects_utils_server.mdx b/api_docs/kbn_core_saved_objects_utils_server.mdx index e1795a3be133e..6ca747830ab44 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: 2022-09-30 +date: 2022-10-01 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-saved-objects-utils-server'] --- import kbnCoreSavedObjectsUtilsServerObj from './kbn_core_saved_objects_utils_server.devdocs.json'; diff --git a/api_docs/kbn_core_status_common.mdx b/api_docs/kbn_core_status_common.mdx index d6ff451e1d1dc..768e628a8af99 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: 2022-09-30 +date: 2022-10-01 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-status-common'] --- import kbnCoreStatusCommonObj from './kbn_core_status_common.devdocs.json'; diff --git a/api_docs/kbn_core_status_common_internal.mdx b/api_docs/kbn_core_status_common_internal.mdx index e3a2233f32a15..970cb7ab087e3 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: 2022-09-30 +date: 2022-10-01 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-status-common-internal'] --- import kbnCoreStatusCommonInternalObj from './kbn_core_status_common_internal.devdocs.json'; diff --git a/api_docs/kbn_core_status_server.mdx b/api_docs/kbn_core_status_server.mdx index 2a073386f7a75..cd7bbe51e9042 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: 2022-09-30 +date: 2022-10-01 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-status-server'] --- import kbnCoreStatusServerObj from './kbn_core_status_server.devdocs.json'; diff --git a/api_docs/kbn_core_status_server_internal.mdx b/api_docs/kbn_core_status_server_internal.mdx index da2f56a7f69ca..da072c5533deb 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: 2022-09-30 +date: 2022-10-01 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-status-server-internal'] --- import kbnCoreStatusServerInternalObj from './kbn_core_status_server_internal.devdocs.json'; diff --git a/api_docs/kbn_core_status_server_mocks.mdx b/api_docs/kbn_core_status_server_mocks.mdx index db4c4003ec798..0a9599ba8cac2 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: 2022-09-30 +date: 2022-10-01 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-status-server-mocks'] --- import kbnCoreStatusServerMocksObj from './kbn_core_status_server_mocks.devdocs.json'; diff --git a/api_docs/kbn_core_test_helpers_deprecations_getters.mdx b/api_docs/kbn_core_test_helpers_deprecations_getters.mdx index c8b0a759e9da9..57940d8a2498b 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: 2022-09-30 +date: 2022-10-01 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-test-helpers-deprecations-getters'] --- import kbnCoreTestHelpersDeprecationsGettersObj from './kbn_core_test_helpers_deprecations_getters.devdocs.json'; diff --git a/api_docs/kbn_core_test_helpers_http_setup_browser.mdx b/api_docs/kbn_core_test_helpers_http_setup_browser.mdx index a46dd1b958ad3..ba62b21644351 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: 2022-09-30 +date: 2022-10-01 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-test-helpers-http-setup-browser'] --- import kbnCoreTestHelpersHttpSetupBrowserObj from './kbn_core_test_helpers_http_setup_browser.devdocs.json'; diff --git a/api_docs/kbn_core_theme_browser.mdx b/api_docs/kbn_core_theme_browser.mdx index bf4074f9ff80f..c3939a291a656 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: 2022-09-30 +date: 2022-10-01 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-theme-browser'] --- import kbnCoreThemeBrowserObj from './kbn_core_theme_browser.devdocs.json'; diff --git a/api_docs/kbn_core_theme_browser_internal.mdx b/api_docs/kbn_core_theme_browser_internal.mdx index 50d9d7c378160..6148fce410496 100644 --- a/api_docs/kbn_core_theme_browser_internal.mdx +++ b/api_docs/kbn_core_theme_browser_internal.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-theme-browser-internal title: "@kbn/core-theme-browser-internal" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-theme-browser-internal plugin -date: 2022-09-30 +date: 2022-10-01 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-theme-browser-internal'] --- import kbnCoreThemeBrowserInternalObj from './kbn_core_theme_browser_internal.devdocs.json'; diff --git a/api_docs/kbn_core_theme_browser_mocks.mdx b/api_docs/kbn_core_theme_browser_mocks.mdx index 876f4bd186bb7..5fb0272483d51 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: 2022-09-30 +date: 2022-10-01 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-theme-browser-mocks'] --- import kbnCoreThemeBrowserMocksObj from './kbn_core_theme_browser_mocks.devdocs.json'; diff --git a/api_docs/kbn_core_ui_settings_browser.mdx b/api_docs/kbn_core_ui_settings_browser.mdx index 433f7324e5491..28de861c3382d 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: 2022-09-30 +date: 2022-10-01 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-ui-settings-browser'] --- import kbnCoreUiSettingsBrowserObj from './kbn_core_ui_settings_browser.devdocs.json'; diff --git a/api_docs/kbn_core_ui_settings_browser_internal.mdx b/api_docs/kbn_core_ui_settings_browser_internal.mdx index 0bf1ae7c24108..d9a6c2b14d251 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: 2022-09-30 +date: 2022-10-01 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-ui-settings-browser-internal'] --- import kbnCoreUiSettingsBrowserInternalObj from './kbn_core_ui_settings_browser_internal.devdocs.json'; diff --git a/api_docs/kbn_core_ui_settings_browser_mocks.mdx b/api_docs/kbn_core_ui_settings_browser_mocks.mdx index 577822a31bc17..3dd7677225f06 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: 2022-09-30 +date: 2022-10-01 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-ui-settings-browser-mocks'] --- import kbnCoreUiSettingsBrowserMocksObj from './kbn_core_ui_settings_browser_mocks.devdocs.json'; diff --git a/api_docs/kbn_core_ui_settings_common.mdx b/api_docs/kbn_core_ui_settings_common.mdx index 30759d2ba604c..8a73e44070355 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: 2022-09-30 +date: 2022-10-01 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-ui-settings-common'] --- import kbnCoreUiSettingsCommonObj from './kbn_core_ui_settings_common.devdocs.json'; diff --git a/api_docs/kbn_core_ui_settings_server.mdx b/api_docs/kbn_core_ui_settings_server.mdx index b00037c8b73c7..b86978a4c0f51 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: 2022-09-30 +date: 2022-10-01 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-ui-settings-server'] --- import kbnCoreUiSettingsServerObj from './kbn_core_ui_settings_server.devdocs.json'; diff --git a/api_docs/kbn_core_ui_settings_server_internal.mdx b/api_docs/kbn_core_ui_settings_server_internal.mdx index 0dbf6764d598c..632bc077b3e16 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: 2022-09-30 +date: 2022-10-01 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-ui-settings-server-internal'] --- import kbnCoreUiSettingsServerInternalObj from './kbn_core_ui_settings_server_internal.devdocs.json'; diff --git a/api_docs/kbn_core_ui_settings_server_mocks.mdx b/api_docs/kbn_core_ui_settings_server_mocks.mdx index f2e11e0ec4103..43ce870fd9d1c 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: 2022-09-30 +date: 2022-10-01 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-ui-settings-server-mocks'] --- import kbnCoreUiSettingsServerMocksObj from './kbn_core_ui_settings_server_mocks.devdocs.json'; diff --git a/api_docs/kbn_core_usage_data_server.mdx b/api_docs/kbn_core_usage_data_server.mdx index fdafd7c74c008..982847f0d737c 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: 2022-09-30 +date: 2022-10-01 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-usage-data-server'] --- import kbnCoreUsageDataServerObj from './kbn_core_usage_data_server.devdocs.json'; diff --git a/api_docs/kbn_core_usage_data_server_internal.mdx b/api_docs/kbn_core_usage_data_server_internal.mdx index 8e7cee968fe75..55d78bd6eee1b 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: 2022-09-30 +date: 2022-10-01 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-usage-data-server-internal'] --- import kbnCoreUsageDataServerInternalObj from './kbn_core_usage_data_server_internal.devdocs.json'; diff --git a/api_docs/kbn_core_usage_data_server_mocks.mdx b/api_docs/kbn_core_usage_data_server_mocks.mdx index bfcb2471b8f09..4a0c5588f0be5 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: 2022-09-30 +date: 2022-10-01 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-usage-data-server-mocks'] --- import kbnCoreUsageDataServerMocksObj from './kbn_core_usage_data_server_mocks.devdocs.json'; diff --git a/api_docs/kbn_crypto.mdx b/api_docs/kbn_crypto.mdx index d47e0499bc2ad..521e5b631e391 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: 2022-09-30 +date: 2022-10-01 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/crypto'] --- import kbnCryptoObj from './kbn_crypto.devdocs.json'; diff --git a/api_docs/kbn_crypto_browser.mdx b/api_docs/kbn_crypto_browser.mdx index 471c3b25429df..58ddc73e08dfc 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: 2022-09-30 +date: 2022-10-01 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/crypto-browser'] --- import kbnCryptoBrowserObj from './kbn_crypto_browser.devdocs.json'; diff --git a/api_docs/kbn_datemath.mdx b/api_docs/kbn_datemath.mdx index 4dc98f350e51d..644ca142bc7d0 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: 2022-09-30 +date: 2022-10-01 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/datemath'] --- import kbnDatemathObj from './kbn_datemath.devdocs.json'; diff --git a/api_docs/kbn_dev_cli_errors.mdx b/api_docs/kbn_dev_cli_errors.mdx index 0691a727d305b..61773de18ba45 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: 2022-09-30 +date: 2022-10-01 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/dev-cli-errors'] --- import kbnDevCliErrorsObj from './kbn_dev_cli_errors.devdocs.json'; diff --git a/api_docs/kbn_dev_cli_runner.mdx b/api_docs/kbn_dev_cli_runner.mdx index 7f92e41d7a4dc..33f29af6449f5 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: 2022-09-30 +date: 2022-10-01 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/dev-cli-runner'] --- import kbnDevCliRunnerObj from './kbn_dev_cli_runner.devdocs.json'; diff --git a/api_docs/kbn_dev_proc_runner.mdx b/api_docs/kbn_dev_proc_runner.mdx index 720562339cb01..7160587ae7c07 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: 2022-09-30 +date: 2022-10-01 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/dev-proc-runner'] --- import kbnDevProcRunnerObj from './kbn_dev_proc_runner.devdocs.json'; diff --git a/api_docs/kbn_dev_utils.mdx b/api_docs/kbn_dev_utils.mdx index 9b0d11e055baa..765e362ac5000 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: 2022-09-30 +date: 2022-10-01 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/dev-utils'] --- import kbnDevUtilsObj from './kbn_dev_utils.devdocs.json'; diff --git a/api_docs/kbn_doc_links.mdx b/api_docs/kbn_doc_links.mdx index a972f8dfe08c2..d74e0af0ba44c 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: 2022-09-30 +date: 2022-10-01 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/doc-links'] --- import kbnDocLinksObj from './kbn_doc_links.devdocs.json'; diff --git a/api_docs/kbn_docs_utils.mdx b/api_docs/kbn_docs_utils.mdx index 7fde88f253ffb..bd64af2bd9d2f 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: 2022-09-30 +date: 2022-10-01 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/docs-utils'] --- import kbnDocsUtilsObj from './kbn_docs_utils.devdocs.json'; diff --git a/api_docs/kbn_ebt_tools.mdx b/api_docs/kbn_ebt_tools.mdx index b60e5a1432257..16b1791d70aab 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: 2022-09-30 +date: 2022-10-01 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/ebt-tools'] --- import kbnEbtToolsObj from './kbn_ebt_tools.devdocs.json'; diff --git a/api_docs/kbn_es_archiver.mdx b/api_docs/kbn_es_archiver.mdx index 5b8334a6273f7..516930bec71f4 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: 2022-09-30 +date: 2022-10-01 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/es-archiver'] --- import kbnEsArchiverObj from './kbn_es_archiver.devdocs.json'; diff --git a/api_docs/kbn_es_errors.mdx b/api_docs/kbn_es_errors.mdx index cbd8011fd264d..f8cfd1377e566 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: 2022-09-30 +date: 2022-10-01 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/es-errors'] --- import kbnEsErrorsObj from './kbn_es_errors.devdocs.json'; diff --git a/api_docs/kbn_es_query.mdx b/api_docs/kbn_es_query.mdx index 6454ec64eeec1..0125789a530ac 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: 2022-09-30 +date: 2022-10-01 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/es-query'] --- import kbnEsQueryObj from './kbn_es_query.devdocs.json'; diff --git a/api_docs/kbn_es_types.mdx b/api_docs/kbn_es_types.mdx index 9d9912a3e60be..faa1089fab654 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: 2022-09-30 +date: 2022-10-01 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/es-types'] --- import kbnEsTypesObj from './kbn_es_types.devdocs.json'; diff --git a/api_docs/kbn_eslint_plugin_imports.mdx b/api_docs/kbn_eslint_plugin_imports.mdx index 460d6cc14eab2..756b802d0c32d 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: 2022-09-30 +date: 2022-10-01 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/eslint-plugin-imports'] --- import kbnEslintPluginImportsObj from './kbn_eslint_plugin_imports.devdocs.json'; diff --git a/api_docs/kbn_field_types.mdx b/api_docs/kbn_field_types.mdx index de71112dafadf..bb82f2d259771 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: 2022-09-30 +date: 2022-10-01 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/field-types'] --- import kbnFieldTypesObj from './kbn_field_types.devdocs.json'; diff --git a/api_docs/kbn_find_used_node_modules.mdx b/api_docs/kbn_find_used_node_modules.mdx index 4e028126633c1..f745989c9c8a1 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: 2022-09-30 +date: 2022-10-01 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/find-used-node-modules'] --- import kbnFindUsedNodeModulesObj from './kbn_find_used_node_modules.devdocs.json'; diff --git a/api_docs/kbn_ftr_common_functional_services.mdx b/api_docs/kbn_ftr_common_functional_services.mdx index 04d7cb7b4cfd8..6ddc526b2548a 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: 2022-09-30 +date: 2022-10-01 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/ftr-common-functional-services'] --- import kbnFtrCommonFunctionalServicesObj from './kbn_ftr_common_functional_services.devdocs.json'; diff --git a/api_docs/kbn_generate.mdx b/api_docs/kbn_generate.mdx index d88b4e834bee8..42e063e32e7f1 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: 2022-09-30 +date: 2022-10-01 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/generate'] --- import kbnGenerateObj from './kbn_generate.devdocs.json'; diff --git a/api_docs/kbn_get_repo_files.mdx b/api_docs/kbn_get_repo_files.mdx index 11f578d5d6c58..984eab3d218e8 100644 --- a/api_docs/kbn_get_repo_files.mdx +++ b/api_docs/kbn_get_repo_files.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-get-repo-files title: "@kbn/get-repo-files" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/get-repo-files plugin -date: 2022-09-30 +date: 2022-10-01 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/get-repo-files'] --- import kbnGetRepoFilesObj from './kbn_get_repo_files.devdocs.json'; diff --git a/api_docs/kbn_handlebars.mdx b/api_docs/kbn_handlebars.mdx index b3a8defe77206..0fcc343e3d190 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: 2022-09-30 +date: 2022-10-01 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/handlebars'] --- import kbnHandlebarsObj from './kbn_handlebars.devdocs.json'; diff --git a/api_docs/kbn_hapi_mocks.mdx b/api_docs/kbn_hapi_mocks.mdx index e9429b41deb7b..2b73efa6062ac 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: 2022-09-30 +date: 2022-10-01 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/hapi-mocks'] --- import kbnHapiMocksObj from './kbn_hapi_mocks.devdocs.json'; diff --git a/api_docs/kbn_home_sample_data_card.mdx b/api_docs/kbn_home_sample_data_card.mdx index f678cb181de18..0dc1d0876d3a2 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: 2022-09-30 +date: 2022-10-01 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/home-sample-data-card'] --- import kbnHomeSampleDataCardObj from './kbn_home_sample_data_card.devdocs.json'; diff --git a/api_docs/kbn_home_sample_data_tab.mdx b/api_docs/kbn_home_sample_data_tab.mdx index 404f2163c46c0..f8639118d81e0 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: 2022-09-30 +date: 2022-10-01 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/home-sample-data-tab'] --- import kbnHomeSampleDataTabObj from './kbn_home_sample_data_tab.devdocs.json'; diff --git a/api_docs/kbn_i18n.mdx b/api_docs/kbn_i18n.mdx index 525cb60f347a1..78d78be33902f 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: 2022-09-30 +date: 2022-10-01 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/i18n'] --- import kbnI18nObj from './kbn_i18n.devdocs.json'; diff --git a/api_docs/kbn_import_resolver.mdx b/api_docs/kbn_import_resolver.mdx index d4f49a5704638..f8c83ac7998ac 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: 2022-09-30 +date: 2022-10-01 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/import-resolver'] --- import kbnImportResolverObj from './kbn_import_resolver.devdocs.json'; diff --git a/api_docs/kbn_interpreter.mdx b/api_docs/kbn_interpreter.mdx index 9fa8dfc8321c7..894230ad1d11f 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: 2022-09-30 +date: 2022-10-01 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/interpreter'] --- import kbnInterpreterObj from './kbn_interpreter.devdocs.json'; diff --git a/api_docs/kbn_io_ts_utils.mdx b/api_docs/kbn_io_ts_utils.mdx index 4c08eeab4c883..034bcc168b9e6 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: 2022-09-30 +date: 2022-10-01 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/io-ts-utils'] --- import kbnIoTsUtilsObj from './kbn_io_ts_utils.devdocs.json'; diff --git a/api_docs/kbn_jest_serializers.mdx b/api_docs/kbn_jest_serializers.mdx index d8948bee86402..417f8ba3a65f1 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: 2022-09-30 +date: 2022-10-01 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/jest-serializers'] --- import kbnJestSerializersObj from './kbn_jest_serializers.devdocs.json'; diff --git a/api_docs/kbn_journeys.mdx b/api_docs/kbn_journeys.mdx index e2a2cc005cad2..7e46d2dcb1f91 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: 2022-09-30 +date: 2022-10-01 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/journeys'] --- import kbnJourneysObj from './kbn_journeys.devdocs.json'; diff --git a/api_docs/kbn_kibana_manifest_schema.mdx b/api_docs/kbn_kibana_manifest_schema.mdx index 3999084bdf285..5dc82ade1a649 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: 2022-09-30 +date: 2022-10-01 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/kibana-manifest-schema'] --- import kbnKibanaManifestSchemaObj from './kbn_kibana_manifest_schema.devdocs.json'; diff --git a/api_docs/kbn_logging.mdx b/api_docs/kbn_logging.mdx index 6f279b0700ac2..e88bca58e89eb 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: 2022-09-30 +date: 2022-10-01 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/logging'] --- import kbnLoggingObj from './kbn_logging.devdocs.json'; diff --git a/api_docs/kbn_logging_mocks.mdx b/api_docs/kbn_logging_mocks.mdx index cc05defa4dac2..dee1f848efd66 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: 2022-09-30 +date: 2022-10-01 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/logging-mocks'] --- import kbnLoggingMocksObj from './kbn_logging_mocks.devdocs.json'; diff --git a/api_docs/kbn_managed_vscode_config.mdx b/api_docs/kbn_managed_vscode_config.mdx index 20c5f25e026bf..ef7abd6df1bfe 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: 2022-09-30 +date: 2022-10-01 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/managed-vscode-config'] --- import kbnManagedVscodeConfigObj from './kbn_managed_vscode_config.devdocs.json'; diff --git a/api_docs/kbn_mapbox_gl.mdx b/api_docs/kbn_mapbox_gl.mdx index a0dfd15450607..cb067e4a5e48f 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: 2022-09-30 +date: 2022-10-01 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/mapbox-gl'] --- import kbnMapboxGlObj from './kbn_mapbox_gl.devdocs.json'; diff --git a/api_docs/kbn_ml_agg_utils.mdx b/api_docs/kbn_ml_agg_utils.mdx index 8c10def45c78c..2c28a423148f0 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: 2022-09-30 +date: 2022-10-01 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/ml-agg-utils'] --- import kbnMlAggUtilsObj from './kbn_ml_agg_utils.devdocs.json'; diff --git a/api_docs/kbn_ml_is_populated_object.mdx b/api_docs/kbn_ml_is_populated_object.mdx index f4eb153961bd3..e1380d56c305b 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: 2022-09-30 +date: 2022-10-01 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/ml-is-populated-object'] --- import kbnMlIsPopulatedObjectObj from './kbn_ml_is_populated_object.devdocs.json'; diff --git a/api_docs/kbn_ml_string_hash.mdx b/api_docs/kbn_ml_string_hash.mdx index 8d36ae0132631..960bb4da53ce7 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: 2022-09-30 +date: 2022-10-01 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/ml-string-hash'] --- import kbnMlStringHashObj from './kbn_ml_string_hash.devdocs.json'; diff --git a/api_docs/kbn_monaco.mdx b/api_docs/kbn_monaco.mdx index 2a32d7d919b0c..00938629a9610 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: 2022-09-30 +date: 2022-10-01 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/monaco'] --- import kbnMonacoObj from './kbn_monaco.devdocs.json'; diff --git a/api_docs/kbn_optimizer.mdx b/api_docs/kbn_optimizer.mdx index ad7149dc8fe1a..0a5ae8a689d82 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: 2022-09-30 +date: 2022-10-01 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/optimizer'] --- import kbnOptimizerObj from './kbn_optimizer.devdocs.json'; diff --git a/api_docs/kbn_optimizer_webpack_helpers.mdx b/api_docs/kbn_optimizer_webpack_helpers.mdx index 8d83ba6d1f0ef..b6440aacaa070 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: 2022-09-30 +date: 2022-10-01 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/optimizer-webpack-helpers'] --- import kbnOptimizerWebpackHelpersObj from './kbn_optimizer_webpack_helpers.devdocs.json'; diff --git a/api_docs/kbn_osquery_io_ts_types.mdx b/api_docs/kbn_osquery_io_ts_types.mdx index 9bd69c34940d3..f92a80367e024 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: 2022-09-30 +date: 2022-10-01 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/osquery-io-ts-types'] --- import kbnOsqueryIoTsTypesObj from './kbn_osquery_io_ts_types.devdocs.json'; diff --git a/api_docs/kbn_performance_testing_dataset_extractor.mdx b/api_docs/kbn_performance_testing_dataset_extractor.mdx index e87e2bea07312..56e2cd559c032 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: 2022-09-30 +date: 2022-10-01 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/performance-testing-dataset-extractor'] --- import kbnPerformanceTestingDatasetExtractorObj from './kbn_performance_testing_dataset_extractor.devdocs.json'; diff --git a/api_docs/kbn_plugin_generator.mdx b/api_docs/kbn_plugin_generator.mdx index dff42547b8b4e..23bb7dc57c4e1 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: 2022-09-30 +date: 2022-10-01 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/plugin-generator'] --- import kbnPluginGeneratorObj from './kbn_plugin_generator.devdocs.json'; diff --git a/api_docs/kbn_plugin_helpers.mdx b/api_docs/kbn_plugin_helpers.mdx index 9dfa323c764a1..c685665c1cd4b 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: 2022-09-30 +date: 2022-10-01 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/plugin-helpers'] --- import kbnPluginHelpersObj from './kbn_plugin_helpers.devdocs.json'; diff --git a/api_docs/kbn_react_field.mdx b/api_docs/kbn_react_field.mdx index 233fdfa2b5299..e603b0c70740d 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: 2022-09-30 +date: 2022-10-01 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/react-field'] --- import kbnReactFieldObj from './kbn_react_field.devdocs.json'; diff --git a/api_docs/kbn_repo_source_classifier.mdx b/api_docs/kbn_repo_source_classifier.mdx index e7e506f42c4dc..0aa2a7e6d7e24 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: 2022-09-30 +date: 2022-10-01 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/repo-source-classifier'] --- import kbnRepoSourceClassifierObj from './kbn_repo_source_classifier.devdocs.json'; diff --git a/api_docs/kbn_rule_data_utils.mdx b/api_docs/kbn_rule_data_utils.mdx index 2385663d0372e..d327087b29294 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: 2022-09-30 +date: 2022-10-01 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/rule-data-utils'] --- import kbnRuleDataUtilsObj from './kbn_rule_data_utils.devdocs.json'; diff --git a/api_docs/kbn_securitysolution_autocomplete.mdx b/api_docs/kbn_securitysolution_autocomplete.mdx index c9560b881efcc..3912476bf911c 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: 2022-09-30 +date: 2022-10-01 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/securitysolution-autocomplete'] --- import kbnSecuritysolutionAutocompleteObj from './kbn_securitysolution_autocomplete.devdocs.json'; diff --git a/api_docs/kbn_securitysolution_es_utils.mdx b/api_docs/kbn_securitysolution_es_utils.mdx index 277e8fe2e29f0..2f31f51131f61 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: 2022-09-30 +date: 2022-10-01 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/securitysolution-es-utils'] --- import kbnSecuritysolutionEsUtilsObj from './kbn_securitysolution_es_utils.devdocs.json'; diff --git a/api_docs/kbn_securitysolution_exception_list_components.mdx b/api_docs/kbn_securitysolution_exception_list_components.mdx index aada63b6cdcfc..4777f33dc85d5 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: 2022-09-30 +date: 2022-10-01 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/securitysolution-exception-list-components'] --- import kbnSecuritysolutionExceptionListComponentsObj from './kbn_securitysolution_exception_list_components.devdocs.json'; diff --git a/api_docs/kbn_securitysolution_hook_utils.mdx b/api_docs/kbn_securitysolution_hook_utils.mdx index 06a05479ba722..07b9c7684cbb9 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: 2022-09-30 +date: 2022-10-01 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/securitysolution-hook-utils'] --- import kbnSecuritysolutionHookUtilsObj from './kbn_securitysolution_hook_utils.devdocs.json'; diff --git a/api_docs/kbn_securitysolution_io_ts_alerting_types.mdx b/api_docs/kbn_securitysolution_io_ts_alerting_types.mdx index 4ff62a3c86d94..3c721f46f48cb 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: 2022-09-30 +date: 2022-10-01 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/securitysolution-io-ts-alerting-types'] --- import kbnSecuritysolutionIoTsAlertingTypesObj from './kbn_securitysolution_io_ts_alerting_types.devdocs.json'; diff --git a/api_docs/kbn_securitysolution_io_ts_list_types.mdx b/api_docs/kbn_securitysolution_io_ts_list_types.mdx index 73431dba715aa..1d452af9ea156 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: 2022-09-30 +date: 2022-10-01 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/securitysolution-io-ts-list-types'] --- import kbnSecuritysolutionIoTsListTypesObj from './kbn_securitysolution_io_ts_list_types.devdocs.json'; diff --git a/api_docs/kbn_securitysolution_io_ts_types.mdx b/api_docs/kbn_securitysolution_io_ts_types.mdx index f1065703e694b..59df749d44291 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: 2022-09-30 +date: 2022-10-01 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/securitysolution-io-ts-types'] --- import kbnSecuritysolutionIoTsTypesObj from './kbn_securitysolution_io_ts_types.devdocs.json'; diff --git a/api_docs/kbn_securitysolution_io_ts_utils.mdx b/api_docs/kbn_securitysolution_io_ts_utils.mdx index 0a3e38566ee92..8063f1fd1592f 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: 2022-09-30 +date: 2022-10-01 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/securitysolution-io-ts-utils'] --- import kbnSecuritysolutionIoTsUtilsObj from './kbn_securitysolution_io_ts_utils.devdocs.json'; diff --git a/api_docs/kbn_securitysolution_list_api.mdx b/api_docs/kbn_securitysolution_list_api.mdx index 0dc5e87dba567..184877c74cfaf 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: 2022-09-30 +date: 2022-10-01 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/securitysolution-list-api'] --- import kbnSecuritysolutionListApiObj from './kbn_securitysolution_list_api.devdocs.json'; diff --git a/api_docs/kbn_securitysolution_list_constants.mdx b/api_docs/kbn_securitysolution_list_constants.mdx index ee9a5057cd0b7..933a87c620ba4 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: 2022-09-30 +date: 2022-10-01 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/securitysolution-list-constants'] --- import kbnSecuritysolutionListConstantsObj from './kbn_securitysolution_list_constants.devdocs.json'; diff --git a/api_docs/kbn_securitysolution_list_hooks.mdx b/api_docs/kbn_securitysolution_list_hooks.mdx index 75f29aaf7123e..0f3f3805ca320 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: 2022-09-30 +date: 2022-10-01 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/securitysolution-list-hooks'] --- import kbnSecuritysolutionListHooksObj from './kbn_securitysolution_list_hooks.devdocs.json'; diff --git a/api_docs/kbn_securitysolution_list_utils.mdx b/api_docs/kbn_securitysolution_list_utils.mdx index 515b4a8285bb3..6b810acdc8e7d 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: 2022-09-30 +date: 2022-10-01 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/securitysolution-list-utils'] --- import kbnSecuritysolutionListUtilsObj from './kbn_securitysolution_list_utils.devdocs.json'; diff --git a/api_docs/kbn_securitysolution_rules.mdx b/api_docs/kbn_securitysolution_rules.mdx index 2991cdacbacd0..aceb1ec1d65d6 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: 2022-09-30 +date: 2022-10-01 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/securitysolution-rules'] --- import kbnSecuritysolutionRulesObj from './kbn_securitysolution_rules.devdocs.json'; diff --git a/api_docs/kbn_securitysolution_t_grid.mdx b/api_docs/kbn_securitysolution_t_grid.mdx index 92b1867f34a64..11cfe00c5eb62 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: 2022-09-30 +date: 2022-10-01 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/securitysolution-t-grid'] --- import kbnSecuritysolutionTGridObj from './kbn_securitysolution_t_grid.devdocs.json'; diff --git a/api_docs/kbn_securitysolution_utils.mdx b/api_docs/kbn_securitysolution_utils.mdx index a9ff8d1d81fbd..4e4ba39e56d9d 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: 2022-09-30 +date: 2022-10-01 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/securitysolution-utils'] --- import kbnSecuritysolutionUtilsObj from './kbn_securitysolution_utils.devdocs.json'; diff --git a/api_docs/kbn_server_http_tools.mdx b/api_docs/kbn_server_http_tools.mdx index 91cf5bb3b5dd9..5a002fe9b6348 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: 2022-09-30 +date: 2022-10-01 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/server-http-tools'] --- import kbnServerHttpToolsObj from './kbn_server_http_tools.devdocs.json'; diff --git a/api_docs/kbn_server_route_repository.mdx b/api_docs/kbn_server_route_repository.mdx index cefe3d1543a94..53bffb726d7e0 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: 2022-09-30 +date: 2022-10-01 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/server-route-repository'] --- import kbnServerRouteRepositoryObj from './kbn_server_route_repository.devdocs.json'; diff --git a/api_docs/kbn_shared_svg.mdx b/api_docs/kbn_shared_svg.mdx index 737c986cbf11a..ba975b8446923 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: 2022-09-30 +date: 2022-10-01 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/shared-svg'] --- import kbnSharedSvgObj from './kbn_shared_svg.devdocs.json'; diff --git a/api_docs/kbn_shared_ux_avatar_user_profile_components.mdx b/api_docs/kbn_shared_ux_avatar_user_profile_components.mdx index eebd51935c35a..9c30c42972615 100644 --- a/api_docs/kbn_shared_ux_avatar_user_profile_components.mdx +++ b/api_docs/kbn_shared_ux_avatar_user_profile_components.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-shared-ux-avatar-user-profile-components title: "@kbn/shared-ux-avatar-user-profile-components" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/shared-ux-avatar-user-profile-components plugin -date: 2022-09-30 +date: 2022-10-01 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/shared-ux-avatar-user-profile-components'] --- import kbnSharedUxAvatarUserProfileComponentsObj from './kbn_shared_ux_avatar_user_profile_components.devdocs.json'; diff --git a/api_docs/kbn_shared_ux_button_exit_full_screen_mocks.mdx b/api_docs/kbn_shared_ux_button_exit_full_screen_mocks.mdx index c121d1e8a4893..cf6491d338fe1 100644 --- a/api_docs/kbn_shared_ux_button_exit_full_screen_mocks.mdx +++ b/api_docs/kbn_shared_ux_button_exit_full_screen_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-shared-ux-button-exit-full-screen-mocks title: "@kbn/shared-ux-button-exit-full-screen-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/shared-ux-button-exit-full-screen-mocks plugin -date: 2022-09-30 +date: 2022-10-01 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/shared-ux-button-exit-full-screen-mocks'] --- import kbnSharedUxButtonExitFullScreenMocksObj from './kbn_shared_ux_button_exit_full_screen_mocks.devdocs.json'; diff --git a/api_docs/kbn_shared_ux_button_toolbar.mdx b/api_docs/kbn_shared_ux_button_toolbar.mdx index ff53903386830..e055ce5c7dbec 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: 2022-09-30 +date: 2022-10-01 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/shared-ux-button-toolbar'] --- import kbnSharedUxButtonToolbarObj from './kbn_shared_ux_button_toolbar.devdocs.json'; diff --git a/api_docs/kbn_shared_ux_card_no_data.mdx b/api_docs/kbn_shared_ux_card_no_data.mdx index 12b820666a653..63958a2cb0297 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: 2022-09-30 +date: 2022-10-01 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/shared-ux-card-no-data'] --- import kbnSharedUxCardNoDataObj from './kbn_shared_ux_card_no_data.devdocs.json'; diff --git a/api_docs/kbn_shared_ux_card_no_data_mocks.mdx b/api_docs/kbn_shared_ux_card_no_data_mocks.mdx index c083f9ea1266f..e8dacbe7203bb 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: 2022-09-30 +date: 2022-10-01 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/shared-ux-card-no-data-mocks'] --- import kbnSharedUxCardNoDataMocksObj from './kbn_shared_ux_card_no_data_mocks.devdocs.json'; diff --git a/api_docs/kbn_shared_ux_link_redirect_app_mocks.mdx b/api_docs/kbn_shared_ux_link_redirect_app_mocks.mdx index 35439d9fda006..421f7f9d7187b 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: 2022-09-30 +date: 2022-10-01 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/shared-ux-link-redirect-app-mocks'] --- import kbnSharedUxLinkRedirectAppMocksObj from './kbn_shared_ux_link_redirect_app_mocks.devdocs.json'; diff --git a/api_docs/kbn_shared_ux_page_analytics_no_data.mdx b/api_docs/kbn_shared_ux_page_analytics_no_data.mdx index de78cc05fd160..99d63502639cf 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: 2022-09-30 +date: 2022-10-01 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/shared-ux-page-analytics-no-data'] --- import kbnSharedUxPageAnalyticsNoDataObj from './kbn_shared_ux_page_analytics_no_data.devdocs.json'; diff --git a/api_docs/kbn_shared_ux_page_analytics_no_data_mocks.mdx b/api_docs/kbn_shared_ux_page_analytics_no_data_mocks.mdx index b1c6f91ebdbd1..2deff84864974 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: 2022-09-30 +date: 2022-10-01 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/shared-ux-page-analytics-no-data-mocks'] --- import kbnSharedUxPageAnalyticsNoDataMocksObj from './kbn_shared_ux_page_analytics_no_data_mocks.devdocs.json'; diff --git a/api_docs/kbn_shared_ux_page_kibana_no_data.mdx b/api_docs/kbn_shared_ux_page_kibana_no_data.mdx index 9f07e742a7606..883bd3ab03a8a 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: 2022-09-30 +date: 2022-10-01 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/shared-ux-page-kibana-no-data'] --- import kbnSharedUxPageKibanaNoDataObj from './kbn_shared_ux_page_kibana_no_data.devdocs.json'; diff --git a/api_docs/kbn_shared_ux_page_kibana_no_data_mocks.mdx b/api_docs/kbn_shared_ux_page_kibana_no_data_mocks.mdx index 065a90d00a348..0db5daddc45c9 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: 2022-09-30 +date: 2022-10-01 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/shared-ux-page-kibana-no-data-mocks'] --- import kbnSharedUxPageKibanaNoDataMocksObj from './kbn_shared_ux_page_kibana_no_data_mocks.devdocs.json'; diff --git a/api_docs/kbn_shared_ux_page_kibana_template.mdx b/api_docs/kbn_shared_ux_page_kibana_template.mdx index c100281c25d4d..a9353ec774046 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: 2022-09-30 +date: 2022-10-01 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/shared-ux-page-kibana-template'] --- import kbnSharedUxPageKibanaTemplateObj from './kbn_shared_ux_page_kibana_template.devdocs.json'; diff --git a/api_docs/kbn_shared_ux_page_kibana_template_mocks.mdx b/api_docs/kbn_shared_ux_page_kibana_template_mocks.mdx index b884d72ca4d07..99d9c415c15b1 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: 2022-09-30 +date: 2022-10-01 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/shared-ux-page-kibana-template-mocks'] --- import kbnSharedUxPageKibanaTemplateMocksObj from './kbn_shared_ux_page_kibana_template_mocks.devdocs.json'; diff --git a/api_docs/kbn_shared_ux_page_no_data.mdx b/api_docs/kbn_shared_ux_page_no_data.mdx index c060047529bc6..2417b72b9ffe3 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: 2022-09-30 +date: 2022-10-01 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/shared-ux-page-no-data'] --- import kbnSharedUxPageNoDataObj from './kbn_shared_ux_page_no_data.devdocs.json'; diff --git a/api_docs/kbn_shared_ux_page_no_data_config.mdx b/api_docs/kbn_shared_ux_page_no_data_config.mdx index 362eb12bc58f9..68dfc645ddd8d 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: 2022-09-30 +date: 2022-10-01 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/shared-ux-page-no-data-config'] --- import kbnSharedUxPageNoDataConfigObj from './kbn_shared_ux_page_no_data_config.devdocs.json'; diff --git a/api_docs/kbn_shared_ux_page_no_data_config_mocks.mdx b/api_docs/kbn_shared_ux_page_no_data_config_mocks.mdx index 4e02c245ff69b..8f977f1cc7a9a 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: 2022-09-30 +date: 2022-10-01 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/shared-ux-page-no-data-config-mocks'] --- import kbnSharedUxPageNoDataConfigMocksObj from './kbn_shared_ux_page_no_data_config_mocks.devdocs.json'; diff --git a/api_docs/kbn_shared_ux_page_no_data_mocks.mdx b/api_docs/kbn_shared_ux_page_no_data_mocks.mdx index 49e658a38c8b7..109a924fb3b9a 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: 2022-09-30 +date: 2022-10-01 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/shared-ux-page-no-data-mocks'] --- import kbnSharedUxPageNoDataMocksObj from './kbn_shared_ux_page_no_data_mocks.devdocs.json'; diff --git a/api_docs/kbn_shared_ux_page_solution_nav.mdx b/api_docs/kbn_shared_ux_page_solution_nav.mdx index 5e2e625539982..07a01ac671dac 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: 2022-09-30 +date: 2022-10-01 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/shared-ux-page-solution-nav'] --- import kbnSharedUxPageSolutionNavObj from './kbn_shared_ux_page_solution_nav.devdocs.json'; diff --git a/api_docs/kbn_shared_ux_prompt_no_data_views.mdx b/api_docs/kbn_shared_ux_prompt_no_data_views.mdx index eec2b418bbc44..10af2f7f2c160 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: 2022-09-30 +date: 2022-10-01 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/shared-ux-prompt-no-data-views'] --- import kbnSharedUxPromptNoDataViewsObj from './kbn_shared_ux_prompt_no_data_views.devdocs.json'; diff --git a/api_docs/kbn_shared_ux_prompt_no_data_views_mocks.mdx b/api_docs/kbn_shared_ux_prompt_no_data_views_mocks.mdx index f6bf840ae41ac..0b0f2e48ec0a0 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: 2022-09-30 +date: 2022-10-01 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/shared-ux-prompt-no-data-views-mocks'] --- import kbnSharedUxPromptNoDataViewsMocksObj from './kbn_shared_ux_prompt_no_data_views_mocks.devdocs.json'; diff --git a/api_docs/kbn_shared_ux_router.mdx b/api_docs/kbn_shared_ux_router.mdx index deb460019bbeb..956de3dd05849 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: 2022-09-30 +date: 2022-10-01 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/shared-ux-router'] --- import kbnSharedUxRouterObj from './kbn_shared_ux_router.devdocs.json'; diff --git a/api_docs/kbn_shared_ux_router_mocks.mdx b/api_docs/kbn_shared_ux_router_mocks.mdx index b6141feed65de..f10769e16c69d 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: 2022-09-30 +date: 2022-10-01 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/shared-ux-router-mocks'] --- import kbnSharedUxRouterMocksObj from './kbn_shared_ux_router_mocks.devdocs.json'; diff --git a/api_docs/kbn_shared_ux_storybook_config.mdx b/api_docs/kbn_shared_ux_storybook_config.mdx index 9d6b7561cd4fe..a99179ef9d406 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: 2022-09-30 +date: 2022-10-01 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/shared-ux-storybook-config'] --- import kbnSharedUxStorybookConfigObj from './kbn_shared_ux_storybook_config.devdocs.json'; diff --git a/api_docs/kbn_shared_ux_storybook_mock.mdx b/api_docs/kbn_shared_ux_storybook_mock.mdx index 1d57383c1f7a2..6abf6549e0565 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: 2022-09-30 +date: 2022-10-01 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/shared-ux-storybook-mock'] --- import kbnSharedUxStorybookMockObj from './kbn_shared_ux_storybook_mock.devdocs.json'; diff --git a/api_docs/kbn_shared_ux_utility.mdx b/api_docs/kbn_shared_ux_utility.mdx index f1529dbdeeadd..e44419942c796 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: 2022-09-30 +date: 2022-10-01 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/shared-ux-utility'] --- import kbnSharedUxUtilityObj from './kbn_shared_ux_utility.devdocs.json'; diff --git a/api_docs/kbn_some_dev_log.mdx b/api_docs/kbn_some_dev_log.mdx index 08e81f53f5e6a..e25a62c5079ae 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: 2022-09-30 +date: 2022-10-01 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/some-dev-log'] --- import kbnSomeDevLogObj from './kbn_some_dev_log.devdocs.json'; diff --git a/api_docs/kbn_sort_package_json.mdx b/api_docs/kbn_sort_package_json.mdx index f9a40e4e50605..28fe6feb5d19d 100644 --- a/api_docs/kbn_sort_package_json.mdx +++ b/api_docs/kbn_sort_package_json.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-sort-package-json title: "@kbn/sort-package-json" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/sort-package-json plugin -date: 2022-09-30 +date: 2022-10-01 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/sort-package-json'] --- import kbnSortPackageJsonObj from './kbn_sort_package_json.devdocs.json'; diff --git a/api_docs/kbn_std.mdx b/api_docs/kbn_std.mdx index 0be3ac9e885d8..05b56017a08ff 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: 2022-09-30 +date: 2022-10-01 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/std'] --- import kbnStdObj from './kbn_std.devdocs.json'; diff --git a/api_docs/kbn_stdio_dev_helpers.mdx b/api_docs/kbn_stdio_dev_helpers.mdx index 12855b1d6c6e1..be9d33d159f3c 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: 2022-09-30 +date: 2022-10-01 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/stdio-dev-helpers'] --- import kbnStdioDevHelpersObj from './kbn_stdio_dev_helpers.devdocs.json'; diff --git a/api_docs/kbn_storybook.mdx b/api_docs/kbn_storybook.mdx index ff504977fbd18..dd904c049f3bd 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: 2022-09-30 +date: 2022-10-01 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/storybook'] --- import kbnStorybookObj from './kbn_storybook.devdocs.json'; diff --git a/api_docs/kbn_telemetry_tools.mdx b/api_docs/kbn_telemetry_tools.mdx index c4980baa0846b..b854992fde335 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: 2022-09-30 +date: 2022-10-01 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/telemetry-tools'] --- import kbnTelemetryToolsObj from './kbn_telemetry_tools.devdocs.json'; diff --git a/api_docs/kbn_test.mdx b/api_docs/kbn_test.mdx index fc2d3aa4ceb2f..82eab77aca0cf 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: 2022-09-30 +date: 2022-10-01 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/test'] --- import kbnTestObj from './kbn_test.devdocs.json'; diff --git a/api_docs/kbn_test_jest_helpers.mdx b/api_docs/kbn_test_jest_helpers.mdx index c0fe273058800..bd59838a870d1 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: 2022-09-30 +date: 2022-10-01 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/test-jest-helpers'] --- import kbnTestJestHelpersObj from './kbn_test_jest_helpers.devdocs.json'; diff --git a/api_docs/kbn_test_subj_selector.mdx b/api_docs/kbn_test_subj_selector.mdx index a11f331d327f9..c5b72af903b3a 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: 2022-09-30 +date: 2022-10-01 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/test-subj-selector'] --- import kbnTestSubjSelectorObj from './kbn_test_subj_selector.devdocs.json'; diff --git a/api_docs/kbn_tooling_log.mdx b/api_docs/kbn_tooling_log.mdx index 634503f237630..abd0555459d96 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: 2022-09-30 +date: 2022-10-01 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/tooling-log'] --- import kbnToolingLogObj from './kbn_tooling_log.devdocs.json'; diff --git a/api_docs/kbn_type_summarizer.mdx b/api_docs/kbn_type_summarizer.mdx index ec79f6d74e50a..09bc46b76cc97 100644 --- a/api_docs/kbn_type_summarizer.mdx +++ b/api_docs/kbn_type_summarizer.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-type-summarizer title: "@kbn/type-summarizer" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/type-summarizer plugin -date: 2022-09-30 +date: 2022-10-01 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/type-summarizer'] --- import kbnTypeSummarizerObj from './kbn_type_summarizer.devdocs.json'; diff --git a/api_docs/kbn_type_summarizer_core.mdx b/api_docs/kbn_type_summarizer_core.mdx index 64a86ae7f718d..60509b4421a9d 100644 --- a/api_docs/kbn_type_summarizer_core.mdx +++ b/api_docs/kbn_type_summarizer_core.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-type-summarizer-core title: "@kbn/type-summarizer-core" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/type-summarizer-core plugin -date: 2022-09-30 +date: 2022-10-01 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/type-summarizer-core'] --- import kbnTypeSummarizerCoreObj from './kbn_type_summarizer_core.devdocs.json'; diff --git a/api_docs/kbn_typed_react_router_config.mdx b/api_docs/kbn_typed_react_router_config.mdx index fd83134954efd..614b52b535a99 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: 2022-09-30 +date: 2022-10-01 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/typed-react-router-config'] --- import kbnTypedReactRouterConfigObj from './kbn_typed_react_router_config.devdocs.json'; diff --git a/api_docs/kbn_ui_theme.mdx b/api_docs/kbn_ui_theme.mdx index e05e7d1fbf270..86b99ea131b43 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: 2022-09-30 +date: 2022-10-01 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/ui-theme'] --- import kbnUiThemeObj from './kbn_ui_theme.devdocs.json'; diff --git a/api_docs/kbn_user_profile_components.mdx b/api_docs/kbn_user_profile_components.mdx index c62021b90a7c5..1411d1f11e0f6 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: 2022-09-30 +date: 2022-10-01 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/user-profile-components'] --- import kbnUserProfileComponentsObj from './kbn_user_profile_components.devdocs.json'; diff --git a/api_docs/kbn_utility_types.mdx b/api_docs/kbn_utility_types.mdx index 383e50529e744..124801b6982ed 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: 2022-09-30 +date: 2022-10-01 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/utility-types'] --- import kbnUtilityTypesObj from './kbn_utility_types.devdocs.json'; diff --git a/api_docs/kbn_utility_types_jest.mdx b/api_docs/kbn_utility_types_jest.mdx index 900ea8d6e615c..286cf41a0f814 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: 2022-09-30 +date: 2022-10-01 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/utility-types-jest'] --- import kbnUtilityTypesJestObj from './kbn_utility_types_jest.devdocs.json'; diff --git a/api_docs/kbn_utils.mdx b/api_docs/kbn_utils.mdx index 224a3cfeb7afa..1d15139e5ad5d 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: 2022-09-30 +date: 2022-10-01 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/utils'] --- import kbnUtilsObj from './kbn_utils.devdocs.json'; diff --git a/api_docs/kbn_yarn_lock_validator.mdx b/api_docs/kbn_yarn_lock_validator.mdx index 51c6ae605e7bd..3fa079e3178f7 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: 2022-09-30 +date: 2022-10-01 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/yarn-lock-validator'] --- import kbnYarnLockValidatorObj from './kbn_yarn_lock_validator.devdocs.json'; diff --git a/api_docs/kibana_overview.mdx b/api_docs/kibana_overview.mdx index c15bfc3b7fe22..ac6ccdaefbbf2 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: 2022-09-30 +date: 2022-10-01 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'kibanaOverview'] --- import kibanaOverviewObj from './kibana_overview.devdocs.json'; diff --git a/api_docs/kibana_react.mdx b/api_docs/kibana_react.mdx index ea705da0da762..e8016cd77287b 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: 2022-09-30 +date: 2022-10-01 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'kibanaReact'] --- import kibanaReactObj from './kibana_react.devdocs.json'; diff --git a/api_docs/kibana_utils.mdx b/api_docs/kibana_utils.mdx index 0ea7624514ef5..dff8ce771bdee 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: 2022-09-30 +date: 2022-10-01 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'kibanaUtils'] --- import kibanaUtilsObj from './kibana_utils.devdocs.json'; diff --git a/api_docs/kubernetes_security.mdx b/api_docs/kubernetes_security.mdx index ac719690669b5..318aa79a29754 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: 2022-09-30 +date: 2022-10-01 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'kubernetesSecurity'] --- import kubernetesSecurityObj from './kubernetes_security.devdocs.json'; diff --git a/api_docs/lens.devdocs.json b/api_docs/lens.devdocs.json index 43a256fa418ca..d29c21bc24d31 100644 --- a/api_docs/lens.devdocs.json +++ b/api_docs/lens.devdocs.json @@ -4254,6 +4254,53 @@ ], "returnComment": [] }, + { + "parentPluginId": "lens", + "id": "def-public.Visualization.getUsedDataView", + "type": "Function", + "tags": [], + "label": "getUsedDataView", + "description": [], + "signature": [ + "((state: T, layerId: string) => string | undefined) | undefined" + ], + "path": "x-pack/plugins/lens/public/types.ts", + "deprecated": false, + "trackAdoption": false, + "children": [ + { + "parentPluginId": "lens", + "id": "def-public.Visualization.getUsedDataView.$1", + "type": "Uncategorized", + "tags": [], + "label": "state", + "description": [], + "signature": [ + "T" + ], + "path": "x-pack/plugins/lens/public/types.ts", + "deprecated": false, + "trackAdoption": false, + "isRequired": true + }, + { + "parentPluginId": "lens", + "id": "def-public.Visualization.getUsedDataView.$2", + "type": "string", + "tags": [], + "label": "layerId", + "description": [], + "signature": [ + "string" + ], + "path": "x-pack/plugins/lens/public/types.ts", + "deprecated": false, + "trackAdoption": false, + "isRequired": true + } + ], + "returnComment": [] + }, { "parentPluginId": "lens", "id": "def-public.Visualization.getUsedDataViews", @@ -4994,13 +5041,84 @@ ], "returnComment": [] }, + { + "parentPluginId": "lens", + "id": "def-public.Visualization.getSupportedActionsForLayer", + "type": "Function", + "tags": [], + "label": "getSupportedActionsForLayer", + "description": [ + "\nreturns a list of custom actions supported by the visualization layer.\nDefault actions like delete/clear are not included in this list and are managed by the editor frame" + ], + "signature": [ + "((layerId: string, state: T, setState: ", + "StateSetter", + ") => ", + "LayerAction", + "[]) | undefined" + ], + "path": "x-pack/plugins/lens/public/types.ts", + "deprecated": false, + "trackAdoption": false, + "children": [ + { + "parentPluginId": "lens", + "id": "def-public.Visualization.getSupportedActionsForLayer.$1", + "type": "string", + "tags": [], + "label": "layerId", + "description": [], + "signature": [ + "string" + ], + "path": "x-pack/plugins/lens/public/types.ts", + "deprecated": false, + "trackAdoption": false, + "isRequired": true + }, + { + "parentPluginId": "lens", + "id": "def-public.Visualization.getSupportedActionsForLayer.$2", + "type": "Uncategorized", + "tags": [], + "label": "state", + "description": [], + "signature": [ + "T" + ], + "path": "x-pack/plugins/lens/public/types.ts", + "deprecated": false, + "trackAdoption": false, + "isRequired": true + }, + { + "parentPluginId": "lens", + "id": "def-public.Visualization.getSupportedActionsForLayer.$3", + "type": "Function", + "tags": [], + "label": "setState", + "description": [], + "signature": [ + "StateSetter", + "" + ], + "path": "x-pack/plugins/lens/public/types.ts", + "deprecated": false, + "trackAdoption": false, + "isRequired": true + } + ], + "returnComment": [] + }, { "parentPluginId": "lens", "id": "def-public.Visualization.getLayerType", "type": "Function", "tags": [], "label": "getLayerType", - "description": [], + "description": [ + "returns the type string of the given layer" + ], "signature": [ "(layerId: string, state?: T | undefined) => ", { @@ -5494,6 +5612,43 @@ ], "returnComment": [] }, + { + "parentPluginId": "lens", + "id": "def-public.Visualization.getDropProps", + "type": "Function", + "tags": [], + "label": "getDropProps", + "description": [], + "signature": [ + "((dropProps: ", + "GetDropPropsArgs", + ") => { dropTypes: ", + "DropType", + "[]; nextLabel?: string | undefined; } | undefined) | undefined" + ], + "path": "x-pack/plugins/lens/public/types.ts", + "deprecated": false, + "trackAdoption": false, + "children": [ + { + "parentPluginId": "lens", + "id": "def-public.Visualization.getDropProps.$1", + "type": "Object", + "tags": [], + "label": "dropProps", + "description": [], + "signature": [ + "GetDropPropsArgs", + "" + ], + "path": "x-pack/plugins/lens/public/types.ts", + "deprecated": false, + "trackAdoption": false, + "isRequired": true + } + ], + "returnComment": [] + }, { "parentPluginId": "lens", "id": "def-public.Visualization.renderDimensionEditor", diff --git a/api_docs/lens.mdx b/api_docs/lens.mdx index ebeef2fc8c31d..01c5bc3141bc4 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: 2022-09-30 +date: 2022-10-01 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'lens'] --- import lensObj from './lens.devdocs.json'; @@ -21,7 +21,7 @@ Contact [Vis Editors](https://github.com/orgs/elastic/teams/kibana-vis-editors) | Public API count | Any count | Items lacking comments | Missing exports | |-------------------|-----------|------------------------|-----------------| -| 649 | 0 | 560 | 42 | +| 658 | 0 | 567 | 45 | ## Client diff --git a/api_docs/license_api_guard.mdx b/api_docs/license_api_guard.mdx index 7a642bff9e73a..e1894af2cbfa0 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: 2022-09-30 +date: 2022-10-01 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'licenseApiGuard'] --- import licenseApiGuardObj from './license_api_guard.devdocs.json'; diff --git a/api_docs/license_management.mdx b/api_docs/license_management.mdx index 0f646773d6138..d592aa08d8751 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: 2022-09-30 +date: 2022-10-01 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'licenseManagement'] --- import licenseManagementObj from './license_management.devdocs.json'; diff --git a/api_docs/licensing.mdx b/api_docs/licensing.mdx index 13e56db522d2b..a65fb069d0ac4 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: 2022-09-30 +date: 2022-10-01 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'licensing'] --- import licensingObj from './licensing.devdocs.json'; diff --git a/api_docs/lists.mdx b/api_docs/lists.mdx index 4a6747d66e72c..e4e33df28af34 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: 2022-09-30 +date: 2022-10-01 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'lists'] --- import listsObj from './lists.devdocs.json'; diff --git a/api_docs/management.mdx b/api_docs/management.mdx index 3b4067947d08b..bcb5fc7434722 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: 2022-09-30 +date: 2022-10-01 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'management'] --- import managementObj from './management.devdocs.json'; diff --git a/api_docs/maps.mdx b/api_docs/maps.mdx index e68653a32c8ca..e1409873d0457 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: 2022-09-30 +date: 2022-10-01 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'maps'] --- import mapsObj from './maps.devdocs.json'; diff --git a/api_docs/maps_ems.mdx b/api_docs/maps_ems.mdx index 8547850fa777a..d6ef5a21773f9 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: 2022-09-30 +date: 2022-10-01 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'mapsEms'] --- import mapsEmsObj from './maps_ems.devdocs.json'; diff --git a/api_docs/ml.mdx b/api_docs/ml.mdx index b52f48b935000..f725548e9cf9c 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: 2022-09-30 +date: 2022-10-01 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'ml'] --- import mlObj from './ml.devdocs.json'; diff --git a/api_docs/monitoring.mdx b/api_docs/monitoring.mdx index eaa35953f39e9..c72b46a487e9e 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: 2022-09-30 +date: 2022-10-01 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'monitoring'] --- import monitoringObj from './monitoring.devdocs.json'; diff --git a/api_docs/monitoring_collection.mdx b/api_docs/monitoring_collection.mdx index 4048c3102a29f..41785b90b47d3 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: 2022-09-30 +date: 2022-10-01 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'monitoringCollection'] --- import monitoringCollectionObj from './monitoring_collection.devdocs.json'; diff --git a/api_docs/navigation.mdx b/api_docs/navigation.mdx index 4b05d9ce3b7ef..4d964c688c8af 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: 2022-09-30 +date: 2022-10-01 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'navigation'] --- import navigationObj from './navigation.devdocs.json'; diff --git a/api_docs/newsfeed.mdx b/api_docs/newsfeed.mdx index b10f893f9601b..d084497544343 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: 2022-09-30 +date: 2022-10-01 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'newsfeed'] --- import newsfeedObj from './newsfeed.devdocs.json'; diff --git a/api_docs/observability.mdx b/api_docs/observability.mdx index 758f400939d9e..e40080c8ecf58 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: 2022-09-30 +date: 2022-10-01 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'observability'] --- import observabilityObj from './observability.devdocs.json'; diff --git a/api_docs/osquery.mdx b/api_docs/osquery.mdx index 40c14dd0feebf..266faca28aede 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: 2022-09-30 +date: 2022-10-01 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'osquery'] --- import osqueryObj from './osquery.devdocs.json'; diff --git a/api_docs/plugin_directory.mdx b/api_docs/plugin_directory.mdx index faf5c1b113204..65ed265de39cf 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: 2022-09-30 +date: 2022-10-01 tags: ['contributor', 'dev', 'apidocs', 'kibana'] --- @@ -21,7 +21,7 @@ tags: ['contributor', 'dev', 'apidocs', 'kibana'] | API Count | Any Count | Missing comments | Missing exports | |--------------|----------|-----------------|--------| -| 31986 | 179 | 21534 | 1003 | +| 32016 | 179 | 21562 | 1007 | ## Plugin Directory @@ -51,7 +51,7 @@ tags: ['contributor', 'dev', 'apidocs', 'kibana'] | | [App Services](https://github.com/orgs/elastic/teams/kibana-app-services) | This plugin provides the ability to create data views via a modal flyout inside Kibana apps | 15 | 0 | 7 | 0 | | | [App Services](https://github.com/orgs/elastic/teams/kibana-app-services) | Reusable data view field editor across Kibana | 60 | 0 | 30 | 0 | | | [App Services](https://github.com/orgs/elastic/teams/kibana-app-services) | Data view management app | 2 | 0 | 2 | 0 | -| | [App Services](https://github.com/orgs/elastic/teams/kibana-app-services) | Data services are useful for searching and querying data from Elasticsearch. Helpful utilities include: a re-usable react query bar, KQL autocomplete, async search, Data Views (Index Patterns) and field formatters. | 966 | 0 | 208 | 1 | +| | [App Services](https://github.com/orgs/elastic/teams/kibana-app-services) | Data services are useful for searching and querying data from Elasticsearch. Helpful utilities include: a re-usable react query bar, KQL autocomplete, async search, Data Views (Index Patterns) and field formatters. | 983 | 0 | 225 | 2 | | | [Machine Learning UI](https://github.com/orgs/elastic/teams/ml-ui) | The Data Visualizer tools help you understand your data, by analyzing the metrics and fields in a log file or an existing Elasticsearch index. | 28 | 3 | 24 | 1 | | | [Stack Management](https://github.com/orgs/elastic/teams/kibana-stack-management) | - | 10 | 0 | 8 | 2 | | | [Data Discovery](https://github.com/orgs/elastic/teams/kibana-data-discovery) | This plugin contains the Discover application and the saved search embeddable. | 97 | 0 | 80 | 4 | @@ -101,7 +101,7 @@ tags: ['contributor', 'dev', 'apidocs', 'kibana'] | kibanaUsageCollection | [Kibana Telemetry](https://github.com/orgs/elastic/teams/kibana-telemetry) | - | 0 | 0 | 0 | 0 | | | [App Services](https://github.com/orgs/elastic/teams/kibana-app-services) | - | 615 | 3 | 418 | 9 | | | [Security Team](https://github.com/orgs/elastic/teams/security-team) | - | 3 | 0 | 3 | 1 | -| | [Vis Editors](https://github.com/orgs/elastic/teams/kibana-vis-editors) | Visualization editor allowing to quickly and easily configure compelling visualizations to use on dashboards and canvas workpads. Exposes components to embed visualizations and link into the Lens editor from within other apps in Kibana. | 649 | 0 | 560 | 42 | +| | [Vis Editors](https://github.com/orgs/elastic/teams/kibana-vis-editors) | Visualization editor allowing to quickly and easily configure compelling visualizations to use on dashboards and canvas workpads. Exposes components to embed visualizations and link into the Lens editor from within other apps in Kibana. | 658 | 0 | 567 | 45 | | | [Stack Management](https://github.com/orgs/elastic/teams/kibana-stack-management) | - | 8 | 0 | 8 | 0 | | | [Stack Management](https://github.com/orgs/elastic/teams/kibana-stack-management) | - | 3 | 0 | 3 | 0 | | | [Kibana Core](https://github.com/orgs/elastic/teams/kibana-core) | - | 117 | 0 | 42 | 10 | @@ -153,10 +153,10 @@ tags: ['contributor', 'dev', 'apidocs', 'kibana'] | | [Machine Learning UI](https://github.com/orgs/elastic/teams/ml-ui) | This plugin provides access to the transforms features provided by Elastic. Transforms enable you to convert existing Elasticsearch indices into summarized indices, which provide opportunities for new insights and analytics. | 4 | 0 | 4 | 1 | | translations | [Kibana Localization](https://github.com/orgs/elastic/teams/kibana-localization) | - | 0 | 0 | 0 | 0 | | | [Response Ops](https://github.com/orgs/elastic/teams/response-ops) | - | 512 | 1 | 485 | 48 | -| | [App Services](https://github.com/orgs/elastic/teams/kibana-app-services) | Adds UI Actions service to Kibana | 132 | 0 | 91 | 11 | +| | [App Services](https://github.com/orgs/elastic/teams/kibana-app-services) | Adds UI Actions service to Kibana | 133 | 0 | 92 | 11 | | | [App Services](https://github.com/orgs/elastic/teams/kibana-app-services) | Extends UI Actions plugin with more functionality | 206 | 0 | 142 | 9 | | | [Data Discovery](https://github.com/orgs/elastic/teams/kibana-data-discovery) | Contains functionality for the field list which can be integrated into apps | 61 | 0 | 59 | 2 | -| | [Unified Search](https://github.com/orgs/elastic/teams/kibana-app-services) | Contains all the key functionality of Kibana's unified search experience.Contains all the key functionality of Kibana's unified search experience. | 125 | 2 | 99 | 17 | +| | [Unified Search](https://github.com/orgs/elastic/teams/kibana-app-services) | Contains all the key functionality of Kibana's unified search experience.Contains all the key functionality of Kibana's unified search experience. | 128 | 2 | 102 | 17 | | upgradeAssistant | [Stack Management](https://github.com/orgs/elastic/teams/kibana-stack-management) | - | 0 | 0 | 0 | 0 | | urlDrilldown | [App Services](https://github.com/orgs/elastic/teams/kibana-app-services) | Adds drilldown implementations to Kibana | 0 | 0 | 0 | 0 | | | [Vis Editors](https://github.com/orgs/elastic/teams/kibana-vis-editors) | - | 12 | 0 | 12 | 0 | diff --git a/api_docs/presentation_util.mdx b/api_docs/presentation_util.mdx index 4d3613a8b117a..581cd5ef4d51a 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: 2022-09-30 +date: 2022-10-01 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'presentationUtil'] --- import presentationUtilObj from './presentation_util.devdocs.json'; diff --git a/api_docs/profiling.mdx b/api_docs/profiling.mdx index 29db7898a4b53..817f03f981b13 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: 2022-09-30 +date: 2022-10-01 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'profiling'] --- import profilingObj from './profiling.devdocs.json'; diff --git a/api_docs/remote_clusters.mdx b/api_docs/remote_clusters.mdx index 49b546ef38a2b..e074406c74e89 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: 2022-09-30 +date: 2022-10-01 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'remoteClusters'] --- import remoteClustersObj from './remote_clusters.devdocs.json'; diff --git a/api_docs/reporting.mdx b/api_docs/reporting.mdx index 18eff91aea12b..5c1dc0c2685a3 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: 2022-09-30 +date: 2022-10-01 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'reporting'] --- import reportingObj from './reporting.devdocs.json'; diff --git a/api_docs/rollup.mdx b/api_docs/rollup.mdx index 099cff0ab5181..df1bff5712972 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: 2022-09-30 +date: 2022-10-01 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'rollup'] --- import rollupObj from './rollup.devdocs.json'; diff --git a/api_docs/rule_registry.mdx b/api_docs/rule_registry.mdx index c2aaaeb78852e..ec349c4ad0b5e 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: 2022-09-30 +date: 2022-10-01 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'ruleRegistry'] --- import ruleRegistryObj from './rule_registry.devdocs.json'; diff --git a/api_docs/runtime_fields.mdx b/api_docs/runtime_fields.mdx index 5c28ac8b2bdb5..5edda54c6f139 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: 2022-09-30 +date: 2022-10-01 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'runtimeFields'] --- import runtimeFieldsObj from './runtime_fields.devdocs.json'; diff --git a/api_docs/saved_objects.mdx b/api_docs/saved_objects.mdx index 6351e3d45b6ee..d4d313bef79fb 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: 2022-09-30 +date: 2022-10-01 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'savedObjects'] --- import savedObjectsObj from './saved_objects.devdocs.json'; diff --git a/api_docs/saved_objects_finder.mdx b/api_docs/saved_objects_finder.mdx index b0955d53c8d0f..1ae6118247ce5 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: 2022-09-30 +date: 2022-10-01 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'savedObjectsFinder'] --- import savedObjectsFinderObj from './saved_objects_finder.devdocs.json'; diff --git a/api_docs/saved_objects_management.mdx b/api_docs/saved_objects_management.mdx index ddb1f6d02750c..3a2c36b7cc7f4 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: 2022-09-30 +date: 2022-10-01 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'savedObjectsManagement'] --- import savedObjectsManagementObj from './saved_objects_management.devdocs.json'; diff --git a/api_docs/saved_objects_tagging.mdx b/api_docs/saved_objects_tagging.mdx index f9510b48f7efe..6e788653e193a 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: 2022-09-30 +date: 2022-10-01 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'savedObjectsTagging'] --- import savedObjectsTaggingObj from './saved_objects_tagging.devdocs.json'; diff --git a/api_docs/saved_objects_tagging_oss.mdx b/api_docs/saved_objects_tagging_oss.mdx index 3239724d7ef38..1e81b07e6d24c 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: 2022-09-30 +date: 2022-10-01 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'savedObjectsTaggingOss'] --- import savedObjectsTaggingOssObj from './saved_objects_tagging_oss.devdocs.json'; diff --git a/api_docs/saved_search.mdx b/api_docs/saved_search.mdx index b11f668fa1169..2146968cda903 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: 2022-09-30 +date: 2022-10-01 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'savedSearch'] --- import savedSearchObj from './saved_search.devdocs.json'; diff --git a/api_docs/screenshot_mode.mdx b/api_docs/screenshot_mode.mdx index 42b62ddb1d6d1..d88e2e95c6387 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: 2022-09-30 +date: 2022-10-01 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'screenshotMode'] --- import screenshotModeObj from './screenshot_mode.devdocs.json'; diff --git a/api_docs/screenshotting.mdx b/api_docs/screenshotting.mdx index 2e8f47d4893bb..dd4d7868a8991 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: 2022-09-30 +date: 2022-10-01 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'screenshotting'] --- import screenshottingObj from './screenshotting.devdocs.json'; diff --git a/api_docs/security.mdx b/api_docs/security.mdx index a576dc7f8b981..549878d171ab4 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: 2022-09-30 +date: 2022-10-01 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'security'] --- import securityObj from './security.devdocs.json'; diff --git a/api_docs/security_solution.mdx b/api_docs/security_solution.mdx index 575793a057288..eac5df4aa58b0 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: 2022-09-30 +date: 2022-10-01 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'securitySolution'] --- import securitySolutionObj from './security_solution.devdocs.json'; diff --git a/api_docs/session_view.mdx b/api_docs/session_view.mdx index 2ccc09799e6f6..212526e3c0214 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: 2022-09-30 +date: 2022-10-01 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'sessionView'] --- import sessionViewObj from './session_view.devdocs.json'; diff --git a/api_docs/share.mdx b/api_docs/share.mdx index 3c787d2f24b06..a3534fb4ba277 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: 2022-09-30 +date: 2022-10-01 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'share'] --- import shareObj from './share.devdocs.json'; diff --git a/api_docs/snapshot_restore.mdx b/api_docs/snapshot_restore.mdx index fcd7d2325c179..5c626675eef66 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: 2022-09-30 +date: 2022-10-01 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'snapshotRestore'] --- import snapshotRestoreObj from './snapshot_restore.devdocs.json'; diff --git a/api_docs/spaces.mdx b/api_docs/spaces.mdx index a0c0f7d6c4c24..b8766114204c6 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: 2022-09-30 +date: 2022-10-01 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'spaces'] --- import spacesObj from './spaces.devdocs.json'; diff --git a/api_docs/stack_alerts.mdx b/api_docs/stack_alerts.mdx index 6c9a14514a8aa..5bdce3da3e229 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: 2022-09-30 +date: 2022-10-01 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'stackAlerts'] --- import stackAlertsObj from './stack_alerts.devdocs.json'; diff --git a/api_docs/stack_connectors.mdx b/api_docs/stack_connectors.mdx index fb2aab7cf00a6..415c51b650dcb 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: 2022-09-30 +date: 2022-10-01 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'stackConnectors'] --- import stackConnectorsObj from './stack_connectors.devdocs.json'; diff --git a/api_docs/task_manager.mdx b/api_docs/task_manager.mdx index 5289e0a7dee5e..e730f9b56148e 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: 2022-09-30 +date: 2022-10-01 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'taskManager'] --- import taskManagerObj from './task_manager.devdocs.json'; diff --git a/api_docs/telemetry.mdx b/api_docs/telemetry.mdx index ec6a6fda9343b..8cc947166e677 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: 2022-09-30 +date: 2022-10-01 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'telemetry'] --- import telemetryObj from './telemetry.devdocs.json'; diff --git a/api_docs/telemetry_collection_manager.mdx b/api_docs/telemetry_collection_manager.mdx index 28813ee2279e7..7d0012a2281a9 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: 2022-09-30 +date: 2022-10-01 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'telemetryCollectionManager'] --- import telemetryCollectionManagerObj from './telemetry_collection_manager.devdocs.json'; diff --git a/api_docs/telemetry_collection_xpack.mdx b/api_docs/telemetry_collection_xpack.mdx index 167b467328b25..27fb11dfae9f9 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: 2022-09-30 +date: 2022-10-01 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'telemetryCollectionXpack'] --- import telemetryCollectionXpackObj from './telemetry_collection_xpack.devdocs.json'; diff --git a/api_docs/telemetry_management_section.mdx b/api_docs/telemetry_management_section.mdx index c11efc4d43706..e358c37feb52c 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: 2022-09-30 +date: 2022-10-01 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 8d9b53a137bc8..54c0a5d93409a 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: 2022-09-30 +date: 2022-10-01 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'threatIntelligence'] --- import threatIntelligenceObj from './threat_intelligence.devdocs.json'; diff --git a/api_docs/timelines.mdx b/api_docs/timelines.mdx index 5070df796c8a6..9c00897d8c1fd 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: 2022-09-30 +date: 2022-10-01 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'timelines'] --- import timelinesObj from './timelines.devdocs.json'; diff --git a/api_docs/transform.mdx b/api_docs/transform.mdx index 3115cbb40769f..510d527d883c6 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: 2022-09-30 +date: 2022-10-01 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'transform'] --- import transformObj from './transform.devdocs.json'; diff --git a/api_docs/triggers_actions_ui.mdx b/api_docs/triggers_actions_ui.mdx index c7570c5245900..c94cb7a1a751d 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: 2022-09-30 +date: 2022-10-01 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'triggersActionsUi'] --- import triggersActionsUiObj from './triggers_actions_ui.devdocs.json'; diff --git a/api_docs/ui_actions.devdocs.json b/api_docs/ui_actions.devdocs.json index 293aa53e4d804..d224e96cb9e8a 100644 --- a/api_docs/ui_actions.devdocs.json +++ b/api_docs/ui_actions.devdocs.json @@ -2191,6 +2191,21 @@ "path": "src/plugins/ui_actions/public/types.ts", "deprecated": false, "trackAdoption": false + }, + { + "parentPluginId": "uiActions", + "id": "def-public.VisualizeFieldContext.query", + "type": "CompoundType", + "tags": [], + "label": "query", + "description": [], + "signature": [ + "AggregateQuery", + " | undefined" + ], + "path": "src/plugins/ui_actions/public/types.ts", + "deprecated": false, + "trackAdoption": false } ], "initialIsOpen": false diff --git a/api_docs/ui_actions.mdx b/api_docs/ui_actions.mdx index 9626982ef7232..a67988ed1155e 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: 2022-09-30 +date: 2022-10-01 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'uiActions'] --- import uiActionsObj from './ui_actions.devdocs.json'; @@ -21,7 +21,7 @@ Contact [App Services](https://github.com/orgs/elastic/teams/kibana-app-services | Public API count | Any count | Items lacking comments | Missing exports | |-------------------|-----------|------------------------|-----------------| -| 132 | 0 | 91 | 11 | +| 133 | 0 | 92 | 11 | ## Client diff --git a/api_docs/ui_actions_enhanced.mdx b/api_docs/ui_actions_enhanced.mdx index 5e08f17c4b215..a2d9c4d869b7b 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: 2022-09-30 +date: 2022-10-01 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'uiActionsEnhanced'] --- import uiActionsEnhancedObj from './ui_actions_enhanced.devdocs.json'; diff --git a/api_docs/unified_field_list.mdx b/api_docs/unified_field_list.mdx index 2c376ec69d7eb..ccea854bb0735 100644 --- a/api_docs/unified_field_list.mdx +++ b/api_docs/unified_field_list.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/unifiedFieldList title: "unifiedFieldList" image: https://source.unsplash.com/400x175/?github description: API docs for the unifiedFieldList plugin -date: 2022-09-30 +date: 2022-10-01 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'unifiedFieldList'] --- import unifiedFieldListObj from './unified_field_list.devdocs.json'; diff --git a/api_docs/unified_search.devdocs.json b/api_docs/unified_search.devdocs.json index 8a490ca91dd2b..5678db92f00cd 100644 --- a/api_docs/unified_search.devdocs.json +++ b/api_docs/unified_search.devdocs.json @@ -11,7 +11,7 @@ "label": "DataViewPicker", "description": [], "signature": [ - "({ isMissingCurrent, currentDataViewId, adHocDataViews, onChangeDataView, onAddField, onDataViewCreated, trigger, selectableProps, textBasedLanguages, onSaveTextLanguageQuery, onTextLangQuerySubmit, textBasedLanguage, isDisabled, }: ", + "({ isMissingCurrent, currentDataViewId, adHocDataViews, onChangeDataView, onAddField, onDataViewCreated, trigger, selectableProps, textBasedLanguages, onSaveTextLanguageQuery, onTextLangQuerySubmit, textBasedLanguage, onCreateDefaultAdHocDataView, isDisabled, }: ", "DataViewPickerPropsExtended", ") => JSX.Element" ], @@ -24,7 +24,7 @@ "id": "def-public.DataViewPicker.$1", "type": "Object", "tags": [], - "label": "{\n isMissingCurrent,\n currentDataViewId,\n adHocDataViews,\n onChangeDataView,\n onAddField,\n onDataViewCreated,\n trigger,\n selectableProps,\n textBasedLanguages,\n onSaveTextLanguageQuery,\n onTextLangQuerySubmit,\n textBasedLanguage,\n isDisabled,\n}", + "label": "{\n isMissingCurrent,\n currentDataViewId,\n adHocDataViews,\n onChangeDataView,\n onAddField,\n onDataViewCreated,\n trigger,\n selectableProps,\n textBasedLanguages,\n onSaveTextLanguageQuery,\n onTextLangQuerySubmit,\n textBasedLanguage,\n onCreateDefaultAdHocDataView,\n isDisabled,\n}", "description": [], "signature": [ "DataViewPickerPropsExtended" @@ -645,6 +645,38 @@ "children": [], "returnComment": [] }, + { + "parentPluginId": "unifiedSearch", + "id": "def-public.DataViewPickerProps.onCreateDefaultAdHocDataView", + "type": "Function", + "tags": [], + "label": "onCreateDefaultAdHocDataView", + "description": [], + "signature": [ + "((pattern: string) => void) | undefined" + ], + "path": "src/plugins/unified_search/public/dataview_picker/index.tsx", + "deprecated": false, + "trackAdoption": false, + "children": [ + { + "parentPluginId": "unifiedSearch", + "id": "def-public.DataViewPickerProps.onCreateDefaultAdHocDataView.$1", + "type": "string", + "tags": [], + "label": "pattern", + "description": [], + "signature": [ + "string" + ], + "path": "src/plugins/unified_search/public/dataview_picker/index.tsx", + "deprecated": false, + "trackAdoption": false, + "isRequired": true + } + ], + "returnComment": [] + }, { "parentPluginId": "unifiedSearch", "id": "def-public.DataViewPickerProps.textBasedLanguages", @@ -1058,6 +1090,26 @@ "deprecated": false, "trackAdoption": false }, + { + "parentPluginId": "unifiedSearch", + "id": "def-public.IUnifiedSearchPluginServices.dataViews", + "type": "Object", + "tags": [], + "label": "dataViews", + "description": [], + "signature": [ + { + "pluginId": "dataViews", + "scope": "public", + "docId": "kibDataViewsPluginApi", + "section": "def-public.DataViewsServicePublic", + "text": "DataViewsServicePublic" + } + ], + "path": "src/plugins/unified_search/public/types.ts", + "deprecated": false, + "trackAdoption": false + }, { "parentPluginId": "unifiedSearch", "id": "def-public.IUnifiedSearchPluginServices.usageCollection", diff --git a/api_docs/unified_search.mdx b/api_docs/unified_search.mdx index de104e703fd94..76011654fbea5 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: 2022-09-30 +date: 2022-10-01 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'unifiedSearch'] --- import unifiedSearchObj from './unified_search.devdocs.json'; @@ -21,7 +21,7 @@ Contact [Unified Search](https://github.com/orgs/elastic/teams/kibana-app-servic | Public API count | Any count | Items lacking comments | Missing exports | |-------------------|-----------|------------------------|-----------------| -| 125 | 2 | 99 | 17 | +| 128 | 2 | 102 | 17 | ## Client diff --git a/api_docs/unified_search_autocomplete.mdx b/api_docs/unified_search_autocomplete.mdx index 6138b56184d26..14a0d57226b4c 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: 2022-09-30 +date: 2022-10-01 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'unifiedSearch.autocomplete'] --- import unifiedSearchAutocompleteObj from './unified_search_autocomplete.devdocs.json'; @@ -21,7 +21,7 @@ Contact [Unified Search](https://github.com/orgs/elastic/teams/kibana-app-servic | Public API count | Any count | Items lacking comments | Missing exports | |-------------------|-----------|------------------------|-----------------| -| 125 | 2 | 99 | 17 | +| 128 | 2 | 102 | 17 | ## Client diff --git a/api_docs/url_forwarding.mdx b/api_docs/url_forwarding.mdx index e44699c7b7c56..f7410808300ee 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: 2022-09-30 +date: 2022-10-01 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'urlForwarding'] --- import urlForwardingObj from './url_forwarding.devdocs.json'; diff --git a/api_docs/usage_collection.mdx b/api_docs/usage_collection.mdx index b59d6dcec2681..a62461b88ceec 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: 2022-09-30 +date: 2022-10-01 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'usageCollection'] --- import usageCollectionObj from './usage_collection.devdocs.json'; diff --git a/api_docs/ux.mdx b/api_docs/ux.mdx index b5e23e55dfb64..7d7a4df32df81 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: 2022-09-30 +date: 2022-10-01 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'ux'] --- import uxObj from './ux.devdocs.json'; diff --git a/api_docs/vis_default_editor.mdx b/api_docs/vis_default_editor.mdx index 2fb7351aa02f8..3a1a53675deec 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: 2022-09-30 +date: 2022-10-01 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'visDefaultEditor'] --- import visDefaultEditorObj from './vis_default_editor.devdocs.json'; diff --git a/api_docs/vis_type_gauge.mdx b/api_docs/vis_type_gauge.mdx index 408e2c2ca376b..cfdaf08f6cc1b 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: 2022-09-30 +date: 2022-10-01 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'visTypeGauge'] --- import visTypeGaugeObj from './vis_type_gauge.devdocs.json'; diff --git a/api_docs/vis_type_heatmap.mdx b/api_docs/vis_type_heatmap.mdx index fa44a39b582b7..b26a487e9cbbc 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: 2022-09-30 +date: 2022-10-01 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'visTypeHeatmap'] --- import visTypeHeatmapObj from './vis_type_heatmap.devdocs.json'; diff --git a/api_docs/vis_type_pie.mdx b/api_docs/vis_type_pie.mdx index cd176ecf49a95..a3aaeb805b0c3 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: 2022-09-30 +date: 2022-10-01 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'visTypePie'] --- import visTypePieObj from './vis_type_pie.devdocs.json'; diff --git a/api_docs/vis_type_table.mdx b/api_docs/vis_type_table.mdx index d5b90e601d8ec..aff9846178613 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: 2022-09-30 +date: 2022-10-01 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'visTypeTable'] --- import visTypeTableObj from './vis_type_table.devdocs.json'; diff --git a/api_docs/vis_type_timelion.mdx b/api_docs/vis_type_timelion.mdx index ba692d609d713..c1f44c36c05d8 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: 2022-09-30 +date: 2022-10-01 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'visTypeTimelion'] --- import visTypeTimelionObj from './vis_type_timelion.devdocs.json'; diff --git a/api_docs/vis_type_timeseries.mdx b/api_docs/vis_type_timeseries.mdx index 4b74690406711..179e2273cf670 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: 2022-09-30 +date: 2022-10-01 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'visTypeTimeseries'] --- import visTypeTimeseriesObj from './vis_type_timeseries.devdocs.json'; diff --git a/api_docs/vis_type_vega.mdx b/api_docs/vis_type_vega.mdx index 9eddbfeec41d4..691934f5c9b10 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: 2022-09-30 +date: 2022-10-01 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'visTypeVega'] --- import visTypeVegaObj from './vis_type_vega.devdocs.json'; diff --git a/api_docs/vis_type_vislib.mdx b/api_docs/vis_type_vislib.mdx index 31e138d68aa17..a18309726008d 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: 2022-09-30 +date: 2022-10-01 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'visTypeVislib'] --- import visTypeVislibObj from './vis_type_vislib.devdocs.json'; diff --git a/api_docs/vis_type_xy.mdx b/api_docs/vis_type_xy.mdx index a1d6cb9154128..9733a2e51f76c 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: 2022-09-30 +date: 2022-10-01 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'visTypeXy'] --- import visTypeXyObj from './vis_type_xy.devdocs.json'; diff --git a/api_docs/visualizations.mdx b/api_docs/visualizations.mdx index db658a8b5a0b1..1b87bc4d3156d 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: 2022-09-30 +date: 2022-10-01 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'visualizations'] --- import visualizationsObj from './visualizations.devdocs.json'; From e50b5eb6da88b426bf4eebd02e3c535c92ab6c34 Mon Sep 17 00:00:00 2001 From: Sean Sullivan Date: Sat, 1 Oct 2022 07:20:13 -0400 Subject: [PATCH 66/72] Allow custom sources to have control over data sync (#141829) --- .../raster_tile_layer.test.ts | 17 ++++++-- .../raster_tile_layer/raster_tile_layer.ts | 43 ++++++------------- .../kibana_tilemap_source.js | 10 ++++- .../classes/sources/raster_source/index.ts | 18 ++++++++ .../classes/sources/tms_source/index.ts | 1 - .../classes/sources/wms_source/wms_source.js | 10 ++++- .../sources/xyz_tms_source/xyz_tms_source.ts | 38 ++++++++++++++-- .../maps/public/selectors/map_selectors.ts | 4 +- 8 files changed, 101 insertions(+), 40 deletions(-) create mode 100644 x-pack/plugins/maps/public/classes/sources/raster_source/index.ts diff --git a/x-pack/plugins/maps/public/classes/layers/raster_tile_layer/raster_tile_layer.test.ts b/x-pack/plugins/maps/public/classes/layers/raster_tile_layer/raster_tile_layer.test.ts index 963a12e9f7374..c42b338032f05 100644 --- a/x-pack/plugins/maps/public/classes/layers/raster_tile_layer/raster_tile_layer.test.ts +++ b/x-pack/plugins/maps/public/classes/layers/raster_tile_layer/raster_tile_layer.test.ts @@ -7,10 +7,12 @@ import { RasterTileLayer } from './raster_tile_layer'; import { SOURCE_TYPES } from '../../../../common/constants'; -import { XYZTMSSourceDescriptor } from '../../../../common/descriptor_types'; +import { DataRequestMeta, XYZTMSSourceDescriptor } from '../../../../common/descriptor_types'; import { AbstractSource } from '../../sources/source'; -import { ITMSSource } from '../../sources/tms_source'; import { ILayer } from '../layer'; +import { RasterTileSource } from 'maplibre-gl'; +import { DataRequest } from '../../util/data_request'; +import { IRasterSource, RasterTileSourceData } from '../../sources/raster_source'; const sourceDescriptor: XYZTMSSourceDescriptor = { type: SOURCE_TYPES.EMS_XYZ, @@ -18,12 +20,21 @@ const sourceDescriptor: XYZTMSSourceDescriptor = { id: 'foobar', }; -class MockTileSource extends AbstractSource implements ITMSSource { +class MockTileSource extends AbstractSource implements IRasterSource { readonly _descriptor: XYZTMSSourceDescriptor; constructor(descriptor: XYZTMSSourceDescriptor) { super(descriptor); this._descriptor = descriptor; } + async canSkipSourceUpdate( + dataRequest: DataRequest, + nextRequestMeta: DataRequestMeta + ): Promise { + return true; + } + isSourceStale(mbSource: RasterTileSource, sourceData: RasterTileSourceData): boolean { + return false; + } async getDisplayName(): Promise { return this._descriptor.urlTemplate; diff --git a/x-pack/plugins/maps/public/classes/layers/raster_tile_layer/raster_tile_layer.ts b/x-pack/plugins/maps/public/classes/layers/raster_tile_layer/raster_tile_layer.ts index fc471375e1d30..cc13b70d01060 100644 --- a/x-pack/plugins/maps/public/classes/layers/raster_tile_layer/raster_tile_layer.ts +++ b/x-pack/plugins/maps/public/classes/layers/raster_tile_layer/raster_tile_layer.ts @@ -9,15 +9,11 @@ import type { Map as MbMap, RasterTileSource } from '@kbn/mapbox-gl'; import _ from 'lodash'; import { AbstractLayer } from '../layer'; import { SOURCE_DATA_REQUEST_ID, LAYER_TYPE, LAYER_STYLE_TYPE } from '../../../../common/constants'; -import { LayerDescriptor, Timeslice } from '../../../../common/descriptor_types'; +import { LayerDescriptor } from '../../../../common/descriptor_types'; import { TileStyle } from '../../styles/tile/tile_style'; -import { ITMSSource } from '../../sources/tms_source'; import { DataRequestContext } from '../../../actions'; -import { canSkipSourceUpdate } from '../../util/can_skip_fetch'; -interface RasterTileSourceData { - url: string; -} +import { IRasterSource, RasterTileSourceData } from '../../sources/raster_source'; export class RasterTileLayer extends AbstractLayer { static createDescriptor(options: Partial) { @@ -34,15 +30,15 @@ export class RasterTileLayer extends AbstractLayer { source, layerDescriptor, }: { - source: ITMSSource; + source: IRasterSource; layerDescriptor: LayerDescriptor; }) { super({ source, layerDescriptor }); this._style = new TileStyle(); } - getSource(): ITMSSource { - return super.getSource() as ITMSSource; + getSource(): IRasterSource { + return super.getSource() as IRasterSource; } getStyleForEditing() { @@ -65,17 +61,7 @@ export class RasterTileLayer extends AbstractLayer { }; const prevDataRequest = this.getSourceDataRequest(); if (prevDataRequest) { - const prevMeta = prevDataRequest?.getMeta(); - const canSkip = await canSkipSourceUpdate({ - extentAware: false, - source, - prevDataRequest, - nextRequestMeta: nextMeta, - getUpdateDueToTimeslice: (timeslice?: Timeslice) => { - if (!prevMeta) return true; - return source.getUpdateDueToTimeslice(prevMeta, timeslice); - }, - }); + const canSkip = await source.canSkipSourceUpdate(prevDataRequest, nextMeta); if (canSkip) return; } const requestToken = Symbol(`layer-source-refresh:${this.getId()} - source`); @@ -107,21 +93,20 @@ export class RasterTileLayer extends AbstractLayer { } _requiresPrevSourceCleanup(mbMap: MbMap): boolean { + const source = this.getSource(); const mbSource = mbMap.getSource(this.getMbSourceId()) as RasterTileSource; if (!mbSource) { return false; } const sourceDataRequest = this.getSourceDataRequest(); - if (!sourceDataRequest) { - return false; - } - const sourceData = sourceDataRequest.getData() as RasterTileSourceData | undefined; - if (!sourceData) { - return false; + if (sourceDataRequest) { + const data = sourceDataRequest.getData(); + if (data) { + return source.isSourceStale(mbSource, data as RasterTileSourceData); + } } - - return mbSource.tiles?.[0] !== sourceData.url; + return false; } syncLayerWithMB(mbMap: MbMap) { @@ -138,7 +123,7 @@ export class RasterTileLayer extends AbstractLayer { return; } - const tmsSourceData = sourceDataRequest.getData() as { url?: string }; + const tmsSourceData = sourceDataRequest.getData() as RasterTileSourceData; if (!tmsSourceData || !tmsSourceData.url) { return; } diff --git a/x-pack/plugins/maps/public/classes/sources/kibana_tilemap_source/kibana_tilemap_source.js b/x-pack/plugins/maps/public/classes/sources/kibana_tilemap_source/kibana_tilemap_source.js index db0b5359ca56e..19a7ec2941102 100644 --- a/x-pack/plugins/maps/public/classes/sources/kibana_tilemap_source/kibana_tilemap_source.js +++ b/x-pack/plugins/maps/public/classes/sources/kibana_tilemap_source/kibana_tilemap_source.js @@ -41,7 +41,15 @@ export class KibanaTilemapSource extends AbstractSource { }, ]; } - + isSourceStale(mbSource, sourceData) { + if (!sourceData.url) { + return false; + } + return mbSource.tiles?.[0] !== sourceData.url; + } + async canSkipSourceUpdate() { + return false; + } async getUrlTemplate() { const tilemap = getKibanaTileMap(); if (!tilemap.url) { diff --git a/x-pack/plugins/maps/public/classes/sources/raster_source/index.ts b/x-pack/plugins/maps/public/classes/sources/raster_source/index.ts new file mode 100644 index 0000000000000..53f1b75003ea3 --- /dev/null +++ b/x-pack/plugins/maps/public/classes/sources/raster_source/index.ts @@ -0,0 +1,18 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import { RasterTileSource } from '@kbn/mapbox-gl'; +import { DataRequest } from '../../util/data_request'; +import { ITMSSource } from '../tms_source'; +import { DataRequestMeta } from '../../../../common/descriptor_types'; +export interface RasterTileSourceData { + url: string; +} +export interface IRasterSource extends ITMSSource { + canSkipSourceUpdate(dataRequest: DataRequest, nextRequestMeta: DataRequestMeta): Promise; + isSourceStale(mbSource: RasterTileSource, sourceData: RasterTileSourceData): boolean; +} diff --git a/x-pack/plugins/maps/public/classes/sources/tms_source/index.ts b/x-pack/plugins/maps/public/classes/sources/tms_source/index.ts index 05207acf7329a..d18a00df34f07 100644 --- a/x-pack/plugins/maps/public/classes/sources/tms_source/index.ts +++ b/x-pack/plugins/maps/public/classes/sources/tms_source/index.ts @@ -7,7 +7,6 @@ import { DataFilters } from '../../../../common/descriptor_types'; import { ISource } from '../source'; - export interface ITMSSource extends ISource { getUrlTemplate(dataFilters: DataFilters): Promise; } diff --git a/x-pack/plugins/maps/public/classes/sources/wms_source/wms_source.js b/x-pack/plugins/maps/public/classes/sources/wms_source/wms_source.js index b884785d348aa..a1c1c60d75561 100644 --- a/x-pack/plugins/maps/public/classes/sources/wms_source/wms_source.js +++ b/x-pack/plugins/maps/public/classes/sources/wms_source/wms_source.js @@ -27,7 +27,15 @@ export class WMSSource extends AbstractSource { styles, }; } - + isSourceStale(mbSource, sourceData) { + if (!sourceData.url) { + return false; + } + return mbSource.tiles?.[0] !== sourceData.url; + } + async canSkipSourceUpdate() { + return false; + } async getImmutableProperties() { return [ { label: getDataSourceLabel(), value: sourceTitle }, diff --git a/x-pack/plugins/maps/public/classes/sources/xyz_tms_source/xyz_tms_source.ts b/x-pack/plugins/maps/public/classes/sources/xyz_tms_source/xyz_tms_source.ts index 01f77e4a45c38..c2c5e6404c8f0 100644 --- a/x-pack/plugins/maps/public/classes/sources/xyz_tms_source/xyz_tms_source.ts +++ b/x-pack/plugins/maps/public/classes/sources/xyz_tms_source/xyz_tms_source.ts @@ -6,19 +6,26 @@ */ import { i18n } from '@kbn/i18n'; +import { RasterTileSource } from 'maplibre-gl'; import { getDataSourceLabel, getUrlLabel } from '../../../../common/i18n_getters'; import { SOURCE_TYPES } from '../../../../common/constants'; import { registerSource } from '../source_registry'; -import { ITMSSource } from '../tms_source'; -import { XYZTMSSourceDescriptor } from '../../../../common/descriptor_types'; +import { + XYZTMSSourceDescriptor, + DataRequestMeta, + Timeslice, +} from '../../../../common/descriptor_types'; import { AbstractSource, ImmutableSourceProperty } from '../source'; import { XYZTMSSourceConfig } from './xyz_tms_editor'; +import { canSkipSourceUpdate } from '../../util/can_skip_fetch'; +import { DataRequest } from '../../util/data_request'; +import { IRasterSource, RasterTileSourceData } from '../raster_source'; export const sourceTitle = i18n.translate('xpack.maps.source.ems_xyzTitle', { defaultMessage: 'Tile Map Service', }); -export class XYZTMSSource extends AbstractSource implements ITMSSource { +export class XYZTMSSource extends AbstractSource implements IRasterSource { static type = SOURCE_TYPES.EMS_XYZ; readonly _descriptor: XYZTMSSourceDescriptor; @@ -49,6 +56,31 @@ export class XYZTMSSource extends AbstractSource implements ITMSSource { async getUrlTemplate(): Promise { return this._descriptor.urlTemplate; } + + isSourceStale(mbSource: RasterTileSource, sourceData: RasterTileSourceData): boolean { + if (!sourceData.url) { + return false; + } + return mbSource.tiles?.[0] !== sourceData.url; + } + + async canSkipSourceUpdate( + prevDataRequest: DataRequest, + nextMeta: DataRequestMeta + ): Promise { + const prevMeta = prevDataRequest?.getMeta(); + const canSkip = await canSkipSourceUpdate({ + extentAware: false, + source: this, + prevDataRequest, + nextRequestMeta: nextMeta, + getUpdateDueToTimeslice: (timeslice?: Timeslice) => { + if (!prevMeta) return true; + return this.getUpdateDueToTimeslice(prevMeta, timeslice); + }, + }); + return canSkip; + } } registerSource({ diff --git a/x-pack/plugins/maps/public/selectors/map_selectors.ts b/x-pack/plugins/maps/public/selectors/map_selectors.ts index 8adb3f8f927ab..6ee55bd72e49d 100644 --- a/x-pack/plugins/maps/public/selectors/map_selectors.ts +++ b/x-pack/plugins/maps/public/selectors/map_selectors.ts @@ -54,10 +54,10 @@ import { VectorLayerDescriptor, } from '../../common/descriptor_types'; import { ISource } from '../classes/sources/source'; -import { ITMSSource } from '../classes/sources/tms_source'; import { IVectorSource } from '../classes/sources/vector_source'; import { ESGeoGridSource } from '../classes/sources/es_geo_grid_source'; import { EMSTMSSource } from '../classes/sources/ems_tms_source'; +import { IRasterSource } from '../classes/sources/raster_source'; import { ILayer } from '../classes/layers/layer'; import { getIsReadOnly } from './ui_selectors'; @@ -78,7 +78,7 @@ export function createLayerInstance( switch (layerDescriptor.type) { case LAYER_TYPE.RASTER_TILE: - return new RasterTileLayer({ layerDescriptor, source: source as ITMSSource }); + return new RasterTileLayer({ layerDescriptor, source: source as IRasterSource }); case LAYER_TYPE.EMS_VECTOR_TILE: return new EmsVectorTileLayer({ layerDescriptor: layerDescriptor as EMSVectorTileLayerDescriptor, From 083b9a74fd6e291c1113acd8ef996a940cd5b1a3 Mon Sep 17 00:00:00 2001 From: Kibana Machine <42973632+kibanamachine@users.noreply.github.com> Date: Sat, 1 Oct 2022 22:38:50 -0600 Subject: [PATCH 67/72] [api-docs] Daily api_docs build (#142425) --- api_docs/actions.mdx | 2 +- api_docs/advanced_settings.mdx | 2 +- api_docs/aiops.mdx | 2 +- api_docs/alerting.mdx | 2 +- api_docs/apm.mdx | 2 +- api_docs/banners.mdx | 2 +- api_docs/bfetch.mdx | 2 +- api_docs/canvas.mdx | 2 +- api_docs/cases.mdx | 2 +- api_docs/charts.mdx | 2 +- api_docs/cloud.mdx | 2 +- api_docs/cloud_experiments.mdx | 2 +- api_docs/cloud_security_posture.mdx | 2 +- api_docs/console.mdx | 2 +- api_docs/controls.mdx | 2 +- api_docs/core.mdx | 2 +- api_docs/custom_integrations.mdx | 2 +- api_docs/dashboard.mdx | 2 +- api_docs/dashboard_enhanced.mdx | 2 +- api_docs/data.mdx | 2 +- api_docs/data_query.mdx | 2 +- api_docs/data_search.mdx | 2 +- api_docs/data_view_editor.mdx | 2 +- api_docs/data_view_field_editor.mdx | 2 +- api_docs/data_view_management.mdx | 2 +- api_docs/data_views.mdx | 2 +- api_docs/data_visualizer.mdx | 2 +- api_docs/deprecations_by_api.mdx | 2 +- api_docs/deprecations_by_plugin.mdx | 2 +- api_docs/deprecations_by_team.mdx | 2 +- api_docs/dev_tools.mdx | 2 +- api_docs/discover.mdx | 2 +- api_docs/discover_enhanced.mdx | 2 +- api_docs/embeddable.mdx | 2 +- api_docs/embeddable_enhanced.mdx | 2 +- api_docs/encrypted_saved_objects.mdx | 2 +- api_docs/enterprise_search.mdx | 2 +- api_docs/es_ui_shared.mdx | 2 +- api_docs/event_annotation.mdx | 2 +- api_docs/event_log.mdx | 2 +- api_docs/expression_error.mdx | 2 +- api_docs/expression_gauge.mdx | 2 +- api_docs/expression_heatmap.mdx | 2 +- api_docs/expression_image.mdx | 2 +- api_docs/expression_legacy_metric_vis.mdx | 2 +- api_docs/expression_metric.mdx | 2 +- api_docs/expression_metric_vis.mdx | 2 +- api_docs/expression_partition_vis.mdx | 2 +- api_docs/expression_repeat_image.mdx | 2 +- api_docs/expression_reveal_image.mdx | 2 +- api_docs/expression_shape.mdx | 2 +- api_docs/expression_tagcloud.mdx | 2 +- api_docs/expression_x_y.mdx | 2 +- api_docs/expressions.mdx | 2 +- api_docs/features.mdx | 2 +- api_docs/field_formats.mdx | 2 +- api_docs/file_upload.mdx | 2 +- api_docs/files.mdx | 2 +- api_docs/fleet.mdx | 2 +- api_docs/global_search.mdx | 2 +- api_docs/guided_onboarding.mdx | 2 +- api_docs/home.mdx | 2 +- api_docs/index_lifecycle_management.mdx | 2 +- api_docs/index_management.mdx | 2 +- api_docs/infra.mdx | 2 +- api_docs/inspector.mdx | 2 +- api_docs/interactive_setup.mdx | 2 +- api_docs/kbn_ace.mdx | 2 +- api_docs/kbn_aiops_components.mdx | 2 +- api_docs/kbn_aiops_utils.mdx | 2 +- api_docs/kbn_alerts.mdx | 2 +- api_docs/kbn_analytics.mdx | 2 +- api_docs/kbn_analytics_client.mdx | 2 +- api_docs/kbn_analytics_shippers_elastic_v3_browser.mdx | 2 +- api_docs/kbn_analytics_shippers_elastic_v3_common.mdx | 2 +- api_docs/kbn_analytics_shippers_elastic_v3_server.mdx | 2 +- api_docs/kbn_analytics_shippers_fullstory.mdx | 2 +- api_docs/kbn_apm_config_loader.mdx | 2 +- api_docs/kbn_apm_synthtrace.mdx | 2 +- api_docs/kbn_apm_utils.mdx | 2 +- api_docs/kbn_axe_config.mdx | 2 +- api_docs/kbn_chart_icons.mdx | 2 +- api_docs/kbn_ci_stats_core.mdx | 2 +- api_docs/kbn_ci_stats_performance_metrics.mdx | 2 +- api_docs/kbn_ci_stats_reporter.mdx | 2 +- api_docs/kbn_cli_dev_mode.mdx | 2 +- api_docs/kbn_coloring.mdx | 2 +- api_docs/kbn_config.mdx | 2 +- api_docs/kbn_config_mocks.mdx | 2 +- api_docs/kbn_config_schema.mdx | 2 +- api_docs/kbn_content_management_table_list.mdx | 2 +- api_docs/kbn_core_analytics_browser.mdx | 2 +- api_docs/kbn_core_analytics_browser_internal.mdx | 2 +- api_docs/kbn_core_analytics_browser_mocks.mdx | 2 +- api_docs/kbn_core_analytics_server.mdx | 2 +- api_docs/kbn_core_analytics_server_internal.mdx | 2 +- api_docs/kbn_core_analytics_server_mocks.mdx | 2 +- api_docs/kbn_core_application_browser.mdx | 2 +- api_docs/kbn_core_application_browser_internal.mdx | 2 +- api_docs/kbn_core_application_browser_mocks.mdx | 2 +- api_docs/kbn_core_application_common.mdx | 2 +- api_docs/kbn_core_apps_browser_internal.mdx | 2 +- api_docs/kbn_core_apps_browser_mocks.mdx | 2 +- api_docs/kbn_core_base_browser_mocks.mdx | 2 +- api_docs/kbn_core_base_common.mdx | 2 +- api_docs/kbn_core_base_server_internal.mdx | 2 +- api_docs/kbn_core_base_server_mocks.mdx | 2 +- api_docs/kbn_core_capabilities_browser_mocks.mdx | 2 +- api_docs/kbn_core_capabilities_common.mdx | 2 +- api_docs/kbn_core_capabilities_server.mdx | 2 +- api_docs/kbn_core_capabilities_server_mocks.mdx | 2 +- api_docs/kbn_core_chrome_browser.mdx | 2 +- api_docs/kbn_core_chrome_browser_mocks.mdx | 2 +- api_docs/kbn_core_config_server_internal.mdx | 2 +- api_docs/kbn_core_deprecations_browser.mdx | 2 +- api_docs/kbn_core_deprecations_browser_internal.mdx | 2 +- api_docs/kbn_core_deprecations_browser_mocks.mdx | 2 +- api_docs/kbn_core_deprecations_common.mdx | 2 +- api_docs/kbn_core_deprecations_server.mdx | 2 +- api_docs/kbn_core_deprecations_server_internal.mdx | 2 +- api_docs/kbn_core_deprecations_server_mocks.mdx | 2 +- api_docs/kbn_core_doc_links_browser.mdx | 2 +- api_docs/kbn_core_doc_links_browser_mocks.mdx | 2 +- api_docs/kbn_core_doc_links_server.mdx | 2 +- api_docs/kbn_core_doc_links_server_mocks.mdx | 2 +- api_docs/kbn_core_elasticsearch_client_server_internal.mdx | 2 +- api_docs/kbn_core_elasticsearch_client_server_mocks.mdx | 2 +- api_docs/kbn_core_elasticsearch_server.mdx | 2 +- api_docs/kbn_core_elasticsearch_server_internal.mdx | 2 +- api_docs/kbn_core_elasticsearch_server_mocks.mdx | 2 +- api_docs/kbn_core_environment_server_internal.mdx | 2 +- api_docs/kbn_core_environment_server_mocks.mdx | 2 +- api_docs/kbn_core_execution_context_browser.mdx | 2 +- api_docs/kbn_core_execution_context_browser_internal.mdx | 2 +- api_docs/kbn_core_execution_context_browser_mocks.mdx | 2 +- api_docs/kbn_core_execution_context_common.mdx | 2 +- api_docs/kbn_core_execution_context_server.mdx | 2 +- api_docs/kbn_core_execution_context_server_internal.mdx | 2 +- api_docs/kbn_core_execution_context_server_mocks.mdx | 2 +- api_docs/kbn_core_fatal_errors_browser.mdx | 2 +- api_docs/kbn_core_fatal_errors_browser_mocks.mdx | 2 +- api_docs/kbn_core_http_browser.mdx | 2 +- api_docs/kbn_core_http_browser_internal.mdx | 2 +- api_docs/kbn_core_http_browser_mocks.mdx | 2 +- api_docs/kbn_core_http_common.mdx | 2 +- api_docs/kbn_core_http_context_server_mocks.mdx | 2 +- api_docs/kbn_core_http_request_handler_context_server.mdx | 2 +- api_docs/kbn_core_http_router_server_internal.mdx | 2 +- api_docs/kbn_core_http_router_server_mocks.mdx | 2 +- api_docs/kbn_core_http_server.mdx | 2 +- api_docs/kbn_core_http_server_internal.mdx | 2 +- api_docs/kbn_core_http_server_mocks.mdx | 2 +- api_docs/kbn_core_i18n_browser.mdx | 2 +- api_docs/kbn_core_i18n_browser_mocks.mdx | 2 +- api_docs/kbn_core_i18n_server.mdx | 2 +- api_docs/kbn_core_i18n_server_internal.mdx | 2 +- api_docs/kbn_core_i18n_server_mocks.mdx | 2 +- api_docs/kbn_core_injected_metadata_browser.mdx | 2 +- api_docs/kbn_core_injected_metadata_browser_mocks.mdx | 2 +- api_docs/kbn_core_integrations_browser_internal.mdx | 2 +- api_docs/kbn_core_integrations_browser_mocks.mdx | 2 +- api_docs/kbn_core_lifecycle_browser.mdx | 2 +- api_docs/kbn_core_lifecycle_browser_mocks.mdx | 2 +- api_docs/kbn_core_logging_server.mdx | 2 +- api_docs/kbn_core_logging_server_internal.mdx | 2 +- api_docs/kbn_core_logging_server_mocks.mdx | 2 +- api_docs/kbn_core_metrics_collectors_server_internal.mdx | 2 +- api_docs/kbn_core_metrics_collectors_server_mocks.mdx | 2 +- api_docs/kbn_core_metrics_server.mdx | 2 +- api_docs/kbn_core_metrics_server_internal.mdx | 2 +- api_docs/kbn_core_metrics_server_mocks.mdx | 2 +- api_docs/kbn_core_mount_utils_browser.mdx | 2 +- api_docs/kbn_core_node_server.mdx | 2 +- api_docs/kbn_core_node_server_internal.mdx | 2 +- api_docs/kbn_core_node_server_mocks.mdx | 2 +- api_docs/kbn_core_notifications_browser.mdx | 2 +- api_docs/kbn_core_notifications_browser_internal.mdx | 2 +- api_docs/kbn_core_notifications_browser_mocks.mdx | 2 +- api_docs/kbn_core_overlays_browser.mdx | 2 +- api_docs/kbn_core_overlays_browser_internal.mdx | 2 +- api_docs/kbn_core_overlays_browser_mocks.mdx | 2 +- api_docs/kbn_core_plugins_browser.mdx | 2 +- api_docs/kbn_core_plugins_browser_mocks.mdx | 2 +- api_docs/kbn_core_preboot_server.mdx | 2 +- api_docs/kbn_core_preboot_server_mocks.mdx | 2 +- api_docs/kbn_core_rendering_browser_mocks.mdx | 2 +- api_docs/kbn_core_saved_objects_api_browser.mdx | 2 +- api_docs/kbn_core_saved_objects_api_server.mdx | 2 +- api_docs/kbn_core_saved_objects_api_server_internal.mdx | 2 +- api_docs/kbn_core_saved_objects_api_server_mocks.mdx | 2 +- api_docs/kbn_core_saved_objects_base_server_internal.mdx | 2 +- api_docs/kbn_core_saved_objects_base_server_mocks.mdx | 2 +- api_docs/kbn_core_saved_objects_browser.mdx | 2 +- api_docs/kbn_core_saved_objects_browser_internal.mdx | 2 +- api_docs/kbn_core_saved_objects_browser_mocks.mdx | 2 +- api_docs/kbn_core_saved_objects_common.mdx | 2 +- .../kbn_core_saved_objects_import_export_server_internal.mdx | 2 +- api_docs/kbn_core_saved_objects_import_export_server_mocks.mdx | 2 +- api_docs/kbn_core_saved_objects_migration_server_internal.mdx | 2 +- api_docs/kbn_core_saved_objects_migration_server_mocks.mdx | 2 +- api_docs/kbn_core_saved_objects_server.mdx | 2 +- api_docs/kbn_core_saved_objects_server_internal.mdx | 2 +- api_docs/kbn_core_saved_objects_server_mocks.mdx | 2 +- api_docs/kbn_core_saved_objects_utils_server.mdx | 2 +- api_docs/kbn_core_status_common.mdx | 2 +- api_docs/kbn_core_status_common_internal.mdx | 2 +- api_docs/kbn_core_status_server.mdx | 2 +- api_docs/kbn_core_status_server_internal.mdx | 2 +- api_docs/kbn_core_status_server_mocks.mdx | 2 +- api_docs/kbn_core_test_helpers_deprecations_getters.mdx | 2 +- api_docs/kbn_core_test_helpers_http_setup_browser.mdx | 2 +- api_docs/kbn_core_theme_browser.mdx | 2 +- api_docs/kbn_core_theme_browser_internal.mdx | 2 +- api_docs/kbn_core_theme_browser_mocks.mdx | 2 +- api_docs/kbn_core_ui_settings_browser.mdx | 2 +- api_docs/kbn_core_ui_settings_browser_internal.mdx | 2 +- api_docs/kbn_core_ui_settings_browser_mocks.mdx | 2 +- api_docs/kbn_core_ui_settings_common.mdx | 2 +- api_docs/kbn_core_ui_settings_server.mdx | 2 +- api_docs/kbn_core_ui_settings_server_internal.mdx | 2 +- api_docs/kbn_core_ui_settings_server_mocks.mdx | 2 +- api_docs/kbn_core_usage_data_server.mdx | 2 +- api_docs/kbn_core_usage_data_server_internal.mdx | 2 +- api_docs/kbn_core_usage_data_server_mocks.mdx | 2 +- api_docs/kbn_crypto.mdx | 2 +- api_docs/kbn_crypto_browser.mdx | 2 +- api_docs/kbn_datemath.mdx | 2 +- api_docs/kbn_dev_cli_errors.mdx | 2 +- api_docs/kbn_dev_cli_runner.mdx | 2 +- api_docs/kbn_dev_proc_runner.mdx | 2 +- api_docs/kbn_dev_utils.mdx | 2 +- api_docs/kbn_doc_links.mdx | 2 +- api_docs/kbn_docs_utils.mdx | 2 +- api_docs/kbn_ebt_tools.mdx | 2 +- api_docs/kbn_es_archiver.mdx | 2 +- api_docs/kbn_es_errors.mdx | 2 +- api_docs/kbn_es_query.mdx | 2 +- api_docs/kbn_es_types.mdx | 2 +- api_docs/kbn_eslint_plugin_imports.mdx | 2 +- api_docs/kbn_field_types.mdx | 2 +- api_docs/kbn_find_used_node_modules.mdx | 2 +- api_docs/kbn_ftr_common_functional_services.mdx | 2 +- api_docs/kbn_generate.mdx | 2 +- api_docs/kbn_get_repo_files.mdx | 2 +- api_docs/kbn_handlebars.mdx | 2 +- api_docs/kbn_hapi_mocks.mdx | 2 +- api_docs/kbn_home_sample_data_card.mdx | 2 +- api_docs/kbn_home_sample_data_tab.mdx | 2 +- api_docs/kbn_i18n.mdx | 2 +- api_docs/kbn_import_resolver.mdx | 2 +- api_docs/kbn_interpreter.mdx | 2 +- api_docs/kbn_io_ts_utils.mdx | 2 +- api_docs/kbn_jest_serializers.mdx | 2 +- api_docs/kbn_journeys.mdx | 2 +- api_docs/kbn_kibana_manifest_schema.mdx | 2 +- api_docs/kbn_logging.mdx | 2 +- api_docs/kbn_logging_mocks.mdx | 2 +- api_docs/kbn_managed_vscode_config.mdx | 2 +- api_docs/kbn_mapbox_gl.mdx | 2 +- api_docs/kbn_ml_agg_utils.mdx | 2 +- api_docs/kbn_ml_is_populated_object.mdx | 2 +- api_docs/kbn_ml_string_hash.mdx | 2 +- api_docs/kbn_monaco.mdx | 2 +- api_docs/kbn_optimizer.mdx | 2 +- api_docs/kbn_optimizer_webpack_helpers.mdx | 2 +- api_docs/kbn_osquery_io_ts_types.mdx | 2 +- api_docs/kbn_performance_testing_dataset_extractor.mdx | 2 +- api_docs/kbn_plugin_generator.mdx | 2 +- api_docs/kbn_plugin_helpers.mdx | 2 +- api_docs/kbn_react_field.mdx | 2 +- api_docs/kbn_repo_source_classifier.mdx | 2 +- api_docs/kbn_rule_data_utils.mdx | 2 +- api_docs/kbn_securitysolution_autocomplete.mdx | 2 +- api_docs/kbn_securitysolution_es_utils.mdx | 2 +- api_docs/kbn_securitysolution_exception_list_components.mdx | 2 +- api_docs/kbn_securitysolution_hook_utils.mdx | 2 +- api_docs/kbn_securitysolution_io_ts_alerting_types.mdx | 2 +- api_docs/kbn_securitysolution_io_ts_list_types.mdx | 2 +- api_docs/kbn_securitysolution_io_ts_types.mdx | 2 +- api_docs/kbn_securitysolution_io_ts_utils.mdx | 2 +- api_docs/kbn_securitysolution_list_api.mdx | 2 +- api_docs/kbn_securitysolution_list_constants.mdx | 2 +- api_docs/kbn_securitysolution_list_hooks.mdx | 2 +- api_docs/kbn_securitysolution_list_utils.mdx | 2 +- api_docs/kbn_securitysolution_rules.mdx | 2 +- api_docs/kbn_securitysolution_t_grid.mdx | 2 +- api_docs/kbn_securitysolution_utils.mdx | 2 +- api_docs/kbn_server_http_tools.mdx | 2 +- api_docs/kbn_server_route_repository.mdx | 2 +- api_docs/kbn_shared_svg.mdx | 2 +- api_docs/kbn_shared_ux_avatar_user_profile_components.mdx | 2 +- api_docs/kbn_shared_ux_button_exit_full_screen_mocks.mdx | 2 +- api_docs/kbn_shared_ux_button_toolbar.mdx | 2 +- api_docs/kbn_shared_ux_card_no_data.mdx | 2 +- api_docs/kbn_shared_ux_card_no_data_mocks.mdx | 2 +- api_docs/kbn_shared_ux_link_redirect_app_mocks.mdx | 2 +- api_docs/kbn_shared_ux_page_analytics_no_data.mdx | 2 +- api_docs/kbn_shared_ux_page_analytics_no_data_mocks.mdx | 2 +- api_docs/kbn_shared_ux_page_kibana_no_data.mdx | 2 +- api_docs/kbn_shared_ux_page_kibana_no_data_mocks.mdx | 2 +- api_docs/kbn_shared_ux_page_kibana_template.mdx | 2 +- api_docs/kbn_shared_ux_page_kibana_template_mocks.mdx | 2 +- api_docs/kbn_shared_ux_page_no_data.mdx | 2 +- api_docs/kbn_shared_ux_page_no_data_config.mdx | 2 +- api_docs/kbn_shared_ux_page_no_data_config_mocks.mdx | 2 +- api_docs/kbn_shared_ux_page_no_data_mocks.mdx | 2 +- api_docs/kbn_shared_ux_page_solution_nav.mdx | 2 +- api_docs/kbn_shared_ux_prompt_no_data_views.mdx | 2 +- api_docs/kbn_shared_ux_prompt_no_data_views_mocks.mdx | 2 +- api_docs/kbn_shared_ux_router.mdx | 2 +- api_docs/kbn_shared_ux_router_mocks.mdx | 2 +- api_docs/kbn_shared_ux_storybook_config.mdx | 2 +- api_docs/kbn_shared_ux_storybook_mock.mdx | 2 +- api_docs/kbn_shared_ux_utility.mdx | 2 +- api_docs/kbn_some_dev_log.mdx | 2 +- api_docs/kbn_sort_package_json.mdx | 2 +- api_docs/kbn_std.mdx | 2 +- api_docs/kbn_stdio_dev_helpers.mdx | 2 +- api_docs/kbn_storybook.mdx | 2 +- api_docs/kbn_telemetry_tools.mdx | 2 +- api_docs/kbn_test.mdx | 2 +- api_docs/kbn_test_jest_helpers.mdx | 2 +- api_docs/kbn_test_subj_selector.mdx | 2 +- api_docs/kbn_tooling_log.mdx | 2 +- api_docs/kbn_type_summarizer.mdx | 2 +- api_docs/kbn_type_summarizer_core.mdx | 2 +- api_docs/kbn_typed_react_router_config.mdx | 2 +- api_docs/kbn_ui_theme.mdx | 2 +- api_docs/kbn_user_profile_components.mdx | 2 +- api_docs/kbn_utility_types.mdx | 2 +- api_docs/kbn_utility_types_jest.mdx | 2 +- api_docs/kbn_utils.mdx | 2 +- api_docs/kbn_yarn_lock_validator.mdx | 2 +- api_docs/kibana_overview.mdx | 2 +- api_docs/kibana_react.mdx | 2 +- api_docs/kibana_utils.mdx | 2 +- api_docs/kubernetes_security.mdx | 2 +- api_docs/lens.mdx | 2 +- api_docs/license_api_guard.mdx | 2 +- api_docs/license_management.mdx | 2 +- api_docs/licensing.mdx | 2 +- api_docs/lists.mdx | 2 +- api_docs/management.mdx | 2 +- api_docs/maps.mdx | 2 +- api_docs/maps_ems.mdx | 2 +- api_docs/ml.mdx | 2 +- api_docs/monitoring.mdx | 2 +- api_docs/monitoring_collection.mdx | 2 +- api_docs/navigation.mdx | 2 +- api_docs/newsfeed.mdx | 2 +- api_docs/observability.mdx | 2 +- api_docs/osquery.mdx | 2 +- api_docs/plugin_directory.mdx | 2 +- api_docs/presentation_util.mdx | 2 +- api_docs/profiling.mdx | 2 +- api_docs/remote_clusters.mdx | 2 +- api_docs/reporting.mdx | 2 +- api_docs/rollup.mdx | 2 +- api_docs/rule_registry.mdx | 2 +- api_docs/runtime_fields.mdx | 2 +- api_docs/saved_objects.mdx | 2 +- api_docs/saved_objects_finder.mdx | 2 +- api_docs/saved_objects_management.mdx | 2 +- api_docs/saved_objects_tagging.mdx | 2 +- api_docs/saved_objects_tagging_oss.mdx | 2 +- api_docs/saved_search.mdx | 2 +- api_docs/screenshot_mode.mdx | 2 +- api_docs/screenshotting.mdx | 2 +- api_docs/security.mdx | 2 +- api_docs/security_solution.mdx | 2 +- api_docs/session_view.mdx | 2 +- api_docs/share.mdx | 2 +- api_docs/snapshot_restore.mdx | 2 +- api_docs/spaces.mdx | 2 +- api_docs/stack_alerts.mdx | 2 +- api_docs/stack_connectors.mdx | 2 +- api_docs/task_manager.mdx | 2 +- api_docs/telemetry.mdx | 2 +- api_docs/telemetry_collection_manager.mdx | 2 +- api_docs/telemetry_collection_xpack.mdx | 2 +- api_docs/telemetry_management_section.mdx | 2 +- api_docs/threat_intelligence.mdx | 2 +- api_docs/timelines.mdx | 2 +- api_docs/transform.mdx | 2 +- api_docs/triggers_actions_ui.mdx | 2 +- api_docs/ui_actions.mdx | 2 +- api_docs/ui_actions_enhanced.mdx | 2 +- api_docs/unified_field_list.mdx | 2 +- api_docs/unified_search.mdx | 2 +- api_docs/unified_search_autocomplete.mdx | 2 +- api_docs/url_forwarding.mdx | 2 +- api_docs/usage_collection.mdx | 2 +- api_docs/ux.mdx | 2 +- api_docs/vis_default_editor.mdx | 2 +- api_docs/vis_type_gauge.mdx | 2 +- api_docs/vis_type_heatmap.mdx | 2 +- api_docs/vis_type_pie.mdx | 2 +- api_docs/vis_type_table.mdx | 2 +- api_docs/vis_type_timelion.mdx | 2 +- api_docs/vis_type_timeseries.mdx | 2 +- api_docs/vis_type_vega.mdx | 2 +- api_docs/vis_type_vislib.mdx | 2 +- api_docs/vis_type_xy.mdx | 2 +- api_docs/visualizations.mdx | 2 +- 404 files changed, 404 insertions(+), 404 deletions(-) diff --git a/api_docs/actions.mdx b/api_docs/actions.mdx index 48d75bc3ce7cb..f91e6ca14c5c6 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: 2022-10-01 +date: 2022-10-02 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 ee9b4276cce64..7c38365d9afe8 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: 2022-10-01 +date: 2022-10-02 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'advancedSettings'] --- import advancedSettingsObj from './advanced_settings.devdocs.json'; diff --git a/api_docs/aiops.mdx b/api_docs/aiops.mdx index 9d860aa24355e..1adc1287e6f25 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: 2022-10-01 +date: 2022-10-02 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 e72baca86cbf6..3da854ba53f11 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: 2022-10-01 +date: 2022-10-02 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 020843029e21c..5831360d8a8cb 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: 2022-10-01 +date: 2022-10-02 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'apm'] --- import apmObj from './apm.devdocs.json'; diff --git a/api_docs/banners.mdx b/api_docs/banners.mdx index b792f664c347f..a25e8c846c7e9 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: 2022-10-01 +date: 2022-10-02 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 a343745fd134b..06dd79899f4f1 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: 2022-10-01 +date: 2022-10-02 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 74326b5f4e705..8524768364141 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: 2022-10-01 +date: 2022-10-02 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 6d8fcf94ddb84..aed43e616a03a 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: 2022-10-01 +date: 2022-10-02 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 f2eb1e6d668cd..166c25203c17a 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: 2022-10-01 +date: 2022-10-02 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 a7f1c3bd483c0..4cf122ec44f1f 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: 2022-10-01 +date: 2022-10-02 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'cloud'] --- import cloudObj from './cloud.devdocs.json'; diff --git a/api_docs/cloud_experiments.mdx b/api_docs/cloud_experiments.mdx index 4cd830231b266..afce96b1debd4 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: 2022-10-01 +date: 2022-10-02 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 7afab612c4a7a..6da76742d8c28 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: 2022-10-01 +date: 2022-10-02 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 1ace57ec36bdc..c5b317f06f243 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: 2022-10-01 +date: 2022-10-02 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'console'] --- import consoleObj from './console.devdocs.json'; diff --git a/api_docs/controls.mdx b/api_docs/controls.mdx index 1e2f85a3b6c6c..7af97619b1a37 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: 2022-10-01 +date: 2022-10-02 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'controls'] --- import controlsObj from './controls.devdocs.json'; diff --git a/api_docs/core.mdx b/api_docs/core.mdx index e3d2f1354aea8..5f59293c8f37b 100644 --- a/api_docs/core.mdx +++ b/api_docs/core.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/core title: "core" image: https://source.unsplash.com/400x175/?github description: API docs for the core plugin -date: 2022-10-01 +date: 2022-10-02 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'core'] --- import coreObj from './core.devdocs.json'; diff --git a/api_docs/custom_integrations.mdx b/api_docs/custom_integrations.mdx index 62deee07bd7d8..6778fc3543db5 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: 2022-10-01 +date: 2022-10-02 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 abecd96470ec6..711da58211c55 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: 2022-10-01 +date: 2022-10-02 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 6a49051f2936a..a4aac32db1705 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: 2022-10-01 +date: 2022-10-02 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 44fc64c6bdf41..74a573292d797 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: 2022-10-01 +date: 2022-10-02 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'data'] --- import dataObj from './data.devdocs.json'; diff --git a/api_docs/data_query.mdx b/api_docs/data_query.mdx index a82d817ae1317..52ec376fb7cb8 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: 2022-10-01 +date: 2022-10-02 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 3e7214a59cc2f..c0cda63f61621 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: 2022-10-01 +date: 2022-10-02 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 288b3ee585f51..3a448dea572e4 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: 2022-10-01 +date: 2022-10-02 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 f0c7b8022d144..c4933b68c9368 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: 2022-10-01 +date: 2022-10-02 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 9840337f75a70..35b2849b1521e 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: 2022-10-01 +date: 2022-10-02 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'dataViewManagement'] --- import dataViewManagementObj from './data_view_management.devdocs.json'; diff --git a/api_docs/data_views.mdx b/api_docs/data_views.mdx index 9ce3b6c700638..8b66e010c36d3 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: 2022-10-01 +date: 2022-10-02 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 05d260b1c544f..17ed535ee87c4 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: 2022-10-01 +date: 2022-10-02 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'dataVisualizer'] --- import dataVisualizerObj from './data_visualizer.devdocs.json'; diff --git a/api_docs/deprecations_by_api.mdx b/api_docs/deprecations_by_api.mdx index a3d96055c821b..f4b1fa55c1ed8 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: 2022-10-01 +date: 2022-10-02 tags: ['contributor', 'dev', 'apidocs', 'kibana'] --- diff --git a/api_docs/deprecations_by_plugin.mdx b/api_docs/deprecations_by_plugin.mdx index 4eb2eb95d80e1..0c5bbd60e517f 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: 2022-10-01 +date: 2022-10-02 tags: ['contributor', 'dev', 'apidocs', 'kibana'] --- diff --git a/api_docs/deprecations_by_team.mdx b/api_docs/deprecations_by_team.mdx index 4fc141f38747a..60d74fa28721a 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: 2022-10-01 +date: 2022-10-02 tags: ['contributor', 'dev', 'apidocs', 'kibana'] --- diff --git a/api_docs/dev_tools.mdx b/api_docs/dev_tools.mdx index f22d728079646..06dfec816d605 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: 2022-10-01 +date: 2022-10-02 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 c744310a34b91..e703c38627cbc 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: 2022-10-01 +date: 2022-10-02 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 b9b4af0426fde..591663448e856 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: 2022-10-01 +date: 2022-10-02 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'discoverEnhanced'] --- import discoverEnhancedObj from './discover_enhanced.devdocs.json'; diff --git a/api_docs/embeddable.mdx b/api_docs/embeddable.mdx index f09224c581505..9782e32b7985f 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: 2022-10-01 +date: 2022-10-02 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 e1530fd32233e..84dd77d22a239 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: 2022-10-01 +date: 2022-10-02 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 3f0a323b92794..ffd479100976d 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: 2022-10-01 +date: 2022-10-02 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 68f9252a936a6..6d8e9e20d6993 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: 2022-10-01 +date: 2022-10-02 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'enterpriseSearch'] --- import enterpriseSearchObj from './enterprise_search.devdocs.json'; diff --git a/api_docs/es_ui_shared.mdx b/api_docs/es_ui_shared.mdx index e4b29fe30fced..661382fdf519e 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: 2022-10-01 +date: 2022-10-02 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'esUiShared'] --- import esUiSharedObj from './es_ui_shared.devdocs.json'; diff --git a/api_docs/event_annotation.mdx b/api_docs/event_annotation.mdx index 5fc5dd479579e..d752e0f31cc9d 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: 2022-10-01 +date: 2022-10-02 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'eventAnnotation'] --- import eventAnnotationObj from './event_annotation.devdocs.json'; diff --git a/api_docs/event_log.mdx b/api_docs/event_log.mdx index a1aaa7507ccb7..cfa039d75aa8c 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: 2022-10-01 +date: 2022-10-02 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'eventLog'] --- import eventLogObj from './event_log.devdocs.json'; diff --git a/api_docs/expression_error.mdx b/api_docs/expression_error.mdx index a7413684bd039..1ea659904646d 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: 2022-10-01 +date: 2022-10-02 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 a882614c990a5..2e6be367a1d99 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: 2022-10-01 +date: 2022-10-02 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 9237719c9d201..f4086885e5073 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: 2022-10-01 +date: 2022-10-02 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 aae35271ff39e..b0d7b0b0e664b 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: 2022-10-01 +date: 2022-10-02 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 df673151690c9..f58979b777a3c 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: 2022-10-01 +date: 2022-10-02 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 da11f3077c1aa..1b1035d10c9ea 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: 2022-10-01 +date: 2022-10-02 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 846aa497ea3bb..8c3a8f9b39334 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: 2022-10-01 +date: 2022-10-02 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 02618661f080e..646de5a025171 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: 2022-10-01 +date: 2022-10-02 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 02f01b4dd86f5..4913f9da7c397 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: 2022-10-01 +date: 2022-10-02 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 acd06327d8886..906b0f9a865c8 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: 2022-10-01 +date: 2022-10-02 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 8046b493fef22..32e6eca8a079c 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: 2022-10-01 +date: 2022-10-02 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 3ddfd870314aa..7eb9651829275 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: 2022-10-01 +date: 2022-10-02 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 0b5d88e7aab73..c727f32752b6f 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: 2022-10-01 +date: 2022-10-02 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 8c09010151113..63b7d486fa201 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: 2022-10-01 +date: 2022-10-02 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 05df2ffc3a487..14e361da22469 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: 2022-10-01 +date: 2022-10-02 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 fb46fbf3c533b..4c8ac407c2a2d 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: 2022-10-01 +date: 2022-10-02 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'fieldFormats'] --- import fieldFormatsObj from './field_formats.devdocs.json'; diff --git a/api_docs/file_upload.mdx b/api_docs/file_upload.mdx index ad24537aa0fdc..a5923aea7ee0c 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: 2022-10-01 +date: 2022-10-02 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 77286018c6236..d40d7e303d6b2 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: 2022-10-01 +date: 2022-10-02 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'files'] --- import filesObj from './files.devdocs.json'; diff --git a/api_docs/fleet.mdx b/api_docs/fleet.mdx index 8196936c8efd9..bafd3ddd8518e 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: 2022-10-01 +date: 2022-10-02 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 6908d7194d17b..42378d31281f1 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: 2022-10-01 +date: 2022-10-02 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 af5a128f54b0d..d183f51fa1495 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: 2022-10-01 +date: 2022-10-02 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 8bbe725e782fe..388cdf51fff4d 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: 2022-10-01 +date: 2022-10-02 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'home'] --- import homeObj from './home.devdocs.json'; diff --git a/api_docs/index_lifecycle_management.mdx b/api_docs/index_lifecycle_management.mdx index 9edd7ca01eff0..36f4a84d6d37b 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: 2022-10-01 +date: 2022-10-02 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 0c3c64c38fa9e..f142e52067907 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: 2022-10-01 +date: 2022-10-02 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'indexManagement'] --- import indexManagementObj from './index_management.devdocs.json'; diff --git a/api_docs/infra.mdx b/api_docs/infra.mdx index 12e3a5944bfec..ba44a8375901b 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: 2022-10-01 +date: 2022-10-02 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'infra'] --- import infraObj from './infra.devdocs.json'; diff --git a/api_docs/inspector.mdx b/api_docs/inspector.mdx index d5d9c2b4b6937..cebd40add5413 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: 2022-10-01 +date: 2022-10-02 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'inspector'] --- import inspectorObj from './inspector.devdocs.json'; diff --git a/api_docs/interactive_setup.mdx b/api_docs/interactive_setup.mdx index 3f156bfcb7b35..bcfc55b7a3106 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: 2022-10-01 +date: 2022-10-02 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'interactiveSetup'] --- import interactiveSetupObj from './interactive_setup.devdocs.json'; diff --git a/api_docs/kbn_ace.mdx b/api_docs/kbn_ace.mdx index 9033fdf982ef0..de04343d39dd8 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: 2022-10-01 +date: 2022-10-02 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/ace'] --- import kbnAceObj from './kbn_ace.devdocs.json'; diff --git a/api_docs/kbn_aiops_components.mdx b/api_docs/kbn_aiops_components.mdx index dae5a070183a3..640d8bc0daddc 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: 2022-10-01 +date: 2022-10-02 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/aiops-components'] --- import kbnAiopsComponentsObj from './kbn_aiops_components.devdocs.json'; diff --git a/api_docs/kbn_aiops_utils.mdx b/api_docs/kbn_aiops_utils.mdx index 25f9c2c92bfd1..37748e5923d7e 100644 --- a/api_docs/kbn_aiops_utils.mdx +++ b/api_docs/kbn_aiops_utils.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-aiops-utils title: "@kbn/aiops-utils" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/aiops-utils plugin -date: 2022-10-01 +date: 2022-10-02 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/aiops-utils'] --- import kbnAiopsUtilsObj from './kbn_aiops_utils.devdocs.json'; diff --git a/api_docs/kbn_alerts.mdx b/api_docs/kbn_alerts.mdx index ca9ca177b00a7..4f93c597b2e4a 100644 --- a/api_docs/kbn_alerts.mdx +++ b/api_docs/kbn_alerts.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-alerts title: "@kbn/alerts" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/alerts plugin -date: 2022-10-01 +date: 2022-10-02 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/alerts'] --- import kbnAlertsObj from './kbn_alerts.devdocs.json'; diff --git a/api_docs/kbn_analytics.mdx b/api_docs/kbn_analytics.mdx index 9c5c4346e45a0..653e93710bb2c 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: 2022-10-01 +date: 2022-10-02 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/analytics'] --- import kbnAnalyticsObj from './kbn_analytics.devdocs.json'; diff --git a/api_docs/kbn_analytics_client.mdx b/api_docs/kbn_analytics_client.mdx index 0f94bac6c9c8a..ab8ade876b3b3 100644 --- a/api_docs/kbn_analytics_client.mdx +++ b/api_docs/kbn_analytics_client.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-analytics-client title: "@kbn/analytics-client" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/analytics-client plugin -date: 2022-10-01 +date: 2022-10-02 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/analytics-client'] --- import kbnAnalyticsClientObj from './kbn_analytics_client.devdocs.json'; diff --git a/api_docs/kbn_analytics_shippers_elastic_v3_browser.mdx b/api_docs/kbn_analytics_shippers_elastic_v3_browser.mdx index 71847c01b1eb0..94415cdc496c6 100644 --- a/api_docs/kbn_analytics_shippers_elastic_v3_browser.mdx +++ b/api_docs/kbn_analytics_shippers_elastic_v3_browser.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-analytics-shippers-elastic-v3-browser title: "@kbn/analytics-shippers-elastic-v3-browser" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/analytics-shippers-elastic-v3-browser plugin -date: 2022-10-01 +date: 2022-10-02 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/analytics-shippers-elastic-v3-browser'] --- import kbnAnalyticsShippersElasticV3BrowserObj from './kbn_analytics_shippers_elastic_v3_browser.devdocs.json'; diff --git a/api_docs/kbn_analytics_shippers_elastic_v3_common.mdx b/api_docs/kbn_analytics_shippers_elastic_v3_common.mdx index 09e9cdc683fa1..bc6057bd65960 100644 --- a/api_docs/kbn_analytics_shippers_elastic_v3_common.mdx +++ b/api_docs/kbn_analytics_shippers_elastic_v3_common.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-analytics-shippers-elastic-v3-common title: "@kbn/analytics-shippers-elastic-v3-common" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/analytics-shippers-elastic-v3-common plugin -date: 2022-10-01 +date: 2022-10-02 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/analytics-shippers-elastic-v3-common'] --- import kbnAnalyticsShippersElasticV3CommonObj from './kbn_analytics_shippers_elastic_v3_common.devdocs.json'; diff --git a/api_docs/kbn_analytics_shippers_elastic_v3_server.mdx b/api_docs/kbn_analytics_shippers_elastic_v3_server.mdx index 14753eade649d..953ad7736eaa5 100644 --- a/api_docs/kbn_analytics_shippers_elastic_v3_server.mdx +++ b/api_docs/kbn_analytics_shippers_elastic_v3_server.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-analytics-shippers-elastic-v3-server title: "@kbn/analytics-shippers-elastic-v3-server" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/analytics-shippers-elastic-v3-server plugin -date: 2022-10-01 +date: 2022-10-02 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/analytics-shippers-elastic-v3-server'] --- import kbnAnalyticsShippersElasticV3ServerObj from './kbn_analytics_shippers_elastic_v3_server.devdocs.json'; diff --git a/api_docs/kbn_analytics_shippers_fullstory.mdx b/api_docs/kbn_analytics_shippers_fullstory.mdx index 7b98319dfa0d5..68b4f9a89cc35 100644 --- a/api_docs/kbn_analytics_shippers_fullstory.mdx +++ b/api_docs/kbn_analytics_shippers_fullstory.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-analytics-shippers-fullstory title: "@kbn/analytics-shippers-fullstory" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/analytics-shippers-fullstory plugin -date: 2022-10-01 +date: 2022-10-02 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/analytics-shippers-fullstory'] --- import kbnAnalyticsShippersFullstoryObj from './kbn_analytics_shippers_fullstory.devdocs.json'; diff --git a/api_docs/kbn_apm_config_loader.mdx b/api_docs/kbn_apm_config_loader.mdx index 7e89a7719619f..633a769efa1ad 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: 2022-10-01 +date: 2022-10-02 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/apm-config-loader'] --- import kbnApmConfigLoaderObj from './kbn_apm_config_loader.devdocs.json'; diff --git a/api_docs/kbn_apm_synthtrace.mdx b/api_docs/kbn_apm_synthtrace.mdx index a8302426d0f98..99ce7b8a19bba 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: 2022-10-01 +date: 2022-10-02 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/apm-synthtrace'] --- import kbnApmSynthtraceObj from './kbn_apm_synthtrace.devdocs.json'; diff --git a/api_docs/kbn_apm_utils.mdx b/api_docs/kbn_apm_utils.mdx index 8e3217250a2f3..962b5aa586a18 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: 2022-10-01 +date: 2022-10-02 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/apm-utils'] --- import kbnApmUtilsObj from './kbn_apm_utils.devdocs.json'; diff --git a/api_docs/kbn_axe_config.mdx b/api_docs/kbn_axe_config.mdx index b96fac650f3bb..50f8cd64aee1b 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: 2022-10-01 +date: 2022-10-02 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/axe-config'] --- import kbnAxeConfigObj from './kbn_axe_config.devdocs.json'; diff --git a/api_docs/kbn_chart_icons.mdx b/api_docs/kbn_chart_icons.mdx index 2e27eedb97be8..476bfef859d00 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: 2022-10-01 +date: 2022-10-02 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 ba566208fe8bb..549084cde27d5 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: 2022-10-01 +date: 2022-10-02 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 71b3793b5edba..2256eb2966edb 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: 2022-10-01 +date: 2022-10-02 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 b2e6e11bf6f52..ad42b9ac3ee42 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: 2022-10-01 +date: 2022-10-02 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 741e1c8d09dcc..22a6845fb05d9 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: 2022-10-01 +date: 2022-10-02 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/cli-dev-mode'] --- import kbnCliDevModeObj from './kbn_cli_dev_mode.devdocs.json'; diff --git a/api_docs/kbn_coloring.mdx b/api_docs/kbn_coloring.mdx index 534685b36cd21..2d54eb64e6033 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: 2022-10-01 +date: 2022-10-02 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 3ff3d642b506d..a52202f78637b 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: 2022-10-01 +date: 2022-10-02 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/config'] --- import kbnConfigObj from './kbn_config.devdocs.json'; diff --git a/api_docs/kbn_config_mocks.mdx b/api_docs/kbn_config_mocks.mdx index 67fdb94f78f3b..192f0654b7d5f 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: 2022-10-01 +date: 2022-10-02 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 3b43b92a5565c..5633664daf6d5 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: 2022-10-01 +date: 2022-10-02 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/config-schema'] --- import kbnConfigSchemaObj from './kbn_config_schema.devdocs.json'; diff --git a/api_docs/kbn_content_management_table_list.mdx b/api_docs/kbn_content_management_table_list.mdx index 84ad21fc47fdb..bbf2c310a588d 100644 --- a/api_docs/kbn_content_management_table_list.mdx +++ b/api_docs/kbn_content_management_table_list.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-content-management-table-list title: "@kbn/content-management-table-list" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/content-management-table-list plugin -date: 2022-10-01 +date: 2022-10-02 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/content-management-table-list'] --- import kbnContentManagementTableListObj from './kbn_content_management_table_list.devdocs.json'; diff --git a/api_docs/kbn_core_analytics_browser.mdx b/api_docs/kbn_core_analytics_browser.mdx index 8c307425ee040..e090ff0a26740 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: 2022-10-01 +date: 2022-10-02 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 3212fb673e27f..fe43394f77fb7 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: 2022-10-01 +date: 2022-10-02 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 4e9dd3d54d358..e9c9b866f0fe7 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: 2022-10-01 +date: 2022-10-02 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-analytics-browser-mocks'] --- import kbnCoreAnalyticsBrowserMocksObj from './kbn_core_analytics_browser_mocks.devdocs.json'; diff --git a/api_docs/kbn_core_analytics_server.mdx b/api_docs/kbn_core_analytics_server.mdx index 7bd027365d6e9..a86d4bce56287 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: 2022-10-01 +date: 2022-10-02 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 76cd9dba2db5c..9b2fe9f9f192c 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: 2022-10-01 +date: 2022-10-02 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 bfa75dd3afd7a..c2dc15b657d76 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: 2022-10-01 +date: 2022-10-02 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 7f9da63f298a2..e935da7289301 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: 2022-10-01 +date: 2022-10-02 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 2f2615a48955e..2a05ae0c01c52 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: 2022-10-01 +date: 2022-10-02 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 9c806330e3668..2e74725d2f3d3 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: 2022-10-01 +date: 2022-10-02 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 9294b5b708f88..4a541f590e2f5 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: 2022-10-01 +date: 2022-10-02 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 af582f9ff198f..3463e8e9384e2 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: 2022-10-01 +date: 2022-10-02 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 8af8f902e5408..834faf66c67a2 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: 2022-10-01 +date: 2022-10-02 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_base_browser_mocks.mdx b/api_docs/kbn_core_base_browser_mocks.mdx index aaf8373e9ca7c..f22445d1e10ed 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: 2022-10-01 +date: 2022-10-02 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 9ed7dbaa5e2d6..fe429f0f502ae 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: 2022-10-01 +date: 2022-10-02 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 8186b42e0220e..9d162ecc81bb8 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: 2022-10-01 +date: 2022-10-02 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 a0c063e840094..be46292c9bc9e 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: 2022-10-01 +date: 2022-10-02 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 221ae3385ddd6..aa7f5b3d5df79 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: 2022-10-01 +date: 2022-10-02 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 2156646c76f0a..1380bd04beea9 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: 2022-10-01 +date: 2022-10-02 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 f6c8668e76f26..00087d6131cc8 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: 2022-10-01 +date: 2022-10-02 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 3d39b753f2abb..e4e5a9223ba0b 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: 2022-10-01 +date: 2022-10-02 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 6e6ffeac0f653..251b2d507b168 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: 2022-10-01 +date: 2022-10-02 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 203f9a365fdef..10c16f282a6f9 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: 2022-10-01 +date: 2022-10-02 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 cd573bfd8776c..8d29eb118d55c 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: 2022-10-01 +date: 2022-10-02 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_deprecations_browser.mdx b/api_docs/kbn_core_deprecations_browser.mdx index e2134b925ba81..0d64e581664eb 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: 2022-10-01 +date: 2022-10-02 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 9fc96d5d598f3..6d31a54a56052 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: 2022-10-01 +date: 2022-10-02 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 7a6634ac7f8da..9c7aa10193724 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: 2022-10-01 +date: 2022-10-02 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 edcf87b960941..bc77cf44b3bd3 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: 2022-10-01 +date: 2022-10-02 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 35e8a6ce26327..a976ebcc9a0e8 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: 2022-10-01 +date: 2022-10-02 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 8167097daa0d7..a3af9d6298c58 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: 2022-10-01 +date: 2022-10-02 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 b45ecd8257b07..42feea3f29fba 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: 2022-10-01 +date: 2022-10-02 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 031456455b1ee..1d24379f441f6 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: 2022-10-01 +date: 2022-10-02 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 381310fcf1546..48c6d6862f4dd 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: 2022-10-01 +date: 2022-10-02 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 05f768b81b3ca..8195d4f623893 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: 2022-10-01 +date: 2022-10-02 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 52776680286a7..85fa2c4715748 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: 2022-10-01 +date: 2022-10-02 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 63cc80d8fa739..feabe3a92d7f7 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: 2022-10-01 +date: 2022-10-02 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 309f4ef8839d3..7b9875f589c6b 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: 2022-10-01 +date: 2022-10-02 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 d4df75707a940..1e0c6217b952f 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: 2022-10-01 +date: 2022-10-02 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 a5ade116a7c0e..7bc107af9a805 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: 2022-10-01 +date: 2022-10-02 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 9a09fe50975c2..95497dfe20dc5 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: 2022-10-01 +date: 2022-10-02 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 7fffb0ccbd3d1..5f7c6dc637c89 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: 2022-10-01 +date: 2022-10-02 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 7c8733b369f01..bbda34217fa74 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: 2022-10-01 +date: 2022-10-02 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 f283e05e563d0..fad63abe19936 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: 2022-10-01 +date: 2022-10-02 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 d40d5501ca99c..006d8b447663b 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: 2022-10-01 +date: 2022-10-02 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 cc1a420ccba12..96e88c7e5c2a2 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: 2022-10-01 +date: 2022-10-02 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 25f0346340ea2..7e3559438efa3 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: 2022-10-01 +date: 2022-10-02 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 87eb2c5dd2fdc..e6ab7c3d89159 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: 2022-10-01 +date: 2022-10-02 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 1023c4c175a35..17fee1daced5d 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: 2022-10-01 +date: 2022-10-02 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 20aa61f141c8d..ed465631b22b5 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: 2022-10-01 +date: 2022-10-02 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 4fdaf9d97f6fd..89eb21cdb4d55 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: 2022-10-01 +date: 2022-10-02 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 81e62c8036e09..3e1fbaec76d31 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: 2022-10-01 +date: 2022-10-02 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 548174fbd5d8a..13817b60a15a0 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: 2022-10-01 +date: 2022-10-02 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 16c6d6b510208..3380e7e1a2b4c 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: 2022-10-01 +date: 2022-10-02 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 094479784c51c..4020a1edd3ae5 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: 2022-10-01 +date: 2022-10-02 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 41f882912cfec..a48229db2238e 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: 2022-10-01 +date: 2022-10-02 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 b00edeb7d68be..6c86cd7218b8a 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: 2022-10-01 +date: 2022-10-02 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 17d48963b8b76..a41bd0793732d 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: 2022-10-01 +date: 2022-10-02 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_router_server_internal.mdx b/api_docs/kbn_core_http_router_server_internal.mdx index 2ee35b66a8f69..98354a9107f34 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: 2022-10-01 +date: 2022-10-02 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 750d6c7b3befb..99ac50e292b6b 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: 2022-10-01 +date: 2022-10-02 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.mdx b/api_docs/kbn_core_http_server.mdx index 3a9e92dbe6507..fd022dfb3eea2 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: 2022-10-01 +date: 2022-10-02 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 27352519951fb..f058d1e28dec7 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: 2022-10-01 +date: 2022-10-02 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 2aa52e0dc1c00..1b6cf98922c1b 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: 2022-10-01 +date: 2022-10-02 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 a8e82e67d22cc..bc10c115fb754 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: 2022-10-01 +date: 2022-10-02 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 10be37f40c29e..02d199810fef1 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: 2022-10-01 +date: 2022-10-02 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 ef29632390089..b391482c1e673 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: 2022-10-01 +date: 2022-10-02 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 d6ed176629a21..8bdf305b19645 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: 2022-10-01 +date: 2022-10-02 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 ee1ed897ede0f..949a0fde56bc7 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: 2022-10-01 +date: 2022-10-02 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.mdx b/api_docs/kbn_core_injected_metadata_browser.mdx index 7b120559dc173..f93ad919d9fe8 100644 --- a/api_docs/kbn_core_injected_metadata_browser.mdx +++ b/api_docs/kbn_core_injected_metadata_browser.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-injected-metadata-browser title: "@kbn/core-injected-metadata-browser" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-injected-metadata-browser plugin -date: 2022-10-01 +date: 2022-10-02 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-injected-metadata-browser'] --- import kbnCoreInjectedMetadataBrowserObj from './kbn_core_injected_metadata_browser.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 3e7af178ec124..6389c0fa21a8c 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: 2022-10-01 +date: 2022-10-02 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 d2aabf046c88e..f1c6bacc8a191 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: 2022-10-01 +date: 2022-10-02 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 bc12a2785cc02..91fca25dd4974 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: 2022-10-01 +date: 2022-10-02 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 7480b362f29b9..8aee8a80734c6 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: 2022-10-01 +date: 2022-10-02 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 f21296396e1de..d76de30044e47 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: 2022-10-01 +date: 2022-10-02 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_logging_server.mdx b/api_docs/kbn_core_logging_server.mdx index 61be5ea720a47..575ad511b8fdc 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: 2022-10-01 +date: 2022-10-02 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 af6dd35e83129..02793dca49021 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: 2022-10-01 +date: 2022-10-02 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 a09ca7932e57b..259d3fd65a265 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: 2022-10-01 +date: 2022-10-02 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 c01ad905bc16f..81710e21c33ff 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: 2022-10-01 +date: 2022-10-02 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 d31c4dd48ee55..e3e171db8439c 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: 2022-10-01 +date: 2022-10-02 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 9f15f6cf73905..bacd5044596db 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: 2022-10-01 +date: 2022-10-02 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 e93ec0476f250..eadb43389a164 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: 2022-10-01 +date: 2022-10-02 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 5a94cd10fcb04..baaf23f8822d5 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: 2022-10-01 +date: 2022-10-02 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 43e64914cfb32..0b68bd525a649 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: 2022-10-01 +date: 2022-10-02 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 557e650a73b5d..08f7016062533 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: 2022-10-01 +date: 2022-10-02 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 a3ebabf7f32c7..5b065122b113b 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: 2022-10-01 +date: 2022-10-02 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 804d680bae804..e540991a1252e 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: 2022-10-01 +date: 2022-10-02 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 e15645fb9ab88..8bea394dae010 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: 2022-10-01 +date: 2022-10-02 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 a64c369bcba42..ad8e17b446e9e 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: 2022-10-01 +date: 2022-10-02 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 1192b6244a3a2..514474ea2ef25 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: 2022-10-01 +date: 2022-10-02 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 0eb8bc161976f..bae3dbcf63251 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: 2022-10-01 +date: 2022-10-02 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 d8b0afcc889b6..0544899499223 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: 2022-10-01 +date: 2022-10-02 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 7982df2fb243d..9b739d1209d1b 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: 2022-10-01 +date: 2022-10-02 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 9c70f02f78d00..5b9a435bacaff 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: 2022-10-01 +date: 2022-10-02 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 6bd600cfb198c..b9fa84b19f8cc 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: 2022-10-01 +date: 2022-10-02 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_preboot_server.mdx b/api_docs/kbn_core_preboot_server.mdx index be27903d8b485..0906ee4ed8381 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: 2022-10-01 +date: 2022-10-02 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 b4745db58332c..6b97c1f880675 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: 2022-10-01 +date: 2022-10-02 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 47752b2ae6726..520e18ebb3e77 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: 2022-10-01 +date: 2022-10-02 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_saved_objects_api_browser.mdx b/api_docs/kbn_core_saved_objects_api_browser.mdx index 856ab9b0e54bf..020fabbec183c 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: 2022-10-01 +date: 2022-10-02 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 79709ae898489..6da27ef121439 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: 2022-10-01 +date: 2022-10-02 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_internal.mdx b/api_docs/kbn_core_saved_objects_api_server_internal.mdx index b88c155714125..df6fc60584f43 100644 --- a/api_docs/kbn_core_saved_objects_api_server_internal.mdx +++ b/api_docs/kbn_core_saved_objects_api_server_internal.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-saved-objects-api-server-internal title: "@kbn/core-saved-objects-api-server-internal" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-saved-objects-api-server-internal plugin -date: 2022-10-01 +date: 2022-10-02 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-saved-objects-api-server-internal'] --- import kbnCoreSavedObjectsApiServerInternalObj from './kbn_core_saved_objects_api_server_internal.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 f28c4920181cf..81a29c9d9a727 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: 2022-10-01 +date: 2022-10-02 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 2bf85267549ab..b2eb85135b8d3 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: 2022-10-01 +date: 2022-10-02 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 3f364ace01fd9..d6eb21156cef7 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: 2022-10-01 +date: 2022-10-02 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 2b9b805aa0d51..c0db5893ecdcd 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: 2022-10-01 +date: 2022-10-02 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 94ee2b5e95dd7..6b1df9e60f5a6 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: 2022-10-01 +date: 2022-10-02 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 f2e58e7919b5d..3767a975778f6 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: 2022-10-01 +date: 2022-10-02 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 2f9686598dae2..46e635afccffe 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: 2022-10-01 +date: 2022-10-02 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 67a62a9d8f82d..d9dcf279b04e4 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: 2022-10-01 +date: 2022-10-02 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 f006d43902df5..b273522ddd598 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: 2022-10-01 +date: 2022-10-02 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 962c7d5ac0112..4a63a5bd89ef0 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: 2022-10-01 +date: 2022-10-02 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 c07112e6ad54c..c02fc259a89b2 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: 2022-10-01 +date: 2022-10-02 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 40a150c47507e..78b702fb4478d 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: 2022-10-01 +date: 2022-10-02 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 9d63c473addd9..90c8b849e0ba0 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: 2022-10-01 +date: 2022-10-02 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 27238b71e9474..f349189ab730f 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: 2022-10-01 +date: 2022-10-02 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 6ca747830ab44..8c5aeb1e8262b 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: 2022-10-01 +date: 2022-10-02 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-saved-objects-utils-server'] --- import kbnCoreSavedObjectsUtilsServerObj from './kbn_core_saved_objects_utils_server.devdocs.json'; diff --git a/api_docs/kbn_core_status_common.mdx b/api_docs/kbn_core_status_common.mdx index 768e628a8af99..d9566708b3aeb 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: 2022-10-01 +date: 2022-10-02 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 970cb7ab087e3..a55470733390a 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: 2022-10-01 +date: 2022-10-02 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 cd7bbe51e9042..439d255043861 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: 2022-10-01 +date: 2022-10-02 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 da072c5533deb..96f568f178a40 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: 2022-10-01 +date: 2022-10-02 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 0a9599ba8cac2..85b8475863cf3 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: 2022-10-01 +date: 2022-10-02 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 57940d8a2498b..957576c2e148f 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: 2022-10-01 +date: 2022-10-02 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 ba62b21644351..aeaf0b8ee1105 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: 2022-10-01 +date: 2022-10-02 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_theme_browser.mdx b/api_docs/kbn_core_theme_browser.mdx index c3939a291a656..45aa25f3d172d 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: 2022-10-01 +date: 2022-10-02 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_internal.mdx b/api_docs/kbn_core_theme_browser_internal.mdx index 6148fce410496..4b3a42ce6cc77 100644 --- a/api_docs/kbn_core_theme_browser_internal.mdx +++ b/api_docs/kbn_core_theme_browser_internal.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-theme-browser-internal title: "@kbn/core-theme-browser-internal" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-theme-browser-internal plugin -date: 2022-10-01 +date: 2022-10-02 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-theme-browser-internal'] --- import kbnCoreThemeBrowserInternalObj from './kbn_core_theme_browser_internal.devdocs.json'; diff --git a/api_docs/kbn_core_theme_browser_mocks.mdx b/api_docs/kbn_core_theme_browser_mocks.mdx index 5fb0272483d51..92f080e0f5285 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: 2022-10-01 +date: 2022-10-02 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 28de861c3382d..4a1529581735e 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: 2022-10-01 +date: 2022-10-02 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 d9a6c2b14d251..6fb6935573a7b 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: 2022-10-01 +date: 2022-10-02 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 3dd7677225f06..31697c023ddaa 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: 2022-10-01 +date: 2022-10-02 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 8a73e44070355..574d0ec8e7b47 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: 2022-10-01 +date: 2022-10-02 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 b86978a4c0f51..0997bcdc22115 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: 2022-10-01 +date: 2022-10-02 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 632bc077b3e16..7b4df9498b908 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: 2022-10-01 +date: 2022-10-02 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 43ce870fd9d1c..d222af41c3fd9 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: 2022-10-01 +date: 2022-10-02 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 982847f0d737c..976fc475761a2 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: 2022-10-01 +date: 2022-10-02 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 55d78bd6eee1b..9bd4dab752efb 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: 2022-10-01 +date: 2022-10-02 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 4a0c5588f0be5..8dd7253ab6ab8 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: 2022-10-01 +date: 2022-10-02 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_crypto.mdx b/api_docs/kbn_crypto.mdx index 521e5b631e391..a8049f93e0422 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: 2022-10-01 +date: 2022-10-02 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 58ddc73e08dfc..d5209c039a16a 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: 2022-10-01 +date: 2022-10-02 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/crypto-browser'] --- import kbnCryptoBrowserObj from './kbn_crypto_browser.devdocs.json'; diff --git a/api_docs/kbn_datemath.mdx b/api_docs/kbn_datemath.mdx index 644ca142bc7d0..76052024f029d 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: 2022-10-01 +date: 2022-10-02 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/datemath'] --- import kbnDatemathObj from './kbn_datemath.devdocs.json'; diff --git a/api_docs/kbn_dev_cli_errors.mdx b/api_docs/kbn_dev_cli_errors.mdx index 61773de18ba45..39e11f8614d83 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: 2022-10-01 +date: 2022-10-02 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 33f29af6449f5..95871faf86786 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: 2022-10-01 +date: 2022-10-02 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 7160587ae7c07..198147e7c8229 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: 2022-10-01 +date: 2022-10-02 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 765e362ac5000..b9922d230eb74 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: 2022-10-01 +date: 2022-10-02 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/dev-utils'] --- import kbnDevUtilsObj from './kbn_dev_utils.devdocs.json'; diff --git a/api_docs/kbn_doc_links.mdx b/api_docs/kbn_doc_links.mdx index d74e0af0ba44c..3fe12c91c32a4 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: 2022-10-01 +date: 2022-10-02 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 bd64af2bd9d2f..3545dbecd6961 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: 2022-10-01 +date: 2022-10-02 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/docs-utils'] --- import kbnDocsUtilsObj from './kbn_docs_utils.devdocs.json'; diff --git a/api_docs/kbn_ebt_tools.mdx b/api_docs/kbn_ebt_tools.mdx index 16b1791d70aab..b4270c9011bbe 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: 2022-10-01 +date: 2022-10-02 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/ebt-tools'] --- import kbnEbtToolsObj from './kbn_ebt_tools.devdocs.json'; diff --git a/api_docs/kbn_es_archiver.mdx b/api_docs/kbn_es_archiver.mdx index 516930bec71f4..ca423dde44514 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: 2022-10-01 +date: 2022-10-02 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 f8cfd1377e566..f422e71b9a8b6 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: 2022-10-01 +date: 2022-10-02 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 0125789a530ac..a0bf853e54fda 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: 2022-10-01 +date: 2022-10-02 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 faa1089fab654..42124a156bffe 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: 2022-10-01 +date: 2022-10-02 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 756b802d0c32d..883203cc6f10a 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: 2022-10-01 +date: 2022-10-02 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/eslint-plugin-imports'] --- import kbnEslintPluginImportsObj from './kbn_eslint_plugin_imports.devdocs.json'; diff --git a/api_docs/kbn_field_types.mdx b/api_docs/kbn_field_types.mdx index bb82f2d259771..8791798c64654 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: 2022-10-01 +date: 2022-10-02 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/field-types'] --- import kbnFieldTypesObj from './kbn_field_types.devdocs.json'; diff --git a/api_docs/kbn_find_used_node_modules.mdx b/api_docs/kbn_find_used_node_modules.mdx index f745989c9c8a1..ae1139f5d3604 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: 2022-10-01 +date: 2022-10-02 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/find-used-node-modules'] --- import kbnFindUsedNodeModulesObj from './kbn_find_used_node_modules.devdocs.json'; diff --git a/api_docs/kbn_ftr_common_functional_services.mdx b/api_docs/kbn_ftr_common_functional_services.mdx index 6ddc526b2548a..1c2551073eb20 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: 2022-10-01 +date: 2022-10-02 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_generate.mdx b/api_docs/kbn_generate.mdx index 42e063e32e7f1..9e670335e3a9e 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: 2022-10-01 +date: 2022-10-02 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/generate'] --- import kbnGenerateObj from './kbn_generate.devdocs.json'; diff --git a/api_docs/kbn_get_repo_files.mdx b/api_docs/kbn_get_repo_files.mdx index 984eab3d218e8..816ea84cc9691 100644 --- a/api_docs/kbn_get_repo_files.mdx +++ b/api_docs/kbn_get_repo_files.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-get-repo-files title: "@kbn/get-repo-files" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/get-repo-files plugin -date: 2022-10-01 +date: 2022-10-02 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/get-repo-files'] --- import kbnGetRepoFilesObj from './kbn_get_repo_files.devdocs.json'; diff --git a/api_docs/kbn_handlebars.mdx b/api_docs/kbn_handlebars.mdx index 0fcc343e3d190..88db861974d6f 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: 2022-10-01 +date: 2022-10-02 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 2b73efa6062ac..be13032975df7 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: 2022-10-01 +date: 2022-10-02 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/hapi-mocks'] --- import kbnHapiMocksObj from './kbn_hapi_mocks.devdocs.json'; diff --git a/api_docs/kbn_home_sample_data_card.mdx b/api_docs/kbn_home_sample_data_card.mdx index 0dc1d0876d3a2..71c8b52c08c7d 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: 2022-10-01 +date: 2022-10-02 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 f8639118d81e0..67b69bdc69372 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: 2022-10-01 +date: 2022-10-02 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 78d78be33902f..287c326105c8a 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: 2022-10-01 +date: 2022-10-02 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/i18n'] --- import kbnI18nObj from './kbn_i18n.devdocs.json'; diff --git a/api_docs/kbn_import_resolver.mdx b/api_docs/kbn_import_resolver.mdx index f8c83ac7998ac..2f8cc3ebfa05c 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: 2022-10-01 +date: 2022-10-02 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/import-resolver'] --- import kbnImportResolverObj from './kbn_import_resolver.devdocs.json'; diff --git a/api_docs/kbn_interpreter.mdx b/api_docs/kbn_interpreter.mdx index 894230ad1d11f..119a20db590da 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: 2022-10-01 +date: 2022-10-02 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 034bcc168b9e6..2dd42caa19c20 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: 2022-10-01 +date: 2022-10-02 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/io-ts-utils'] --- import kbnIoTsUtilsObj from './kbn_io_ts_utils.devdocs.json'; diff --git a/api_docs/kbn_jest_serializers.mdx b/api_docs/kbn_jest_serializers.mdx index 417f8ba3a65f1..5f98c468a61c0 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: 2022-10-01 +date: 2022-10-02 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 7e46d2dcb1f91..15376c2757602 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: 2022-10-01 +date: 2022-10-02 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/journeys'] --- import kbnJourneysObj from './kbn_journeys.devdocs.json'; diff --git a/api_docs/kbn_kibana_manifest_schema.mdx b/api_docs/kbn_kibana_manifest_schema.mdx index 5dc82ade1a649..f4f8350b8df63 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: 2022-10-01 +date: 2022-10-02 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/kibana-manifest-schema'] --- import kbnKibanaManifestSchemaObj from './kbn_kibana_manifest_schema.devdocs.json'; diff --git a/api_docs/kbn_logging.mdx b/api_docs/kbn_logging.mdx index e88bca58e89eb..1121ec512bc39 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: 2022-10-01 +date: 2022-10-02 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 dee1f848efd66..fe90ec4cc221f 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: 2022-10-01 +date: 2022-10-02 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/logging-mocks'] --- import kbnLoggingMocksObj from './kbn_logging_mocks.devdocs.json'; diff --git a/api_docs/kbn_managed_vscode_config.mdx b/api_docs/kbn_managed_vscode_config.mdx index ef7abd6df1bfe..0de9f54e62995 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: 2022-10-01 +date: 2022-10-02 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/managed-vscode-config'] --- import kbnManagedVscodeConfigObj from './kbn_managed_vscode_config.devdocs.json'; diff --git a/api_docs/kbn_mapbox_gl.mdx b/api_docs/kbn_mapbox_gl.mdx index cb067e4a5e48f..007e3dd15767c 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: 2022-10-01 +date: 2022-10-02 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/mapbox-gl'] --- import kbnMapboxGlObj from './kbn_mapbox_gl.devdocs.json'; diff --git a/api_docs/kbn_ml_agg_utils.mdx b/api_docs/kbn_ml_agg_utils.mdx index 2c28a423148f0..cafb9d704b491 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: 2022-10-01 +date: 2022-10-02 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_is_populated_object.mdx b/api_docs/kbn_ml_is_populated_object.mdx index e1380d56c305b..ea7bb98fca111 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: 2022-10-01 +date: 2022-10-02 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_string_hash.mdx b/api_docs/kbn_ml_string_hash.mdx index 960bb4da53ce7..cd15a3909e9cb 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: 2022-10-01 +date: 2022-10-02 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/ml-string-hash'] --- import kbnMlStringHashObj from './kbn_ml_string_hash.devdocs.json'; diff --git a/api_docs/kbn_monaco.mdx b/api_docs/kbn_monaco.mdx index 00938629a9610..f418088dad248 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: 2022-10-01 +date: 2022-10-02 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/monaco'] --- import kbnMonacoObj from './kbn_monaco.devdocs.json'; diff --git a/api_docs/kbn_optimizer.mdx b/api_docs/kbn_optimizer.mdx index 0a5ae8a689d82..8aef1a04d1a5f 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: 2022-10-01 +date: 2022-10-02 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 b6440aacaa070..a784f125dd4a3 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: 2022-10-01 +date: 2022-10-02 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 f92a80367e024..752a04593d5ed 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: 2022-10-01 +date: 2022-10-02 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_performance_testing_dataset_extractor.mdx b/api_docs/kbn_performance_testing_dataset_extractor.mdx index 56e2cd559c032..7c7ace4751a93 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: 2022-10-01 +date: 2022-10-02 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/performance-testing-dataset-extractor'] --- import kbnPerformanceTestingDatasetExtractorObj from './kbn_performance_testing_dataset_extractor.devdocs.json'; diff --git a/api_docs/kbn_plugin_generator.mdx b/api_docs/kbn_plugin_generator.mdx index 23bb7dc57c4e1..b76a868134479 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: 2022-10-01 +date: 2022-10-02 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 c685665c1cd4b..a5ff4e0a5f172 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: 2022-10-01 +date: 2022-10-02 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/plugin-helpers'] --- import kbnPluginHelpersObj from './kbn_plugin_helpers.devdocs.json'; diff --git a/api_docs/kbn_react_field.mdx b/api_docs/kbn_react_field.mdx index e603b0c70740d..e0f55f2faed98 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: 2022-10-01 +date: 2022-10-02 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/react-field'] --- import kbnReactFieldObj from './kbn_react_field.devdocs.json'; diff --git a/api_docs/kbn_repo_source_classifier.mdx b/api_docs/kbn_repo_source_classifier.mdx index 0aa2a7e6d7e24..9adf212a87d0c 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: 2022-10-01 +date: 2022-10-02 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/repo-source-classifier'] --- import kbnRepoSourceClassifierObj from './kbn_repo_source_classifier.devdocs.json'; diff --git a/api_docs/kbn_rule_data_utils.mdx b/api_docs/kbn_rule_data_utils.mdx index d327087b29294..77cd942716abf 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: 2022-10-01 +date: 2022-10-02 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/rule-data-utils'] --- import kbnRuleDataUtilsObj from './kbn_rule_data_utils.devdocs.json'; diff --git a/api_docs/kbn_securitysolution_autocomplete.mdx b/api_docs/kbn_securitysolution_autocomplete.mdx index 3912476bf911c..ac51a31185439 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: 2022-10-01 +date: 2022-10-02 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/securitysolution-autocomplete'] --- import kbnSecuritysolutionAutocompleteObj from './kbn_securitysolution_autocomplete.devdocs.json'; diff --git a/api_docs/kbn_securitysolution_es_utils.mdx b/api_docs/kbn_securitysolution_es_utils.mdx index 2f31f51131f61..a1831303286bd 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: 2022-10-01 +date: 2022-10-02 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 4777f33dc85d5..5e5dec3f0efa7 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: 2022-10-01 +date: 2022-10-02 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 07b9c7684cbb9..25b3f6af8b102 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: 2022-10-01 +date: 2022-10-02 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 3c721f46f48cb..09850981c9212 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: 2022-10-01 +date: 2022-10-02 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 1d452af9ea156..6de7cb1f0d6c8 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: 2022-10-01 +date: 2022-10-02 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 59df749d44291..baf98e2fd0b00 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: 2022-10-01 +date: 2022-10-02 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 8063f1fd1592f..500c8c72ca837 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: 2022-10-01 +date: 2022-10-02 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 184877c74cfaf..5b26d74de8a7f 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: 2022-10-01 +date: 2022-10-02 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 933a87c620ba4..05e6ed82f6ddf 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: 2022-10-01 +date: 2022-10-02 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 0f3f3805ca320..e8c0fc13f6e10 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: 2022-10-01 +date: 2022-10-02 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 6b810acdc8e7d..8203f6334e051 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: 2022-10-01 +date: 2022-10-02 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 aceb1ec1d65d6..a5fea43827df3 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: 2022-10-01 +date: 2022-10-02 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 11cfe00c5eb62..5fc96c25aa1d6 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: 2022-10-01 +date: 2022-10-02 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 4e4ba39e56d9d..205d44e5872cb 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: 2022-10-01 +date: 2022-10-02 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 5a002fe9b6348..3d373165a9284 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: 2022-10-01 +date: 2022-10-02 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/server-http-tools'] --- import kbnServerHttpToolsObj from './kbn_server_http_tools.devdocs.json'; diff --git a/api_docs/kbn_server_route_repository.mdx b/api_docs/kbn_server_route_repository.mdx index 53bffb726d7e0..2d765470b354b 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: 2022-10-01 +date: 2022-10-02 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/server-route-repository'] --- import kbnServerRouteRepositoryObj from './kbn_server_route_repository.devdocs.json'; diff --git a/api_docs/kbn_shared_svg.mdx b/api_docs/kbn_shared_svg.mdx index ba975b8446923..760277af99b74 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: 2022-10-01 +date: 2022-10-02 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_user_profile_components.mdx b/api_docs/kbn_shared_ux_avatar_user_profile_components.mdx index 9c30c42972615..bbbfb6144deb5 100644 --- a/api_docs/kbn_shared_ux_avatar_user_profile_components.mdx +++ b/api_docs/kbn_shared_ux_avatar_user_profile_components.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-shared-ux-avatar-user-profile-components title: "@kbn/shared-ux-avatar-user-profile-components" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/shared-ux-avatar-user-profile-components plugin -date: 2022-10-01 +date: 2022-10-02 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/shared-ux-avatar-user-profile-components'] --- import kbnSharedUxAvatarUserProfileComponentsObj from './kbn_shared_ux_avatar_user_profile_components.devdocs.json'; diff --git a/api_docs/kbn_shared_ux_button_exit_full_screen_mocks.mdx b/api_docs/kbn_shared_ux_button_exit_full_screen_mocks.mdx index cf6491d338fe1..09dad01095487 100644 --- a/api_docs/kbn_shared_ux_button_exit_full_screen_mocks.mdx +++ b/api_docs/kbn_shared_ux_button_exit_full_screen_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-shared-ux-button-exit-full-screen-mocks title: "@kbn/shared-ux-button-exit-full-screen-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/shared-ux-button-exit-full-screen-mocks plugin -date: 2022-10-01 +date: 2022-10-02 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/shared-ux-button-exit-full-screen-mocks'] --- import kbnSharedUxButtonExitFullScreenMocksObj from './kbn_shared_ux_button_exit_full_screen_mocks.devdocs.json'; diff --git a/api_docs/kbn_shared_ux_button_toolbar.mdx b/api_docs/kbn_shared_ux_button_toolbar.mdx index e055ce5c7dbec..52a088948e2b6 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: 2022-10-01 +date: 2022-10-02 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 63958a2cb0297..472e6b89741c9 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: 2022-10-01 +date: 2022-10-02 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 e8dacbe7203bb..3999dd6522fd6 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: 2022-10-01 +date: 2022-10-02 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_link_redirect_app_mocks.mdx b/api_docs/kbn_shared_ux_link_redirect_app_mocks.mdx index 421f7f9d7187b..2c6d531cd186f 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: 2022-10-01 +date: 2022-10-02 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_page_analytics_no_data.mdx b/api_docs/kbn_shared_ux_page_analytics_no_data.mdx index 99d63502639cf..9ecba55b278c4 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: 2022-10-01 +date: 2022-10-02 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 2deff84864974..2c999a65117a6 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: 2022-10-01 +date: 2022-10-02 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 883bd3ab03a8a..7426d22515d58 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: 2022-10-01 +date: 2022-10-02 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 0db5daddc45c9..d815677cdbbb0 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: 2022-10-01 +date: 2022-10-02 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 a9353ec774046..285fff4f69d53 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: 2022-10-01 +date: 2022-10-02 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 99d9c415c15b1..e753d5c2306e5 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: 2022-10-01 +date: 2022-10-02 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 2417b72b9ffe3..3e801da7773bf 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: 2022-10-01 +date: 2022-10-02 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 68dfc645ddd8d..7d0ed072b3404 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: 2022-10-01 +date: 2022-10-02 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 8f977f1cc7a9a..04e54301c0928 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: 2022-10-01 +date: 2022-10-02 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 109a924fb3b9a..574f7592eec1e 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: 2022-10-01 +date: 2022-10-02 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 07a01ac671dac..9886feeb304b4 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: 2022-10-01 +date: 2022-10-02 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 10af2f7f2c160..3688d0c50fd5b 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: 2022-10-01 +date: 2022-10-02 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 0b0f2e48ec0a0..49e38c10a1ab6 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: 2022-10-01 +date: 2022-10-02 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_router.mdx b/api_docs/kbn_shared_ux_router.mdx index 956de3dd05849..baf10caeedb7d 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: 2022-10-01 +date: 2022-10-02 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 f10769e16c69d..05d0ab8de20a5 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: 2022-10-01 +date: 2022-10-02 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 a99179ef9d406..5a6e193562b5a 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: 2022-10-01 +date: 2022-10-02 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 6abf6549e0565..fd0593f5bf74e 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: 2022-10-01 +date: 2022-10-02 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/shared-ux-storybook-mock'] --- import kbnSharedUxStorybookMockObj from './kbn_shared_ux_storybook_mock.devdocs.json'; diff --git a/api_docs/kbn_shared_ux_utility.mdx b/api_docs/kbn_shared_ux_utility.mdx index e44419942c796..6f8f8a20349f3 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: 2022-10-01 +date: 2022-10-02 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/shared-ux-utility'] --- import kbnSharedUxUtilityObj from './kbn_shared_ux_utility.devdocs.json'; diff --git a/api_docs/kbn_some_dev_log.mdx b/api_docs/kbn_some_dev_log.mdx index e25a62c5079ae..d3796d5d79dd3 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: 2022-10-01 +date: 2022-10-02 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_package_json.mdx b/api_docs/kbn_sort_package_json.mdx index 28fe6feb5d19d..6ba6f268cd132 100644 --- a/api_docs/kbn_sort_package_json.mdx +++ b/api_docs/kbn_sort_package_json.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-sort-package-json title: "@kbn/sort-package-json" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/sort-package-json plugin -date: 2022-10-01 +date: 2022-10-02 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/sort-package-json'] --- import kbnSortPackageJsonObj from './kbn_sort_package_json.devdocs.json'; diff --git a/api_docs/kbn_std.mdx b/api_docs/kbn_std.mdx index 05b56017a08ff..de90284104e3b 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: 2022-10-01 +date: 2022-10-02 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 be9d33d159f3c..13b3aa2b6ebbd 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: 2022-10-01 +date: 2022-10-02 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 dd904c049f3bd..e57f44e869e1b 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: 2022-10-01 +date: 2022-10-02 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/storybook'] --- import kbnStorybookObj from './kbn_storybook.devdocs.json'; diff --git a/api_docs/kbn_telemetry_tools.mdx b/api_docs/kbn_telemetry_tools.mdx index b854992fde335..730dfdd548326 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: 2022-10-01 +date: 2022-10-02 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 82eab77aca0cf..3e4061d439386 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: 2022-10-01 +date: 2022-10-02 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/test'] --- import kbnTestObj from './kbn_test.devdocs.json'; diff --git a/api_docs/kbn_test_jest_helpers.mdx b/api_docs/kbn_test_jest_helpers.mdx index bd59838a870d1..80bce2c3d3bb8 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: 2022-10-01 +date: 2022-10-02 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 c5b72af903b3a..38296f51f0ea9 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: 2022-10-01 +date: 2022-10-02 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/test-subj-selector'] --- import kbnTestSubjSelectorObj from './kbn_test_subj_selector.devdocs.json'; diff --git a/api_docs/kbn_tooling_log.mdx b/api_docs/kbn_tooling_log.mdx index abd0555459d96..d038b65a9b437 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: 2022-10-01 +date: 2022-10-02 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/tooling-log'] --- import kbnToolingLogObj from './kbn_tooling_log.devdocs.json'; diff --git a/api_docs/kbn_type_summarizer.mdx b/api_docs/kbn_type_summarizer.mdx index 09bc46b76cc97..1dc49f971de9d 100644 --- a/api_docs/kbn_type_summarizer.mdx +++ b/api_docs/kbn_type_summarizer.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-type-summarizer title: "@kbn/type-summarizer" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/type-summarizer plugin -date: 2022-10-01 +date: 2022-10-02 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/type-summarizer'] --- import kbnTypeSummarizerObj from './kbn_type_summarizer.devdocs.json'; diff --git a/api_docs/kbn_type_summarizer_core.mdx b/api_docs/kbn_type_summarizer_core.mdx index 60509b4421a9d..cc8f70eddfb49 100644 --- a/api_docs/kbn_type_summarizer_core.mdx +++ b/api_docs/kbn_type_summarizer_core.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-type-summarizer-core title: "@kbn/type-summarizer-core" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/type-summarizer-core plugin -date: 2022-10-01 +date: 2022-10-02 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/type-summarizer-core'] --- import kbnTypeSummarizerCoreObj from './kbn_type_summarizer_core.devdocs.json'; diff --git a/api_docs/kbn_typed_react_router_config.mdx b/api_docs/kbn_typed_react_router_config.mdx index 614b52b535a99..fa9aec2765d0e 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: 2022-10-01 +date: 2022-10-02 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_theme.mdx b/api_docs/kbn_ui_theme.mdx index 86b99ea131b43..a23a496ec08a1 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: 2022-10-01 +date: 2022-10-02 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/ui-theme'] --- import kbnUiThemeObj from './kbn_ui_theme.devdocs.json'; diff --git a/api_docs/kbn_user_profile_components.mdx b/api_docs/kbn_user_profile_components.mdx index 1411d1f11e0f6..e22681ed1b21f 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: 2022-10-01 +date: 2022-10-02 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 124801b6982ed..4e184219ce29e 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: 2022-10-01 +date: 2022-10-02 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 286cf41a0f814..e2ede8850299f 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: 2022-10-01 +date: 2022-10-02 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 1d15139e5ad5d..9fc2d665396ba 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: 2022-10-01 +date: 2022-10-02 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/utils'] --- import kbnUtilsObj from './kbn_utils.devdocs.json'; diff --git a/api_docs/kbn_yarn_lock_validator.mdx b/api_docs/kbn_yarn_lock_validator.mdx index 3fa079e3178f7..7822a652e9dc9 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: 2022-10-01 +date: 2022-10-02 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/yarn-lock-validator'] --- import kbnYarnLockValidatorObj from './kbn_yarn_lock_validator.devdocs.json'; diff --git a/api_docs/kibana_overview.mdx b/api_docs/kibana_overview.mdx index ac6ccdaefbbf2..3f7cc296f0789 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: 2022-10-01 +date: 2022-10-02 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 e8016cd77287b..721d581c9aebb 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: 2022-10-01 +date: 2022-10-02 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 dff8ce771bdee..331c1c9cc68ef 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: 2022-10-01 +date: 2022-10-02 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 318aa79a29754..927b730fbd080 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: 2022-10-01 +date: 2022-10-02 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 01c5bc3141bc4..29f7f9b863fe9 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: 2022-10-01 +date: 2022-10-02 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 e1894af2cbfa0..cfe740cacdaf4 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: 2022-10-01 +date: 2022-10-02 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 d592aa08d8751..1f90c8557e07e 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: 2022-10-01 +date: 2022-10-02 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 a65fb069d0ac4..27be5086f77e3 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: 2022-10-01 +date: 2022-10-02 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'licensing'] --- import licensingObj from './licensing.devdocs.json'; diff --git a/api_docs/lists.mdx b/api_docs/lists.mdx index e4e33df28af34..0fe469c827997 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: 2022-10-01 +date: 2022-10-02 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'lists'] --- import listsObj from './lists.devdocs.json'; diff --git a/api_docs/management.mdx b/api_docs/management.mdx index bcb5fc7434722..0dab3bc7dfeb7 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: 2022-10-01 +date: 2022-10-02 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 e1409873d0457..606529ea480d8 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: 2022-10-01 +date: 2022-10-02 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 d6ef5a21773f9..cb8141b2fa2eb 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: 2022-10-01 +date: 2022-10-02 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'mapsEms'] --- import mapsEmsObj from './maps_ems.devdocs.json'; diff --git a/api_docs/ml.mdx b/api_docs/ml.mdx index f725548e9cf9c..a220cc633fdbe 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: 2022-10-01 +date: 2022-10-02 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'ml'] --- import mlObj from './ml.devdocs.json'; diff --git a/api_docs/monitoring.mdx b/api_docs/monitoring.mdx index c72b46a487e9e..d57492b577032 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: 2022-10-01 +date: 2022-10-02 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 41785b90b47d3..4fa7372e846d3 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: 2022-10-01 +date: 2022-10-02 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 4d964c688c8af..ace04be9dfd65 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: 2022-10-01 +date: 2022-10-02 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 d084497544343..ea74ae679ce8f 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: 2022-10-01 +date: 2022-10-02 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'newsfeed'] --- import newsfeedObj from './newsfeed.devdocs.json'; diff --git a/api_docs/observability.mdx b/api_docs/observability.mdx index e40080c8ecf58..63effa9722c28 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: 2022-10-01 +date: 2022-10-02 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'observability'] --- import observabilityObj from './observability.devdocs.json'; diff --git a/api_docs/osquery.mdx b/api_docs/osquery.mdx index 266faca28aede..0c73ce5aa345c 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: 2022-10-01 +date: 2022-10-02 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'osquery'] --- import osqueryObj from './osquery.devdocs.json'; diff --git a/api_docs/plugin_directory.mdx b/api_docs/plugin_directory.mdx index 65ed265de39cf..51cba79e857c9 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: 2022-10-01 +date: 2022-10-02 tags: ['contributor', 'dev', 'apidocs', 'kibana'] --- diff --git a/api_docs/presentation_util.mdx b/api_docs/presentation_util.mdx index 581cd5ef4d51a..b7aa3b787718d 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: 2022-10-01 +date: 2022-10-02 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 817f03f981b13..877b703d7e169 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: 2022-10-01 +date: 2022-10-02 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'profiling'] --- import profilingObj from './profiling.devdocs.json'; diff --git a/api_docs/remote_clusters.mdx b/api_docs/remote_clusters.mdx index e074406c74e89..9f3abb5e1d970 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: 2022-10-01 +date: 2022-10-02 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 5c1dc0c2685a3..53a33e3f3e021 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: 2022-10-01 +date: 2022-10-02 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 df1bff5712972..4e870d52ebe4e 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: 2022-10-01 +date: 2022-10-02 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 ec349c4ad0b5e..3a2aa8b507fe9 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: 2022-10-01 +date: 2022-10-02 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 5edda54c6f139..4092856f85483 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: 2022-10-01 +date: 2022-10-02 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 d4d313bef79fb..6e00cff68eeaf 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: 2022-10-01 +date: 2022-10-02 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 1ae6118247ce5..92585b79379f3 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: 2022-10-01 +date: 2022-10-02 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 3a2c36b7cc7f4..f97c77aca56d9 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: 2022-10-01 +date: 2022-10-02 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 6e788653e193a..69df9871d9f65 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: 2022-10-01 +date: 2022-10-02 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 1e81b07e6d24c..9e3ca4f8d4e8f 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: 2022-10-01 +date: 2022-10-02 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 2146968cda903..ce10df747f588 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: 2022-10-01 +date: 2022-10-02 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 d88e2e95c6387..db9cf0112901e 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: 2022-10-01 +date: 2022-10-02 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 dd4d7868a8991..88a61fbfbefd6 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: 2022-10-01 +date: 2022-10-02 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'screenshotting'] --- import screenshottingObj from './screenshotting.devdocs.json'; diff --git a/api_docs/security.mdx b/api_docs/security.mdx index 549878d171ab4..574757b6488dd 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: 2022-10-01 +date: 2022-10-02 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'security'] --- import securityObj from './security.devdocs.json'; diff --git a/api_docs/security_solution.mdx b/api_docs/security_solution.mdx index eac5df4aa58b0..fd2ceda90f9ee 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: 2022-10-01 +date: 2022-10-02 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'securitySolution'] --- import securitySolutionObj from './security_solution.devdocs.json'; diff --git a/api_docs/session_view.mdx b/api_docs/session_view.mdx index 212526e3c0214..dae50a1df7b65 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: 2022-10-01 +date: 2022-10-02 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 a3534fb4ba277..da7c56ca51c58 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: 2022-10-01 +date: 2022-10-02 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'share'] --- import shareObj from './share.devdocs.json'; diff --git a/api_docs/snapshot_restore.mdx b/api_docs/snapshot_restore.mdx index 5c626675eef66..12fb3c0f940cb 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: 2022-10-01 +date: 2022-10-02 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 b8766114204c6..ad1ae785ccc95 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: 2022-10-01 +date: 2022-10-02 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 5bdce3da3e229..366616671516d 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: 2022-10-01 +date: 2022-10-02 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 415c51b650dcb..811c79896d7ec 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: 2022-10-01 +date: 2022-10-02 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 e730f9b56148e..0f244bdfa77ac 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: 2022-10-01 +date: 2022-10-02 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 8cc947166e677..27b6af9549d74 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: 2022-10-01 +date: 2022-10-02 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 7d0012a2281a9..e40ec8f867a6e 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: 2022-10-01 +date: 2022-10-02 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 27fb11dfae9f9..15225549bbe79 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: 2022-10-01 +date: 2022-10-02 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 e358c37feb52c..e962b1c74b73a 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: 2022-10-01 +date: 2022-10-02 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 54c0a5d93409a..bc8d91d1ee1df 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: 2022-10-01 +date: 2022-10-02 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 9c00897d8c1fd..f12a30a01feae 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: 2022-10-01 +date: 2022-10-02 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 510d527d883c6..0c044093de8da 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: 2022-10-01 +date: 2022-10-02 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 c94cb7a1a751d..d628475506628 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: 2022-10-01 +date: 2022-10-02 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 a67988ed1155e..a11e23546d229 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: 2022-10-01 +date: 2022-10-02 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 a2d9c4d869b7b..273a9ab86497e 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: 2022-10-01 +date: 2022-10-02 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'uiActionsEnhanced'] --- import uiActionsEnhancedObj from './ui_actions_enhanced.devdocs.json'; diff --git a/api_docs/unified_field_list.mdx b/api_docs/unified_field_list.mdx index ccea854bb0735..d3614845b2485 100644 --- a/api_docs/unified_field_list.mdx +++ b/api_docs/unified_field_list.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/unifiedFieldList title: "unifiedFieldList" image: https://source.unsplash.com/400x175/?github description: API docs for the unifiedFieldList plugin -date: 2022-10-01 +date: 2022-10-02 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'unifiedFieldList'] --- import unifiedFieldListObj from './unified_field_list.devdocs.json'; diff --git a/api_docs/unified_search.mdx b/api_docs/unified_search.mdx index 76011654fbea5..efac37faf56d0 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: 2022-10-01 +date: 2022-10-02 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 14a0d57226b4c..b0ffa71265a1c 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: 2022-10-01 +date: 2022-10-02 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'unifiedSearch.autocomplete'] --- import unifiedSearchAutocompleteObj from './unified_search_autocomplete.devdocs.json'; diff --git a/api_docs/url_forwarding.mdx b/api_docs/url_forwarding.mdx index f7410808300ee..ef65b102aed74 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: 2022-10-01 +date: 2022-10-02 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 a62461b88ceec..e41693e5efca0 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: 2022-10-01 +date: 2022-10-02 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 7d7a4df32df81..cfafdaf068029 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: 2022-10-01 +date: 2022-10-02 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 3a1a53675deec..f63baebfa4b2a 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: 2022-10-01 +date: 2022-10-02 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 cfdaf08f6cc1b..b91e25ae3893f 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: 2022-10-01 +date: 2022-10-02 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 b26a487e9cbbc..49ba54cdc57d3 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: 2022-10-01 +date: 2022-10-02 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 a3aaeb805b0c3..93e84b16f4d28 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: 2022-10-01 +date: 2022-10-02 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 aff9846178613..90bae1cb686f6 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: 2022-10-01 +date: 2022-10-02 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 c1f44c36c05d8..06b9a57efddf5 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: 2022-10-01 +date: 2022-10-02 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 179e2273cf670..7aafcad29e0fa 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: 2022-10-01 +date: 2022-10-02 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 691934f5c9b10..324013c67331a 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: 2022-10-01 +date: 2022-10-02 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 a18309726008d..d8e1da6a13e95 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: 2022-10-01 +date: 2022-10-02 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 9733a2e51f76c..4722a4b75256e 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: 2022-10-01 +date: 2022-10-02 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'visTypeXy'] --- import visTypeXyObj from './vis_type_xy.devdocs.json'; diff --git a/api_docs/visualizations.mdx b/api_docs/visualizations.mdx index 1b87bc4d3156d..36d12fab03cfc 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: 2022-10-01 +date: 2022-10-02 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'visualizations'] --- import visualizationsObj from './visualizations.devdocs.json'; From de1c22a07429001ce582dd28d97860754f5b5220 Mon Sep 17 00:00:00 2001 From: Kibana Machine <42973632+kibanamachine@users.noreply.github.com> Date: Sun, 2 Oct 2022 22:39:26 -0600 Subject: [PATCH 68/72] [api-docs] Daily api_docs build (#142438) --- api_docs/actions.mdx | 2 +- api_docs/advanced_settings.mdx | 2 +- api_docs/aiops.mdx | 2 +- api_docs/alerting.mdx | 2 +- api_docs/apm.mdx | 2 +- api_docs/banners.mdx | 2 +- api_docs/bfetch.mdx | 2 +- api_docs/canvas.mdx | 2 +- api_docs/cases.mdx | 2 +- api_docs/charts.mdx | 2 +- api_docs/cloud.mdx | 2 +- api_docs/cloud_experiments.mdx | 2 +- api_docs/cloud_security_posture.mdx | 2 +- api_docs/console.mdx | 2 +- api_docs/controls.mdx | 2 +- api_docs/core.mdx | 2 +- api_docs/custom_integrations.mdx | 2 +- api_docs/dashboard.mdx | 2 +- api_docs/dashboard_enhanced.mdx | 2 +- api_docs/data.mdx | 2 +- api_docs/data_query.mdx | 2 +- api_docs/data_search.mdx | 2 +- api_docs/data_view_editor.mdx | 2 +- api_docs/data_view_field_editor.mdx | 2 +- api_docs/data_view_management.mdx | 2 +- api_docs/data_views.mdx | 2 +- api_docs/data_visualizer.mdx | 2 +- api_docs/deprecations_by_api.mdx | 2 +- api_docs/deprecations_by_plugin.mdx | 2 +- api_docs/deprecations_by_team.mdx | 2 +- api_docs/dev_tools.mdx | 2 +- api_docs/discover.mdx | 2 +- api_docs/discover_enhanced.mdx | 2 +- api_docs/embeddable.mdx | 2 +- api_docs/embeddable_enhanced.mdx | 2 +- api_docs/encrypted_saved_objects.mdx | 2 +- api_docs/enterprise_search.mdx | 2 +- api_docs/es_ui_shared.mdx | 2 +- api_docs/event_annotation.mdx | 2 +- api_docs/event_log.mdx | 2 +- api_docs/expression_error.mdx | 2 +- api_docs/expression_gauge.mdx | 2 +- api_docs/expression_heatmap.mdx | 2 +- api_docs/expression_image.mdx | 2 +- api_docs/expression_legacy_metric_vis.mdx | 2 +- api_docs/expression_metric.mdx | 2 +- api_docs/expression_metric_vis.mdx | 2 +- api_docs/expression_partition_vis.mdx | 2 +- api_docs/expression_repeat_image.mdx | 2 +- api_docs/expression_reveal_image.mdx | 2 +- api_docs/expression_shape.mdx | 2 +- api_docs/expression_tagcloud.mdx | 2 +- api_docs/expression_x_y.mdx | 2 +- api_docs/expressions.mdx | 2 +- api_docs/features.mdx | 2 +- api_docs/field_formats.mdx | 2 +- api_docs/file_upload.mdx | 2 +- api_docs/files.mdx | 2 +- api_docs/fleet.mdx | 2 +- api_docs/global_search.mdx | 2 +- api_docs/guided_onboarding.mdx | 2 +- api_docs/home.mdx | 2 +- api_docs/index_lifecycle_management.mdx | 2 +- api_docs/index_management.mdx | 2 +- api_docs/infra.mdx | 2 +- api_docs/inspector.mdx | 2 +- api_docs/interactive_setup.mdx | 2 +- api_docs/kbn_ace.mdx | 2 +- api_docs/kbn_aiops_components.mdx | 2 +- api_docs/kbn_aiops_utils.mdx | 2 +- api_docs/kbn_alerts.mdx | 2 +- api_docs/kbn_analytics.mdx | 2 +- api_docs/kbn_analytics_client.mdx | 2 +- api_docs/kbn_analytics_shippers_elastic_v3_browser.mdx | 2 +- api_docs/kbn_analytics_shippers_elastic_v3_common.mdx | 2 +- api_docs/kbn_analytics_shippers_elastic_v3_server.mdx | 2 +- api_docs/kbn_analytics_shippers_fullstory.mdx | 2 +- api_docs/kbn_apm_config_loader.mdx | 2 +- api_docs/kbn_apm_synthtrace.mdx | 2 +- api_docs/kbn_apm_utils.mdx | 2 +- api_docs/kbn_axe_config.mdx | 2 +- api_docs/kbn_chart_icons.mdx | 2 +- api_docs/kbn_ci_stats_core.mdx | 2 +- api_docs/kbn_ci_stats_performance_metrics.mdx | 2 +- api_docs/kbn_ci_stats_reporter.mdx | 2 +- api_docs/kbn_cli_dev_mode.mdx | 2 +- api_docs/kbn_coloring.mdx | 2 +- api_docs/kbn_config.mdx | 2 +- api_docs/kbn_config_mocks.mdx | 2 +- api_docs/kbn_config_schema.mdx | 2 +- api_docs/kbn_content_management_table_list.mdx | 2 +- api_docs/kbn_core_analytics_browser.mdx | 2 +- api_docs/kbn_core_analytics_browser_internal.mdx | 2 +- api_docs/kbn_core_analytics_browser_mocks.mdx | 2 +- api_docs/kbn_core_analytics_server.mdx | 2 +- api_docs/kbn_core_analytics_server_internal.mdx | 2 +- api_docs/kbn_core_analytics_server_mocks.mdx | 2 +- api_docs/kbn_core_application_browser.mdx | 2 +- api_docs/kbn_core_application_browser_internal.mdx | 2 +- api_docs/kbn_core_application_browser_mocks.mdx | 2 +- api_docs/kbn_core_application_common.mdx | 2 +- api_docs/kbn_core_apps_browser_internal.mdx | 2 +- api_docs/kbn_core_apps_browser_mocks.mdx | 2 +- api_docs/kbn_core_base_browser_mocks.mdx | 2 +- api_docs/kbn_core_base_common.mdx | 2 +- api_docs/kbn_core_base_server_internal.mdx | 2 +- api_docs/kbn_core_base_server_mocks.mdx | 2 +- api_docs/kbn_core_capabilities_browser_mocks.mdx | 2 +- api_docs/kbn_core_capabilities_common.mdx | 2 +- api_docs/kbn_core_capabilities_server.mdx | 2 +- api_docs/kbn_core_capabilities_server_mocks.mdx | 2 +- api_docs/kbn_core_chrome_browser.mdx | 2 +- api_docs/kbn_core_chrome_browser_mocks.mdx | 2 +- api_docs/kbn_core_config_server_internal.mdx | 2 +- api_docs/kbn_core_deprecations_browser.mdx | 2 +- api_docs/kbn_core_deprecations_browser_internal.mdx | 2 +- api_docs/kbn_core_deprecations_browser_mocks.mdx | 2 +- api_docs/kbn_core_deprecations_common.mdx | 2 +- api_docs/kbn_core_deprecations_server.mdx | 2 +- api_docs/kbn_core_deprecations_server_internal.mdx | 2 +- api_docs/kbn_core_deprecations_server_mocks.mdx | 2 +- api_docs/kbn_core_doc_links_browser.mdx | 2 +- api_docs/kbn_core_doc_links_browser_mocks.mdx | 2 +- api_docs/kbn_core_doc_links_server.mdx | 2 +- api_docs/kbn_core_doc_links_server_mocks.mdx | 2 +- api_docs/kbn_core_elasticsearch_client_server_internal.mdx | 2 +- api_docs/kbn_core_elasticsearch_client_server_mocks.mdx | 2 +- api_docs/kbn_core_elasticsearch_server.mdx | 2 +- api_docs/kbn_core_elasticsearch_server_internal.mdx | 2 +- api_docs/kbn_core_elasticsearch_server_mocks.mdx | 2 +- api_docs/kbn_core_environment_server_internal.mdx | 2 +- api_docs/kbn_core_environment_server_mocks.mdx | 2 +- api_docs/kbn_core_execution_context_browser.mdx | 2 +- api_docs/kbn_core_execution_context_browser_internal.mdx | 2 +- api_docs/kbn_core_execution_context_browser_mocks.mdx | 2 +- api_docs/kbn_core_execution_context_common.mdx | 2 +- api_docs/kbn_core_execution_context_server.mdx | 2 +- api_docs/kbn_core_execution_context_server_internal.mdx | 2 +- api_docs/kbn_core_execution_context_server_mocks.mdx | 2 +- api_docs/kbn_core_fatal_errors_browser.mdx | 2 +- api_docs/kbn_core_fatal_errors_browser_mocks.mdx | 2 +- api_docs/kbn_core_http_browser.mdx | 2 +- api_docs/kbn_core_http_browser_internal.mdx | 2 +- api_docs/kbn_core_http_browser_mocks.mdx | 2 +- api_docs/kbn_core_http_common.mdx | 2 +- api_docs/kbn_core_http_context_server_mocks.mdx | 2 +- api_docs/kbn_core_http_request_handler_context_server.mdx | 2 +- api_docs/kbn_core_http_router_server_internal.mdx | 2 +- api_docs/kbn_core_http_router_server_mocks.mdx | 2 +- api_docs/kbn_core_http_server.mdx | 2 +- api_docs/kbn_core_http_server_internal.mdx | 2 +- api_docs/kbn_core_http_server_mocks.mdx | 2 +- api_docs/kbn_core_i18n_browser.mdx | 2 +- api_docs/kbn_core_i18n_browser_mocks.mdx | 2 +- api_docs/kbn_core_i18n_server.mdx | 2 +- api_docs/kbn_core_i18n_server_internal.mdx | 2 +- api_docs/kbn_core_i18n_server_mocks.mdx | 2 +- api_docs/kbn_core_injected_metadata_browser.mdx | 2 +- api_docs/kbn_core_injected_metadata_browser_mocks.mdx | 2 +- api_docs/kbn_core_integrations_browser_internal.mdx | 2 +- api_docs/kbn_core_integrations_browser_mocks.mdx | 2 +- api_docs/kbn_core_lifecycle_browser.mdx | 2 +- api_docs/kbn_core_lifecycle_browser_mocks.mdx | 2 +- api_docs/kbn_core_logging_server.mdx | 2 +- api_docs/kbn_core_logging_server_internal.mdx | 2 +- api_docs/kbn_core_logging_server_mocks.mdx | 2 +- api_docs/kbn_core_metrics_collectors_server_internal.mdx | 2 +- api_docs/kbn_core_metrics_collectors_server_mocks.mdx | 2 +- api_docs/kbn_core_metrics_server.mdx | 2 +- api_docs/kbn_core_metrics_server_internal.mdx | 2 +- api_docs/kbn_core_metrics_server_mocks.mdx | 2 +- api_docs/kbn_core_mount_utils_browser.mdx | 2 +- api_docs/kbn_core_node_server.mdx | 2 +- api_docs/kbn_core_node_server_internal.mdx | 2 +- api_docs/kbn_core_node_server_mocks.mdx | 2 +- api_docs/kbn_core_notifications_browser.mdx | 2 +- api_docs/kbn_core_notifications_browser_internal.mdx | 2 +- api_docs/kbn_core_notifications_browser_mocks.mdx | 2 +- api_docs/kbn_core_overlays_browser.mdx | 2 +- api_docs/kbn_core_overlays_browser_internal.mdx | 2 +- api_docs/kbn_core_overlays_browser_mocks.mdx | 2 +- api_docs/kbn_core_plugins_browser.mdx | 2 +- api_docs/kbn_core_plugins_browser_mocks.mdx | 2 +- api_docs/kbn_core_preboot_server.mdx | 2 +- api_docs/kbn_core_preboot_server_mocks.mdx | 2 +- api_docs/kbn_core_rendering_browser_mocks.mdx | 2 +- api_docs/kbn_core_saved_objects_api_browser.mdx | 2 +- api_docs/kbn_core_saved_objects_api_server.mdx | 2 +- api_docs/kbn_core_saved_objects_api_server_internal.mdx | 2 +- api_docs/kbn_core_saved_objects_api_server_mocks.mdx | 2 +- api_docs/kbn_core_saved_objects_base_server_internal.mdx | 2 +- api_docs/kbn_core_saved_objects_base_server_mocks.mdx | 2 +- api_docs/kbn_core_saved_objects_browser.mdx | 2 +- api_docs/kbn_core_saved_objects_browser_internal.mdx | 2 +- api_docs/kbn_core_saved_objects_browser_mocks.mdx | 2 +- api_docs/kbn_core_saved_objects_common.mdx | 2 +- .../kbn_core_saved_objects_import_export_server_internal.mdx | 2 +- api_docs/kbn_core_saved_objects_import_export_server_mocks.mdx | 2 +- api_docs/kbn_core_saved_objects_migration_server_internal.mdx | 2 +- api_docs/kbn_core_saved_objects_migration_server_mocks.mdx | 2 +- api_docs/kbn_core_saved_objects_server.mdx | 2 +- api_docs/kbn_core_saved_objects_server_internal.mdx | 2 +- api_docs/kbn_core_saved_objects_server_mocks.mdx | 2 +- api_docs/kbn_core_saved_objects_utils_server.mdx | 2 +- api_docs/kbn_core_status_common.mdx | 2 +- api_docs/kbn_core_status_common_internal.mdx | 2 +- api_docs/kbn_core_status_server.mdx | 2 +- api_docs/kbn_core_status_server_internal.mdx | 2 +- api_docs/kbn_core_status_server_mocks.mdx | 2 +- api_docs/kbn_core_test_helpers_deprecations_getters.mdx | 2 +- api_docs/kbn_core_test_helpers_http_setup_browser.mdx | 2 +- api_docs/kbn_core_theme_browser.mdx | 2 +- api_docs/kbn_core_theme_browser_internal.mdx | 2 +- api_docs/kbn_core_theme_browser_mocks.mdx | 2 +- api_docs/kbn_core_ui_settings_browser.mdx | 2 +- api_docs/kbn_core_ui_settings_browser_internal.mdx | 2 +- api_docs/kbn_core_ui_settings_browser_mocks.mdx | 2 +- api_docs/kbn_core_ui_settings_common.mdx | 2 +- api_docs/kbn_core_ui_settings_server.mdx | 2 +- api_docs/kbn_core_ui_settings_server_internal.mdx | 2 +- api_docs/kbn_core_ui_settings_server_mocks.mdx | 2 +- api_docs/kbn_core_usage_data_server.mdx | 2 +- api_docs/kbn_core_usage_data_server_internal.mdx | 2 +- api_docs/kbn_core_usage_data_server_mocks.mdx | 2 +- api_docs/kbn_crypto.mdx | 2 +- api_docs/kbn_crypto_browser.mdx | 2 +- api_docs/kbn_datemath.mdx | 2 +- api_docs/kbn_dev_cli_errors.mdx | 2 +- api_docs/kbn_dev_cli_runner.mdx | 2 +- api_docs/kbn_dev_proc_runner.mdx | 2 +- api_docs/kbn_dev_utils.mdx | 2 +- api_docs/kbn_doc_links.mdx | 2 +- api_docs/kbn_docs_utils.mdx | 2 +- api_docs/kbn_ebt_tools.mdx | 2 +- api_docs/kbn_es_archiver.mdx | 2 +- api_docs/kbn_es_errors.mdx | 2 +- api_docs/kbn_es_query.mdx | 2 +- api_docs/kbn_es_types.mdx | 2 +- api_docs/kbn_eslint_plugin_imports.mdx | 2 +- api_docs/kbn_field_types.mdx | 2 +- api_docs/kbn_find_used_node_modules.mdx | 2 +- api_docs/kbn_ftr_common_functional_services.mdx | 2 +- api_docs/kbn_generate.mdx | 2 +- api_docs/kbn_get_repo_files.mdx | 2 +- api_docs/kbn_handlebars.mdx | 2 +- api_docs/kbn_hapi_mocks.mdx | 2 +- api_docs/kbn_home_sample_data_card.mdx | 2 +- api_docs/kbn_home_sample_data_tab.mdx | 2 +- api_docs/kbn_i18n.mdx | 2 +- api_docs/kbn_import_resolver.mdx | 2 +- api_docs/kbn_interpreter.mdx | 2 +- api_docs/kbn_io_ts_utils.mdx | 2 +- api_docs/kbn_jest_serializers.mdx | 2 +- api_docs/kbn_journeys.mdx | 2 +- api_docs/kbn_kibana_manifest_schema.mdx | 2 +- api_docs/kbn_logging.mdx | 2 +- api_docs/kbn_logging_mocks.mdx | 2 +- api_docs/kbn_managed_vscode_config.mdx | 2 +- api_docs/kbn_mapbox_gl.mdx | 2 +- api_docs/kbn_ml_agg_utils.mdx | 2 +- api_docs/kbn_ml_is_populated_object.mdx | 2 +- api_docs/kbn_ml_string_hash.mdx | 2 +- api_docs/kbn_monaco.mdx | 2 +- api_docs/kbn_optimizer.mdx | 2 +- api_docs/kbn_optimizer_webpack_helpers.mdx | 2 +- api_docs/kbn_osquery_io_ts_types.mdx | 2 +- api_docs/kbn_performance_testing_dataset_extractor.mdx | 2 +- api_docs/kbn_plugin_generator.mdx | 2 +- api_docs/kbn_plugin_helpers.mdx | 2 +- api_docs/kbn_react_field.mdx | 2 +- api_docs/kbn_repo_source_classifier.mdx | 2 +- api_docs/kbn_rule_data_utils.mdx | 2 +- api_docs/kbn_securitysolution_autocomplete.mdx | 2 +- api_docs/kbn_securitysolution_es_utils.mdx | 2 +- api_docs/kbn_securitysolution_exception_list_components.mdx | 2 +- api_docs/kbn_securitysolution_hook_utils.mdx | 2 +- api_docs/kbn_securitysolution_io_ts_alerting_types.mdx | 2 +- api_docs/kbn_securitysolution_io_ts_list_types.mdx | 2 +- api_docs/kbn_securitysolution_io_ts_types.mdx | 2 +- api_docs/kbn_securitysolution_io_ts_utils.mdx | 2 +- api_docs/kbn_securitysolution_list_api.mdx | 2 +- api_docs/kbn_securitysolution_list_constants.mdx | 2 +- api_docs/kbn_securitysolution_list_hooks.mdx | 2 +- api_docs/kbn_securitysolution_list_utils.mdx | 2 +- api_docs/kbn_securitysolution_rules.mdx | 2 +- api_docs/kbn_securitysolution_t_grid.mdx | 2 +- api_docs/kbn_securitysolution_utils.mdx | 2 +- api_docs/kbn_server_http_tools.mdx | 2 +- api_docs/kbn_server_route_repository.mdx | 2 +- api_docs/kbn_shared_svg.mdx | 2 +- api_docs/kbn_shared_ux_avatar_user_profile_components.mdx | 2 +- api_docs/kbn_shared_ux_button_exit_full_screen_mocks.mdx | 2 +- api_docs/kbn_shared_ux_button_toolbar.mdx | 2 +- api_docs/kbn_shared_ux_card_no_data.mdx | 2 +- api_docs/kbn_shared_ux_card_no_data_mocks.mdx | 2 +- api_docs/kbn_shared_ux_link_redirect_app_mocks.mdx | 2 +- api_docs/kbn_shared_ux_page_analytics_no_data.mdx | 2 +- api_docs/kbn_shared_ux_page_analytics_no_data_mocks.mdx | 2 +- api_docs/kbn_shared_ux_page_kibana_no_data.mdx | 2 +- api_docs/kbn_shared_ux_page_kibana_no_data_mocks.mdx | 2 +- api_docs/kbn_shared_ux_page_kibana_template.mdx | 2 +- api_docs/kbn_shared_ux_page_kibana_template_mocks.mdx | 2 +- api_docs/kbn_shared_ux_page_no_data.mdx | 2 +- api_docs/kbn_shared_ux_page_no_data_config.mdx | 2 +- api_docs/kbn_shared_ux_page_no_data_config_mocks.mdx | 2 +- api_docs/kbn_shared_ux_page_no_data_mocks.mdx | 2 +- api_docs/kbn_shared_ux_page_solution_nav.mdx | 2 +- api_docs/kbn_shared_ux_prompt_no_data_views.mdx | 2 +- api_docs/kbn_shared_ux_prompt_no_data_views_mocks.mdx | 2 +- api_docs/kbn_shared_ux_router.mdx | 2 +- api_docs/kbn_shared_ux_router_mocks.mdx | 2 +- api_docs/kbn_shared_ux_storybook_config.mdx | 2 +- api_docs/kbn_shared_ux_storybook_mock.mdx | 2 +- api_docs/kbn_shared_ux_utility.mdx | 2 +- api_docs/kbn_some_dev_log.mdx | 2 +- api_docs/kbn_sort_package_json.mdx | 2 +- api_docs/kbn_std.mdx | 2 +- api_docs/kbn_stdio_dev_helpers.mdx | 2 +- api_docs/kbn_storybook.mdx | 2 +- api_docs/kbn_telemetry_tools.mdx | 2 +- api_docs/kbn_test.mdx | 2 +- api_docs/kbn_test_jest_helpers.mdx | 2 +- api_docs/kbn_test_subj_selector.mdx | 2 +- api_docs/kbn_tooling_log.mdx | 2 +- api_docs/kbn_type_summarizer.mdx | 2 +- api_docs/kbn_type_summarizer_core.mdx | 2 +- api_docs/kbn_typed_react_router_config.mdx | 2 +- api_docs/kbn_ui_theme.mdx | 2 +- api_docs/kbn_user_profile_components.mdx | 2 +- api_docs/kbn_utility_types.mdx | 2 +- api_docs/kbn_utility_types_jest.mdx | 2 +- api_docs/kbn_utils.mdx | 2 +- api_docs/kbn_yarn_lock_validator.mdx | 2 +- api_docs/kibana_overview.mdx | 2 +- api_docs/kibana_react.mdx | 2 +- api_docs/kibana_utils.mdx | 2 +- api_docs/kubernetes_security.mdx | 2 +- api_docs/lens.mdx | 2 +- api_docs/license_api_guard.mdx | 2 +- api_docs/license_management.mdx | 2 +- api_docs/licensing.mdx | 2 +- api_docs/lists.mdx | 2 +- api_docs/management.mdx | 2 +- api_docs/maps.mdx | 2 +- api_docs/maps_ems.mdx | 2 +- api_docs/ml.mdx | 2 +- api_docs/monitoring.mdx | 2 +- api_docs/monitoring_collection.mdx | 2 +- api_docs/navigation.mdx | 2 +- api_docs/newsfeed.mdx | 2 +- api_docs/observability.mdx | 2 +- api_docs/osquery.mdx | 2 +- api_docs/plugin_directory.mdx | 2 +- api_docs/presentation_util.mdx | 2 +- api_docs/profiling.mdx | 2 +- api_docs/remote_clusters.mdx | 2 +- api_docs/reporting.mdx | 2 +- api_docs/rollup.mdx | 2 +- api_docs/rule_registry.mdx | 2 +- api_docs/runtime_fields.mdx | 2 +- api_docs/saved_objects.mdx | 2 +- api_docs/saved_objects_finder.mdx | 2 +- api_docs/saved_objects_management.mdx | 2 +- api_docs/saved_objects_tagging.mdx | 2 +- api_docs/saved_objects_tagging_oss.mdx | 2 +- api_docs/saved_search.mdx | 2 +- api_docs/screenshot_mode.mdx | 2 +- api_docs/screenshotting.mdx | 2 +- api_docs/security.mdx | 2 +- api_docs/security_solution.mdx | 2 +- api_docs/session_view.mdx | 2 +- api_docs/share.mdx | 2 +- api_docs/snapshot_restore.mdx | 2 +- api_docs/spaces.mdx | 2 +- api_docs/stack_alerts.mdx | 2 +- api_docs/stack_connectors.mdx | 2 +- api_docs/task_manager.mdx | 2 +- api_docs/telemetry.mdx | 2 +- api_docs/telemetry_collection_manager.mdx | 2 +- api_docs/telemetry_collection_xpack.mdx | 2 +- api_docs/telemetry_management_section.mdx | 2 +- api_docs/threat_intelligence.mdx | 2 +- api_docs/timelines.mdx | 2 +- api_docs/transform.mdx | 2 +- api_docs/triggers_actions_ui.mdx | 2 +- api_docs/ui_actions.mdx | 2 +- api_docs/ui_actions_enhanced.mdx | 2 +- api_docs/unified_field_list.mdx | 2 +- api_docs/unified_search.mdx | 2 +- api_docs/unified_search_autocomplete.mdx | 2 +- api_docs/url_forwarding.mdx | 2 +- api_docs/usage_collection.mdx | 2 +- api_docs/ux.mdx | 2 +- api_docs/vis_default_editor.mdx | 2 +- api_docs/vis_type_gauge.mdx | 2 +- api_docs/vis_type_heatmap.mdx | 2 +- api_docs/vis_type_pie.mdx | 2 +- api_docs/vis_type_table.mdx | 2 +- api_docs/vis_type_timelion.mdx | 2 +- api_docs/vis_type_timeseries.mdx | 2 +- api_docs/vis_type_vega.mdx | 2 +- api_docs/vis_type_vislib.mdx | 2 +- api_docs/vis_type_xy.mdx | 2 +- api_docs/visualizations.mdx | 2 +- 404 files changed, 404 insertions(+), 404 deletions(-) diff --git a/api_docs/actions.mdx b/api_docs/actions.mdx index f91e6ca14c5c6..8c70634191ac9 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: 2022-10-02 +date: 2022-10-03 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 7c38365d9afe8..5f708b7bd5b22 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: 2022-10-02 +date: 2022-10-03 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'advancedSettings'] --- import advancedSettingsObj from './advanced_settings.devdocs.json'; diff --git a/api_docs/aiops.mdx b/api_docs/aiops.mdx index 1adc1287e6f25..affc8c08a679c 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: 2022-10-02 +date: 2022-10-03 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 3da854ba53f11..dba2b5b8a03fa 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: 2022-10-02 +date: 2022-10-03 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 5831360d8a8cb..e327d3d9ef266 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: 2022-10-02 +date: 2022-10-03 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'apm'] --- import apmObj from './apm.devdocs.json'; diff --git a/api_docs/banners.mdx b/api_docs/banners.mdx index a25e8c846c7e9..8465fcc62bbbe 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: 2022-10-02 +date: 2022-10-03 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 06dd79899f4f1..b4d39167b8afc 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: 2022-10-02 +date: 2022-10-03 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 8524768364141..964d7c080f50e 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: 2022-10-02 +date: 2022-10-03 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 aed43e616a03a..1b56bb9f2bb5a 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: 2022-10-02 +date: 2022-10-03 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 166c25203c17a..5971c6140b9d0 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: 2022-10-02 +date: 2022-10-03 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 4cf122ec44f1f..07a722e9fc63c 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: 2022-10-02 +date: 2022-10-03 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'cloud'] --- import cloudObj from './cloud.devdocs.json'; diff --git a/api_docs/cloud_experiments.mdx b/api_docs/cloud_experiments.mdx index afce96b1debd4..8cb19bfe8beb9 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: 2022-10-02 +date: 2022-10-03 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 6da76742d8c28..6c31131981413 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: 2022-10-02 +date: 2022-10-03 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 c5b317f06f243..69717a2855de0 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: 2022-10-02 +date: 2022-10-03 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'console'] --- import consoleObj from './console.devdocs.json'; diff --git a/api_docs/controls.mdx b/api_docs/controls.mdx index 7af97619b1a37..d120725ebf6c3 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: 2022-10-02 +date: 2022-10-03 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'controls'] --- import controlsObj from './controls.devdocs.json'; diff --git a/api_docs/core.mdx b/api_docs/core.mdx index 5f59293c8f37b..2ce73b73214aa 100644 --- a/api_docs/core.mdx +++ b/api_docs/core.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/core title: "core" image: https://source.unsplash.com/400x175/?github description: API docs for the core plugin -date: 2022-10-02 +date: 2022-10-03 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'core'] --- import coreObj from './core.devdocs.json'; diff --git a/api_docs/custom_integrations.mdx b/api_docs/custom_integrations.mdx index 6778fc3543db5..c9bd9c16e7214 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: 2022-10-02 +date: 2022-10-03 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 711da58211c55..7fa93934def07 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: 2022-10-02 +date: 2022-10-03 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 a4aac32db1705..4f0b134f643ca 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: 2022-10-02 +date: 2022-10-03 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 74a573292d797..3cda1cdf63de6 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: 2022-10-02 +date: 2022-10-03 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'data'] --- import dataObj from './data.devdocs.json'; diff --git a/api_docs/data_query.mdx b/api_docs/data_query.mdx index 52ec376fb7cb8..09c0ef0d696bf 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: 2022-10-02 +date: 2022-10-03 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 c0cda63f61621..c3b582462fd7d 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: 2022-10-02 +date: 2022-10-03 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 3a448dea572e4..34855c7100cec 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: 2022-10-02 +date: 2022-10-03 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 c4933b68c9368..5daa20fdddfef 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: 2022-10-02 +date: 2022-10-03 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 35b2849b1521e..fa43c84f3166a 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: 2022-10-02 +date: 2022-10-03 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'dataViewManagement'] --- import dataViewManagementObj from './data_view_management.devdocs.json'; diff --git a/api_docs/data_views.mdx b/api_docs/data_views.mdx index 8b66e010c36d3..817619ccf49c9 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: 2022-10-02 +date: 2022-10-03 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 17ed535ee87c4..6df0430d04c27 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: 2022-10-02 +date: 2022-10-03 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'dataVisualizer'] --- import dataVisualizerObj from './data_visualizer.devdocs.json'; diff --git a/api_docs/deprecations_by_api.mdx b/api_docs/deprecations_by_api.mdx index f4b1fa55c1ed8..3c34e78a89e7f 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: 2022-10-02 +date: 2022-10-03 tags: ['contributor', 'dev', 'apidocs', 'kibana'] --- diff --git a/api_docs/deprecations_by_plugin.mdx b/api_docs/deprecations_by_plugin.mdx index 0c5bbd60e517f..abe2810379ec2 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: 2022-10-02 +date: 2022-10-03 tags: ['contributor', 'dev', 'apidocs', 'kibana'] --- diff --git a/api_docs/deprecations_by_team.mdx b/api_docs/deprecations_by_team.mdx index 60d74fa28721a..882abd4cb6150 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: 2022-10-02 +date: 2022-10-03 tags: ['contributor', 'dev', 'apidocs', 'kibana'] --- diff --git a/api_docs/dev_tools.mdx b/api_docs/dev_tools.mdx index 06dfec816d605..76be86527aaed 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: 2022-10-02 +date: 2022-10-03 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 e703c38627cbc..9c9793bd2bcfb 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: 2022-10-02 +date: 2022-10-03 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 591663448e856..bc90ebb67c09b 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: 2022-10-02 +date: 2022-10-03 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'discoverEnhanced'] --- import discoverEnhancedObj from './discover_enhanced.devdocs.json'; diff --git a/api_docs/embeddable.mdx b/api_docs/embeddable.mdx index 9782e32b7985f..4c4b222a02a7c 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: 2022-10-02 +date: 2022-10-03 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 84dd77d22a239..5ab0874911417 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: 2022-10-02 +date: 2022-10-03 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 ffd479100976d..5aa1eae40de53 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: 2022-10-02 +date: 2022-10-03 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 6d8e9e20d6993..ba021086e294a 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: 2022-10-02 +date: 2022-10-03 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'enterpriseSearch'] --- import enterpriseSearchObj from './enterprise_search.devdocs.json'; diff --git a/api_docs/es_ui_shared.mdx b/api_docs/es_ui_shared.mdx index 661382fdf519e..bf991156be210 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: 2022-10-02 +date: 2022-10-03 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'esUiShared'] --- import esUiSharedObj from './es_ui_shared.devdocs.json'; diff --git a/api_docs/event_annotation.mdx b/api_docs/event_annotation.mdx index d752e0f31cc9d..2c09bd5d65d46 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: 2022-10-02 +date: 2022-10-03 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'eventAnnotation'] --- import eventAnnotationObj from './event_annotation.devdocs.json'; diff --git a/api_docs/event_log.mdx b/api_docs/event_log.mdx index cfa039d75aa8c..482e1d361a157 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: 2022-10-02 +date: 2022-10-03 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'eventLog'] --- import eventLogObj from './event_log.devdocs.json'; diff --git a/api_docs/expression_error.mdx b/api_docs/expression_error.mdx index 1ea659904646d..2ab9af9772d04 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: 2022-10-02 +date: 2022-10-03 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 2e6be367a1d99..908d90469c751 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: 2022-10-02 +date: 2022-10-03 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 f4086885e5073..aa2ac31f046ec 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: 2022-10-02 +date: 2022-10-03 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 b0d7b0b0e664b..fd4412ad3f9e9 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: 2022-10-02 +date: 2022-10-03 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 f58979b777a3c..4f1bd9723f36a 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: 2022-10-02 +date: 2022-10-03 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 1b1035d10c9ea..d17081eed3cbf 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: 2022-10-02 +date: 2022-10-03 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 8c3a8f9b39334..daa61ecf37e7b 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: 2022-10-02 +date: 2022-10-03 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 646de5a025171..aaf66fd40fa4e 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: 2022-10-02 +date: 2022-10-03 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 4913f9da7c397..8e5467dc9cff3 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: 2022-10-02 +date: 2022-10-03 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 906b0f9a865c8..a2a032c0c0bde 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: 2022-10-02 +date: 2022-10-03 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 32e6eca8a079c..e650bf57eac7f 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: 2022-10-02 +date: 2022-10-03 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 7eb9651829275..cf00311b239a8 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: 2022-10-02 +date: 2022-10-03 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 c727f32752b6f..0eed4b0b713d0 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: 2022-10-02 +date: 2022-10-03 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 63b7d486fa201..353dfa02a7830 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: 2022-10-02 +date: 2022-10-03 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 14e361da22469..8b7f40f4a359b 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: 2022-10-02 +date: 2022-10-03 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 4c8ac407c2a2d..040d820604007 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: 2022-10-02 +date: 2022-10-03 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'fieldFormats'] --- import fieldFormatsObj from './field_formats.devdocs.json'; diff --git a/api_docs/file_upload.mdx b/api_docs/file_upload.mdx index a5923aea7ee0c..768f6188371fc 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: 2022-10-02 +date: 2022-10-03 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 d40d7e303d6b2..8491d90df2446 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: 2022-10-02 +date: 2022-10-03 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'files'] --- import filesObj from './files.devdocs.json'; diff --git a/api_docs/fleet.mdx b/api_docs/fleet.mdx index bafd3ddd8518e..b63495e177924 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: 2022-10-02 +date: 2022-10-03 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 42378d31281f1..97d12a56906f0 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: 2022-10-02 +date: 2022-10-03 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 d183f51fa1495..899b3205a819c 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: 2022-10-02 +date: 2022-10-03 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 388cdf51fff4d..30beb41d12fae 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: 2022-10-02 +date: 2022-10-03 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'home'] --- import homeObj from './home.devdocs.json'; diff --git a/api_docs/index_lifecycle_management.mdx b/api_docs/index_lifecycle_management.mdx index 36f4a84d6d37b..e3ee1798496d0 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: 2022-10-02 +date: 2022-10-03 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 f142e52067907..34f9d8fcde852 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: 2022-10-02 +date: 2022-10-03 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'indexManagement'] --- import indexManagementObj from './index_management.devdocs.json'; diff --git a/api_docs/infra.mdx b/api_docs/infra.mdx index ba44a8375901b..7ab9b9d8573c5 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: 2022-10-02 +date: 2022-10-03 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'infra'] --- import infraObj from './infra.devdocs.json'; diff --git a/api_docs/inspector.mdx b/api_docs/inspector.mdx index cebd40add5413..4cb29a4632cab 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: 2022-10-02 +date: 2022-10-03 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'inspector'] --- import inspectorObj from './inspector.devdocs.json'; diff --git a/api_docs/interactive_setup.mdx b/api_docs/interactive_setup.mdx index bcfc55b7a3106..6f257bb854320 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: 2022-10-02 +date: 2022-10-03 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'interactiveSetup'] --- import interactiveSetupObj from './interactive_setup.devdocs.json'; diff --git a/api_docs/kbn_ace.mdx b/api_docs/kbn_ace.mdx index de04343d39dd8..0dcf9a1b797bc 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: 2022-10-02 +date: 2022-10-03 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/ace'] --- import kbnAceObj from './kbn_ace.devdocs.json'; diff --git a/api_docs/kbn_aiops_components.mdx b/api_docs/kbn_aiops_components.mdx index 640d8bc0daddc..60ab8f506c3a5 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: 2022-10-02 +date: 2022-10-03 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/aiops-components'] --- import kbnAiopsComponentsObj from './kbn_aiops_components.devdocs.json'; diff --git a/api_docs/kbn_aiops_utils.mdx b/api_docs/kbn_aiops_utils.mdx index 37748e5923d7e..c459ac8369da3 100644 --- a/api_docs/kbn_aiops_utils.mdx +++ b/api_docs/kbn_aiops_utils.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-aiops-utils title: "@kbn/aiops-utils" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/aiops-utils plugin -date: 2022-10-02 +date: 2022-10-03 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/aiops-utils'] --- import kbnAiopsUtilsObj from './kbn_aiops_utils.devdocs.json'; diff --git a/api_docs/kbn_alerts.mdx b/api_docs/kbn_alerts.mdx index 4f93c597b2e4a..aaf236aab90f0 100644 --- a/api_docs/kbn_alerts.mdx +++ b/api_docs/kbn_alerts.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-alerts title: "@kbn/alerts" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/alerts plugin -date: 2022-10-02 +date: 2022-10-03 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/alerts'] --- import kbnAlertsObj from './kbn_alerts.devdocs.json'; diff --git a/api_docs/kbn_analytics.mdx b/api_docs/kbn_analytics.mdx index 653e93710bb2c..35df4e16f17cd 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: 2022-10-02 +date: 2022-10-03 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/analytics'] --- import kbnAnalyticsObj from './kbn_analytics.devdocs.json'; diff --git a/api_docs/kbn_analytics_client.mdx b/api_docs/kbn_analytics_client.mdx index ab8ade876b3b3..0d18980e0b1c0 100644 --- a/api_docs/kbn_analytics_client.mdx +++ b/api_docs/kbn_analytics_client.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-analytics-client title: "@kbn/analytics-client" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/analytics-client plugin -date: 2022-10-02 +date: 2022-10-03 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/analytics-client'] --- import kbnAnalyticsClientObj from './kbn_analytics_client.devdocs.json'; diff --git a/api_docs/kbn_analytics_shippers_elastic_v3_browser.mdx b/api_docs/kbn_analytics_shippers_elastic_v3_browser.mdx index 94415cdc496c6..c4b9427b1a333 100644 --- a/api_docs/kbn_analytics_shippers_elastic_v3_browser.mdx +++ b/api_docs/kbn_analytics_shippers_elastic_v3_browser.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-analytics-shippers-elastic-v3-browser title: "@kbn/analytics-shippers-elastic-v3-browser" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/analytics-shippers-elastic-v3-browser plugin -date: 2022-10-02 +date: 2022-10-03 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/analytics-shippers-elastic-v3-browser'] --- import kbnAnalyticsShippersElasticV3BrowserObj from './kbn_analytics_shippers_elastic_v3_browser.devdocs.json'; diff --git a/api_docs/kbn_analytics_shippers_elastic_v3_common.mdx b/api_docs/kbn_analytics_shippers_elastic_v3_common.mdx index bc6057bd65960..f06cb724cc729 100644 --- a/api_docs/kbn_analytics_shippers_elastic_v3_common.mdx +++ b/api_docs/kbn_analytics_shippers_elastic_v3_common.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-analytics-shippers-elastic-v3-common title: "@kbn/analytics-shippers-elastic-v3-common" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/analytics-shippers-elastic-v3-common plugin -date: 2022-10-02 +date: 2022-10-03 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/analytics-shippers-elastic-v3-common'] --- import kbnAnalyticsShippersElasticV3CommonObj from './kbn_analytics_shippers_elastic_v3_common.devdocs.json'; diff --git a/api_docs/kbn_analytics_shippers_elastic_v3_server.mdx b/api_docs/kbn_analytics_shippers_elastic_v3_server.mdx index 953ad7736eaa5..cd5176593f6ad 100644 --- a/api_docs/kbn_analytics_shippers_elastic_v3_server.mdx +++ b/api_docs/kbn_analytics_shippers_elastic_v3_server.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-analytics-shippers-elastic-v3-server title: "@kbn/analytics-shippers-elastic-v3-server" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/analytics-shippers-elastic-v3-server plugin -date: 2022-10-02 +date: 2022-10-03 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/analytics-shippers-elastic-v3-server'] --- import kbnAnalyticsShippersElasticV3ServerObj from './kbn_analytics_shippers_elastic_v3_server.devdocs.json'; diff --git a/api_docs/kbn_analytics_shippers_fullstory.mdx b/api_docs/kbn_analytics_shippers_fullstory.mdx index 68b4f9a89cc35..d6317c64bf48c 100644 --- a/api_docs/kbn_analytics_shippers_fullstory.mdx +++ b/api_docs/kbn_analytics_shippers_fullstory.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-analytics-shippers-fullstory title: "@kbn/analytics-shippers-fullstory" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/analytics-shippers-fullstory plugin -date: 2022-10-02 +date: 2022-10-03 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/analytics-shippers-fullstory'] --- import kbnAnalyticsShippersFullstoryObj from './kbn_analytics_shippers_fullstory.devdocs.json'; diff --git a/api_docs/kbn_apm_config_loader.mdx b/api_docs/kbn_apm_config_loader.mdx index 633a769efa1ad..e916c19f16197 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: 2022-10-02 +date: 2022-10-03 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/apm-config-loader'] --- import kbnApmConfigLoaderObj from './kbn_apm_config_loader.devdocs.json'; diff --git a/api_docs/kbn_apm_synthtrace.mdx b/api_docs/kbn_apm_synthtrace.mdx index 99ce7b8a19bba..9ba0d5aeeacf4 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: 2022-10-02 +date: 2022-10-03 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/apm-synthtrace'] --- import kbnApmSynthtraceObj from './kbn_apm_synthtrace.devdocs.json'; diff --git a/api_docs/kbn_apm_utils.mdx b/api_docs/kbn_apm_utils.mdx index 962b5aa586a18..ca208a21625bd 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: 2022-10-02 +date: 2022-10-03 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/apm-utils'] --- import kbnApmUtilsObj from './kbn_apm_utils.devdocs.json'; diff --git a/api_docs/kbn_axe_config.mdx b/api_docs/kbn_axe_config.mdx index 50f8cd64aee1b..7a1ad1863e07b 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: 2022-10-02 +date: 2022-10-03 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/axe-config'] --- import kbnAxeConfigObj from './kbn_axe_config.devdocs.json'; diff --git a/api_docs/kbn_chart_icons.mdx b/api_docs/kbn_chart_icons.mdx index 476bfef859d00..6e102733b051b 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: 2022-10-02 +date: 2022-10-03 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 549084cde27d5..cfd53f8e091ff 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: 2022-10-02 +date: 2022-10-03 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 2256eb2966edb..c28b07464ba41 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: 2022-10-02 +date: 2022-10-03 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 ad42b9ac3ee42..d5c55b31b68c0 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: 2022-10-02 +date: 2022-10-03 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 22a6845fb05d9..c2de5353062a3 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: 2022-10-02 +date: 2022-10-03 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/cli-dev-mode'] --- import kbnCliDevModeObj from './kbn_cli_dev_mode.devdocs.json'; diff --git a/api_docs/kbn_coloring.mdx b/api_docs/kbn_coloring.mdx index 2d54eb64e6033..c5026a994bbff 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: 2022-10-02 +date: 2022-10-03 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 a52202f78637b..a81d5f720c20a 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: 2022-10-02 +date: 2022-10-03 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/config'] --- import kbnConfigObj from './kbn_config.devdocs.json'; diff --git a/api_docs/kbn_config_mocks.mdx b/api_docs/kbn_config_mocks.mdx index 192f0654b7d5f..3ca7cf87f8819 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: 2022-10-02 +date: 2022-10-03 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 5633664daf6d5..f4fd135eead55 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: 2022-10-02 +date: 2022-10-03 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/config-schema'] --- import kbnConfigSchemaObj from './kbn_config_schema.devdocs.json'; diff --git a/api_docs/kbn_content_management_table_list.mdx b/api_docs/kbn_content_management_table_list.mdx index bbf2c310a588d..2cb822b645378 100644 --- a/api_docs/kbn_content_management_table_list.mdx +++ b/api_docs/kbn_content_management_table_list.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-content-management-table-list title: "@kbn/content-management-table-list" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/content-management-table-list plugin -date: 2022-10-02 +date: 2022-10-03 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/content-management-table-list'] --- import kbnContentManagementTableListObj from './kbn_content_management_table_list.devdocs.json'; diff --git a/api_docs/kbn_core_analytics_browser.mdx b/api_docs/kbn_core_analytics_browser.mdx index e090ff0a26740..2cf8df7f6fb13 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: 2022-10-02 +date: 2022-10-03 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 fe43394f77fb7..217056d756e6c 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: 2022-10-02 +date: 2022-10-03 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 e9c9b866f0fe7..8674be0b88a22 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: 2022-10-02 +date: 2022-10-03 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-analytics-browser-mocks'] --- import kbnCoreAnalyticsBrowserMocksObj from './kbn_core_analytics_browser_mocks.devdocs.json'; diff --git a/api_docs/kbn_core_analytics_server.mdx b/api_docs/kbn_core_analytics_server.mdx index a86d4bce56287..a3e9193110cf9 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: 2022-10-02 +date: 2022-10-03 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 9b2fe9f9f192c..87edbd5da1573 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: 2022-10-02 +date: 2022-10-03 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 c2dc15b657d76..eba99f7740982 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: 2022-10-02 +date: 2022-10-03 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 e935da7289301..6cd2f00a3f32a 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: 2022-10-02 +date: 2022-10-03 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 2a05ae0c01c52..0e0674185951d 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: 2022-10-02 +date: 2022-10-03 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 2e74725d2f3d3..f58bebcf2f5d0 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: 2022-10-02 +date: 2022-10-03 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 4a541f590e2f5..3d4d7035f6c1d 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: 2022-10-02 +date: 2022-10-03 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 3463e8e9384e2..7681b7a4a3885 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: 2022-10-02 +date: 2022-10-03 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 834faf66c67a2..02a409c5881de 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: 2022-10-02 +date: 2022-10-03 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_base_browser_mocks.mdx b/api_docs/kbn_core_base_browser_mocks.mdx index f22445d1e10ed..b60d8471e15dd 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: 2022-10-02 +date: 2022-10-03 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 fe429f0f502ae..39463461d9165 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: 2022-10-02 +date: 2022-10-03 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 9d162ecc81bb8..2a64da20012e8 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: 2022-10-02 +date: 2022-10-03 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 be46292c9bc9e..b2056befb2acb 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: 2022-10-02 +date: 2022-10-03 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 aa7f5b3d5df79..6d28c54984174 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: 2022-10-02 +date: 2022-10-03 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 1380bd04beea9..c7628a5a59c63 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: 2022-10-02 +date: 2022-10-03 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 00087d6131cc8..e01e96164ef47 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: 2022-10-02 +date: 2022-10-03 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 e4e5a9223ba0b..9ef6e61852ed2 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: 2022-10-02 +date: 2022-10-03 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 251b2d507b168..57e8483cb0f74 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: 2022-10-02 +date: 2022-10-03 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 10c16f282a6f9..c4fabecffea39 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: 2022-10-02 +date: 2022-10-03 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 8d29eb118d55c..1d7858167c974 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: 2022-10-02 +date: 2022-10-03 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_deprecations_browser.mdx b/api_docs/kbn_core_deprecations_browser.mdx index 0d64e581664eb..3914aa766a64d 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: 2022-10-02 +date: 2022-10-03 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 6d31a54a56052..fca144e245a76 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: 2022-10-02 +date: 2022-10-03 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 9c7aa10193724..5be603ffa1f96 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: 2022-10-02 +date: 2022-10-03 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 bc77cf44b3bd3..afde35a745d30 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: 2022-10-02 +date: 2022-10-03 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 a976ebcc9a0e8..92ba606e6044c 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: 2022-10-02 +date: 2022-10-03 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 a3af9d6298c58..9b3c1070f6623 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: 2022-10-02 +date: 2022-10-03 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 42feea3f29fba..e871d2dc0a941 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: 2022-10-02 +date: 2022-10-03 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 1d24379f441f6..d591288b81315 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: 2022-10-02 +date: 2022-10-03 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 48c6d6862f4dd..7cd809b6b97e1 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: 2022-10-02 +date: 2022-10-03 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 8195d4f623893..273051738c41f 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: 2022-10-02 +date: 2022-10-03 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 85fa2c4715748..0cddffa5aeab6 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: 2022-10-02 +date: 2022-10-03 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 feabe3a92d7f7..88eb042d98206 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: 2022-10-02 +date: 2022-10-03 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 7b9875f589c6b..bbf4d1f0a58e8 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: 2022-10-02 +date: 2022-10-03 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 1e0c6217b952f..c9f8fdbd9b45d 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: 2022-10-02 +date: 2022-10-03 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 7bc107af9a805..f4032d04f97ca 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: 2022-10-02 +date: 2022-10-03 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 95497dfe20dc5..835c21903b6bf 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: 2022-10-02 +date: 2022-10-03 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 5f7c6dc637c89..47f64412fe99e 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: 2022-10-02 +date: 2022-10-03 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 bbda34217fa74..082f5dd46eced 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: 2022-10-02 +date: 2022-10-03 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 fad63abe19936..492f874f833eb 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: 2022-10-02 +date: 2022-10-03 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 006d8b447663b..f8426b783c45a 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: 2022-10-02 +date: 2022-10-03 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 96e88c7e5c2a2..6efeffd1c91c3 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: 2022-10-02 +date: 2022-10-03 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 7e3559438efa3..ed8e5ae438b3d 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: 2022-10-02 +date: 2022-10-03 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 e6ab7c3d89159..6441c8e326395 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: 2022-10-02 +date: 2022-10-03 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 17fee1daced5d..4f0d3211fa39d 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: 2022-10-02 +date: 2022-10-03 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 ed465631b22b5..02fa99d7cb6ce 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: 2022-10-02 +date: 2022-10-03 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 89eb21cdb4d55..40263469ee782 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: 2022-10-02 +date: 2022-10-03 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 3e1fbaec76d31..a6af55aa79cbe 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: 2022-10-02 +date: 2022-10-03 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 13817b60a15a0..a1c258a426f33 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: 2022-10-02 +date: 2022-10-03 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 3380e7e1a2b4c..a937dccab7fb8 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: 2022-10-02 +date: 2022-10-03 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 4020a1edd3ae5..a6274dd34b37d 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: 2022-10-02 +date: 2022-10-03 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 a48229db2238e..6293ae9b58af2 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: 2022-10-02 +date: 2022-10-03 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 6c86cd7218b8a..f11227d039fcf 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: 2022-10-02 +date: 2022-10-03 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 a41bd0793732d..d0ea0e82f7682 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: 2022-10-02 +date: 2022-10-03 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_router_server_internal.mdx b/api_docs/kbn_core_http_router_server_internal.mdx index 98354a9107f34..7654b3f70cc87 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: 2022-10-02 +date: 2022-10-03 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 99ac50e292b6b..8a2d3a3de3333 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: 2022-10-02 +date: 2022-10-03 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.mdx b/api_docs/kbn_core_http_server.mdx index fd022dfb3eea2..62b834449c23f 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: 2022-10-02 +date: 2022-10-03 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 f058d1e28dec7..bbda88d5c238c 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: 2022-10-02 +date: 2022-10-03 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 1b6cf98922c1b..e99fba0127cc2 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: 2022-10-02 +date: 2022-10-03 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 bc10c115fb754..c6da1dc82bc90 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: 2022-10-02 +date: 2022-10-03 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 02d199810fef1..140e346128004 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: 2022-10-02 +date: 2022-10-03 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 b391482c1e673..ddd02e61d7ee4 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: 2022-10-02 +date: 2022-10-03 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 8bdf305b19645..56636905f7afa 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: 2022-10-02 +date: 2022-10-03 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 949a0fde56bc7..f8ed8c6f0bec6 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: 2022-10-02 +date: 2022-10-03 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.mdx b/api_docs/kbn_core_injected_metadata_browser.mdx index f93ad919d9fe8..9a02125114dc7 100644 --- a/api_docs/kbn_core_injected_metadata_browser.mdx +++ b/api_docs/kbn_core_injected_metadata_browser.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-injected-metadata-browser title: "@kbn/core-injected-metadata-browser" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-injected-metadata-browser plugin -date: 2022-10-02 +date: 2022-10-03 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-injected-metadata-browser'] --- import kbnCoreInjectedMetadataBrowserObj from './kbn_core_injected_metadata_browser.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 6389c0fa21a8c..d6a078aef0df0 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: 2022-10-02 +date: 2022-10-03 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 f1c6bacc8a191..38c283eaaf97e 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: 2022-10-02 +date: 2022-10-03 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 91fca25dd4974..5cc58ad5a914c 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: 2022-10-02 +date: 2022-10-03 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 8aee8a80734c6..1ab8822af2252 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: 2022-10-02 +date: 2022-10-03 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 d76de30044e47..99d9d3f32d3e8 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: 2022-10-02 +date: 2022-10-03 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_logging_server.mdx b/api_docs/kbn_core_logging_server.mdx index 575ad511b8fdc..5065fff3211ff 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: 2022-10-02 +date: 2022-10-03 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 02793dca49021..2e6959cc87594 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: 2022-10-02 +date: 2022-10-03 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 259d3fd65a265..81a53652b4ea2 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: 2022-10-02 +date: 2022-10-03 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 81710e21c33ff..3d5b6fffdd513 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: 2022-10-02 +date: 2022-10-03 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 e3e171db8439c..14756f136bd3a 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: 2022-10-02 +date: 2022-10-03 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 bacd5044596db..087dd2dd357ca 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: 2022-10-02 +date: 2022-10-03 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 eadb43389a164..5f5ea85f80056 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: 2022-10-02 +date: 2022-10-03 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 baaf23f8822d5..6216a6d589ce5 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: 2022-10-02 +date: 2022-10-03 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 0b68bd525a649..82c2c06e08457 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: 2022-10-02 +date: 2022-10-03 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 08f7016062533..b4eeaf823c522 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: 2022-10-02 +date: 2022-10-03 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 5b065122b113b..04c3664f49b67 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: 2022-10-02 +date: 2022-10-03 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 e540991a1252e..edcf4af2b62ad 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: 2022-10-02 +date: 2022-10-03 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 8bea394dae010..d120b6ccece74 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: 2022-10-02 +date: 2022-10-03 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 ad8e17b446e9e..e4152c45f1f60 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: 2022-10-02 +date: 2022-10-03 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 514474ea2ef25..a571fb85c2ef4 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: 2022-10-02 +date: 2022-10-03 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 bae3dbcf63251..8f4457512da88 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: 2022-10-02 +date: 2022-10-03 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 0544899499223..6e25c69de32ee 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: 2022-10-02 +date: 2022-10-03 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 9b739d1209d1b..ce41f3aac1f43 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: 2022-10-02 +date: 2022-10-03 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 5b9a435bacaff..0b413f962b275 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: 2022-10-02 +date: 2022-10-03 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 b9fa84b19f8cc..b31af30c16030 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: 2022-10-02 +date: 2022-10-03 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_preboot_server.mdx b/api_docs/kbn_core_preboot_server.mdx index 0906ee4ed8381..ec6b64842af42 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: 2022-10-02 +date: 2022-10-03 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 6b97c1f880675..583b5bc973add 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: 2022-10-02 +date: 2022-10-03 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 520e18ebb3e77..383e9c6511efa 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: 2022-10-02 +date: 2022-10-03 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_saved_objects_api_browser.mdx b/api_docs/kbn_core_saved_objects_api_browser.mdx index 020fabbec183c..e07f5797c7f72 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: 2022-10-02 +date: 2022-10-03 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 6da27ef121439..8a3662b8b470c 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: 2022-10-02 +date: 2022-10-03 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_internal.mdx b/api_docs/kbn_core_saved_objects_api_server_internal.mdx index df6fc60584f43..7244cfe8beb60 100644 --- a/api_docs/kbn_core_saved_objects_api_server_internal.mdx +++ b/api_docs/kbn_core_saved_objects_api_server_internal.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-saved-objects-api-server-internal title: "@kbn/core-saved-objects-api-server-internal" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-saved-objects-api-server-internal plugin -date: 2022-10-02 +date: 2022-10-03 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-saved-objects-api-server-internal'] --- import kbnCoreSavedObjectsApiServerInternalObj from './kbn_core_saved_objects_api_server_internal.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 81a29c9d9a727..9a62ec00bb37c 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: 2022-10-02 +date: 2022-10-03 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 b2eb85135b8d3..4068fcf5e73b5 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: 2022-10-02 +date: 2022-10-03 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 d6eb21156cef7..7af80f7527944 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: 2022-10-02 +date: 2022-10-03 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 c0db5893ecdcd..83b6f08887286 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: 2022-10-02 +date: 2022-10-03 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 6b1df9e60f5a6..3d8e3d03be29b 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: 2022-10-02 +date: 2022-10-03 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 3767a975778f6..ad03d6488f2a0 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: 2022-10-02 +date: 2022-10-03 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 46e635afccffe..b06d26ed9bea4 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: 2022-10-02 +date: 2022-10-03 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 d9dcf279b04e4..6532dfcaeaf81 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: 2022-10-02 +date: 2022-10-03 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 b273522ddd598..53092b90fc151 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: 2022-10-02 +date: 2022-10-03 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 4a63a5bd89ef0..3d1544f4f110f 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: 2022-10-02 +date: 2022-10-03 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 c02fc259a89b2..c662be1f8fb09 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: 2022-10-02 +date: 2022-10-03 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 78b702fb4478d..8a27161ad18de 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: 2022-10-02 +date: 2022-10-03 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 90c8b849e0ba0..c73c73d974180 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: 2022-10-02 +date: 2022-10-03 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 f349189ab730f..e8fe3856fa57f 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: 2022-10-02 +date: 2022-10-03 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 8c5aeb1e8262b..5eb6ed5fabf23 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: 2022-10-02 +date: 2022-10-03 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-saved-objects-utils-server'] --- import kbnCoreSavedObjectsUtilsServerObj from './kbn_core_saved_objects_utils_server.devdocs.json'; diff --git a/api_docs/kbn_core_status_common.mdx b/api_docs/kbn_core_status_common.mdx index d9566708b3aeb..3f9ec5be08ad2 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: 2022-10-02 +date: 2022-10-03 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 a55470733390a..fd7956ee7ab43 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: 2022-10-02 +date: 2022-10-03 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 439d255043861..71ceb6a7bede4 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: 2022-10-02 +date: 2022-10-03 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 96f568f178a40..3916cb3c3119c 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: 2022-10-02 +date: 2022-10-03 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 85b8475863cf3..966876de9b0c2 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: 2022-10-02 +date: 2022-10-03 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 957576c2e148f..f3ad0c01cc377 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: 2022-10-02 +date: 2022-10-03 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 aeaf0b8ee1105..995497dffa505 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: 2022-10-02 +date: 2022-10-03 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_theme_browser.mdx b/api_docs/kbn_core_theme_browser.mdx index 45aa25f3d172d..2db8ecd68b0dc 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: 2022-10-02 +date: 2022-10-03 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_internal.mdx b/api_docs/kbn_core_theme_browser_internal.mdx index 4b3a42ce6cc77..38778f82b4a73 100644 --- a/api_docs/kbn_core_theme_browser_internal.mdx +++ b/api_docs/kbn_core_theme_browser_internal.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-theme-browser-internal title: "@kbn/core-theme-browser-internal" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-theme-browser-internal plugin -date: 2022-10-02 +date: 2022-10-03 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-theme-browser-internal'] --- import kbnCoreThemeBrowserInternalObj from './kbn_core_theme_browser_internal.devdocs.json'; diff --git a/api_docs/kbn_core_theme_browser_mocks.mdx b/api_docs/kbn_core_theme_browser_mocks.mdx index 92f080e0f5285..d561c846ba528 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: 2022-10-02 +date: 2022-10-03 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 4a1529581735e..f4b08646423d6 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: 2022-10-02 +date: 2022-10-03 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 6fb6935573a7b..607eaa47b682d 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: 2022-10-02 +date: 2022-10-03 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 31697c023ddaa..15ecdc9fee508 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: 2022-10-02 +date: 2022-10-03 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 574d0ec8e7b47..6644389a6513b 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: 2022-10-02 +date: 2022-10-03 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 0997bcdc22115..d486425f2067d 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: 2022-10-02 +date: 2022-10-03 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 7b4df9498b908..98b9aa8e6584a 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: 2022-10-02 +date: 2022-10-03 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 d222af41c3fd9..c287c7d3717f4 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: 2022-10-02 +date: 2022-10-03 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 976fc475761a2..8d5b6922438e8 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: 2022-10-02 +date: 2022-10-03 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 9bd4dab752efb..e433b18463057 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: 2022-10-02 +date: 2022-10-03 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 8dd7253ab6ab8..ad3dac588eb63 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: 2022-10-02 +date: 2022-10-03 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_crypto.mdx b/api_docs/kbn_crypto.mdx index a8049f93e0422..0e41431342876 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: 2022-10-02 +date: 2022-10-03 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 d5209c039a16a..7f67262cf91c9 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: 2022-10-02 +date: 2022-10-03 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/crypto-browser'] --- import kbnCryptoBrowserObj from './kbn_crypto_browser.devdocs.json'; diff --git a/api_docs/kbn_datemath.mdx b/api_docs/kbn_datemath.mdx index 76052024f029d..86cc145ec159a 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: 2022-10-02 +date: 2022-10-03 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/datemath'] --- import kbnDatemathObj from './kbn_datemath.devdocs.json'; diff --git a/api_docs/kbn_dev_cli_errors.mdx b/api_docs/kbn_dev_cli_errors.mdx index 39e11f8614d83..e46730cf719c3 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: 2022-10-02 +date: 2022-10-03 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 95871faf86786..54d0f8713d0fb 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: 2022-10-02 +date: 2022-10-03 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 198147e7c8229..b646fc86f43f5 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: 2022-10-02 +date: 2022-10-03 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 b9922d230eb74..83091d9879dc4 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: 2022-10-02 +date: 2022-10-03 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/dev-utils'] --- import kbnDevUtilsObj from './kbn_dev_utils.devdocs.json'; diff --git a/api_docs/kbn_doc_links.mdx b/api_docs/kbn_doc_links.mdx index 3fe12c91c32a4..8913a1a03ab85 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: 2022-10-02 +date: 2022-10-03 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 3545dbecd6961..a5d4079c284b0 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: 2022-10-02 +date: 2022-10-03 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/docs-utils'] --- import kbnDocsUtilsObj from './kbn_docs_utils.devdocs.json'; diff --git a/api_docs/kbn_ebt_tools.mdx b/api_docs/kbn_ebt_tools.mdx index b4270c9011bbe..8370c22a01f19 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: 2022-10-02 +date: 2022-10-03 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/ebt-tools'] --- import kbnEbtToolsObj from './kbn_ebt_tools.devdocs.json'; diff --git a/api_docs/kbn_es_archiver.mdx b/api_docs/kbn_es_archiver.mdx index ca423dde44514..4ad77bfff6559 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: 2022-10-02 +date: 2022-10-03 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 f422e71b9a8b6..bf9c27ac92b27 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: 2022-10-02 +date: 2022-10-03 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 a0bf853e54fda..632303fa82c97 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: 2022-10-02 +date: 2022-10-03 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 42124a156bffe..6a6ac63f69acd 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: 2022-10-02 +date: 2022-10-03 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 883203cc6f10a..e0525000b5f9f 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: 2022-10-02 +date: 2022-10-03 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/eslint-plugin-imports'] --- import kbnEslintPluginImportsObj from './kbn_eslint_plugin_imports.devdocs.json'; diff --git a/api_docs/kbn_field_types.mdx b/api_docs/kbn_field_types.mdx index 8791798c64654..f9ad3846f19fa 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: 2022-10-02 +date: 2022-10-03 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/field-types'] --- import kbnFieldTypesObj from './kbn_field_types.devdocs.json'; diff --git a/api_docs/kbn_find_used_node_modules.mdx b/api_docs/kbn_find_used_node_modules.mdx index ae1139f5d3604..9bc0b92168240 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: 2022-10-02 +date: 2022-10-03 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/find-used-node-modules'] --- import kbnFindUsedNodeModulesObj from './kbn_find_used_node_modules.devdocs.json'; diff --git a/api_docs/kbn_ftr_common_functional_services.mdx b/api_docs/kbn_ftr_common_functional_services.mdx index 1c2551073eb20..359334478d03d 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: 2022-10-02 +date: 2022-10-03 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_generate.mdx b/api_docs/kbn_generate.mdx index 9e670335e3a9e..151e0da4dd3b1 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: 2022-10-02 +date: 2022-10-03 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/generate'] --- import kbnGenerateObj from './kbn_generate.devdocs.json'; diff --git a/api_docs/kbn_get_repo_files.mdx b/api_docs/kbn_get_repo_files.mdx index 816ea84cc9691..161354bbbcb14 100644 --- a/api_docs/kbn_get_repo_files.mdx +++ b/api_docs/kbn_get_repo_files.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-get-repo-files title: "@kbn/get-repo-files" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/get-repo-files plugin -date: 2022-10-02 +date: 2022-10-03 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/get-repo-files'] --- import kbnGetRepoFilesObj from './kbn_get_repo_files.devdocs.json'; diff --git a/api_docs/kbn_handlebars.mdx b/api_docs/kbn_handlebars.mdx index 88db861974d6f..1e054c0706c6f 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: 2022-10-02 +date: 2022-10-03 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 be13032975df7..0852dda61f29a 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: 2022-10-02 +date: 2022-10-03 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/hapi-mocks'] --- import kbnHapiMocksObj from './kbn_hapi_mocks.devdocs.json'; diff --git a/api_docs/kbn_home_sample_data_card.mdx b/api_docs/kbn_home_sample_data_card.mdx index 71c8b52c08c7d..d4cca06818606 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: 2022-10-02 +date: 2022-10-03 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 67b69bdc69372..54d4d15fc741e 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: 2022-10-02 +date: 2022-10-03 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 287c326105c8a..c7ff5b8ab5056 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: 2022-10-02 +date: 2022-10-03 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/i18n'] --- import kbnI18nObj from './kbn_i18n.devdocs.json'; diff --git a/api_docs/kbn_import_resolver.mdx b/api_docs/kbn_import_resolver.mdx index 2f8cc3ebfa05c..262e79df335d1 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: 2022-10-02 +date: 2022-10-03 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/import-resolver'] --- import kbnImportResolverObj from './kbn_import_resolver.devdocs.json'; diff --git a/api_docs/kbn_interpreter.mdx b/api_docs/kbn_interpreter.mdx index 119a20db590da..df20b5d894c5e 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: 2022-10-02 +date: 2022-10-03 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 2dd42caa19c20..4994d60766a45 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: 2022-10-02 +date: 2022-10-03 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/io-ts-utils'] --- import kbnIoTsUtilsObj from './kbn_io_ts_utils.devdocs.json'; diff --git a/api_docs/kbn_jest_serializers.mdx b/api_docs/kbn_jest_serializers.mdx index 5f98c468a61c0..e5e069f91c957 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: 2022-10-02 +date: 2022-10-03 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 15376c2757602..21477f1c435c7 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: 2022-10-02 +date: 2022-10-03 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/journeys'] --- import kbnJourneysObj from './kbn_journeys.devdocs.json'; diff --git a/api_docs/kbn_kibana_manifest_schema.mdx b/api_docs/kbn_kibana_manifest_schema.mdx index f4f8350b8df63..6d9b4a9bb317c 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: 2022-10-02 +date: 2022-10-03 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/kibana-manifest-schema'] --- import kbnKibanaManifestSchemaObj from './kbn_kibana_manifest_schema.devdocs.json'; diff --git a/api_docs/kbn_logging.mdx b/api_docs/kbn_logging.mdx index 1121ec512bc39..712dd79f55359 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: 2022-10-02 +date: 2022-10-03 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 fe90ec4cc221f..6dcc57446aaad 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: 2022-10-02 +date: 2022-10-03 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/logging-mocks'] --- import kbnLoggingMocksObj from './kbn_logging_mocks.devdocs.json'; diff --git a/api_docs/kbn_managed_vscode_config.mdx b/api_docs/kbn_managed_vscode_config.mdx index 0de9f54e62995..788e96c22f5c3 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: 2022-10-02 +date: 2022-10-03 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/managed-vscode-config'] --- import kbnManagedVscodeConfigObj from './kbn_managed_vscode_config.devdocs.json'; diff --git a/api_docs/kbn_mapbox_gl.mdx b/api_docs/kbn_mapbox_gl.mdx index 007e3dd15767c..8e2ce8b3d9fdc 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: 2022-10-02 +date: 2022-10-03 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/mapbox-gl'] --- import kbnMapboxGlObj from './kbn_mapbox_gl.devdocs.json'; diff --git a/api_docs/kbn_ml_agg_utils.mdx b/api_docs/kbn_ml_agg_utils.mdx index cafb9d704b491..25b2b17e3997b 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: 2022-10-02 +date: 2022-10-03 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_is_populated_object.mdx b/api_docs/kbn_ml_is_populated_object.mdx index ea7bb98fca111..5f24dc1806b03 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: 2022-10-02 +date: 2022-10-03 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_string_hash.mdx b/api_docs/kbn_ml_string_hash.mdx index cd15a3909e9cb..2fa9ac8d84b7a 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: 2022-10-02 +date: 2022-10-03 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/ml-string-hash'] --- import kbnMlStringHashObj from './kbn_ml_string_hash.devdocs.json'; diff --git a/api_docs/kbn_monaco.mdx b/api_docs/kbn_monaco.mdx index f418088dad248..c5b48fbeff006 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: 2022-10-02 +date: 2022-10-03 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/monaco'] --- import kbnMonacoObj from './kbn_monaco.devdocs.json'; diff --git a/api_docs/kbn_optimizer.mdx b/api_docs/kbn_optimizer.mdx index 8aef1a04d1a5f..2a5d7bc10afb8 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: 2022-10-02 +date: 2022-10-03 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 a784f125dd4a3..3f87a2b8b79d8 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: 2022-10-02 +date: 2022-10-03 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 752a04593d5ed..76d9089526cec 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: 2022-10-02 +date: 2022-10-03 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_performance_testing_dataset_extractor.mdx b/api_docs/kbn_performance_testing_dataset_extractor.mdx index 7c7ace4751a93..3e83e64f435dc 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: 2022-10-02 +date: 2022-10-03 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/performance-testing-dataset-extractor'] --- import kbnPerformanceTestingDatasetExtractorObj from './kbn_performance_testing_dataset_extractor.devdocs.json'; diff --git a/api_docs/kbn_plugin_generator.mdx b/api_docs/kbn_plugin_generator.mdx index b76a868134479..dc887c9ce3056 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: 2022-10-02 +date: 2022-10-03 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 a5ff4e0a5f172..30cf3560edd3a 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: 2022-10-02 +date: 2022-10-03 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/plugin-helpers'] --- import kbnPluginHelpersObj from './kbn_plugin_helpers.devdocs.json'; diff --git a/api_docs/kbn_react_field.mdx b/api_docs/kbn_react_field.mdx index e0f55f2faed98..ae485f79249a3 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: 2022-10-02 +date: 2022-10-03 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/react-field'] --- import kbnReactFieldObj from './kbn_react_field.devdocs.json'; diff --git a/api_docs/kbn_repo_source_classifier.mdx b/api_docs/kbn_repo_source_classifier.mdx index 9adf212a87d0c..8249b1eae5a39 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: 2022-10-02 +date: 2022-10-03 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/repo-source-classifier'] --- import kbnRepoSourceClassifierObj from './kbn_repo_source_classifier.devdocs.json'; diff --git a/api_docs/kbn_rule_data_utils.mdx b/api_docs/kbn_rule_data_utils.mdx index 77cd942716abf..a4ef149f8033b 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: 2022-10-02 +date: 2022-10-03 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/rule-data-utils'] --- import kbnRuleDataUtilsObj from './kbn_rule_data_utils.devdocs.json'; diff --git a/api_docs/kbn_securitysolution_autocomplete.mdx b/api_docs/kbn_securitysolution_autocomplete.mdx index ac51a31185439..ea7380185e08a 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: 2022-10-02 +date: 2022-10-03 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/securitysolution-autocomplete'] --- import kbnSecuritysolutionAutocompleteObj from './kbn_securitysolution_autocomplete.devdocs.json'; diff --git a/api_docs/kbn_securitysolution_es_utils.mdx b/api_docs/kbn_securitysolution_es_utils.mdx index a1831303286bd..4f2b01b578636 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: 2022-10-02 +date: 2022-10-03 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 5e5dec3f0efa7..35651464e503c 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: 2022-10-02 +date: 2022-10-03 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 25b3f6af8b102..74a60ea3a6e0d 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: 2022-10-02 +date: 2022-10-03 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 09850981c9212..a2e5cb79e7ec0 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: 2022-10-02 +date: 2022-10-03 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 6de7cb1f0d6c8..878d21884f5ab 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: 2022-10-02 +date: 2022-10-03 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 baf98e2fd0b00..7009b4610d376 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: 2022-10-02 +date: 2022-10-03 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 500c8c72ca837..1a8635741da38 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: 2022-10-02 +date: 2022-10-03 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 5b26d74de8a7f..ba0f3639d8e00 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: 2022-10-02 +date: 2022-10-03 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 05e6ed82f6ddf..cc6cd2e0e30ab 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: 2022-10-02 +date: 2022-10-03 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 e8c0fc13f6e10..c160feacf522f 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: 2022-10-02 +date: 2022-10-03 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 8203f6334e051..1a0fb17e5ced7 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: 2022-10-02 +date: 2022-10-03 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 a5fea43827df3..7aa3b1237d1bd 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: 2022-10-02 +date: 2022-10-03 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 5fc96c25aa1d6..7b831d8213377 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: 2022-10-02 +date: 2022-10-03 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 205d44e5872cb..e82e1785f2490 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: 2022-10-02 +date: 2022-10-03 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 3d373165a9284..60f6a7802671b 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: 2022-10-02 +date: 2022-10-03 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/server-http-tools'] --- import kbnServerHttpToolsObj from './kbn_server_http_tools.devdocs.json'; diff --git a/api_docs/kbn_server_route_repository.mdx b/api_docs/kbn_server_route_repository.mdx index 2d765470b354b..d5b974e9060a3 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: 2022-10-02 +date: 2022-10-03 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/server-route-repository'] --- import kbnServerRouteRepositoryObj from './kbn_server_route_repository.devdocs.json'; diff --git a/api_docs/kbn_shared_svg.mdx b/api_docs/kbn_shared_svg.mdx index 760277af99b74..434f6ebf7360f 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: 2022-10-02 +date: 2022-10-03 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_user_profile_components.mdx b/api_docs/kbn_shared_ux_avatar_user_profile_components.mdx index bbbfb6144deb5..aca5844ce1aa5 100644 --- a/api_docs/kbn_shared_ux_avatar_user_profile_components.mdx +++ b/api_docs/kbn_shared_ux_avatar_user_profile_components.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-shared-ux-avatar-user-profile-components title: "@kbn/shared-ux-avatar-user-profile-components" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/shared-ux-avatar-user-profile-components plugin -date: 2022-10-02 +date: 2022-10-03 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/shared-ux-avatar-user-profile-components'] --- import kbnSharedUxAvatarUserProfileComponentsObj from './kbn_shared_ux_avatar_user_profile_components.devdocs.json'; diff --git a/api_docs/kbn_shared_ux_button_exit_full_screen_mocks.mdx b/api_docs/kbn_shared_ux_button_exit_full_screen_mocks.mdx index 09dad01095487..64ff483b257b8 100644 --- a/api_docs/kbn_shared_ux_button_exit_full_screen_mocks.mdx +++ b/api_docs/kbn_shared_ux_button_exit_full_screen_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-shared-ux-button-exit-full-screen-mocks title: "@kbn/shared-ux-button-exit-full-screen-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/shared-ux-button-exit-full-screen-mocks plugin -date: 2022-10-02 +date: 2022-10-03 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/shared-ux-button-exit-full-screen-mocks'] --- import kbnSharedUxButtonExitFullScreenMocksObj from './kbn_shared_ux_button_exit_full_screen_mocks.devdocs.json'; diff --git a/api_docs/kbn_shared_ux_button_toolbar.mdx b/api_docs/kbn_shared_ux_button_toolbar.mdx index 52a088948e2b6..98810e33e0a49 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: 2022-10-02 +date: 2022-10-03 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 472e6b89741c9..f7ca5b1619118 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: 2022-10-02 +date: 2022-10-03 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 3999dd6522fd6..bae9391ff07c9 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: 2022-10-02 +date: 2022-10-03 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_link_redirect_app_mocks.mdx b/api_docs/kbn_shared_ux_link_redirect_app_mocks.mdx index 2c6d531cd186f..aeabec4b1421b 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: 2022-10-02 +date: 2022-10-03 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_page_analytics_no_data.mdx b/api_docs/kbn_shared_ux_page_analytics_no_data.mdx index 9ecba55b278c4..7dc8d4c973138 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: 2022-10-02 +date: 2022-10-03 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 2c999a65117a6..5386d337930ef 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: 2022-10-02 +date: 2022-10-03 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 7426d22515d58..77248704888b4 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: 2022-10-02 +date: 2022-10-03 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 d815677cdbbb0..100b84a823c93 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: 2022-10-02 +date: 2022-10-03 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 285fff4f69d53..fc9392a85f8ee 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: 2022-10-02 +date: 2022-10-03 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 e753d5c2306e5..75c7b818d2b99 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: 2022-10-02 +date: 2022-10-03 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 3e801da7773bf..46c1575ac211e 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: 2022-10-02 +date: 2022-10-03 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 7d0ed072b3404..ab3b48e848639 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: 2022-10-02 +date: 2022-10-03 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 04e54301c0928..be35872625c46 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: 2022-10-02 +date: 2022-10-03 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 574f7592eec1e..b5afba9ff421d 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: 2022-10-02 +date: 2022-10-03 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 9886feeb304b4..da1478041d724 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: 2022-10-02 +date: 2022-10-03 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 3688d0c50fd5b..1b1327a86bd0a 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: 2022-10-02 +date: 2022-10-03 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 49e38c10a1ab6..0e7e8889a58c6 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: 2022-10-02 +date: 2022-10-03 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_router.mdx b/api_docs/kbn_shared_ux_router.mdx index baf10caeedb7d..f9c07c50257c8 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: 2022-10-02 +date: 2022-10-03 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 05d0ab8de20a5..a0aca2fcd5aaf 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: 2022-10-02 +date: 2022-10-03 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 5a6e193562b5a..aeae1c356a861 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: 2022-10-02 +date: 2022-10-03 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 fd0593f5bf74e..d5712323de82d 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: 2022-10-02 +date: 2022-10-03 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/shared-ux-storybook-mock'] --- import kbnSharedUxStorybookMockObj from './kbn_shared_ux_storybook_mock.devdocs.json'; diff --git a/api_docs/kbn_shared_ux_utility.mdx b/api_docs/kbn_shared_ux_utility.mdx index 6f8f8a20349f3..3466072027056 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: 2022-10-02 +date: 2022-10-03 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/shared-ux-utility'] --- import kbnSharedUxUtilityObj from './kbn_shared_ux_utility.devdocs.json'; diff --git a/api_docs/kbn_some_dev_log.mdx b/api_docs/kbn_some_dev_log.mdx index d3796d5d79dd3..d6c26edac107d 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: 2022-10-02 +date: 2022-10-03 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_package_json.mdx b/api_docs/kbn_sort_package_json.mdx index 6ba6f268cd132..13db8c8155fd0 100644 --- a/api_docs/kbn_sort_package_json.mdx +++ b/api_docs/kbn_sort_package_json.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-sort-package-json title: "@kbn/sort-package-json" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/sort-package-json plugin -date: 2022-10-02 +date: 2022-10-03 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/sort-package-json'] --- import kbnSortPackageJsonObj from './kbn_sort_package_json.devdocs.json'; diff --git a/api_docs/kbn_std.mdx b/api_docs/kbn_std.mdx index de90284104e3b..e96bc3e61652b 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: 2022-10-02 +date: 2022-10-03 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 13b3aa2b6ebbd..b4aac204fc2fc 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: 2022-10-02 +date: 2022-10-03 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 e57f44e869e1b..13b0046b3c5f5 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: 2022-10-02 +date: 2022-10-03 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/storybook'] --- import kbnStorybookObj from './kbn_storybook.devdocs.json'; diff --git a/api_docs/kbn_telemetry_tools.mdx b/api_docs/kbn_telemetry_tools.mdx index 730dfdd548326..5dc57b83e3caf 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: 2022-10-02 +date: 2022-10-03 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 3e4061d439386..924a8f1d2d36d 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: 2022-10-02 +date: 2022-10-03 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/test'] --- import kbnTestObj from './kbn_test.devdocs.json'; diff --git a/api_docs/kbn_test_jest_helpers.mdx b/api_docs/kbn_test_jest_helpers.mdx index 80bce2c3d3bb8..cc4a486b6dc8e 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: 2022-10-02 +date: 2022-10-03 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 38296f51f0ea9..38fd9ee192959 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: 2022-10-02 +date: 2022-10-03 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/test-subj-selector'] --- import kbnTestSubjSelectorObj from './kbn_test_subj_selector.devdocs.json'; diff --git a/api_docs/kbn_tooling_log.mdx b/api_docs/kbn_tooling_log.mdx index d038b65a9b437..efc952ecde5a0 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: 2022-10-02 +date: 2022-10-03 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/tooling-log'] --- import kbnToolingLogObj from './kbn_tooling_log.devdocs.json'; diff --git a/api_docs/kbn_type_summarizer.mdx b/api_docs/kbn_type_summarizer.mdx index 1dc49f971de9d..1c63f3fb99305 100644 --- a/api_docs/kbn_type_summarizer.mdx +++ b/api_docs/kbn_type_summarizer.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-type-summarizer title: "@kbn/type-summarizer" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/type-summarizer plugin -date: 2022-10-02 +date: 2022-10-03 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/type-summarizer'] --- import kbnTypeSummarizerObj from './kbn_type_summarizer.devdocs.json'; diff --git a/api_docs/kbn_type_summarizer_core.mdx b/api_docs/kbn_type_summarizer_core.mdx index cc8f70eddfb49..346fc07253bf5 100644 --- a/api_docs/kbn_type_summarizer_core.mdx +++ b/api_docs/kbn_type_summarizer_core.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-type-summarizer-core title: "@kbn/type-summarizer-core" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/type-summarizer-core plugin -date: 2022-10-02 +date: 2022-10-03 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/type-summarizer-core'] --- import kbnTypeSummarizerCoreObj from './kbn_type_summarizer_core.devdocs.json'; diff --git a/api_docs/kbn_typed_react_router_config.mdx b/api_docs/kbn_typed_react_router_config.mdx index fa9aec2765d0e..cc16ed53a0ad1 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: 2022-10-02 +date: 2022-10-03 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_theme.mdx b/api_docs/kbn_ui_theme.mdx index a23a496ec08a1..768d7656e3a83 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: 2022-10-02 +date: 2022-10-03 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/ui-theme'] --- import kbnUiThemeObj from './kbn_ui_theme.devdocs.json'; diff --git a/api_docs/kbn_user_profile_components.mdx b/api_docs/kbn_user_profile_components.mdx index e22681ed1b21f..321db07786d48 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: 2022-10-02 +date: 2022-10-03 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 4e184219ce29e..59733af696053 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: 2022-10-02 +date: 2022-10-03 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 e2ede8850299f..d34f5eb451f66 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: 2022-10-02 +date: 2022-10-03 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 9fc2d665396ba..3301abb7449f7 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: 2022-10-02 +date: 2022-10-03 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/utils'] --- import kbnUtilsObj from './kbn_utils.devdocs.json'; diff --git a/api_docs/kbn_yarn_lock_validator.mdx b/api_docs/kbn_yarn_lock_validator.mdx index 7822a652e9dc9..7aba97a043a20 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: 2022-10-02 +date: 2022-10-03 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/yarn-lock-validator'] --- import kbnYarnLockValidatorObj from './kbn_yarn_lock_validator.devdocs.json'; diff --git a/api_docs/kibana_overview.mdx b/api_docs/kibana_overview.mdx index 3f7cc296f0789..99437dfa2d79f 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: 2022-10-02 +date: 2022-10-03 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 721d581c9aebb..b563f5461da0f 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: 2022-10-02 +date: 2022-10-03 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 331c1c9cc68ef..5bb528b470212 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: 2022-10-02 +date: 2022-10-03 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 927b730fbd080..b08fc593fdcc7 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: 2022-10-02 +date: 2022-10-03 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 29f7f9b863fe9..ee26d7bf7b870 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: 2022-10-02 +date: 2022-10-03 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 cfe740cacdaf4..f3039f89e8db3 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: 2022-10-02 +date: 2022-10-03 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 1f90c8557e07e..a2bbb989390e5 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: 2022-10-02 +date: 2022-10-03 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 27be5086f77e3..a1ea39b243d1e 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: 2022-10-02 +date: 2022-10-03 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'licensing'] --- import licensingObj from './licensing.devdocs.json'; diff --git a/api_docs/lists.mdx b/api_docs/lists.mdx index 0fe469c827997..167f95ca81b40 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: 2022-10-02 +date: 2022-10-03 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'lists'] --- import listsObj from './lists.devdocs.json'; diff --git a/api_docs/management.mdx b/api_docs/management.mdx index 0dab3bc7dfeb7..7b13b081164ff 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: 2022-10-02 +date: 2022-10-03 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 606529ea480d8..84567432aed62 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: 2022-10-02 +date: 2022-10-03 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 cb8141b2fa2eb..7e0c0528fef4a 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: 2022-10-02 +date: 2022-10-03 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'mapsEms'] --- import mapsEmsObj from './maps_ems.devdocs.json'; diff --git a/api_docs/ml.mdx b/api_docs/ml.mdx index a220cc633fdbe..a7a7a0517b9b8 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: 2022-10-02 +date: 2022-10-03 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'ml'] --- import mlObj from './ml.devdocs.json'; diff --git a/api_docs/monitoring.mdx b/api_docs/monitoring.mdx index d57492b577032..e884c213dddbc 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: 2022-10-02 +date: 2022-10-03 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 4fa7372e846d3..37856b288370a 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: 2022-10-02 +date: 2022-10-03 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 ace04be9dfd65..283d52b0a4c3a 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: 2022-10-02 +date: 2022-10-03 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 ea74ae679ce8f..278b15e23d47f 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: 2022-10-02 +date: 2022-10-03 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'newsfeed'] --- import newsfeedObj from './newsfeed.devdocs.json'; diff --git a/api_docs/observability.mdx b/api_docs/observability.mdx index 63effa9722c28..2f29ba44a8c06 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: 2022-10-02 +date: 2022-10-03 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'observability'] --- import observabilityObj from './observability.devdocs.json'; diff --git a/api_docs/osquery.mdx b/api_docs/osquery.mdx index 0c73ce5aa345c..5b05f78a15a04 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: 2022-10-02 +date: 2022-10-03 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'osquery'] --- import osqueryObj from './osquery.devdocs.json'; diff --git a/api_docs/plugin_directory.mdx b/api_docs/plugin_directory.mdx index 51cba79e857c9..b6b1d856686da 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: 2022-10-02 +date: 2022-10-03 tags: ['contributor', 'dev', 'apidocs', 'kibana'] --- diff --git a/api_docs/presentation_util.mdx b/api_docs/presentation_util.mdx index b7aa3b787718d..f9b349676713b 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: 2022-10-02 +date: 2022-10-03 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 877b703d7e169..489f7c32b600e 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: 2022-10-02 +date: 2022-10-03 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'profiling'] --- import profilingObj from './profiling.devdocs.json'; diff --git a/api_docs/remote_clusters.mdx b/api_docs/remote_clusters.mdx index 9f3abb5e1d970..6a8252bfebe78 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: 2022-10-02 +date: 2022-10-03 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 53a33e3f3e021..fbdfd3cb5bd01 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: 2022-10-02 +date: 2022-10-03 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 4e870d52ebe4e..11313a6dc5f24 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: 2022-10-02 +date: 2022-10-03 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 3a2aa8b507fe9..3ac4843ea4176 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: 2022-10-02 +date: 2022-10-03 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 4092856f85483..17f5b0c7f230d 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: 2022-10-02 +date: 2022-10-03 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 6e00cff68eeaf..5063707c3abd9 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: 2022-10-02 +date: 2022-10-03 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 92585b79379f3..53186cbce4362 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: 2022-10-02 +date: 2022-10-03 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 f97c77aca56d9..0032f71ba6484 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: 2022-10-02 +date: 2022-10-03 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 69df9871d9f65..b3c954d358cb1 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: 2022-10-02 +date: 2022-10-03 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 9e3ca4f8d4e8f..280c60872da7d 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: 2022-10-02 +date: 2022-10-03 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 ce10df747f588..eac6e8187a83f 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: 2022-10-02 +date: 2022-10-03 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 db9cf0112901e..50deed0a47fdd 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: 2022-10-02 +date: 2022-10-03 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 88a61fbfbefd6..64b2f1e872dd9 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: 2022-10-02 +date: 2022-10-03 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'screenshotting'] --- import screenshottingObj from './screenshotting.devdocs.json'; diff --git a/api_docs/security.mdx b/api_docs/security.mdx index 574757b6488dd..b62b787d9d0e4 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: 2022-10-02 +date: 2022-10-03 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'security'] --- import securityObj from './security.devdocs.json'; diff --git a/api_docs/security_solution.mdx b/api_docs/security_solution.mdx index fd2ceda90f9ee..088b9d7a12e2b 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: 2022-10-02 +date: 2022-10-03 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'securitySolution'] --- import securitySolutionObj from './security_solution.devdocs.json'; diff --git a/api_docs/session_view.mdx b/api_docs/session_view.mdx index dae50a1df7b65..eaddd45f9b778 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: 2022-10-02 +date: 2022-10-03 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 da7c56ca51c58..c6ba8145d4c64 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: 2022-10-02 +date: 2022-10-03 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'share'] --- import shareObj from './share.devdocs.json'; diff --git a/api_docs/snapshot_restore.mdx b/api_docs/snapshot_restore.mdx index 12fb3c0f940cb..daaaceba668b4 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: 2022-10-02 +date: 2022-10-03 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 ad1ae785ccc95..1196b40d5c3bf 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: 2022-10-02 +date: 2022-10-03 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 366616671516d..fdd5dfbc025b1 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: 2022-10-02 +date: 2022-10-03 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 811c79896d7ec..89056c9ebd088 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: 2022-10-02 +date: 2022-10-03 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 0f244bdfa77ac..1b7e13dd4d650 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: 2022-10-02 +date: 2022-10-03 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 27b6af9549d74..8e865875b83fe 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: 2022-10-02 +date: 2022-10-03 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 e40ec8f867a6e..e5cbc94c567a3 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: 2022-10-02 +date: 2022-10-03 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 15225549bbe79..7b775d1ce3bce 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: 2022-10-02 +date: 2022-10-03 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 e962b1c74b73a..7312616ea8a6e 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: 2022-10-02 +date: 2022-10-03 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 bc8d91d1ee1df..4abe6fedf3bf3 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: 2022-10-02 +date: 2022-10-03 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 f12a30a01feae..692501acd7de0 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: 2022-10-02 +date: 2022-10-03 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 0c044093de8da..9603096cd2b99 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: 2022-10-02 +date: 2022-10-03 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 d628475506628..a9c60110ba139 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: 2022-10-02 +date: 2022-10-03 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 a11e23546d229..734e896cbdf27 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: 2022-10-02 +date: 2022-10-03 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 273a9ab86497e..5ac50aa29c085 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: 2022-10-02 +date: 2022-10-03 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'uiActionsEnhanced'] --- import uiActionsEnhancedObj from './ui_actions_enhanced.devdocs.json'; diff --git a/api_docs/unified_field_list.mdx b/api_docs/unified_field_list.mdx index d3614845b2485..2818641379fb7 100644 --- a/api_docs/unified_field_list.mdx +++ b/api_docs/unified_field_list.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/unifiedFieldList title: "unifiedFieldList" image: https://source.unsplash.com/400x175/?github description: API docs for the unifiedFieldList plugin -date: 2022-10-02 +date: 2022-10-03 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'unifiedFieldList'] --- import unifiedFieldListObj from './unified_field_list.devdocs.json'; diff --git a/api_docs/unified_search.mdx b/api_docs/unified_search.mdx index efac37faf56d0..ed31e74c5d7eb 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: 2022-10-02 +date: 2022-10-03 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 b0ffa71265a1c..e75d86bbab218 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: 2022-10-02 +date: 2022-10-03 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'unifiedSearch.autocomplete'] --- import unifiedSearchAutocompleteObj from './unified_search_autocomplete.devdocs.json'; diff --git a/api_docs/url_forwarding.mdx b/api_docs/url_forwarding.mdx index ef65b102aed74..0ac5762c42af3 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: 2022-10-02 +date: 2022-10-03 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 e41693e5efca0..b493774dc1eb3 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: 2022-10-02 +date: 2022-10-03 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 cfafdaf068029..f3c60dc8b7b43 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: 2022-10-02 +date: 2022-10-03 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 f63baebfa4b2a..ec4208a4a06da 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: 2022-10-02 +date: 2022-10-03 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 b91e25ae3893f..43f73daa08070 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: 2022-10-02 +date: 2022-10-03 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 49ba54cdc57d3..d537797699cab 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: 2022-10-02 +date: 2022-10-03 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 93e84b16f4d28..08324c72b813f 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: 2022-10-02 +date: 2022-10-03 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 90bae1cb686f6..7d052e7dd40fb 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: 2022-10-02 +date: 2022-10-03 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 06b9a57efddf5..696edbd5d321e 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: 2022-10-02 +date: 2022-10-03 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 7aafcad29e0fa..ef87c344661e6 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: 2022-10-02 +date: 2022-10-03 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 324013c67331a..1a5a44160bf46 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: 2022-10-02 +date: 2022-10-03 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 d8e1da6a13e95..8651bb82ad813 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: 2022-10-02 +date: 2022-10-03 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 4722a4b75256e..440839b51793a 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: 2022-10-02 +date: 2022-10-03 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'visTypeXy'] --- import visTypeXyObj from './vis_type_xy.devdocs.json'; diff --git a/api_docs/visualizations.mdx b/api_docs/visualizations.mdx index 36d12fab03cfc..2edc6b736c5b6 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: 2022-10-02 +date: 2022-10-03 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'visualizations'] --- import visualizationsObj from './visualizations.devdocs.json'; From 8a298e4c8d1a9c75ce081e5c4c91174818e057d9 Mon Sep 17 00:00:00 2001 From: Pierre Gayvallet Date: Mon, 3 Oct 2022 09:52:17 +0200 Subject: [PATCH 69/72] Migrate server-side `rendering` service to packages (#141902) * create empty packages * moves files to packages * adapt usages * updating READMEs and packages jsons * [CI] Auto-commit changed files from 'node scripts/generate codeowners' * adapt more usages * more import fixes * fix mock method names * export the `Fonts` component for security... * [CI] Auto-commit changed files from 'node scripts/precommit_hook.js --ref HEAD~1..HEAD --fix' * fix more usages again * includes tsx files Co-authored-by: kibanamachine <42973632+kibanamachine@users.noreply.github.com> --- .github/CODEOWNERS | 3 + package.json | 6 + packages/BUILD.bazel | 6 + .../BUILD.bazel | 107 +++++++++++++++ .../README.md | 3 + .../index.ts | 9 ++ .../jest.config.js | 13 ++ .../kibana.jsonc | 7 + .../package.json | 8 ++ .../src/index.ts | 9 ++ .../src/types.ts | 51 +++++++ .../tsconfig.json | 17 +++ .../BUILD.bazel | 127 ++++++++++++++++++ .../core-rendering-server-internal/README.md | 3 + .../core-rendering-server-internal/index.ts | 17 +++ .../jest.config.js | 13 ++ .../kibana.jsonc | 7 + .../package.json | 8 ++ .../rendering_service.test.ts.snap | 0 .../render_template.test.ts.snap | 0 .../bootstrap_renderer.test.mocks.ts | 0 .../src}/bootstrap/bootstrap_renderer.test.ts | 2 +- .../src}/bootstrap/bootstrap_renderer.ts | 2 +- .../bootstrap/get_js_dependency_paths.test.ts | 0 .../src}/bootstrap/get_js_dependency_paths.ts | 0 .../bootstrap/get_plugin_bundle_paths.test.ts | 3 +- .../src}/bootstrap/get_plugin_bundle_paths.ts | 2 +- .../src}/bootstrap/get_theme_tag.test.ts | 0 .../src}/bootstrap/get_theme_tag.ts | 0 .../src}/bootstrap/index.ts | 0 .../bootstrap/register_bootstrap_route.ts | 0 .../src}/bootstrap/render_template.test.ts | 0 .../src}/bootstrap/render_template.ts | 0 .../src}/filter_ui_plugins.test.ts | 3 +- .../src}/filter_ui_plugins.ts | 2 +- .../src}/index.ts | 1 + .../src}/internal_types.ts | 0 .../src}/render_utils.test.ts | 0 .../src}/render_utils.ts | 0 .../src}/rendering_service.test.mocks.ts | 0 .../src}/rendering_service.test.ts | 2 +- .../src}/rendering_service.tsx | 4 +- .../src/test_helpers}/params.ts | 13 +- .../src/test_helpers}/rendering_service.ts | 0 .../src}/types.ts | 4 +- .../src}/views/fonts.tsx | 0 .../src}/views/index.ts | 1 + .../src}/views/logo.tsx | 0 .../src}/views/styles.tsx | 0 .../src}/views/template.tsx | 0 .../tsconfig.json | 19 +++ .../core-rendering-server-mocks/BUILD.bazel | 106 +++++++++++++++ .../core-rendering-server-mocks/README.md | 4 + .../core-rendering-server-mocks/index.ts | 9 ++ .../jest.config.js | 13 ++ .../core-rendering-server-mocks/kibana.jsonc | 7 + .../core-rendering-server-mocks/package.json | 8 ++ .../core-rendering-server-mocks/src/index.ts | 9 ++ .../src}/rendering_service.mock.ts | 25 +++- .../core-rendering-server-mocks/tsconfig.json | 17 +++ .../register_bundle_routes.test.ts | 2 +- .../bundle_routes/register_bundle_routes.ts | 2 +- src/core/server/core_app/core_app.test.ts | 2 +- src/core/server/core_app/core_app.ts | 2 +- .../http_resources_service.test.ts | 6 +- .../http_resources/http_resources_service.ts | 5 +- src/core/server/index.ts | 1 - src/core/server/internal_types.ts | 2 +- src/core/server/mocks.ts | 6 +- src/core/server/plugins/index.ts | 1 - src/core/server/plugins/plugins_service.ts | 28 +--- src/core/server/plugins/types.ts | 22 --- src/core/server/server.test.mocks.ts | 8 +- src/core/server/server.ts | 2 +- .../unauthenticated_page.test.tsx | 2 +- .../authorization/reset_session_page.test.tsx | 2 +- .../security/server/prompt_page.test.tsx | 2 +- .../plugins/security/server/prompt_page.tsx | 2 +- yarn.lock | 24 ++++ 79 files changed, 705 insertions(+), 86 deletions(-) create mode 100644 packages/core/plugins/core-plugins-base-server-internal/BUILD.bazel create mode 100644 packages/core/plugins/core-plugins-base-server-internal/README.md create mode 100644 packages/core/plugins/core-plugins-base-server-internal/index.ts create mode 100644 packages/core/plugins/core-plugins-base-server-internal/jest.config.js create mode 100644 packages/core/plugins/core-plugins-base-server-internal/kibana.jsonc create mode 100644 packages/core/plugins/core-plugins-base-server-internal/package.json create mode 100644 packages/core/plugins/core-plugins-base-server-internal/src/index.ts create mode 100644 packages/core/plugins/core-plugins-base-server-internal/src/types.ts create mode 100644 packages/core/plugins/core-plugins-base-server-internal/tsconfig.json create mode 100644 packages/core/rendering/core-rendering-server-internal/BUILD.bazel create mode 100644 packages/core/rendering/core-rendering-server-internal/README.md create mode 100644 packages/core/rendering/core-rendering-server-internal/index.ts create mode 100644 packages/core/rendering/core-rendering-server-internal/jest.config.js create mode 100644 packages/core/rendering/core-rendering-server-internal/kibana.jsonc create mode 100644 packages/core/rendering/core-rendering-server-internal/package.json rename {src/core/server/rendering => packages/core/rendering/core-rendering-server-internal/src}/__snapshots__/rendering_service.test.ts.snap (100%) rename {src/core/server/rendering => packages/core/rendering/core-rendering-server-internal/src}/bootstrap/__snapshots__/render_template.test.ts.snap (100%) rename {src/core/server/rendering => packages/core/rendering/core-rendering-server-internal/src}/bootstrap/bootstrap_renderer.test.mocks.ts (100%) rename {src/core/server/rendering => packages/core/rendering/core-rendering-server-internal/src}/bootstrap/bootstrap_renderer.test.ts (98%) rename {src/core/server/rendering => packages/core/rendering/core-rendering-server-internal/src}/bootstrap/bootstrap_renderer.ts (97%) rename {src/core/server/rendering => packages/core/rendering/core-rendering-server-internal/src}/bootstrap/get_js_dependency_paths.test.ts (100%) rename {src/core/server/rendering => packages/core/rendering/core-rendering-server-internal/src}/bootstrap/get_js_dependency_paths.ts (100%) rename {src/core/server/rendering => packages/core/rendering/core-rendering-server-internal/src}/bootstrap/get_plugin_bundle_paths.test.ts (94%) rename {src/core/server/rendering => packages/core/rendering/core-rendering-server-internal/src}/bootstrap/get_plugin_bundle_paths.ts (95%) rename {src/core/server/rendering => packages/core/rendering/core-rendering-server-internal/src}/bootstrap/get_theme_tag.test.ts (100%) rename {src/core/server/rendering => packages/core/rendering/core-rendering-server-internal/src}/bootstrap/get_theme_tag.ts (100%) rename {src/core/server/rendering => packages/core/rendering/core-rendering-server-internal/src}/bootstrap/index.ts (100%) rename {src/core/server/rendering => packages/core/rendering/core-rendering-server-internal/src}/bootstrap/register_bootstrap_route.ts (100%) rename {src/core/server/rendering => packages/core/rendering/core-rendering-server-internal/src}/bootstrap/render_template.test.ts (100%) rename {src/core/server/rendering => packages/core/rendering/core-rendering-server-internal/src}/bootstrap/render_template.ts (100%) rename {src/core/server/rendering => packages/core/rendering/core-rendering-server-internal/src}/filter_ui_plugins.test.ts (93%) rename {src/core/server/rendering => packages/core/rendering/core-rendering-server-internal/src}/filter_ui_plugins.ts (95%) rename {src/core/server/rendering => packages/core/rendering/core-rendering-server-internal/src}/index.ts (94%) rename {src/core/server/rendering => packages/core/rendering/core-rendering-server-internal/src}/internal_types.ts (100%) rename {src/core/server/rendering => packages/core/rendering/core-rendering-server-internal/src}/render_utils.test.ts (100%) rename {src/core/server/rendering => packages/core/rendering/core-rendering-server-internal/src}/render_utils.ts (100%) rename {src/core/server/rendering => packages/core/rendering/core-rendering-server-internal/src}/rendering_service.test.mocks.ts (100%) rename {src/core/server/rendering => packages/core/rendering/core-rendering-server-internal/src}/rendering_service.test.ts (99%) rename {src/core/server/rendering => packages/core/rendering/core-rendering-server-internal/src}/rendering_service.tsx (98%) rename {src/core/server/rendering/__mocks__ => packages/core/rendering/core-rendering-server-internal/src/test_helpers}/params.ts (85%) rename {src/core/server/rendering/__mocks__ => packages/core/rendering/core-rendering-server-internal/src/test_helpers}/rendering_service.ts (100%) rename {src/core/server/rendering => packages/core/rendering/core-rendering-server-internal/src}/types.ts (96%) rename {src/core/server/rendering => packages/core/rendering/core-rendering-server-internal/src}/views/fonts.tsx (100%) rename {src/core/server/rendering => packages/core/rendering/core-rendering-server-internal/src}/views/index.ts (92%) rename {src/core/server/rendering => packages/core/rendering/core-rendering-server-internal/src}/views/logo.tsx (100%) rename {src/core/server/rendering => packages/core/rendering/core-rendering-server-internal/src}/views/styles.tsx (100%) rename {src/core/server/rendering => packages/core/rendering/core-rendering-server-internal/src}/views/template.tsx (100%) create mode 100644 packages/core/rendering/core-rendering-server-internal/tsconfig.json create mode 100644 packages/core/rendering/core-rendering-server-mocks/BUILD.bazel create mode 100644 packages/core/rendering/core-rendering-server-mocks/README.md create mode 100644 packages/core/rendering/core-rendering-server-mocks/index.ts create mode 100644 packages/core/rendering/core-rendering-server-mocks/jest.config.js create mode 100644 packages/core/rendering/core-rendering-server-mocks/kibana.jsonc create mode 100644 packages/core/rendering/core-rendering-server-mocks/package.json create mode 100644 packages/core/rendering/core-rendering-server-mocks/src/index.ts rename {src/core/server/rendering => packages/core/rendering/core-rendering-server-mocks/src}/rendering_service.mock.ts (55%) create mode 100644 packages/core/rendering/core-rendering-server-mocks/tsconfig.json diff --git a/.github/CODEOWNERS b/.github/CODEOWNERS index 0a1fcc60d55b6..b7d588bc89269 100644 --- a/.github/CODEOWNERS +++ b/.github/CODEOWNERS @@ -784,6 +784,7 @@ packages/core/notifications/core-notifications-browser-mocks @elastic/kibana-cor packages/core/overlays/core-overlays-browser @elastic/kibana-core packages/core/overlays/core-overlays-browser-internal @elastic/kibana-core packages/core/overlays/core-overlays-browser-mocks @elastic/kibana-core +packages/core/plugins/core-plugins-base-server-internal @elastic/kibana-core packages/core/plugins/core-plugins-browser @elastic/kibana-core packages/core/plugins/core-plugins-browser-internal @elastic/kibana-core packages/core/plugins/core-plugins-browser-mocks @elastic/kibana-core @@ -792,6 +793,8 @@ packages/core/preboot/core-preboot-server-internal @elastic/kibana-core packages/core/preboot/core-preboot-server-mocks @elastic/kibana-core packages/core/rendering/core-rendering-browser-internal @elastic/kibana-core packages/core/rendering/core-rendering-browser-mocks @elastic/kibana-core +packages/core/rendering/core-rendering-server-internal @elastic/kibana-core +packages/core/rendering/core-rendering-server-mocks @elastic/kibana-core packages/core/root/core-root-browser-internal @elastic/kibana-core packages/core/saved-objects/core-saved-objects-api-browser @elastic/kibana-core packages/core/saved-objects/core-saved-objects-api-server @elastic/kibana-core diff --git a/package.json b/package.json index e7b1f86b9c053..4108e83b0e6c6 100644 --- a/package.json +++ b/package.json @@ -254,6 +254,7 @@ "@kbn/core-overlays-browser": "link:bazel-bin/packages/core/overlays/core-overlays-browser", "@kbn/core-overlays-browser-internal": "link:bazel-bin/packages/core/overlays/core-overlays-browser-internal", "@kbn/core-overlays-browser-mocks": "link:bazel-bin/packages/core/overlays/core-overlays-browser-mocks", + "@kbn/core-plugins-base-server-internal": "link:bazel-bin/packages/core/plugins/core-plugins-base-server-internal", "@kbn/core-plugins-browser": "link:bazel-bin/packages/core/plugins/core-plugins-browser", "@kbn/core-plugins-browser-internal": "link:bazel-bin/packages/core/plugins/core-plugins-browser-internal", "@kbn/core-plugins-browser-mocks": "link:bazel-bin/packages/core/plugins/core-plugins-browser-mocks", @@ -262,6 +263,8 @@ "@kbn/core-preboot-server-mocks": "link:bazel-bin/packages/core/preboot/core-preboot-server-mocks", "@kbn/core-rendering-browser-internal": "link:bazel-bin/packages/core/rendering/core-rendering-browser-internal", "@kbn/core-rendering-browser-mocks": "link:bazel-bin/packages/core/rendering/core-rendering-browser-mocks", + "@kbn/core-rendering-server-internal": "link:bazel-bin/packages/core/rendering/core-rendering-server-internal", + "@kbn/core-rendering-server-mocks": "link:bazel-bin/packages/core/rendering/core-rendering-server-mocks", "@kbn/core-root-browser-internal": "link:bazel-bin/packages/core/root/core-root-browser-internal", "@kbn/core-saved-objects-api-browser": "link:bazel-bin/packages/core/saved-objects/core-saved-objects-api-browser", "@kbn/core-saved-objects-api-server": "link:bazel-bin/packages/core/saved-objects/core-saved-objects-api-server", @@ -978,6 +981,7 @@ "@types/kbn__core-overlays-browser": "link:bazel-bin/packages/core/overlays/core-overlays-browser/npm_module_types", "@types/kbn__core-overlays-browser-internal": "link:bazel-bin/packages/core/overlays/core-overlays-browser-internal/npm_module_types", "@types/kbn__core-overlays-browser-mocks": "link:bazel-bin/packages/core/overlays/core-overlays-browser-mocks/npm_module_types", + "@types/kbn__core-plugins-base-server-internal": "link:bazel-bin/packages/core/plugins/core-plugins-base-server-internal/npm_module_types", "@types/kbn__core-plugins-browser": "link:bazel-bin/packages/core/plugins/core-plugins-browser/npm_module_types", "@types/kbn__core-plugins-browser-internal": "link:bazel-bin/packages/core/plugins/core-plugins-browser-internal/npm_module_types", "@types/kbn__core-plugins-browser-mocks": "link:bazel-bin/packages/core/plugins/core-plugins-browser-mocks/npm_module_types", @@ -987,6 +991,8 @@ "@types/kbn__core-public-internal-base": "link:bazel-bin/packages/core/public/internal-base/npm_module_types", "@types/kbn__core-rendering-browser-internal": "link:bazel-bin/packages/core/rendering/core-rendering-browser-internal/npm_module_types", "@types/kbn__core-rendering-browser-mocks": "link:bazel-bin/packages/core/rendering/core-rendering-browser-mocks/npm_module_types", + "@types/kbn__core-rendering-server-internal": "link:bazel-bin/packages/core/rendering/core-rendering-server-internal/npm_module_types", + "@types/kbn__core-rendering-server-mocks": "link:bazel-bin/packages/core/rendering/core-rendering-server-mocks/npm_module_types", "@types/kbn__core-root-browser-internal": "link:bazel-bin/packages/core/root/core-root-browser-internal/npm_module_types", "@types/kbn__core-saved-objects-api-browser": "link:bazel-bin/packages/core/saved-objects/core-saved-objects-api-browser/npm_module_types", "@types/kbn__core-saved-objects-api-server": "link:bazel-bin/packages/core/saved-objects/core-saved-objects-api-server/npm_module_types", diff --git a/packages/BUILD.bazel b/packages/BUILD.bazel index cf97e501df09c..0d5ecd4bc4cfc 100644 --- a/packages/BUILD.bazel +++ b/packages/BUILD.bazel @@ -120,6 +120,7 @@ filegroup( "//packages/core/overlays/core-overlays-browser:build", "//packages/core/overlays/core-overlays-browser-internal:build", "//packages/core/overlays/core-overlays-browser-mocks:build", + "//packages/core/plugins/core-plugins-base-server-internal:build", "//packages/core/plugins/core-plugins-browser:build", "//packages/core/plugins/core-plugins-browser-internal:build", "//packages/core/plugins/core-plugins-browser-mocks:build", @@ -128,6 +129,8 @@ filegroup( "//packages/core/preboot/core-preboot-server-mocks:build", "//packages/core/rendering/core-rendering-browser-internal:build", "//packages/core/rendering/core-rendering-browser-mocks:build", + "//packages/core/rendering/core-rendering-server-internal:build", + "//packages/core/rendering/core-rendering-server-mocks:build", "//packages/core/root/core-root-browser-internal:build", "//packages/core/saved-objects/core-saved-objects-api-browser:build", "//packages/core/saved-objects/core-saved-objects-api-server:build", @@ -454,6 +457,7 @@ filegroup( "//packages/core/overlays/core-overlays-browser:build_types", "//packages/core/overlays/core-overlays-browser-internal:build_types", "//packages/core/overlays/core-overlays-browser-mocks:build_types", + "//packages/core/plugins/core-plugins-base-server-internal:build_types", "//packages/core/plugins/core-plugins-browser:build_types", "//packages/core/plugins/core-plugins-browser-internal:build_types", "//packages/core/plugins/core-plugins-browser-mocks:build_types", @@ -462,6 +466,8 @@ filegroup( "//packages/core/preboot/core-preboot-server-mocks:build_types", "//packages/core/rendering/core-rendering-browser-internal:build_types", "//packages/core/rendering/core-rendering-browser-mocks:build_types", + "//packages/core/rendering/core-rendering-server-internal:build_types", + "//packages/core/rendering/core-rendering-server-mocks:build_types", "//packages/core/root/core-root-browser-internal:build_types", "//packages/core/saved-objects/core-saved-objects-api-browser:build_types", "//packages/core/saved-objects/core-saved-objects-api-server:build_types", diff --git a/packages/core/plugins/core-plugins-base-server-internal/BUILD.bazel b/packages/core/plugins/core-plugins-base-server-internal/BUILD.bazel new file mode 100644 index 0000000000000..7e4d73b638a75 --- /dev/null +++ b/packages/core/plugins/core-plugins-base-server-internal/BUILD.bazel @@ -0,0 +1,107 @@ +load("@npm//@bazel/typescript:index.bzl", "ts_config") +load("@build_bazel_rules_nodejs//:index.bzl", "js_library") +load("//src/dev/bazel:index.bzl", "jsts_transpiler", "pkg_npm", "pkg_npm_types", "ts_project") + +PKG_DIRNAME = "core-plugins-base-server-internal" +PKG_REQUIRE_NAME = "@kbn/core-plugins-base-server-internal" + +SOURCE_FILES = glob( + [ + "**/*.ts", + ], + exclude = [ + "**/*.config.js", + "**/*.mock.*", + "**/*.test.*", + "**/*.stories.*", + "**/__snapshots__/**", + "**/integration_tests/**", + "**/mocks/**", + "**/scripts/**", + "**/storybook/**", + "**/test_fixtures/**", + "**/test_helpers/**", + ], +) + +SRCS = SOURCE_FILES + +filegroup( + name = "srcs", + srcs = SRCS, +) + +NPM_MODULE_EXTRA_FILES = [ + "package.json", +] + +RUNTIME_DEPS = [ +] + +TYPES_DEPS = [ + "@npm//@types/node", + "@npm//@types/jest", + "@npm//rxjs", + "//packages/core/base/core-base-common:npm_module_types", +] + +jsts_transpiler( + name = "target_node", + srcs = SRCS, + build_pkg_name = package_name(), +) + +ts_config( + name = "tsconfig", + src = "tsconfig.json", + deps = [ + "//:tsconfig.base.json", + "//:tsconfig.bazel.json", + ], +) + +ts_project( + name = "tsc_types", + args = ['--pretty'], + srcs = SRCS, + deps = TYPES_DEPS, + declaration = True, + declaration_map = True, + emit_declaration_only = True, + out_dir = "target_types", + tsconfig = ":tsconfig", +) + +js_library( + name = PKG_DIRNAME, + srcs = NPM_MODULE_EXTRA_FILES, + deps = RUNTIME_DEPS + [":target_node"], + package_name = PKG_REQUIRE_NAME, + visibility = ["//visibility:public"], +) + +pkg_npm( + name = "npm_module", + deps = [":" + PKG_DIRNAME], +) + +filegroup( + name = "build", + srcs = [":npm_module"], + visibility = ["//visibility:public"], +) + +pkg_npm_types( + name = "npm_module_types", + srcs = SRCS, + deps = [":tsc_types"], + package_name = PKG_REQUIRE_NAME, + tsconfig = ":tsconfig", + visibility = ["//visibility:public"], +) + +filegroup( + name = "build_types", + srcs = [":npm_module_types"], + visibility = ["//visibility:public"], +) diff --git a/packages/core/plugins/core-plugins-base-server-internal/README.md b/packages/core/plugins/core-plugins-base-server-internal/README.md new file mode 100644 index 0000000000000..565082ebccc04 --- /dev/null +++ b/packages/core/plugins/core-plugins-base-server-internal/README.md @@ -0,0 +1,3 @@ +# @kbn/core-plugins-base-server-internal + +This package contains base internal types of the `plugins` domain used across other core domains. diff --git a/packages/core/plugins/core-plugins-base-server-internal/index.ts b/packages/core/plugins/core-plugins-base-server-internal/index.ts new file mode 100644 index 0000000000000..3052f46e9fe7a --- /dev/null +++ b/packages/core/plugins/core-plugins-base-server-internal/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 type { UiPlugins, InternalPluginInfo } from './src'; diff --git a/packages/core/plugins/core-plugins-base-server-internal/jest.config.js b/packages/core/plugins/core-plugins-base-server-internal/jest.config.js new file mode 100644 index 0000000000000..9a9b5aa5ec9bf --- /dev/null +++ b/packages/core/plugins/core-plugins-base-server-internal/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/core/plugins/core-plugins-base-server-internal'], +}; diff --git a/packages/core/plugins/core-plugins-base-server-internal/kibana.jsonc b/packages/core/plugins/core-plugins-base-server-internal/kibana.jsonc new file mode 100644 index 0000000000000..a593530ab5fc4 --- /dev/null +++ b/packages/core/plugins/core-plugins-base-server-internal/kibana.jsonc @@ -0,0 +1,7 @@ +{ + "type": "shared-common", + "id": "@kbn/core-plugins-base-server-internal", + "owner": "@elastic/kibana-core", + "runtimeDeps": [], + "typeDeps": [], +} diff --git a/packages/core/plugins/core-plugins-base-server-internal/package.json b/packages/core/plugins/core-plugins-base-server-internal/package.json new file mode 100644 index 0000000000000..6af3453f1a29b --- /dev/null +++ b/packages/core/plugins/core-plugins-base-server-internal/package.json @@ -0,0 +1,8 @@ +{ + "name": "@kbn/core-plugins-base-server-internal", + "private": true, + "version": "1.0.0", + "main": "./target_node/index.js", + "author": "Kibana Core", + "license": "SSPL-1.0 OR Elastic License 2.0" +} diff --git a/packages/core/plugins/core-plugins-base-server-internal/src/index.ts b/packages/core/plugins/core-plugins-base-server-internal/src/index.ts new file mode 100644 index 0000000000000..ade9e77fc1783 --- /dev/null +++ b/packages/core/plugins/core-plugins-base-server-internal/src/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 type { UiPlugins, InternalPluginInfo } from './types'; diff --git a/packages/core/plugins/core-plugins-base-server-internal/src/types.ts b/packages/core/plugins/core-plugins-base-server-internal/src/types.ts new file mode 100644 index 0000000000000..d0afcce5dba5c --- /dev/null +++ b/packages/core/plugins/core-plugins-base-server-internal/src/types.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 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 { Observable } from 'rxjs'; +import type { DiscoveredPlugin, PluginName } from '@kbn/core-base-common'; + +/** @internal */ +export interface UiPlugins { + /** + * Paths to all discovered ui plugin entrypoints on the filesystem, even if + * disabled. + */ + internal: Map; + + /** + * Information needed by client-side to load plugins and wire dependencies. + */ + public: Map; + + /** + * Configuration for plugins to be exposed to the client-side. + */ + browserConfigs: Map>; +} + +/** + * @internal + */ +export interface InternalPluginInfo { + /** + * Version of the plugin + */ + readonly version: string; + /** + * Bundles that must be loaded for this plugin + */ + readonly requiredBundles: readonly string[]; + /** + * Path to the target/public directory of the plugin which should be served + */ + readonly publicTargetDir: string; + /** + * Path to the plugin assets directory. + */ + readonly publicAssetsDir: string; +} diff --git a/packages/core/plugins/core-plugins-base-server-internal/tsconfig.json b/packages/core/plugins/core-plugins-base-server-internal/tsconfig.json new file mode 100644 index 0000000000000..71bb40fe57f3f --- /dev/null +++ b/packages/core/plugins/core-plugins-base-server-internal/tsconfig.json @@ -0,0 +1,17 @@ +{ + "extends": "../../../../tsconfig.bazel.json", + "compilerOptions": { + "declaration": true, + "declarationMap": true, + "emitDeclarationOnly": true, + "outDir": "target_types", + "stripInternal": false, + "types": [ + "jest", + "node" + ] + }, + "include": [ + "**/*.ts", + ] +} diff --git a/packages/core/rendering/core-rendering-server-internal/BUILD.bazel b/packages/core/rendering/core-rendering-server-internal/BUILD.bazel new file mode 100644 index 0000000000000..b02ff09264699 --- /dev/null +++ b/packages/core/rendering/core-rendering-server-internal/BUILD.bazel @@ -0,0 +1,127 @@ +load("@npm//@bazel/typescript:index.bzl", "ts_config") +load("@build_bazel_rules_nodejs//:index.bzl", "js_library") +load("//src/dev/bazel:index.bzl", "jsts_transpiler", "pkg_npm", "pkg_npm_types", "ts_project") + +PKG_DIRNAME = "core-rendering-server-internal" +PKG_REQUIRE_NAME = "@kbn/core-rendering-server-internal" + +SOURCE_FILES = glob( + [ + "**/*.ts", + "**/*.tsx", + ], + exclude = [ + "**/*.config.js", + "**/*.mock.*", + "**/*.test.*", + "**/*.stories.*", + "**/__snapshots__/**", + "**/integration_tests/**", + "**/mocks/**", + "**/scripts/**", + "**/storybook/**", + "**/test_fixtures/**", + "**/test_helpers/**", + ], +) + +SRCS = SOURCE_FILES + +filegroup( + name = "srcs", + srcs = SRCS, +) + +NPM_MODULE_EXTRA_FILES = [ + "package.json", +] + +RUNTIME_DEPS = [ + "@npm//react", + "@npm//react-dom", + "@npm//rxjs", + "//packages/kbn-i18n", + "//packages/kbn-ui-shared-deps-npm", + "//packages/kbn-ui-shared-deps-src", +] + +TYPES_DEPS = [ + "@npm//@types/node", + "@npm//@types/jest", + "@npm//@types/react", + "@npm//@types/react-dom", + "@npm//rxjs", + "//packages/kbn-i18n:npm_module_types", + "//packages/kbn-ui-shared-deps-npm:npm_module_types", + "//packages/kbn-ui-shared-deps-src:npm_module_types", + "//packages/core/base/core-base-server-internal:npm_module_types", + "//packages/core/injected-metadata/core-injected-metadata-common-internal:npm_module_types", + "//packages/core/http/core-http-server:npm_module_types", + "//packages/core/http/core-http-server-internal:npm_module_types", + "//packages/core/elasticsearch/core-elasticsearch-server-internal:npm_module_types", + "//packages/core/status/core-status-server-internal:npm_module_types", + "//packages/core/ui-settings/core-ui-settings-common:npm_module_types", + "//packages/core/ui-settings/core-ui-settings-server:npm_module_types", + "//packages/core/plugins/core-plugins-base-server-internal:npm_module_types", +] + +jsts_transpiler( + name = "target_node", + srcs = SRCS, + build_pkg_name = package_name(), +) + +ts_config( + name = "tsconfig", + src = "tsconfig.json", + deps = [ + "//:tsconfig.base.json", + "//:tsconfig.bazel.json", + ], +) + +ts_project( + name = "tsc_types", + args = ['--pretty'], + srcs = SRCS, + deps = TYPES_DEPS, + declaration = True, + declaration_map = True, + emit_declaration_only = True, + out_dir = "target_types", + tsconfig = ":tsconfig", +) + +js_library( + name = PKG_DIRNAME, + srcs = NPM_MODULE_EXTRA_FILES, + deps = RUNTIME_DEPS + [":target_node"], + package_name = PKG_REQUIRE_NAME, + visibility = ["//visibility:public"], +) + +pkg_npm( + name = "npm_module", + deps = [":" + PKG_DIRNAME], +) + +filegroup( + name = "build", + srcs = [":npm_module"], + visibility = ["//visibility:public"], +) + +pkg_npm_types( + name = "npm_module_types", + srcs = SRCS, + deps = [":tsc_types"], + package_name = PKG_REQUIRE_NAME, + tsconfig = ":tsconfig", + visibility = ["//visibility:public"], +) + +filegroup( + name = "build_types", + srcs = [":npm_module_types"], + visibility = ["//visibility:public"], +) diff --git a/packages/core/rendering/core-rendering-server-internal/README.md b/packages/core/rendering/core-rendering-server-internal/README.md new file mode 100644 index 0000000000000..629ac2047de02 --- /dev/null +++ b/packages/core/rendering/core-rendering-server-internal/README.md @@ -0,0 +1,3 @@ +# @kbn/core-rendering-server-internal + +This package contains the internal types and implementation for Core's server-side rendering service. diff --git a/packages/core/rendering/core-rendering-server-internal/index.ts b/packages/core/rendering/core-rendering-server-internal/index.ts new file mode 100644 index 0000000000000..7ddc442a74253 --- /dev/null +++ b/packages/core/rendering/core-rendering-server-internal/index.ts @@ -0,0 +1,17 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0 and the Server Side Public License, v 1; you may not use this file except + * in compliance with, at your election, the Elastic License 2.0 or the Server + * Side Public License, v 1. + */ + +export { RenderingService, Fonts } from './src'; +export type { + InternalRenderingServicePreboot, + InternalRenderingServiceSetup, + IRenderOptions, + RenderingMetadata, + RenderingPrebootDeps, + RenderingSetupDeps, +} from './src'; diff --git a/packages/core/rendering/core-rendering-server-internal/jest.config.js b/packages/core/rendering/core-rendering-server-internal/jest.config.js new file mode 100644 index 0000000000000..48ca2e89b9763 --- /dev/null +++ b/packages/core/rendering/core-rendering-server-internal/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/core/rendering/core-rendering-server-internal'], +}; diff --git a/packages/core/rendering/core-rendering-server-internal/kibana.jsonc b/packages/core/rendering/core-rendering-server-internal/kibana.jsonc new file mode 100644 index 0000000000000..2ce227d70528f --- /dev/null +++ b/packages/core/rendering/core-rendering-server-internal/kibana.jsonc @@ -0,0 +1,7 @@ +{ + "type": "shared-common", + "id": "@kbn/core-rendering-server-internal", + "owner": "@elastic/kibana-core", + "runtimeDeps": [], + "typeDeps": [], +} diff --git a/packages/core/rendering/core-rendering-server-internal/package.json b/packages/core/rendering/core-rendering-server-internal/package.json new file mode 100644 index 0000000000000..ef29d29e9fa2f --- /dev/null +++ b/packages/core/rendering/core-rendering-server-internal/package.json @@ -0,0 +1,8 @@ +{ + "name": "@kbn/core-rendering-server-internal", + "private": true, + "version": "1.0.0", + "main": "./target_node/index.js", + "author": "Kibana Core", + "license": "SSPL-1.0 OR Elastic License 2.0" +} diff --git a/src/core/server/rendering/__snapshots__/rendering_service.test.ts.snap b/packages/core/rendering/core-rendering-server-internal/src/__snapshots__/rendering_service.test.ts.snap similarity index 100% rename from src/core/server/rendering/__snapshots__/rendering_service.test.ts.snap rename to packages/core/rendering/core-rendering-server-internal/src/__snapshots__/rendering_service.test.ts.snap diff --git a/src/core/server/rendering/bootstrap/__snapshots__/render_template.test.ts.snap b/packages/core/rendering/core-rendering-server-internal/src/bootstrap/__snapshots__/render_template.test.ts.snap similarity index 100% rename from src/core/server/rendering/bootstrap/__snapshots__/render_template.test.ts.snap rename to packages/core/rendering/core-rendering-server-internal/src/bootstrap/__snapshots__/render_template.test.ts.snap diff --git a/src/core/server/rendering/bootstrap/bootstrap_renderer.test.mocks.ts b/packages/core/rendering/core-rendering-server-internal/src/bootstrap/bootstrap_renderer.test.mocks.ts similarity index 100% rename from src/core/server/rendering/bootstrap/bootstrap_renderer.test.mocks.ts rename to packages/core/rendering/core-rendering-server-internal/src/bootstrap/bootstrap_renderer.test.mocks.ts diff --git a/src/core/server/rendering/bootstrap/bootstrap_renderer.test.ts b/packages/core/rendering/core-rendering-server-internal/src/bootstrap/bootstrap_renderer.test.ts similarity index 98% rename from src/core/server/rendering/bootstrap/bootstrap_renderer.test.ts rename to packages/core/rendering/core-rendering-server-internal/src/bootstrap/bootstrap_renderer.test.ts index a1ed415f72c42..af9de3fbd6ff1 100644 --- a/src/core/server/rendering/bootstrap/bootstrap_renderer.test.ts +++ b/packages/core/rendering/core-rendering-server-internal/src/bootstrap/bootstrap_renderer.test.ts @@ -15,7 +15,7 @@ import { import { PackageInfo } from '@kbn/config'; import { AuthStatus } from '@kbn/core-http-server'; -import { UiPlugins } from '../../plugins'; +import type { UiPlugins } from '@kbn/core-plugins-base-server-internal'; import { httpServiceMock, httpServerMock } from '@kbn/core-http-server-mocks'; import { uiSettingsServiceMock } from '@kbn/core-ui-settings-server-mocks'; import { bootstrapRendererFactory, BootstrapRenderer } from './bootstrap_renderer'; diff --git a/src/core/server/rendering/bootstrap/bootstrap_renderer.ts b/packages/core/rendering/core-rendering-server-internal/src/bootstrap/bootstrap_renderer.ts similarity index 97% rename from src/core/server/rendering/bootstrap/bootstrap_renderer.ts rename to packages/core/rendering/core-rendering-server-internal/src/bootstrap/bootstrap_renderer.ts index 4c20f8d3d799a..8424bb3e68a1d 100644 --- a/src/core/server/rendering/bootstrap/bootstrap_renderer.ts +++ b/packages/core/rendering/core-rendering-server-internal/src/bootstrap/bootstrap_renderer.ts @@ -11,7 +11,7 @@ import { PackageInfo } from '@kbn/config'; import { ThemeVersion } from '@kbn/ui-shared-deps-npm'; import type { KibanaRequest, HttpAuth } from '@kbn/core-http-server'; import type { IUiSettingsClient } from '@kbn/core-ui-settings-server'; -import { UiPlugins } from '../../plugins'; +import type { UiPlugins } from '@kbn/core-plugins-base-server-internal'; import { getPluginsBundlePaths } from './get_plugin_bundle_paths'; import { getJsDependencyPaths } from './get_js_dependency_paths'; import { getThemeTag } from './get_theme_tag'; diff --git a/src/core/server/rendering/bootstrap/get_js_dependency_paths.test.ts b/packages/core/rendering/core-rendering-server-internal/src/bootstrap/get_js_dependency_paths.test.ts similarity index 100% rename from src/core/server/rendering/bootstrap/get_js_dependency_paths.test.ts rename to packages/core/rendering/core-rendering-server-internal/src/bootstrap/get_js_dependency_paths.test.ts diff --git a/src/core/server/rendering/bootstrap/get_js_dependency_paths.ts b/packages/core/rendering/core-rendering-server-internal/src/bootstrap/get_js_dependency_paths.ts similarity index 100% rename from src/core/server/rendering/bootstrap/get_js_dependency_paths.ts rename to packages/core/rendering/core-rendering-server-internal/src/bootstrap/get_js_dependency_paths.ts diff --git a/src/core/server/rendering/bootstrap/get_plugin_bundle_paths.test.ts b/packages/core/rendering/core-rendering-server-internal/src/bootstrap/get_plugin_bundle_paths.test.ts similarity index 94% rename from src/core/server/rendering/bootstrap/get_plugin_bundle_paths.test.ts rename to packages/core/rendering/core-rendering-server-internal/src/bootstrap/get_plugin_bundle_paths.test.ts index e3746eeb17a00..619765cdc7b6a 100644 --- a/src/core/server/rendering/bootstrap/get_plugin_bundle_paths.test.ts +++ b/packages/core/rendering/core-rendering-server-internal/src/bootstrap/get_plugin_bundle_paths.test.ts @@ -6,7 +6,8 @@ * Side Public License, v 1. */ -import { InternalPluginInfo, PluginType, UiPlugins } from '../../plugins'; +import { PluginType } from '@kbn/core-base-common'; +import type { InternalPluginInfo, UiPlugins } from '@kbn/core-plugins-base-server-internal'; import { getPluginsBundlePaths } from './get_plugin_bundle_paths'; const createUiPlugins = (pluginDeps: Record) => { diff --git a/src/core/server/rendering/bootstrap/get_plugin_bundle_paths.ts b/packages/core/rendering/core-rendering-server-internal/src/bootstrap/get_plugin_bundle_paths.ts similarity index 95% rename from src/core/server/rendering/bootstrap/get_plugin_bundle_paths.ts rename to packages/core/rendering/core-rendering-server-internal/src/bootstrap/get_plugin_bundle_paths.ts index e5a9ed9fdd3d0..ad9f3edb4aa51 100644 --- a/src/core/server/rendering/bootstrap/get_plugin_bundle_paths.ts +++ b/packages/core/rendering/core-rendering-server-internal/src/bootstrap/get_plugin_bundle_paths.ts @@ -6,7 +6,7 @@ * Side Public License, v 1. */ -import { UiPlugins } from '../../plugins'; +import type { UiPlugins } from '@kbn/core-plugins-base-server-internal'; import { filterUiPlugins } from '../filter_ui_plugins'; export interface PluginInfo { diff --git a/src/core/server/rendering/bootstrap/get_theme_tag.test.ts b/packages/core/rendering/core-rendering-server-internal/src/bootstrap/get_theme_tag.test.ts similarity index 100% rename from src/core/server/rendering/bootstrap/get_theme_tag.test.ts rename to packages/core/rendering/core-rendering-server-internal/src/bootstrap/get_theme_tag.test.ts diff --git a/src/core/server/rendering/bootstrap/get_theme_tag.ts b/packages/core/rendering/core-rendering-server-internal/src/bootstrap/get_theme_tag.ts similarity index 100% rename from src/core/server/rendering/bootstrap/get_theme_tag.ts rename to packages/core/rendering/core-rendering-server-internal/src/bootstrap/get_theme_tag.ts diff --git a/src/core/server/rendering/bootstrap/index.ts b/packages/core/rendering/core-rendering-server-internal/src/bootstrap/index.ts similarity index 100% rename from src/core/server/rendering/bootstrap/index.ts rename to packages/core/rendering/core-rendering-server-internal/src/bootstrap/index.ts diff --git a/src/core/server/rendering/bootstrap/register_bootstrap_route.ts b/packages/core/rendering/core-rendering-server-internal/src/bootstrap/register_bootstrap_route.ts similarity index 100% rename from src/core/server/rendering/bootstrap/register_bootstrap_route.ts rename to packages/core/rendering/core-rendering-server-internal/src/bootstrap/register_bootstrap_route.ts diff --git a/src/core/server/rendering/bootstrap/render_template.test.ts b/packages/core/rendering/core-rendering-server-internal/src/bootstrap/render_template.test.ts similarity index 100% rename from src/core/server/rendering/bootstrap/render_template.test.ts rename to packages/core/rendering/core-rendering-server-internal/src/bootstrap/render_template.test.ts diff --git a/src/core/server/rendering/bootstrap/render_template.ts b/packages/core/rendering/core-rendering-server-internal/src/bootstrap/render_template.ts similarity index 100% rename from src/core/server/rendering/bootstrap/render_template.ts rename to packages/core/rendering/core-rendering-server-internal/src/bootstrap/render_template.ts diff --git a/src/core/server/rendering/filter_ui_plugins.test.ts b/packages/core/rendering/core-rendering-server-internal/src/filter_ui_plugins.test.ts similarity index 93% rename from src/core/server/rendering/filter_ui_plugins.test.ts rename to packages/core/rendering/core-rendering-server-internal/src/filter_ui_plugins.test.ts index fc013b4be0d07..096e0cc57b1f6 100644 --- a/src/core/server/rendering/filter_ui_plugins.test.ts +++ b/packages/core/rendering/core-rendering-server-internal/src/filter_ui_plugins.test.ts @@ -6,7 +6,8 @@ * Side Public License, v 1. */ -import type { DiscoveredPlugin, PluginName, UiPlugins } from '../plugins'; +import type { PluginName, DiscoveredPlugin } from '@kbn/core-base-common'; +import type { UiPlugins } from '@kbn/core-plugins-base-server-internal'; import { filterUiPlugins } from './filter_ui_plugins'; function createMockPlugin(params: Partial) { diff --git a/src/core/server/rendering/filter_ui_plugins.ts b/packages/core/rendering/core-rendering-server-internal/src/filter_ui_plugins.ts similarity index 95% rename from src/core/server/rendering/filter_ui_plugins.ts rename to packages/core/rendering/core-rendering-server-internal/src/filter_ui_plugins.ts index d3ca102a35758..e1be7719bfea7 100644 --- a/src/core/server/rendering/filter_ui_plugins.ts +++ b/packages/core/rendering/core-rendering-server-internal/src/filter_ui_plugins.ts @@ -6,7 +6,7 @@ * Side Public License, v 1. */ -import type { UiPlugins } from '../plugins'; +import type { UiPlugins } from '@kbn/core-plugins-base-server-internal'; /** * Gets the array of plugins that should be enabled on the page. diff --git a/src/core/server/rendering/index.ts b/packages/core/rendering/core-rendering-server-internal/src/index.ts similarity index 94% rename from src/core/server/rendering/index.ts rename to packages/core/rendering/core-rendering-server-internal/src/index.ts index 6cf0e2a74aa1f..e1cac45f7765c 100644 --- a/src/core/server/rendering/index.ts +++ b/packages/core/rendering/core-rendering-server-internal/src/index.ts @@ -7,6 +7,7 @@ */ export { RenderingService } from './rendering_service'; +export { Fonts } from './views'; export type { InternalRenderingServicePreboot, InternalRenderingServiceSetup, diff --git a/src/core/server/rendering/internal_types.ts b/packages/core/rendering/core-rendering-server-internal/src/internal_types.ts similarity index 100% rename from src/core/server/rendering/internal_types.ts rename to packages/core/rendering/core-rendering-server-internal/src/internal_types.ts diff --git a/src/core/server/rendering/render_utils.test.ts b/packages/core/rendering/core-rendering-server-internal/src/render_utils.test.ts similarity index 100% rename from src/core/server/rendering/render_utils.test.ts rename to packages/core/rendering/core-rendering-server-internal/src/render_utils.test.ts diff --git a/src/core/server/rendering/render_utils.ts b/packages/core/rendering/core-rendering-server-internal/src/render_utils.ts similarity index 100% rename from src/core/server/rendering/render_utils.ts rename to packages/core/rendering/core-rendering-server-internal/src/render_utils.ts diff --git a/src/core/server/rendering/rendering_service.test.mocks.ts b/packages/core/rendering/core-rendering-server-internal/src/rendering_service.test.mocks.ts similarity index 100% rename from src/core/server/rendering/rendering_service.test.mocks.ts rename to packages/core/rendering/core-rendering-server-internal/src/rendering_service.test.mocks.ts diff --git a/src/core/server/rendering/rendering_service.test.ts b/packages/core/rendering/core-rendering-server-internal/src/rendering_service.test.ts similarity index 99% rename from src/core/server/rendering/rendering_service.test.ts rename to packages/core/rendering/core-rendering-server-internal/src/rendering_service.test.ts index 424bcd8a6533b..48196717c6f9f 100644 --- a/src/core/server/rendering/rendering_service.test.ts +++ b/packages/core/rendering/core-rendering-server-internal/src/rendering_service.test.ts @@ -22,7 +22,7 @@ import { mockRenderingServiceParams, mockRenderingPrebootDeps, mockRenderingSetupDeps, -} from './__mocks__/params'; +} from './test_helpers/params'; import { InternalRenderingServicePreboot, InternalRenderingServiceSetup } from './types'; import { RenderingService } from './rendering_service'; import { AuthStatus } from '@kbn/core-http-server'; diff --git a/src/core/server/rendering/rendering_service.tsx b/packages/core/rendering/core-rendering-server-internal/src/rendering_service.tsx similarity index 98% rename from src/core/server/rendering/rendering_service.tsx rename to packages/core/rendering/core-rendering-server-internal/src/rendering_service.tsx index c5b56a06782bc..653768c83d784 100644 --- a/src/core/server/rendering/rendering_service.tsx +++ b/packages/core/rendering/core-rendering-server-internal/src/rendering_service.tsx @@ -8,15 +8,15 @@ import React from 'react'; import { renderToStaticMarkup } from 'react-dom/server'; +import { firstValueFrom, of } from 'rxjs'; import { catchError, take, timeout } from 'rxjs/operators'; import { i18n } from '@kbn/i18n'; import type { ThemeVersion } from '@kbn/ui-shared-deps-npm'; -import { firstValueFrom, of } from 'rxjs'; import type { CoreContext } from '@kbn/core-base-server-internal'; import type { KibanaRequest, HttpAuth } from '@kbn/core-http-server'; import type { IUiSettingsClient } from '@kbn/core-ui-settings-server'; -import type { UiPlugins } from '../plugins'; +import type { UiPlugins } from '@kbn/core-plugins-base-server-internal'; import { Template } from './views'; import { IRenderOptions, diff --git a/src/core/server/rendering/__mocks__/params.ts b/packages/core/rendering/core-rendering-server-internal/src/test_helpers/params.ts similarity index 85% rename from src/core/server/rendering/__mocks__/params.ts rename to packages/core/rendering/core-rendering-server-internal/src/test_helpers/params.ts index c75353b87a65d..51dfab71efd22 100644 --- a/src/core/server/rendering/__mocks__/params.ts +++ b/packages/core/rendering/core-rendering-server-internal/src/test_helpers/params.ts @@ -10,7 +10,6 @@ import { mockCoreContext } from '@kbn/core-base-server-mocks'; import { httpServiceMock } from '@kbn/core-http-server-mocks'; import { elasticsearchServiceMock } from '@kbn/core-elasticsearch-server-mocks'; import { statusServiceMock } from '@kbn/core-status-server-mocks'; -import { pluginServiceMock } from '../../plugins/plugins_service.mock'; const context = mockCoreContext.create(); const httpPreboot = httpServiceMock.createInternalPrebootContract(); @@ -18,14 +17,22 @@ const httpSetup = httpServiceMock.createInternalSetupContract(); const status = statusServiceMock.createInternalSetupContract(); const elasticsearch = elasticsearchServiceMock.createInternalSetup(); +function createUiPlugins() { + return { + browserConfigs: new Map(), + internal: new Map(), + public: new Map(), + }; +} + export const mockRenderingServiceParams = context; export const mockRenderingPrebootDeps = { http: httpPreboot, - uiPlugins: pluginServiceMock.createUiPlugins(), + uiPlugins: createUiPlugins(), }; export const mockRenderingSetupDeps = { elasticsearch, http: httpSetup, - uiPlugins: pluginServiceMock.createUiPlugins(), + uiPlugins: createUiPlugins(), status, }; diff --git a/src/core/server/rendering/__mocks__/rendering_service.ts b/packages/core/rendering/core-rendering-server-internal/src/test_helpers/rendering_service.ts similarity index 100% rename from src/core/server/rendering/__mocks__/rendering_service.ts rename to packages/core/rendering/core-rendering-server-internal/src/test_helpers/rendering_service.ts diff --git a/src/core/server/rendering/types.ts b/packages/core/rendering/core-rendering-server-internal/src/types.ts similarity index 96% rename from src/core/server/rendering/types.ts rename to packages/core/rendering/core-rendering-server-internal/src/types.ts index 7068d2a9b789d..e2f7797ac5c42 100644 --- a/src/core/server/rendering/types.ts +++ b/packages/core/rendering/core-rendering-server-internal/src/types.ts @@ -17,7 +17,7 @@ import type { import type { InternalElasticsearchServiceSetup } from '@kbn/core-elasticsearch-server-internal'; import type { InternalStatusServiceSetup } from '@kbn/core-status-server-internal'; import type { IUiSettingsClient } from '@kbn/core-ui-settings-server'; -import { UiPlugins } from '../plugins'; +import type { UiPlugins } from '@kbn/core-plugins-base-server-internal'; /** @internal */ export interface RenderingMetadata { @@ -46,7 +46,7 @@ export interface RenderingSetupDeps { uiPlugins: UiPlugins; } -/** @public */ +/** @internal */ export interface IRenderOptions { /** * Set whether the page is anonymous, which determines what plugins are enabled and whether to output user settings in the page metadata. diff --git a/src/core/server/rendering/views/fonts.tsx b/packages/core/rendering/core-rendering-server-internal/src/views/fonts.tsx similarity index 100% rename from src/core/server/rendering/views/fonts.tsx rename to packages/core/rendering/core-rendering-server-internal/src/views/fonts.tsx diff --git a/src/core/server/rendering/views/index.ts b/packages/core/rendering/core-rendering-server-internal/src/views/index.ts similarity index 92% rename from src/core/server/rendering/views/index.ts rename to packages/core/rendering/core-rendering-server-internal/src/views/index.ts index 1aa6e658e3d29..01f395261eccf 100644 --- a/src/core/server/rendering/views/index.ts +++ b/packages/core/rendering/core-rendering-server-internal/src/views/index.ts @@ -7,3 +7,4 @@ */ export { Template } from './template'; +export { Fonts } from './fonts'; diff --git a/src/core/server/rendering/views/logo.tsx b/packages/core/rendering/core-rendering-server-internal/src/views/logo.tsx similarity index 100% rename from src/core/server/rendering/views/logo.tsx rename to packages/core/rendering/core-rendering-server-internal/src/views/logo.tsx diff --git a/src/core/server/rendering/views/styles.tsx b/packages/core/rendering/core-rendering-server-internal/src/views/styles.tsx similarity index 100% rename from src/core/server/rendering/views/styles.tsx rename to packages/core/rendering/core-rendering-server-internal/src/views/styles.tsx diff --git a/src/core/server/rendering/views/template.tsx b/packages/core/rendering/core-rendering-server-internal/src/views/template.tsx similarity index 100% rename from src/core/server/rendering/views/template.tsx rename to packages/core/rendering/core-rendering-server-internal/src/views/template.tsx diff --git a/packages/core/rendering/core-rendering-server-internal/tsconfig.json b/packages/core/rendering/core-rendering-server-internal/tsconfig.json new file mode 100644 index 0000000000000..73c8a6666ff7e --- /dev/null +++ b/packages/core/rendering/core-rendering-server-internal/tsconfig.json @@ -0,0 +1,19 @@ +{ + "extends": "../../../../tsconfig.bazel.json", + "compilerOptions": { + "declaration": true, + "declarationMap": true, + "emitDeclarationOnly": true, + "outDir": "target_types", + "stripInternal": false, + "types": [ + "jest", + "node", + "react", + ] + }, + "include": [ + "**/*.ts", + "**/*.tsx", + ] +} diff --git a/packages/core/rendering/core-rendering-server-mocks/BUILD.bazel b/packages/core/rendering/core-rendering-server-mocks/BUILD.bazel new file mode 100644 index 0000000000000..9ec36da1a1f67 --- /dev/null +++ b/packages/core/rendering/core-rendering-server-mocks/BUILD.bazel @@ -0,0 +1,106 @@ +load("@npm//@bazel/typescript:index.bzl", "ts_config") +load("@build_bazel_rules_nodejs//:index.bzl", "js_library") +load("//src/dev/bazel:index.bzl", "jsts_transpiler", "pkg_npm", "pkg_npm_types", "ts_project") + +PKG_DIRNAME = "core-rendering-server-mocks" +PKG_REQUIRE_NAME = "@kbn/core-rendering-server-mocks" + +SOURCE_FILES = glob( + [ + "**/*.ts", + ], + exclude = [ + "**/*.config.js", + "**/*.test.*", + "**/*.stories.*", + "**/__snapshots__/**", + "**/integration_tests/**", + "**/mocks/**", + "**/scripts/**", + "**/storybook/**", + "**/test_fixtures/**", + "**/test_helpers/**", + ], +) + +SRCS = SOURCE_FILES + +filegroup( + name = "srcs", + srcs = SRCS, +) + +NPM_MODULE_EXTRA_FILES = [ + "package.json", +] + +RUNTIME_DEPS = [ +] + +TYPES_DEPS = [ + "@npm//@types/node", + "@npm//@types/jest", + "//packages/kbn-utility-types:npm_module_types", + "//packages/core/rendering/core-rendering-server-internal:npm_module_types", +] + +jsts_transpiler( + name = "target_node", + srcs = SRCS, + build_pkg_name = package_name(), +) + +ts_config( + name = "tsconfig", + src = "tsconfig.json", + deps = [ + "//:tsconfig.base.json", + "//:tsconfig.bazel.json", + ], +) + +ts_project( + name = "tsc_types", + args = ['--pretty'], + srcs = SRCS, + deps = TYPES_DEPS, + declaration = True, + declaration_map = True, + emit_declaration_only = True, + out_dir = "target_types", + tsconfig = ":tsconfig", +) + +js_library( + name = PKG_DIRNAME, + srcs = NPM_MODULE_EXTRA_FILES, + deps = RUNTIME_DEPS + [":target_node"], + package_name = PKG_REQUIRE_NAME, + visibility = ["//visibility:public"], +) + +pkg_npm( + name = "npm_module", + deps = [":" + PKG_DIRNAME], +) + +filegroup( + name = "build", + srcs = [":npm_module"], + visibility = ["//visibility:public"], +) + +pkg_npm_types( + name = "npm_module_types", + srcs = SRCS, + deps = [":tsc_types"], + package_name = PKG_REQUIRE_NAME, + tsconfig = ":tsconfig", + visibility = ["//visibility:public"], +) + +filegroup( + name = "build_types", + srcs = [":npm_module_types"], + visibility = ["//visibility:public"], +) diff --git a/packages/core/rendering/core-rendering-server-mocks/README.md b/packages/core/rendering/core-rendering-server-mocks/README.md new file mode 100644 index 0000000000000..72df549319198 --- /dev/null +++ b/packages/core/rendering/core-rendering-server-mocks/README.md @@ -0,0 +1,4 @@ +# @kbn/core-rendering-server-mocks + +This package contains mocks for Core's server-side rendering service. +- `renderingServiceMock` diff --git a/packages/core/rendering/core-rendering-server-mocks/index.ts b/packages/core/rendering/core-rendering-server-mocks/index.ts new file mode 100644 index 0000000000000..e7ce72ce797fb --- /dev/null +++ b/packages/core/rendering/core-rendering-server-mocks/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 { renderingServiceMock } from './src'; diff --git a/packages/core/rendering/core-rendering-server-mocks/jest.config.js b/packages/core/rendering/core-rendering-server-mocks/jest.config.js new file mode 100644 index 0000000000000..5dc1ae51c50b0 --- /dev/null +++ b/packages/core/rendering/core-rendering-server-mocks/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/core/rendering/core-rendering-server-mocks'], +}; diff --git a/packages/core/rendering/core-rendering-server-mocks/kibana.jsonc b/packages/core/rendering/core-rendering-server-mocks/kibana.jsonc new file mode 100644 index 0000000000000..a04eae9cadc20 --- /dev/null +++ b/packages/core/rendering/core-rendering-server-mocks/kibana.jsonc @@ -0,0 +1,7 @@ +{ + "type": "shared-common", + "id": "@kbn/core-rendering-server-mocks", + "owner": "@elastic/kibana-core", + "runtimeDeps": [], + "typeDeps": [], +} diff --git a/packages/core/rendering/core-rendering-server-mocks/package.json b/packages/core/rendering/core-rendering-server-mocks/package.json new file mode 100644 index 0000000000000..572e1d5530587 --- /dev/null +++ b/packages/core/rendering/core-rendering-server-mocks/package.json @@ -0,0 +1,8 @@ +{ + "name": "@kbn/core-rendering-server-mocks", + "private": true, + "version": "1.0.0", + "main": "./target_node/index.js", + "author": "Kibana Core", + "license": "SSPL-1.0 OR Elastic License 2.0" +} diff --git a/packages/core/rendering/core-rendering-server-mocks/src/index.ts b/packages/core/rendering/core-rendering-server-mocks/src/index.ts new file mode 100644 index 0000000000000..d56794e3e9ac6 --- /dev/null +++ b/packages/core/rendering/core-rendering-server-mocks/src/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 { renderingServiceMock } from './rendering_service.mock'; diff --git a/src/core/server/rendering/rendering_service.mock.ts b/packages/core/rendering/core-rendering-server-mocks/src/rendering_service.mock.ts similarity index 55% rename from src/core/server/rendering/rendering_service.mock.ts rename to packages/core/rendering/core-rendering-server-mocks/src/rendering_service.mock.ts index 3d8213da62c6d..5cdf5c92f9237 100644 --- a/src/core/server/rendering/rendering_service.mock.ts +++ b/packages/core/rendering/core-rendering-server-mocks/src/rendering_service.mock.ts @@ -6,7 +6,14 @@ * Side Public License, v 1. */ -import { InternalRenderingServicePreboot, InternalRenderingServiceSetup } from './types'; +import type { PublicMethodsOf } from '@kbn/utility-types'; +import type { + InternalRenderingServicePreboot, + InternalRenderingServiceSetup, + RenderingService, +} from '@kbn/core-rendering-server-internal'; + +export type RenderingServiceMock = jest.Mocked>; function createRenderingPreboot() { const mocked: jest.Mocked = { @@ -22,7 +29,21 @@ function createRenderingSetup() { return mocked; } -export const renderingMock = { +function createRenderingService() { + const mock: RenderingServiceMock = { + preboot: jest.fn(), + setup: jest.fn(), + stop: jest.fn(), + }; + + mock.preboot.mockResolvedValue(createRenderingPreboot()); + mock.setup.mockResolvedValue(createRenderingSetup()); + + return mock; +} + +export const renderingServiceMock = { + create: createRenderingService, createPrebootContract: createRenderingPreboot, createSetupContract: createRenderingSetup, }; diff --git a/packages/core/rendering/core-rendering-server-mocks/tsconfig.json b/packages/core/rendering/core-rendering-server-mocks/tsconfig.json new file mode 100644 index 0000000000000..71bb40fe57f3f --- /dev/null +++ b/packages/core/rendering/core-rendering-server-mocks/tsconfig.json @@ -0,0 +1,17 @@ +{ + "extends": "../../../../tsconfig.bazel.json", + "compilerOptions": { + "declaration": true, + "declarationMap": true, + "emitDeclarationOnly": true, + "outDir": "target_types", + "stripInternal": false, + "types": [ + "jest", + "node" + ] + }, + "include": [ + "**/*.ts", + ] +} diff --git a/src/core/server/core_app/bundle_routes/register_bundle_routes.test.ts b/src/core/server/core_app/bundle_routes/register_bundle_routes.test.ts index 12f3041ec53fb..f816a85404f7a 100644 --- a/src/core/server/core_app/bundle_routes/register_bundle_routes.test.ts +++ b/src/core/server/core_app/bundle_routes/register_bundle_routes.test.ts @@ -10,7 +10,7 @@ import { registerRouteForBundleMock } from './register_bundle_routes.test.mocks' import { PackageInfo } from '@kbn/config'; import { httpServiceMock } from '@kbn/core-http-server-mocks'; -import { InternalPluginInfo, UiPlugins } from '../../plugins'; +import type { InternalPluginInfo, UiPlugins } from '@kbn/core-plugins-base-server-internal'; import { registerBundleRoutes } from './register_bundle_routes'; import { FileHashCache } from './file_hash_cache'; diff --git a/src/core/server/core_app/bundle_routes/register_bundle_routes.ts b/src/core/server/core_app/bundle_routes/register_bundle_routes.ts index 6f701b46dcc8b..4adb50fdc96ca 100644 --- a/src/core/server/core_app/bundle_routes/register_bundle_routes.ts +++ b/src/core/server/core_app/bundle_routes/register_bundle_routes.ts @@ -12,7 +12,7 @@ import { fromRoot } from '@kbn/utils'; import UiSharedDepsNpm from '@kbn/ui-shared-deps-npm'; import * as UiSharedDepsSrc from '@kbn/ui-shared-deps-src'; import type { IRouter } from '@kbn/core-http-server'; -import { UiPlugins } from '../../plugins'; +import type { UiPlugins } from '@kbn/core-plugins-base-server-internal'; import { FileHashCache } from './file_hash_cache'; import { registerRouteForBundle } from './bundles_route'; diff --git a/src/core/server/core_app/core_app.test.ts b/src/core/server/core_app/core_app.test.ts index 913ac2aa9ef67..76663eeed2fd1 100644 --- a/src/core/server/core_app/core_app.test.ts +++ b/src/core/server/core_app/core_app.test.ts @@ -10,9 +10,9 @@ import { registerBundleRoutesMock } from './core_app.test.mocks'; import { mockCoreContext } from '@kbn/core-base-server-mocks'; import { mockRouter } from '@kbn/core-http-router-server-mocks'; +import type { UiPlugins } from '@kbn/core-plugins-base-server-internal'; import { coreMock, httpServerMock } from '../mocks'; import { httpResourcesMock } from '../http_resources/http_resources_service.mock'; -import type { UiPlugins } from '../plugins'; import { PluginType } from '../plugins'; import { CoreApp } from './core_app'; import { RequestHandlerContext } from '..'; diff --git a/src/core/server/core_app/core_app.ts b/src/core/server/core_app/core_app.ts index d6f305698fc94..b8701d7646b7e 100644 --- a/src/core/server/core_app/core_app.ts +++ b/src/core/server/core_app/core_app.ts @@ -20,10 +20,10 @@ import type { KibanaRequest, IBasePath, } from '@kbn/core-http-server'; +import type { UiPlugins } from '@kbn/core-plugins-base-server-internal'; import { HttpResources, HttpResourcesServiceToolkit } from '../http_resources'; import { InternalCorePreboot, InternalCoreSetup } from '../internal_types'; import { registerBundleRoutes } from './bundle_routes'; -import { UiPlugins } from '../plugins'; import type { InternalCoreAppRequestHandlerContext } from './internal_types'; /** @internal */ diff --git a/src/core/server/http_resources/http_resources_service.test.ts b/src/core/server/http_resources/http_resources_service.test.ts index 47b0ef049485b..ea04f30847508 100644 --- a/src/core/server/http_resources/http_resources_service.test.ts +++ b/src/core/server/http_resources/http_resources_service.test.ts @@ -13,7 +13,7 @@ import type { RouteConfig } from '@kbn/core-http-server'; import { mockCoreContext } from '@kbn/core-base-server-mocks'; import { httpServiceMock, httpServerMock } from '@kbn/core-http-server-mocks'; import { coreMock } from '../mocks'; -import { renderingMock } from '../rendering/rendering_service.mock'; +import { renderingServiceMock } from '@kbn/core-rendering-server-mocks'; import { HttpResourcesService, PrebootDeps, SetupDeps } from './http_resources_service'; import { httpResourcesMock } from './http_resources_service.mock'; import { HttpResources } from '..'; @@ -37,11 +37,11 @@ describe('HttpResources service', () => { beforeEach(() => { prebootDeps = { http: httpServiceMock.createInternalPrebootContract(), - rendering: renderingMock.createPrebootContract(), + rendering: renderingServiceMock.createPrebootContract(), }; setupDeps = { http: httpServiceMock.createInternalSetupContract(), - rendering: renderingMock.createSetupContract(), + rendering: renderingServiceMock.createSetupContract(), }; service = new HttpResourcesService(coreContext); router = httpServiceMock.createRouter(); diff --git a/src/core/server/http_resources/http_resources_service.ts b/src/core/server/http_resources/http_resources_service.ts index 5db20bf45e409..7cc88699ea7ba 100644 --- a/src/core/server/http_resources/http_resources_service.ts +++ b/src/core/server/http_resources/http_resources_service.ts @@ -18,8 +18,11 @@ import type { InternalHttpServiceSetup, InternalHttpServicePreboot, } from '@kbn/core-http-server-internal'; +import type { + InternalRenderingServicePreboot, + InternalRenderingServiceSetup, +} from '@kbn/core-rendering-server-internal'; import type { RequestHandlerContext } from '@kbn/core-http-request-handler-context-server'; -import { InternalRenderingServicePreboot, InternalRenderingServiceSetup } from '../rendering'; import { InternalHttpResourcesSetup, HttpResources, diff --git a/src/core/server/index.ts b/src/core/server/index.ts index 020975c15fb1b..dafd53e374fe8 100644 --- a/src/core/server/index.ts +++ b/src/core/server/index.ts @@ -230,7 +230,6 @@ export type { HttpResourcesRequestHandler, } from './http_resources'; -export type { IRenderOptions } from './rendering'; export type { LoggingServiceSetup, LoggerContextConfigInput, diff --git a/src/core/server/internal_types.ts b/src/core/server/internal_types.ts index e744ae01d1be0..683d08fe4f849 100644 --- a/src/core/server/internal_types.ts +++ b/src/core/server/internal_types.ts @@ -58,7 +58,7 @@ import type { InternalUiSettingsServiceSetup, InternalUiSettingsServiceStart, } from '@kbn/core-ui-settings-server-internal'; -import { InternalRenderingServiceSetup } from './rendering'; +import type { InternalRenderingServiceSetup } from '@kbn/core-rendering-server-internal'; import { InternalHttpResourcesPreboot, InternalHttpResourcesSetup } from './http_resources'; /** @internal */ diff --git a/src/core/server/mocks.ts b/src/core/server/mocks.ts index 6c2ef712cbf56..cd0429415e7cb 100644 --- a/src/core/server/mocks.ts +++ b/src/core/server/mocks.ts @@ -31,6 +31,7 @@ import { coreUsageDataServiceMock } from '@kbn/core-usage-data-server-mocks'; import { i18nServiceMock } from '@kbn/core-i18n-server-mocks'; import { statusServiceMock } from '@kbn/core-status-server-mocks'; import { uiSettingsServiceMock } from '@kbn/core-ui-settings-server-mocks'; +import { renderingServiceMock } from '@kbn/core-rendering-server-mocks'; import type { PluginInitializerContext, CoreSetup, @@ -40,7 +41,6 @@ import type { RequestHandlerContext, } from '.'; import { httpResourcesMock } from './http_resources/http_resources_service.mock'; -import { renderingMock } from './rendering/rendering_service.mock'; import { SharedGlobalConfig } from './plugins'; export { configServiceMock, configDeprecationsMock } from '@kbn/config-mocks'; @@ -57,7 +57,7 @@ export { export { migrationMocks } from '@kbn/core-saved-objects-migration-server-mocks'; export { uiSettingsServiceMock } from '@kbn/core-ui-settings-server-mocks'; export { metricsServiceMock } from '@kbn/core-metrics-server-mocks'; -export { renderingMock } from './rendering/rendering_service.mock'; +export { renderingServiceMock } from '@kbn/core-rendering-server-mocks'; export { statusServiceMock } from '@kbn/core-status-server-mocks'; export { contextServiceMock } from '@kbn/core-http-context-server-mocks'; export { capabilitiesServiceMock } from '@kbn/core-capabilities-server-mocks'; @@ -237,7 +237,7 @@ function createInternalCoreSetupMock() { environment: environmentServiceMock.createSetupContract(), i18n: i18nServiceMock.createSetupContract(), httpResources: httpResourcesMock.createSetupContract(), - rendering: renderingMock.createSetupContract(), + rendering: renderingServiceMock.createSetupContract(), uiSettings: uiSettingsServiceMock.createSetupContract(), logging: loggingServiceMock.createInternalSetupContract(), metrics: metricsServiceMock.createInternalSetupContract(), diff --git a/src/core/server/plugins/index.ts b/src/core/server/plugins/index.ts index 1b655ccd8bd98..2111d467ef3c2 100644 --- a/src/core/server/plugins/index.ts +++ b/src/core/server/plugins/index.ts @@ -10,7 +10,6 @@ export { PluginsService } from './plugins_service'; export type { PluginsServiceSetup, PluginsServiceStart, - UiPlugins, DiscoveredPlugins, } from './plugins_service'; export { config } from './plugins_config'; diff --git a/src/core/server/plugins/plugins_service.ts b/src/core/server/plugins/plugins_service.ts index a95619f3bc453..3305ff0a06b43 100644 --- a/src/core/server/plugins/plugins_service.ts +++ b/src/core/server/plugins/plugins_service.ts @@ -17,15 +17,10 @@ import type { CoreContext, CoreService } from '@kbn/core-base-server-internal'; import type { PluginName } from '@kbn/core-base-common'; import type { InternalEnvironmentServicePreboot } from '@kbn/core-environment-server-internal'; import type { InternalNodeServicePreboot } from '@kbn/core-node-server-internal'; +import type { InternalPluginInfo, UiPlugins } from '@kbn/core-plugins-base-server-internal'; import { discover, PluginDiscoveryError, PluginDiscoveryErrorType } from './discovery'; import { PluginWrapper } from './plugin'; -import { - DiscoveredPlugin, - InternalPluginInfo, - PluginConfigDescriptor, - PluginDependencies, - PluginType, -} from './types'; +import { DiscoveredPlugin, PluginConfigDescriptor, PluginDependencies, PluginType } from './types'; import { PluginsConfig, PluginsConfigType } from './plugins_config'; import { PluginsSystem } from './plugins_system'; import { createBrowserConfig } from './create_browser_config'; @@ -48,25 +43,6 @@ export interface PluginsServiceSetup { contracts: Map; } -/** @internal */ -export interface UiPlugins { - /** - * Paths to all discovered ui plugin entrypoints on the filesystem, even if - * disabled. - */ - internal: Map; - - /** - * Information needed by client-side to load plugins and wire dependencies. - */ - public: Map; - - /** - * Configuration for plugins to be exposed to the client-side. - */ - browserConfigs: Map>; -} - /** @internal */ export interface PluginsServiceStart { /** Start contracts returned by plugins. */ diff --git a/src/core/server/plugins/types.ts b/src/core/server/plugins/types.ts index f8b20b66f5069..699631bc4411e 100644 --- a/src/core/server/plugins/types.ts +++ b/src/core/server/plugins/types.ts @@ -254,28 +254,6 @@ export interface PluginManifest { readonly enabledOnAnonymousPages?: boolean; } -/** - * @internal - */ -export interface InternalPluginInfo { - /** - * Version of the plugin - */ - readonly version: string; - /** - * Bundles that must be loaded for this plugin - */ - readonly requiredBundles: readonly string[]; - /** - * Path to the target/public directory of the plugin which should be served - */ - readonly publicTargetDir: string; - /** - * Path to the plugin assets directory. - */ - readonly publicAssetsDir: string; -} - /** * The interface that should be returned by a `PluginInitializer` for a `preboot` plugin. * diff --git a/src/core/server/server.test.mocks.ts b/src/core/server/server.test.mocks.ts index dec2b17ae8c61..3e1d5c0e3a28f 100644 --- a/src/core/server/server.test.mocks.ts +++ b/src/core/server/server.test.mocks.ts @@ -63,10 +63,12 @@ jest.doMock('@kbn/core-config-server-internal', () => ({ ensureValidConfiguration: mockEnsureValidConfiguration, })); -import { RenderingService, mockRenderingService } from './rendering/__mocks__/rendering_service'; +import { renderingServiceMock } from '@kbn/core-rendering-server-mocks'; -export { mockRenderingService }; -jest.doMock('./rendering/rendering_service', () => ({ RenderingService })); +export const mockRenderingService = renderingServiceMock.create(); +jest.doMock('@kbn/core-rendering-server-internal', () => ({ + RenderingService: jest.fn(() => mockRenderingService), +})); import { environmentServiceMock } from '@kbn/core-environment-server-mocks'; diff --git a/src/core/server/server.ts b/src/core/server/server.ts index e333e8b81a404..b7f41dd31dd04 100644 --- a/src/core/server/server.ts +++ b/src/core/server/server.ts @@ -66,10 +66,10 @@ import type { RequestHandlerContext, PrebootRequestHandlerContext, } from '@kbn/core-http-request-handler-context-server'; +import { RenderingService } from '@kbn/core-rendering-server-internal'; import { CoreApp } from './core_app'; import { HttpResourcesService } from './http_resources'; -import { RenderingService } from './rendering'; import { PluginsService, config as pluginsConfig } from './plugins'; import { InternalCorePreboot, InternalCoreSetup, InternalCoreStart } from './internal_types'; import { DiscoveredPlugins } from './plugins'; diff --git a/x-pack/plugins/security/server/authentication/unauthenticated_page.test.tsx b/x-pack/plugins/security/server/authentication/unauthenticated_page.test.tsx index 708ca11ca8f78..aca2a5dd77e6c 100644 --- a/x-pack/plugins/security/server/authentication/unauthenticated_page.test.tsx +++ b/x-pack/plugins/security/server/authentication/unauthenticated_page.test.tsx @@ -12,7 +12,7 @@ import { coreMock } from '@kbn/core/server/mocks'; import { UnauthenticatedPage } from './unauthenticated_page'; -jest.mock('@kbn/core/server/rendering/views/fonts', () => ({ +jest.mock('@kbn/core-rendering-server-internal', () => ({ Fonts: () => <>MockedFonts, })); diff --git a/x-pack/plugins/security/server/authorization/reset_session_page.test.tsx b/x-pack/plugins/security/server/authorization/reset_session_page.test.tsx index d5bce1e146eb1..8111246f0776d 100644 --- a/x-pack/plugins/security/server/authorization/reset_session_page.test.tsx +++ b/x-pack/plugins/security/server/authorization/reset_session_page.test.tsx @@ -12,7 +12,7 @@ import { coreMock } from '@kbn/core/server/mocks'; import { ResetSessionPage } from './reset_session_page'; -jest.mock('@kbn/core/server/rendering/views/fonts', () => ({ +jest.mock('@kbn/core-rendering-server-internal', () => ({ Fonts: () => <>MockedFonts, })); diff --git a/x-pack/plugins/security/server/prompt_page.test.tsx b/x-pack/plugins/security/server/prompt_page.test.tsx index 11b45f62f05d6..ef59cacd31bfc 100644 --- a/x-pack/plugins/security/server/prompt_page.test.tsx +++ b/x-pack/plugins/security/server/prompt_page.test.tsx @@ -12,7 +12,7 @@ import { coreMock } from '@kbn/core/server/mocks'; import { PromptPage } from './prompt_page'; -jest.mock('@kbn/core/server/rendering/views/fonts', () => ({ +jest.mock('@kbn/core-rendering-server-internal', () => ({ Fonts: () => <>MockedFonts, })); diff --git a/x-pack/plugins/security/server/prompt_page.tsx b/x-pack/plugins/security/server/prompt_page.tsx index e15574d5af4ef..14f59df15db39 100644 --- a/x-pack/plugins/security/server/prompt_page.tsx +++ b/x-pack/plugins/security/server/prompt_page.tsx @@ -20,8 +20,8 @@ import createCache from '@emotion/cache'; import type { ReactNode } from 'react'; import React from 'react'; +import { Fonts } from '@kbn/core-rendering-server-internal'; import type { IBasePath } from '@kbn/core/server'; -import { Fonts } from '@kbn/core/server/rendering/views/fonts'; import { i18n } from '@kbn/i18n'; import { I18nProvider } from '@kbn/i18n-react'; import UiSharedDepsNpm from '@kbn/ui-shared-deps-npm'; diff --git a/yarn.lock b/yarn.lock index 968956a15ccfa..b9db4636175d0 100644 --- a/yarn.lock +++ b/yarn.lock @@ -3118,6 +3118,10 @@ version "0.0.0" uid "" +"@kbn/core-plugins-base-server-internal@link:bazel-bin/packages/core/plugins/core-plugins-base-server-internal": + version "0.0.0" + uid "" + "@kbn/core-plugins-browser-internal@link:bazel-bin/packages/core/plugins/core-plugins-browser-internal": version "0.0.0" uid "" @@ -3150,6 +3154,14 @@ version "0.0.0" uid "" +"@kbn/core-rendering-server-internal@link:bazel-bin/packages/core/rendering/core-rendering-server-internal": + version "0.0.0" + uid "" + +"@kbn/core-rendering-server-mocks@link:bazel-bin/packages/core/rendering/core-rendering-server-mocks": + version "0.0.0" + uid "" + "@kbn/core-root-browser-internal@link:bazel-bin/packages/core/root/core-root-browser-internal": version "0.0.0" uid "" @@ -7251,6 +7263,10 @@ version "0.0.0" uid "" +"@types/kbn__core-plugins-base-server-internal@link:bazel-bin/packages/core/plugins/core-plugins-base-server-internal/npm_module_types": + version "0.0.0" + uid "" + "@types/kbn__core-plugins-browser-internal@link:bazel-bin/packages/core/plugins/core-plugins-browser-internal/npm_module_types": version "0.0.0" uid "" @@ -7287,6 +7303,14 @@ version "0.0.0" uid "" +"@types/kbn__core-rendering-server-internal@link:bazel-bin/packages/core/rendering/core-rendering-server-internal/npm_module_types": + version "0.0.0" + uid "" + +"@types/kbn__core-rendering-server-mocks@link:bazel-bin/packages/core/rendering/core-rendering-server-mocks/npm_module_types": + version "0.0.0" + uid "" + "@types/kbn__core-root-browser-internal@link:bazel-bin/packages/core/root/core-root-browser-internal/npm_module_types": version "0.0.0" uid "" From f8a90275d55257c8b08a35c267fbb189ef26d81e Mon Sep 17 00:00:00 2001 From: Julia Bardi <90178898+juliaElastic@users.noreply.github.com> Date: Mon, 3 Oct 2022 10:17:38 +0200 Subject: [PATCH 70/72] [Fleet] Bulk action refactor and small fixes (#142299) * refactor to report errors in agent update for all actions * fixed tests * fixed types * refactor to reduce duplication * fixed test * fix for cypress test * passing error reason Co-authored-by: Kibana Machine <42973632+kibanamachine@users.noreply.github.com> --- x-pack/plugins/fleet/cypress/plugins/index.ts | 1 + .../components/tags_add_remove.tsx | 14 +++++- .../server/services/agents/action_status.ts | 5 +- .../server/services/agents/actions.test.ts | 12 +++-- .../fleet/server/services/agents/actions.ts | 50 +++++++++++++++---- .../fleet/server/services/agents/crud.ts | 21 ++++---- .../services/agents/reassign_action_runner.ts | 39 ++++----------- .../server/services/agents/unenroll.test.ts | 16 +++--- .../services/agents/unenroll_action_runner.ts | 45 +++++++---------- .../agents/update_agent_tags_action_runner.ts | 35 +++++-------- .../server/services/agents/upgrade.test.ts | 4 +- .../services/agents/upgrade_action_runner.ts | 47 +++++++---------- 12 files changed, 144 insertions(+), 145 deletions(-) diff --git a/x-pack/plugins/fleet/cypress/plugins/index.ts b/x-pack/plugins/fleet/cypress/plugins/index.ts index d11dbb1e38ada..9fce88b6cd689 100644 --- a/x-pack/plugins/fleet/cypress/plugins/index.ts +++ b/x-pack/plugins/fleet/cypress/plugins/index.ts @@ -35,6 +35,7 @@ const plugin: Cypress.PluginConfig = (on, config) => { query, ignore_unavailable: ignoreUnavailable, refresh: true, + conflicts: 'proceed', }); }, }); diff --git a/x-pack/plugins/fleet/public/applications/fleet/sections/agents/agent_list_page/components/tags_add_remove.tsx b/x-pack/plugins/fleet/public/applications/fleet/sections/agents/agent_list_page/components/tags_add_remove.tsx index 70b4da44dad68..8307bc3467cc2 100644 --- a/x-pack/plugins/fleet/public/applications/fleet/sections/agents/agent_list_page/components/tags_add_remove.tsx +++ b/x-pack/plugins/fleet/public/applications/fleet/sections/agents/agent_list_page/components/tags_add_remove.tsx @@ -123,12 +123,22 @@ export const TagsAddRemove: React.FC = ({ // sending updated tags to add/remove, in case multiple actions are done quickly and the first one is not yet propagated const updatedTagsToAdd = tagsToAdd.concat( labels - .filter((tag) => tag.checked === 'on' && !selectedTags.includes(tag.label)) + .filter( + (tag) => + tag.checked === 'on' && + !selectedTags.includes(tag.label) && + !tagsToRemove.includes(tag.label) + ) .map((tag) => tag.label) ); const updatedTagsToRemove = tagsToRemove.concat( labels - .filter((tag) => tag.checked !== 'on' && selectedTags.includes(tag.label)) + .filter( + (tag) => + tag.checked !== 'on' && + selectedTags.includes(tag.label) && + !tagsToAdd.includes(tag.label) + ) .map((tag) => tag.label) ); diff --git a/x-pack/plugins/fleet/server/services/agents/action_status.ts b/x-pack/plugins/fleet/server/services/agents/action_status.ts index 8489c25e3fd8d..a057af185a066 100644 --- a/x-pack/plugins/fleet/server/services/agents/action_status.ts +++ b/x-pack/plugins/fleet/server/services/agents/action_status.ts @@ -64,7 +64,10 @@ export async function getActionStatuses( const matchingBucket = (acks?.aggregations?.ack_counts as any)?.buckets?.find( (bucket: any) => bucket.key === action.actionId ); - const nbAgentsAck = (matchingBucket?.agent_count as any)?.value ?? 0; + const nbAgentsAck = Math.min( + matchingBucket?.doc_count ?? 0, + (matchingBucket?.agent_count as any)?.value ?? 0 + ); const completionTime = (matchingBucket?.max_timestamp as any)?.value_as_string; const nbAgentsActioned = action.nbAgentsActioned || action.nbAgentsActionCreated; const complete = nbAgentsAck >= nbAgentsActioned; diff --git a/x-pack/plugins/fleet/server/services/agents/actions.test.ts b/x-pack/plugins/fleet/server/services/agents/actions.test.ts index 97d7c73035e6d..7c88b4885b843 100644 --- a/x-pack/plugins/fleet/server/services/agents/actions.test.ts +++ b/x-pack/plugins/fleet/server/services/agents/actions.test.ts @@ -92,10 +92,14 @@ describe('Agent actions', () => { await cancelAgentAction(esClient, 'action1'); expect(mockedBulkUpdateAgents).toBeCalled(); - expect(mockedBulkUpdateAgents).toBeCalledWith(expect.anything(), [ - expect.objectContaining({ agentId: 'agent1' }), - expect.objectContaining({ agentId: 'agent2' }), - ]); + expect(mockedBulkUpdateAgents).toBeCalledWith( + expect.anything(), + [ + expect.objectContaining({ agentId: 'agent1' }), + expect.objectContaining({ agentId: 'agent2' }), + ], + {} + ); }); }); }); diff --git a/x-pack/plugins/fleet/server/services/agents/actions.ts b/x-pack/plugins/fleet/server/services/agents/actions.ts index 17c745bfd285f..8f9302bd31acd 100644 --- a/x-pack/plugins/fleet/server/services/agents/actions.ts +++ b/x-pack/plugins/fleet/server/services/agents/actions.ts @@ -8,6 +8,7 @@ import uuid from 'uuid'; import type { ElasticsearchClient } from '@kbn/core/server'; +import { appContextService } from '../app_context'; import type { Agent, AgentAction, @@ -101,6 +102,32 @@ export async function bulkCreateAgentActions( return actions; } +export async function createErrorActionResults( + esClient: ElasticsearchClient, + actionId: string, + errors: Record, + errorMessage: string +) { + const errorCount = Object.keys(errors).length; + if (errorCount > 0) { + appContextService + .getLogger() + .info( + `Writing error action results of ${errorCount} agents. Possibly failed validation: ${errorMessage}.` + ); + + // writing out error result for those agents that have errors, so the action is not going to stay in progress forever + await bulkCreateAgentActionResults( + esClient, + Object.keys(errors).map((agentId) => ({ + agentId, + actionId, + error: errors[agentId].message, + })) + ); + } +} + export async function bulkCreateAgentActionResults( esClient: ElasticsearchClient, results: Array<{ @@ -227,16 +254,6 @@ export async function cancelAgentAction(esClient: ElasticsearchClient, actionId: if (!hit._source || !hit._source.agents || !hit._source.action_id) { continue; } - await createAgentAction(esClient, { - id: cancelActionId, - type: 'CANCEL', - agents: hit._source.agents, - data: { - target_id: hit._source.action_id, - }, - created_at: now, - expiration: hit._source.expiration, - }); if (hit._source.type === 'UPGRADE') { await bulkUpdateAgents( esClient, @@ -246,9 +263,20 @@ export async function cancelAgentAction(esClient: ElasticsearchClient, actionId: upgraded_at: null, upgrade_started_at: null, }, - })) + })), + {} ); } + await createAgentAction(esClient, { + id: cancelActionId, + type: 'CANCEL', + agents: hit._source.agents, + data: { + target_id: hit._source.action_id, + }, + created_at: now, + expiration: hit._source.expiration, + }); } return { diff --git a/x-pack/plugins/fleet/server/services/agents/crud.ts b/x-pack/plugins/fleet/server/services/agents/crud.ts index 55a244664238b..d62bbf4c414bb 100644 --- a/x-pack/plugins/fleet/server/services/agents/crud.ts +++ b/x-pack/plugins/fleet/server/services/agents/crud.ts @@ -11,7 +11,7 @@ import type { SavedObjectsClientContract, ElasticsearchClient } from '@kbn/core/ import type { KueryNode } from '@kbn/es-query'; import { fromKueryExpression, toElasticsearchQuery } from '@kbn/es-query'; -import type { AgentSOAttributes, Agent, BulkActionResult, ListWithKuery } from '../../types'; +import type { AgentSOAttributes, Agent, ListWithKuery } from '../../types'; import { appContextService, agentPolicyService } from '..'; import type { FleetServerAgent } from '../../../common/types'; import { SO_SEARCH_LIMIT } from '../../../common/constants'; @@ -395,10 +395,11 @@ export async function bulkUpdateAgents( updateData: Array<{ agentId: string; data: Partial; - }> -): Promise<{ items: BulkActionResult[] }> { + }>, + errors: { [key: string]: Error } +): Promise { if (updateData.length === 0) { - return { items: [] }; + return; } const body = updateData.flatMap(({ agentId, data }) => [ @@ -419,14 +420,12 @@ export async function bulkUpdateAgents( refresh: 'wait_for', }); - return { - items: res.items.map((item) => ({ - id: item.update!._id as string, - success: !item.update!.error, + res.items + .filter((item) => item.update!.error) + .forEach((item) => { // @ts-expect-error it not assignable to ErrorCause - error: item.update!.error as Error, - })), - }; + errors[item.update!._id as string] = item.update!.error as Error; + }); } export async function deleteAgent(esClient: ElasticsearchClient, agentId: string) { diff --git a/x-pack/plugins/fleet/server/services/agents/reassign_action_runner.ts b/x-pack/plugins/fleet/server/services/agents/reassign_action_runner.ts index 96405e464b358..c15857bb4ae32 100644 --- a/x-pack/plugins/fleet/server/services/agents/reassign_action_runner.ts +++ b/x-pack/plugins/fleet/server/services/agents/reassign_action_runner.ts @@ -16,7 +16,7 @@ import { appContextService } from '../app_context'; import { ActionRunner } from './action_runner'; import { bulkUpdateAgents } from './crud'; -import { bulkCreateAgentActionResults, createAgentAction } from './actions'; +import { createErrorActionResults, createAgentAction } from './actions'; import { getHostedPolicies, isHostedAgent } from './hosted_agent'; import { BulkActionTaskType } from './bulk_actions_resolver'; @@ -72,7 +72,7 @@ export async function reassignBatch( throw new AgentReassignmentError('No agents to reassign, already assigned or hosted agents'); } - const res = await bulkUpdateAgents( + await bulkUpdateAgents( esClient, agentsToUpdate.map((agent) => ({ agentId: agent.id, @@ -80,18 +80,12 @@ export async function reassignBatch( policy_id: options.newAgentPolicyId, policy_revision: null, }, - })) + })), + errors ); - res.items - .filter((item) => !item.success) - .forEach((item) => { - errors[item.id] = item.error!; - }); - const actionId = options.actionId ?? uuid(); - const errorCount = Object.keys(errors).length; - const total = options.total ?? agentsToUpdate.length + errorCount; + const total = options.total ?? givenAgents.length; const now = new Date().toISOString(); await createAgentAction(esClient, { @@ -105,23 +99,12 @@ export async function reassignBatch( }, }); - if (errorCount > 0) { - appContextService - .getLogger() - .info( - `Skipping ${errorCount} agents, as failed validation (already assigned or assigned to hosted policy)` - ); - - // writing out error result for those agents that failed validation, so the action is not going to stay in progress forever - await bulkCreateAgentActionResults( - esClient, - Object.keys(errors).map((agentId) => ({ - agentId, - actionId, - error: errors[agentId].message, - })) - ); - } + await createErrorActionResults( + esClient, + actionId, + errors, + 'already assigned or assigned to hosted policy' + ); return { actionId }; } diff --git a/x-pack/plugins/fleet/server/services/agents/unenroll.test.ts b/x-pack/plugins/fleet/server/services/agents/unenroll.test.ts index 79612b0bcbf06..5beb5c0a9ac00 100644 --- a/x-pack/plugins/fleet/server/services/agents/unenroll.test.ts +++ b/x-pack/plugins/fleet/server/services/agents/unenroll.test.ts @@ -115,7 +115,7 @@ describe('unenrollAgents (plural)', () => { // calls ES update with correct values const onlyRegular = [agentInRegularDoc._id, agentInRegularDoc2._id]; - const calledWith = esClient.bulk.mock.calls[1][0]; + const calledWith = esClient.bulk.mock.calls[0][0]; const ids = (calledWith as estypes.BulkRequest)?.body ?.filter((i: any) => i.update !== undefined) .map((i: any) => i.update._id); @@ -128,7 +128,7 @@ describe('unenrollAgents (plural)', () => { } // hosted policy is updated in action results with error - const calledWithActionResults = esClient.bulk.mock.calls[0][0] as estypes.BulkRequest; + const calledWithActionResults = esClient.bulk.mock.calls[1][0] as estypes.BulkRequest; // bulk write two line per create expect(calledWithActionResults.body?.length).toBe(2); const expectedObject = expect.objectContaining({ @@ -170,7 +170,7 @@ describe('unenrollAgents (plural)', () => { }); expect(esClient.bulk.mock.calls.length).toEqual(3); - const bulkBody = (esClient.bulk.mock.calls[1][0] as estypes.BulkRequest)?.body?.[1] as any; + const bulkBody = (esClient.bulk.mock.calls[2][0] as estypes.BulkRequest)?.body?.[1] as any; expect(bulkBody.agent_id).toEqual(agentInRegularDoc._id); expect(bulkBody.action_id).toEqual('other-action'); }); @@ -227,7 +227,7 @@ describe('unenrollAgents (plural)', () => { // calls ES update with correct values const onlyRegular = [agentInRegularDoc._id, agentInRegularDoc2._id]; - const calledWith = esClient.bulk.mock.calls[2][0]; + const calledWith = esClient.bulk.mock.calls[0][0]; const ids = (calledWith as estypes.BulkRequest)?.body ?.filter((i: any) => i.update !== undefined) .map((i: any) => i.update._id); @@ -239,13 +239,13 @@ describe('unenrollAgents (plural)', () => { expect(doc).toHaveProperty('unenrolled_at'); } - const errorResults = esClient.bulk.mock.calls[1][0]; + const errorResults = esClient.bulk.mock.calls[2][0]; const errorIds = (errorResults as estypes.BulkRequest)?.body ?.filter((i: any) => i.agent_id) .map((i: any) => i.agent_id); expect(errorIds).toEqual([agentInHostedDoc._id]); - const actionResults = esClient.bulk.mock.calls[0][0]; + const actionResults = esClient.bulk.mock.calls[1][0]; const resultIds = (actionResults as estypes.BulkRequest)?.body ?.filter((i: any) => i.agent_id) .map((i: any) => i.agent_id); @@ -290,7 +290,7 @@ describe('unenrollAgents (plural)', () => { expect(unenrolledResponse.actionId).toBeDefined(); // calls ES update with correct values - const calledWith = esClient.bulk.mock.calls[1][0]; + const calledWith = esClient.bulk.mock.calls[0][0]; const ids = (calledWith as estypes.BulkRequest)?.body ?.filter((i: any) => i.update !== undefined) .map((i: any) => i.update._id); @@ -302,7 +302,7 @@ describe('unenrollAgents (plural)', () => { expect(doc).toHaveProperty('unenrolled_at'); } - const actionResults = esClient.bulk.mock.calls[0][0]; + const actionResults = esClient.bulk.mock.calls[1][0]; const resultIds = (actionResults as estypes.BulkRequest)?.body ?.filter((i: any) => i.agent_id) .map((i: any) => i.agent_id); diff --git a/x-pack/plugins/fleet/server/services/agents/unenroll_action_runner.ts b/x-pack/plugins/fleet/server/services/agents/unenroll_action_runner.ts index dd5b4e023c2a3..c735254f18256 100644 --- a/x-pack/plugins/fleet/server/services/agents/unenroll_action_runner.ts +++ b/x-pack/plugins/fleet/server/services/agents/unenroll_action_runner.ts @@ -25,6 +25,7 @@ import { bulkUpdateAgents } from './crud'; import { bulkCreateAgentActionResults, createAgentAction, + createErrorActionResults, getUnenrollAgentActions, } from './actions'; import { getHostedPolicies, isHostedAgent } from './hosted_agent'; @@ -81,13 +82,24 @@ export async function unenrollBatch( return agents; }, []); + const now = new Date().toISOString(); + + // Update the necessary agents + const updateData = options.revoke + ? { unenrolled_at: now, active: false } + : { unenrollment_started_at: now }; + + await bulkUpdateAgents( + esClient, + agentsToUpdate.map(({ id }) => ({ agentId: id, data: updateData })), + outgoingErrors + ); + const actionId = options.actionId ?? uuid(); - const errorCount = Object.keys(outgoingErrors).length; const total = options.total ?? givenAgents.length; const agentIds = agentsToUpdate.map((agent) => agent.id); - const now = new Date().toISOString(); if (options.revoke) { // Get all API keys that need to be invalidated await invalidateAPIKeysForAgents(agentsToUpdate); @@ -104,32 +116,11 @@ export async function unenrollBatch( }); } - if (errorCount > 0) { - appContextService - .getLogger() - .info( - `Skipping ${errorCount} agents, as failed validation (cannot unenroll from a hosted policy or already unenrolled)` - ); - - // writing out error result for those agents that failed validation, so the action is not going to stay in progress forever - await bulkCreateAgentActionResults( - esClient, - Object.keys(outgoingErrors).map((agentId) => ({ - agentId, - actionId, - error: outgoingErrors[agentId].message, - })) - ); - } - - // Update the necessary agents - const updateData = options.revoke - ? { unenrolled_at: now, active: false } - : { unenrollment_started_at: now }; - - await bulkUpdateAgents( + await createErrorActionResults( esClient, - agentsToUpdate.map(({ id }) => ({ agentId: id, data: updateData })) + actionId, + outgoingErrors, + 'cannot unenroll from a hosted policy or already unenrolled' ); return { diff --git a/x-pack/plugins/fleet/server/services/agents/update_agent_tags_action_runner.ts b/x-pack/plugins/fleet/server/services/agents/update_agent_tags_action_runner.ts index 48f7b455d36b7..11d42bc76e39a 100644 --- a/x-pack/plugins/fleet/server/services/agents/update_agent_tags_action_runner.ts +++ b/x-pack/plugins/fleet/server/services/agents/update_agent_tags_action_runner.ts @@ -11,14 +11,16 @@ import { difference, uniq } from 'lodash'; import type { Agent } from '../../types'; -import { appContextService } from '../app_context'; - import { ActionRunner } from './action_runner'; import { bulkUpdateAgents } from './crud'; import { BulkActionTaskType } from './bulk_actions_resolver'; import { filterHostedPolicies } from './filter_hosted_agents'; -import { bulkCreateAgentActionResults, createAgentAction } from './actions'; +import { + createErrorActionResults, + bulkCreateAgentActionResults, + createAgentAction, +} from './actions'; export class UpdateAgentTagsActionRunner extends ActionRunner { protected async processAgents(agents: Agent[]): Promise<{ actionId: string }> { @@ -90,12 +92,12 @@ export async function updateTagsBatch( data: { tags: getNewTags(agent), }, - })) + })), + errors ); const actionId = options.actionId ?? uuid(); const total = options.total ?? givenAgents.length; - const errorCount = Object.keys(errors).length; // creating an action doc so that update tags shows up in activity await createAgentAction(esClient, { @@ -113,23 +115,12 @@ export async function updateTagsBatch( })) ); - if (errorCount > 0) { - appContextService - .getLogger() - .info( - `Skipping ${errorCount} agents, as failed validation (cannot modified tags on hosted agents)` - ); - - // writing out error result for those agents that failed validation, so the action is not going to stay in progress forever - await bulkCreateAgentActionResults( - esClient, - Object.keys(errors).map((agentId) => ({ - agentId, - actionId, - error: errors[agentId].message, - })) - ); - } + await createErrorActionResults( + esClient, + actionId, + errors, + 'cannot modified tags on hosted agents' + ); return { actionId }; } diff --git a/x-pack/plugins/fleet/server/services/agents/upgrade.test.ts b/x-pack/plugins/fleet/server/services/agents/upgrade.test.ts index db880f56ef474..8b888126ce114 100644 --- a/x-pack/plugins/fleet/server/services/agents/upgrade.test.ts +++ b/x-pack/plugins/fleet/server/services/agents/upgrade.test.ts @@ -50,7 +50,7 @@ describe('sendUpgradeAgentsActions (plural)', () => { // calls ES update with correct values const onlyRegular = [agentInRegularDoc._id, agentInRegularDoc2._id]; - const calledWith = esClient.bulk.mock.calls[1][0]; + const calledWith = esClient.bulk.mock.calls[0][0]; const ids = (calledWith as estypes.BulkRequest)?.body ?.filter((i: any) => i.update !== undefined) .map((i: any) => i.update._id); @@ -64,7 +64,7 @@ describe('sendUpgradeAgentsActions (plural)', () => { } // hosted policy is updated in action results with error - const calledWithActionResults = esClient.bulk.mock.calls[0][0] as estypes.BulkRequest; + const calledWithActionResults = esClient.bulk.mock.calls[1][0] as estypes.BulkRequest; // bulk write two line per create expect(calledWithActionResults.body?.length).toBe(2); const expectedObject = expect.objectContaining({ diff --git a/x-pack/plugins/fleet/server/services/agents/upgrade_action_runner.ts b/x-pack/plugins/fleet/server/services/agents/upgrade_action_runner.ts index a34f189871a39..c6794de6e2dcb 100644 --- a/x-pack/plugins/fleet/server/services/agents/upgrade_action_runner.ts +++ b/x-pack/plugins/fleet/server/services/agents/upgrade_action_runner.ts @@ -22,7 +22,7 @@ import { ActionRunner } from './action_runner'; import type { GetAgentsOptions } from './crud'; import { bulkUpdateAgents } from './crud'; -import { bulkCreateAgentActionResults, createAgentAction } from './actions'; +import { createErrorActionResults, createAgentAction } from './actions'; import { getHostedPolicies, isHostedAgent } from './hosted_agent'; import { BulkActionTaskType } from './bulk_actions_resolver'; @@ -108,9 +108,20 @@ export async function upgradeBatch( options.upgradeDurationSeconds ); + await bulkUpdateAgents( + esClient, + agentsToUpdate.map((agent) => ({ + agentId: agent.id, + data: { + upgraded_at: null, + upgrade_started_at: now, + }, + })), + errors + ); + const actionId = options.actionId ?? uuid(); - const errorCount = Object.keys(errors).length; - const total = options.total ?? agentsToUpdate.length + errorCount; + const total = options.total ?? givenAgents.length; await createAgentAction(esClient, { id: actionId, @@ -123,33 +134,11 @@ export async function upgradeBatch( ...rollingUpgradeOptions, }); - if (errorCount > 0) { - appContextService - .getLogger() - .info( - `Skipping ${errorCount} agents, as failed validation (cannot upgrade hosted agent or agent not upgradeable)` - ); - - // writing out error result for those agents that failed validation, so the action is not going to stay in progress forever - await bulkCreateAgentActionResults( - esClient, - Object.keys(errors).map((agentId) => ({ - agentId, - actionId, - error: errors[agentId].message, - })) - ); - } - - await bulkUpdateAgents( + await createErrorActionResults( esClient, - agentsToUpdate.map((agent) => ({ - agentId: agent.id, - data: { - upgraded_at: null, - upgrade_started_at: now, - }, - })) + actionId, + errors, + 'cannot upgrade hosted agent or agent not upgradeable' ); return { From 5203f1bcc86e777656fa7e7f0036638d83883f51 Mon Sep 17 00:00:00 2001 From: Walter Rafelsberger Date: Mon, 3 Oct 2022 10:25:39 +0200 Subject: [PATCH 71/72] [ML] Explain Log Rate Spikes: Fix loading state for grouping. (#141770) Fix loading state messages for grouping: - Fixes the progress bar messages to include the grouping step. - If progress stalls, it might look to the user like the analysis got stuck when there are steps like the grouping that take a longer time. This updates the progress bar to show an animated background as long as the analysis is running. When the analysis finishes or gets canceled the animated background gets disabled and shows a static background. --- .../packages/ml/aiops_components/BUILD.bazel | 4 ++ .../progress_controls/progress_controls.tsx | 12 ++++- .../use_animated_progress_bar_background.ts | 53 +++++++++++++++++++ .../ml/aiops_components/tsconfig.json | 3 +- .../server/routes/explain_log_rate_spikes.ts | 53 ++++++++++++++----- 5 files changed, 108 insertions(+), 17 deletions(-) create mode 100644 x-pack/packages/ml/aiops_components/src/progress_controls/use_animated_progress_bar_background.ts diff --git a/x-pack/packages/ml/aiops_components/BUILD.bazel b/x-pack/packages/ml/aiops_components/BUILD.bazel index 37ed6c171c4a0..08b49643adc2f 100644 --- a/x-pack/packages/ml/aiops_components/BUILD.bazel +++ b/x-pack/packages/ml/aiops_components/BUILD.bazel @@ -55,6 +55,8 @@ RUNTIME_DEPS = [ "@npm//react", "@npm//@elastic/charts", "@npm//@elastic/eui", + "@npm//@emotion/react", + "@npm//@emotion/css", "//packages/kbn-i18n-react", "//x-pack/packages/ml/aiops_utils", ] @@ -78,6 +80,8 @@ TYPES_DEPS = [ "@npm//@types/react", "@npm//@elastic/charts", "@npm//@elastic/eui", + "@npm//@emotion/react", + "@npm//@emotion/css", "//packages/kbn-i18n-react:npm_module_types", "//x-pack/packages/ml/aiops_utils:npm_module_types", ] diff --git a/x-pack/packages/ml/aiops_components/src/progress_controls/progress_controls.tsx b/x-pack/packages/ml/aiops_components/src/progress_controls/progress_controls.tsx index 579c528d16dca..af8f0ec1ad315 100644 --- a/x-pack/packages/ml/aiops_components/src/progress_controls/progress_controls.tsx +++ b/x-pack/packages/ml/aiops_components/src/progress_controls/progress_controls.tsx @@ -5,7 +5,10 @@ * 2.0. */ +import React from 'react'; + import { + useEuiTheme, EuiButton, EuiFlexGroup, EuiFlexItem, @@ -13,9 +16,11 @@ import { EuiProgress, EuiText, } from '@elastic/eui'; + import { i18n } from '@kbn/i18n'; import { FormattedMessage } from '@kbn/i18n-react'; -import React from 'react'; + +import { useAnimatedProgressBarBackground } from './use_animated_progress_bar_background'; // TODO Consolidate with duplicate component `CorrelationsProgressControls` in // `x-pack/plugins/apm/public/components/app/correlations/progress_controls.tsx` @@ -37,6 +42,9 @@ export function ProgressControls({ isRunning, shouldRerunAnalysis, }: ProgressControlProps) { + const { euiTheme } = useEuiTheme(); + const runningProgressBarStyles = useAnimatedProgressBarBackground(euiTheme.colors.success); + return ( @@ -51,7 +59,7 @@ export function ProgressControls({ /> - + { + return useMemo(() => { + const progressBackground = { + background: `repeating-linear-gradient( + -45deg, + transparent 0 6px, + rgba(0, 0, 0, 0.1) 6px 12px + ), + ${color}`, + // 0.707 = cos(45deg) + backgroundSize: 'calc(12px / 0.707) 100%, 100% 800%', + backgroundPosition: 'inherit', + }; + + return css({ + 'progress[value]': { + animation: 'aiopsAnimatedProgress 4s infinite linear', + + '::-webkit-progress-inner-element': { + overflow: 'hidden', + backgroundPosition: 'inherit', + }, + '::-webkit-progress-bar': { + backgroundColor: 'transparent', + backgroundPosition: 'inherit', + }, + + '::-webkit-progress-value': progressBackground, + '::-moz-progress-bar': progressBackground, + + '@keyframes aiopsAnimatedProgress': { + '0%': { + backgroundPosition: '0 0', + }, + '100%': { + backgroundPosition: 'calc(10 * (12px / 0.707)) 100%', + }, + }, + }, + }); + }, [color]); +}; diff --git a/x-pack/packages/ml/aiops_components/tsconfig.json b/x-pack/packages/ml/aiops_components/tsconfig.json index 8bca748268ac2..cdb1c5d8d0007 100644 --- a/x-pack/packages/ml/aiops_components/tsconfig.json +++ b/x-pack/packages/ml/aiops_components/tsconfig.json @@ -12,7 +12,8 @@ "@types/d3-transition", "jest", "node", - "react" + "react", + "@emotion/react/types/css-prop" ] }, "include": [ diff --git a/x-pack/plugins/aiops/server/routes/explain_log_rate_spikes.ts b/x-pack/plugins/aiops/server/routes/explain_log_rate_spikes.ts index 48ea2dbddb1c3..8a8a7372f80e2 100644 --- a/x-pack/plugins/aiops/server/routes/explain_log_rate_spikes.ts +++ b/x-pack/plugins/aiops/server/routes/explain_log_rate_spikes.ts @@ -52,8 +52,10 @@ import { // Overall progress is a float from 0 to 1. const LOADED_FIELD_CANDIDATES = 0.2; -const PROGRESS_STEP_P_VALUES = 0.6; -const PROGRESS_STEP_HISTOGRAMS = 0.2; +const PROGRESS_STEP_P_VALUES = 0.5; +const PROGRESS_STEP_GROUPING = 0.1; +const PROGRESS_STEP_HISTOGRAMS = 0.1; +const PROGRESS_STEP_HISTOGRAMS_GROUPS = 0.1; export const defineExplainLogRateSpikesRoute = ( router: IRouter, @@ -233,7 +235,35 @@ export const defineExplainLogRateSpikesRoute = ( undefined )) as [NumericChartData]; + function pushHistogramDataLoadingState() { + push( + updateLoadingStateAction({ + ccsWarning: false, + loaded, + loadingState: i18n.translate( + 'xpack.aiops.explainLogRateSpikes.loadingState.loadingHistogramData', + { + defaultMessage: 'Loading histogram data.', + } + ), + }) + ); + } + if (groupingEnabled) { + push( + updateLoadingStateAction({ + ccsWarning: false, + loaded, + loadingState: i18n.translate( + 'xpack.aiops.explainLogRateSpikes.loadingState.groupingResults', + { + defaultMessage: 'Transforming significant field/value pairs into groups.', + } + ), + }) + ); + // To optimize the `frequent_items` query, we identify duplicate change points by count attributes. // Note this is a compromise and not 100% accurate because there could be change points that // have the exact same counts but still don't co-occur. @@ -389,6 +419,10 @@ export const defineExplainLogRateSpikesRoute = ( push(addChangePointsGroupAction(changePointGroups)); } + loaded += PROGRESS_STEP_GROUPING; + + pushHistogramDataLoadingState(); + if (changePointGroups) { await asyncForEach(changePointGroups, async (cpg, index) => { const histogramQuery = { @@ -445,6 +479,8 @@ export const defineExplainLogRateSpikesRoute = ( } } + loaded += PROGRESS_STEP_HISTOGRAMS_GROUPS; + // time series filtered by fields if (changePoints) { await asyncForEach(changePoints, async (cp, index) => { @@ -496,18 +532,7 @@ export const defineExplainLogRateSpikesRoute = ( const { fieldName, fieldValue } = cp; loaded += (1 / changePoints.length) * PROGRESS_STEP_HISTOGRAMS; - push( - updateLoadingStateAction({ - ccsWarning: false, - loaded, - loadingState: i18n.translate( - 'xpack.aiops.explainLogRateSpikes.loadingState.loadingHistogramData', - { - defaultMessage: 'Loading histogram data.', - } - ), - }) - ); + pushHistogramDataLoadingState(); push( addChangePointsHistogramAction([ { From 656a48fee9cd6e0f013b830187d94ea5b964cf91 Mon Sep 17 00:00:00 2001 From: James Gowdy Date: Mon, 3 Oct 2022 09:30:06 +0100 Subject: [PATCH 72/72] [ML] Api tests for ml/modules/jobs_exist/{moduleId} (#142378) * [ML] Api tests for ml/modules/jobs_exist/{moduleId} * fixing title * fixing delete index pattern function --- .../api_integration/apis/ml/modules/index.ts | 1 + .../apis/ml/modules/jobs_exist.ts | 119 ++++++++++++++++++ x-pack/test/functional/services/ml/api.ts | 18 +++ .../functional/services/ml/test_resources.ts | 88 ++++++++----- 4 files changed, 197 insertions(+), 29 deletions(-) create mode 100644 x-pack/test/api_integration/apis/ml/modules/jobs_exist.ts diff --git a/x-pack/test/api_integration/apis/ml/modules/index.ts b/x-pack/test/api_integration/apis/ml/modules/index.ts index de8919976fd33..d28263b487701 100644 --- a/x-pack/test/api_integration/apis/ml/modules/index.ts +++ b/x-pack/test/api_integration/apis/ml/modules/index.ts @@ -38,5 +38,6 @@ export default function ({ getService, loadTestFile }: FtrProviderContext) { loadTestFile(require.resolve('./get_module')); loadTestFile(require.resolve('./recognize_module')); loadTestFile(require.resolve('./setup_module')); + loadTestFile(require.resolve('./jobs_exist')); }); } diff --git a/x-pack/test/api_integration/apis/ml/modules/jobs_exist.ts b/x-pack/test/api_integration/apis/ml/modules/jobs_exist.ts new file mode 100644 index 0000000000000..3e5cd0aa996d6 --- /dev/null +++ b/x-pack/test/api_integration/apis/ml/modules/jobs_exist.ts @@ -0,0 +1,119 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import expect from '@kbn/expect'; + +import { FtrProviderContext } from '../../../ftr_provider_context'; +import { USER } from '../../../../functional/services/ml/security_common'; +import { COMMON_REQUEST_HEADERS } from '../../../../functional/services/ml/common_api'; + +export default ({ getService }: FtrProviderContext) => { + const esArchiver = getService('esArchiver'); + const supertest = getService('supertestWithoutAuth'); + const ml = getService('ml'); + + const idSpace1 = 'space1'; + const sourceDataArchive = 'x-pack/test/functional/es_archives/ml/module_sample_logs'; + const moduleInfo = { + moduleId: 'sample_data_weblogs', + jobIds: ['low_request_rate', 'response_code_rates', 'url_scanning'], + dataView: { name: 'ft_module_sample_logs', timeField: '@timestamp' }, + }; + + async function runRequest(moduleId: string, expectedStatusCode: number, user: USER) { + const { body, status } = await supertest + .get(`/api/ml/modules/jobs_exist/${moduleId}`) + .auth(user, ml.securityCommon.getPasswordForUser(user)) + .set(COMMON_REQUEST_HEADERS); + + ml.api.assertResponseStatusCode(expectedStatusCode, status, body); + return body; + } + + describe('GET ml/modules/jobs_exist/{moduleId}', function () { + before(async () => { + await ml.testResources.setKibanaTimeZoneToUTC(); + await esArchiver.loadIfNeeded(sourceDataArchive); + // create data view in default space + await ml.testResources.createIndexPatternIfNeeded( + moduleInfo.dataView.name, + moduleInfo.dataView.timeField + ); + // create data view in idSpace1 + await ml.testResources.createIndexPatternIfNeeded( + moduleInfo.dataView.name, + moduleInfo.dataView.timeField, + idSpace1 + ); + }); + + afterEach(async () => { + await ml.api.cleanMlIndices(); + }); + + after(async () => { + // delete all data views in all spaces + await ml.testResources.deleteIndexPatternByTitle(moduleInfo.dataView.name); + await ml.testResources.deleteIndexPatternByTitle(moduleInfo.dataView.name, idSpace1); + }); + + it('should find jobs installed by module without prefix', async () => { + const prefix = ''; + await ml.api.setupModule(moduleInfo.moduleId, { + prefix, + indexPatternName: moduleInfo.dataView.name, + startDatafeed: false, + estimateModelMemory: false, + }); + const { jobsExist, jobs } = await runRequest(moduleInfo.moduleId, 200, USER.ML_POWERUSER); + + const expectedJobIds = moduleInfo.jobIds.map((j) => ({ id: `${prefix}${j}` })); + expect(jobsExist).to.eql(true, 'Expected jobsExist to be true'); + expect(jobs).to.eql(expectedJobIds, `Expected jobs to be ${expectedJobIds}`); + }); + + it('should find jobs installed by module with prefix', async () => { + const prefix = 'pf1_'; + await ml.api.setupModule(moduleInfo.moduleId, { + prefix, + indexPatternName: moduleInfo.dataView.name, + startDatafeed: false, + estimateModelMemory: false, + }); + const { jobsExist, jobs } = await runRequest(moduleInfo.moduleId, 200, USER.ML_POWERUSER); + + const expectedJobIds = moduleInfo.jobIds.map((j) => ({ id: `${prefix}${j}` })); + expect(jobsExist).to.eql(true, 'Expected jobsExist to be true'); + expect(jobs).to.eql(expectedJobIds, `Expected jobs to be ${expectedJobIds}`); + }); + + it('should not find jobs installed into a different space', async () => { + const prefix = 'pf1_'; + await ml.api.setupModule( + moduleInfo.moduleId, + { + prefix, + indexPatternName: moduleInfo.dataView.name, + startDatafeed: false, + estimateModelMemory: false, + }, + idSpace1 + ); + const { jobsExist, jobs } = await runRequest(moduleInfo.moduleId, 200, USER.ML_POWERUSER); + + expect(jobsExist).to.eql(false, 'Expected jobsExist to be false'); + expect(jobs).to.eql(undefined, `Expected jobs to be undefined`); + }); + + it("should not find jobs for module which hasn't been installed", async () => { + const { jobsExist, jobs } = await runRequest('apache_ecs', 200, USER.ML_POWERUSER); + + expect(jobsExist).to.eql(false, 'Expected jobsExist to be false'); + expect(jobs).to.eql(undefined, `Expected jobs to be undefined`); + }); + }); +}; diff --git a/x-pack/test/functional/services/ml/api.ts b/x-pack/test/functional/services/ml/api.ts index 62d46e644f173..d6802d2cb0f7d 100644 --- a/x-pack/test/functional/services/ml/api.ts +++ b/x-pack/test/functional/services/ml/api.ts @@ -8,6 +8,7 @@ import type * as estypes from '@elastic/elasticsearch/lib/api/typesWithBodyKey'; import expect from '@kbn/expect'; import { ProvidedType } from '@kbn/test'; +import type { TypeOf } from '@kbn/config-schema'; import fs from 'fs'; import { Calendar } from '@kbn/ml-plugin/server/models/calendar'; import { Annotation } from '@kbn/ml-plugin/common/types/annotations'; @@ -17,6 +18,7 @@ import { DataFrameTaskStateType } from '@kbn/ml-plugin/common/types/data_frame_a import { DATA_FRAME_TASK_STATE } from '@kbn/ml-plugin/common/constants/data_frame_analytics'; import { Datafeed, Job } from '@kbn/ml-plugin/common/types/anomaly_detection_jobs'; import { JobType } from '@kbn/ml-plugin/common/types/saved_objects'; +import { setupModuleBodySchema } from '@kbn/ml-plugin/server/routes/schemas/modules'; import { ML_ANNOTATIONS_INDEX_ALIAS_READ, ML_ANNOTATIONS_INDEX_ALIAS_WRITE, @@ -1445,5 +1447,21 @@ export function MachineLearningAPIProvider({ getService }: FtrProviderContext) { log.debug('> Ingest pipeline deleted'); }, + + async setupModule( + moduleId: string, + body: TypeOf, + space?: string + ) { + log.debug(`Setting up module with ID: "${moduleId}"`); + const { body: module, status } = await kbnSupertest + .post(`${space ? `/s/${space}` : ''}/api/ml/modules/setup/${moduleId}`) + .set(COMMON_REQUEST_HEADERS) + .send(body); + this.assertResponseStatusCode(200, status, module); + + log.debug('Module set up'); + return module; + }, }; } diff --git a/x-pack/test/functional/services/ml/test_resources.ts b/x-pack/test/functional/services/ml/test_resources.ts index d1a7557caf2b1..56d01a4f1a867 100644 --- a/x-pack/test/functional/services/ml/test_resources.ts +++ b/x-pack/test/functional/services/ml/test_resources.ts @@ -54,15 +54,25 @@ export function MachineLearningTestResourcesProvider( await kibanaServer.uiSettings.unset('hideAnnouncements'); }, - async savedObjectExistsById(id: string, objectType: SavedObjectType): Promise { - const response = await supertest.get(`/api/saved_objects/${objectType}/${id}`); + async savedObjectExistsById( + id: string, + objectType: SavedObjectType, + space?: string + ): Promise { + const response = await supertest.get( + `${space ? `/s/${space}` : ''}/api/saved_objects/${objectType}/${id}` + ); return response.status === 200; }, - async savedObjectExistsByTitle(title: string, objectType: SavedObjectType): Promise { - const id = await this.getSavedObjectIdByTitle(title, objectType); + async savedObjectExistsByTitle( + title: string, + objectType: SavedObjectType, + space?: string + ): Promise { + const id = await this.getSavedObjectIdByTitle(title, objectType, space); if (id) { - return await this.savedObjectExistsById(id, objectType); + return await this.savedObjectExistsById(id, objectType, space); } else { return false; } @@ -70,11 +80,14 @@ export function MachineLearningTestResourcesProvider( async getSavedObjectIdByTitle( title: string, - objectType: SavedObjectType + objectType: SavedObjectType, + space?: string ): Promise { log.debug(`Searching for '${objectType}' with title '${title}'...`); const { body: findResponse, status } = await supertest - .get(`/api/saved_objects/_find?type=${objectType}&per_page=10000`) + .get( + `${space ? `/s/${space}` : ''}/api/saved_objects/_find?type=${objectType}&per_page=10000` + ) .set(COMMON_REQUEST_HEADERS); mlApi.assertResponseStatusCode(200, status, findResponse); @@ -104,8 +117,8 @@ export function MachineLearningTestResourcesProvider( return savedObjectIds; }, - async getIndexPatternId(title: string): Promise { - return this.getSavedObjectIdByTitle(title, SavedObjectType.INDEX_PATTERN); + async getIndexPatternId(title: string, space?: string): Promise { + return this.getSavedObjectIdByTitle(title, SavedObjectType.INDEX_PATTERN, space); }, async getSavedSearchId(title: string): Promise { @@ -120,7 +133,11 @@ export function MachineLearningTestResourcesProvider( return this.getSavedObjectIdByTitle(title, SavedObjectType.DASHBOARD); }, - async createIndexPattern(title: string, timeFieldName?: string): Promise { + async createIndexPattern( + title: string, + timeFieldName?: string, + space?: string + ): Promise { log.debug( `Creating index pattern with title '${title}'${ timeFieldName !== undefined ? ` and time field '${timeFieldName}'` : '' @@ -128,12 +145,12 @@ export function MachineLearningTestResourcesProvider( ); const { body: createResponse, status } = await supertest - .post(`/api/saved_objects/${SavedObjectType.INDEX_PATTERN}`) + .post(`${space ? `/s/${space}` : ''}/api/saved_objects/${SavedObjectType.INDEX_PATTERN}`) .set(COMMON_REQUEST_HEADERS) .send({ attributes: { title, timeFieldName } }); mlApi.assertResponseStatusCode(200, status, createResponse); - await this.assertIndexPatternExistByTitle(title); + await this.assertIndexPatternExistByTitle(title, space); log.debug(` > Created with id '${createResponse.id}'`); return createResponse.id; @@ -152,13 +169,17 @@ export function MachineLearningTestResourcesProvider( return createResponse; }, - async createIndexPatternIfNeeded(title: string, timeFieldName?: string): Promise { - const indexPatternId = await this.getIndexPatternId(title); + async createIndexPatternIfNeeded( + title: string, + timeFieldName?: string, + space?: string + ): Promise { + const indexPatternId = await this.getIndexPatternId(title, space); if (indexPatternId !== undefined) { log.debug(`Index pattern with title '${title}' already exists. Nothing to create.`); return indexPatternId; } else { - return await this.createIndexPattern(title, timeFieldName); + return await this.createIndexPattern(title, timeFieldName, space); } }, @@ -301,7 +322,12 @@ export function MachineLearningTestResourcesProvider( ); }, - async deleteSavedObjectById(id: string, objectType: SavedObjectType, force: boolean = false) { + async deleteSavedObjectById( + id: string, + objectType: SavedObjectType, + force: boolean = false, + space?: string + ) { log.debug(`Deleting ${objectType} with id '${id}'...`); if ((await this.savedObjectExistsById(id, objectType)) === false) { @@ -309,31 +335,31 @@ export function MachineLearningTestResourcesProvider( return; } else { const { body, status } = await supertest - .delete(`/api/saved_objects/${objectType}/${id}`) + .delete(`${space ? `/s/${space}` : ''}/api/saved_objects/${objectType}/${id}`) .set(COMMON_REQUEST_HEADERS) .query({ force }); mlApi.assertResponseStatusCode(200, status, body); - await this.assertSavedObjectNotExistsById(id, objectType); + await this.assertSavedObjectNotExistsById(id, objectType, space); log.debug(` > Deleted ${objectType} with id '${id}'`); } }, - async deleteIndexPatternByTitle(title: string) { + async deleteIndexPatternByTitle(title: string, space?: string) { log.debug(`Deleting index pattern with title '${title}'...`); - const indexPatternId = await this.getIndexPatternId(title); + const indexPatternId = await this.getIndexPatternId(title, space); if (indexPatternId === undefined) { log.debug(`Index pattern with title '${title}' does not exists. Nothing to delete.`); return; } else { - await this.deleteIndexPatternById(indexPatternId); + await this.deleteIndexPatternById(indexPatternId, space); } }, - async deleteIndexPatternById(id: string) { - await this.deleteSavedObjectById(id, SavedObjectType.INDEX_PATTERN); + async deleteIndexPatternById(id: string, space?: string) { + await this.deleteSavedObjectById(id, SavedObjectType.INDEX_PATTERN, false, space); }, async deleteSavedSearchByTitle(title: string) { @@ -396,12 +422,16 @@ export function MachineLearningTestResourcesProvider( } }, - async assertSavedObjectExistsByTitle(title: string, objectType: SavedObjectType) { + async assertSavedObjectExistsByTitle( + title: string, + objectType: SavedObjectType, + space?: string + ) { await retry.waitForWithTimeout( `${objectType} with title '${title}' to exist`, 5 * 1000, async () => { - if ((await this.savedObjectExistsByTitle(title, objectType)) === true) { + if ((await this.savedObjectExistsByTitle(title, objectType, space)) === true) { return true; } else { throw new Error(`${objectType} with title '${title}' should exist.`); @@ -438,12 +468,12 @@ export function MachineLearningTestResourcesProvider( ); }, - async assertSavedObjectNotExistsById(id: string, objectType: SavedObjectType) { + async assertSavedObjectNotExistsById(id: string, objectType: SavedObjectType, space?: string) { await retry.waitForWithTimeout( `${objectType} with id '${id}' not to exist`, 5 * 1000, async () => { - if ((await this.savedObjectExistsById(id, objectType)) === false) { + if ((await this.savedObjectExistsById(id, objectType, space)) === false) { return true; } else { throw new Error(`${objectType} with id '${id}' should not exist.`); @@ -452,8 +482,8 @@ export function MachineLearningTestResourcesProvider( ); }, - async assertIndexPatternExistByTitle(title: string) { - await this.assertSavedObjectExistsByTitle(title, SavedObjectType.INDEX_PATTERN); + async assertIndexPatternExistByTitle(title: string, space?: string) { + await this.assertSavedObjectExistsByTitle(title, SavedObjectType.INDEX_PATTERN, space); }, async assertIndexPatternExistById(id: string) {