From 4982ead45caf23f8e9063b55bc5df46d881dfcf6 Mon Sep 17 00:00:00 2001 From: Jon Date: Mon, 6 May 2024 17:12:43 -0500 Subject: [PATCH 01/86] [ci/verify-es-serverless] Add annotation with command to run es image locally (#182579) https://buildkite.com/elastic/kibana-elasticsearch-serverless-verify-and-promote/builds/1074#annotation-es-serverless-run --- .../kibana-es-serverless-snapshots.yml | 2 +- .../es_serverless/verify_es_serverless_image.yml | 9 ++++++++- 2 files changed, 9 insertions(+), 2 deletions(-) diff --git a/.buildkite/pipeline-resource-definitions/kibana-es-serverless-snapshots.yml b/.buildkite/pipeline-resource-definitions/kibana-es-serverless-snapshots.yml index db4ed5e38da4c..60bedaafba586 100644 --- a/.buildkite/pipeline-resource-definitions/kibana-es-serverless-snapshots.yml +++ b/.buildkite/pipeline-resource-definitions/kibana-es-serverless-snapshots.yml @@ -20,7 +20,7 @@ spec: spec: env: SLACK_NOTIFICATIONS_CHANNEL: '#kibana-operations-alerts' - ES_SERVERLESS_IMAGE: latest + ES_SERVERLESS_IMAGE: docker.elastic.co/elasticsearch-ci/elasticsearch-serverless:latest ELASTIC_SLACK_NOTIFICATIONS_ENABLED: 'true' REPORT_FAILED_TESTS_TO_GITHUB: 'true' allow_rebuilds: true diff --git a/.buildkite/pipelines/es_serverless/verify_es_serverless_image.yml b/.buildkite/pipelines/es_serverless/verify_es_serverless_image.yml index 99f5c98a06c35..23e490e88ec10 100644 --- a/.buildkite/pipelines/es_serverless/verify_es_serverless_image.yml +++ b/.buildkite/pipelines/es_serverless/verify_es_serverless_image.yml @@ -17,8 +17,15 @@ agents: steps: - label: "Annotate runtime parameters" command: | - buildkite-agent annotate --context es-serverless-image --style info "ES Serverless image: $ES_SERVERLESS_IMAGE" buildkite-agent annotate --context kibana-commit --style info "Kibana build hash: $BUILDKITE_BRANCH / $BUILDKITE_COMMIT" + cat << EOF | buildkite-agent annotate --context es-serverless-image --style info + ES Serverless image: \`$ES_SERVERLESS_IMAGE\` + + To run this locally: + \`\`\` + node scripts/es serverless --image $ES_SERVERLESS_IMAGE + \`\`\` + EOF - group: "(:kibana: x :elastic:) Trigger Kibana Serverless suite" if: "build.env('SKIP_VERIFICATION') != '1' && build.env('SKIP_VERIFICATION') != 'true'" From b80e4c902134e248c76aefbb0bf1ae157209ff2b Mon Sep 17 00:00:00 2001 From: Tiago Costa Date: Mon, 6 May 2024 23:50:09 +0100 Subject: [PATCH 02/86] skip flaky suite (#181546) --- x-pack/performance/journeys_e2e/tags_listing_page.ts | 2 ++ 1 file changed, 2 insertions(+) diff --git a/x-pack/performance/journeys_e2e/tags_listing_page.ts b/x-pack/performance/journeys_e2e/tags_listing_page.ts index c102c2a68b9fd..e2dc40c284861 100644 --- a/x-pack/performance/journeys_e2e/tags_listing_page.ts +++ b/x-pack/performance/journeys_e2e/tags_listing_page.ts @@ -14,6 +14,8 @@ const TAG_DESCRIPTION = 'test description'; export const journey = new Journey({ esArchives: ['x-pack/performance/es_archives/sample_data_flights'], kbnArchives: ['x-pack/performance/kbn_archives/many_tags_and_visualizations'], + // FLAKY: https://github.com/elastic/kibana/issues/181546 + skipped: true }) .step('Go to Tags Page', async ({ page, kbnUrl }) => { await page.goto(kbnUrl.get(`/app/management/kibana/tags`)); From b7057ce083df96c14ac979f8401de6e7481848ef Mon Sep 17 00:00:00 2001 From: Tiago Costa Date: Mon, 6 May 2024 23:51:42 +0100 Subject: [PATCH 03/86] fix(NA): eslint missing colon at x-pack/performance/journeys_e2e/tags_listing_page.ts --- x-pack/performance/journeys_e2e/tags_listing_page.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/x-pack/performance/journeys_e2e/tags_listing_page.ts b/x-pack/performance/journeys_e2e/tags_listing_page.ts index e2dc40c284861..5ceab6a4d9bba 100644 --- a/x-pack/performance/journeys_e2e/tags_listing_page.ts +++ b/x-pack/performance/journeys_e2e/tags_listing_page.ts @@ -15,7 +15,7 @@ export const journey = new Journey({ esArchives: ['x-pack/performance/es_archives/sample_data_flights'], kbnArchives: ['x-pack/performance/kbn_archives/many_tags_and_visualizations'], // FLAKY: https://github.com/elastic/kibana/issues/181546 - skipped: true + skipped: true, }) .step('Go to Tags Page', async ({ page, kbnUrl }) => { await page.goto(kbnUrl.get(`/app/management/kibana/tags`)); From a6ddf518e24b2d0d723743bf606be7b72e6e86a6 Mon Sep 17 00:00:00 2001 From: Tim Sullivan Date: Mon, 6 May 2024 17:40:21 -0700 Subject: [PATCH 04/86] [Security Solution] Remove usage of deprecated modules for mounting React, Part II (#182061) ## Summary Partially addresses https://github.com/elastic/kibana-team/issues/805 These changes come up from searching in the code and finding where certain kinds of deprecated AppEx-SharedUX modules are imported. **Reviewers: Please interact with critical paths through the UI components touched in this PR, ESPECIALLY in terms of testing dark mode and i18n.** This is the **2nd** PR to focus on code within **Security Solution**, following https://github.com/elastic/kibana/pull/181099. image Note: this also makes inclusion of `i18n` and `analytics` dependencies consistent. Analytics is an optional dependency for the SharedUX modules, which wrap `KibanaErrorBoundaryProvider` and is designed to capture telemetry about errors that are caught in the error boundary. ### Checklist Delete any items that are not applicable to this PR. - [x] [Unit or functional tests](https://www.elastic.co/guide/en/kibana/master/development-tests.html) were updated or added to match the most common scenarios - [ ] This renders correctly on smaller devices using a responsive layout. (You can test this [in your browser](https://www.browserstack.com/guide/responsive-testing-on-local-server)) - [ ] This was checked for [cross-browser compatibility](https://www.elastic.co/support/matrix#matrix_browsers) --- .../components/detection_rule_counter.tsx | 9 +- .../public/components/take_action.tsx | 53 ++-- .../public/pages/rules/rules_flyout.tsx | 8 +- .../public/pages/rules/rules_table.tsx | 63 ++--- .../public/pages/rules/rules_table_header.tsx | 9 +- .../cloud_security_posture/public/plugin.tsx | 2 +- .../cloud_security_posture/public/types.ts | 7 +- .../cloud_security_posture/tsconfig.json | 3 +- x-pack/plugins/osquery/public/application.tsx | 26 +- .../osquery_result_wrapper.tsx | 17 +- .../osquery_results/osquery_results.tsx | 16 +- .../shared_components/services_wrapper.tsx | 11 +- .../plugins/osquery/public/shared_imports.ts | 3 +- .../timelines/add_to_timeline_button.tsx | 4 +- x-pack/plugins/osquery/tsconfig.json | 3 +- .../hover_actions/use_hover_action_items.tsx | 247 +++++++++--------- .../sourcerer/use_update_data_view.test.tsx | 4 +- .../public/resolver/types.ts | 2 +- .../timeline/components/add_to_timeline.tsx | 13 +- .../timeline/hooks/use_add_to_timeline.ts | 5 + .../threat_intelligence/public/plugin.tsx | 6 +- .../threat_intelligence/public/types.ts | 11 +- .../actions/add_to_timeline.test.tsx | 61 ++++- .../hover_actions/actions/add_to_timeline.tsx | 9 +- x-pack/plugins/timelines/public/index.ts | 4 + x-pack/plugins/timelines/tsconfig.json | 5 +- 26 files changed, 330 insertions(+), 271 deletions(-) diff --git a/x-pack/plugins/cloud_security_posture/public/components/detection_rule_counter.tsx b/x-pack/plugins/cloud_security_posture/public/components/detection_rule_counter.tsx index f0d5d64edab67..4cf8c5983cb86 100644 --- a/x-pack/plugins/cloud_security_posture/public/components/detection_rule_counter.tsx +++ b/x-pack/plugins/cloud_security_posture/public/components/detection_rule_counter.tsx @@ -36,14 +36,14 @@ export const DetectionRuleCounter = ({ tags, createRuleFn }: DetectionRuleCounte const [isCreateRuleLoading, setIsCreateRuleLoading] = useState(false); const queryClient = useQueryClient(); - const { http, notifications } = useKibana().services; + const { http, notifications, analytics, i18n, theme } = useKibana().services; const history = useHistory(); const [, setRulesTable] = useSessionStorage(RULES_TABLE_SESSION_STORAGE_KEY); const rulePageNavigation = useCallback(async () => { - await setRulesTable({ + setRulesTable({ tags, }); history.push({ @@ -58,14 +58,15 @@ export const DetectionRuleCounter = ({ tags, createRuleFn }: DetectionRuleCounte }, [history]); const createDetectionRuleOnClick = useCallback(async () => { + const startServices = { analytics, notifications, i18n, theme }; setIsCreateRuleLoading(true); const ruleResponse = await createRuleFn(http); setIsCreateRuleLoading(false); - showCreateDetectionRuleSuccessToast(notifications, http, ruleResponse); + showCreateDetectionRuleSuccessToast(startServices, http, ruleResponse); // Triggering a refetch of rules and alerts to update the UI queryClient.invalidateQueries([DETECTION_ENGINE_RULES_KEY]); queryClient.invalidateQueries([DETECTION_ENGINE_ALERTS_KEY]); - }, [createRuleFn, http, notifications, queryClient]); + }, [createRuleFn, http, analytics, notifications, i18n, theme, queryClient]); return ( { + const { notifications, analytics, i18n, theme } = cloudSecurityStartServices; + const startServices = { analytics, i18n, theme }; + return notifications.toasts.addSuccess({ toastLifeTimeMs: 10000, color: 'success', @@ -60,7 +64,8 @@ export const showCreateDetectionRuleSuccessToast = ( defaultMessage="Add rule actions to get notified when alerts are generated." /> - + , + startServices ), text: toMountPoint(
@@ -78,19 +83,23 @@ export const showCreateDetectionRuleSuccessToast = ( -
+ , + startServices ), }); }; export const showChangeBenchmarkRuleStatesSuccessToast = ( - notifications: NotificationsStart, + cloudSecurityStartServices: CloudSecurityPostureStartServices, isBenchmarkRuleMuted: boolean, data: { numberOfRules: number; numberOfDetectionRules: number; } ) => { + const { notifications, analytics, i18n, theme } = cloudSecurityStartServices; + const startServices = { analytics, i18n, theme }; + return notifications.toasts.addSuccess({ toastLifeTimeMs: 10000, color: 'success', @@ -111,7 +120,8 @@ export const showChangeBenchmarkRuleStatesSuccessToast = ( /> )} - + , + startServices ), text: toMountPoint(
@@ -145,7 +155,8 @@ export const showChangeBenchmarkRuleStatesSuccessToast = ( )} )} -
+ , + startServices ), }); }; @@ -171,8 +182,6 @@ export const TakeAction = ({ prefix: 'smallContextMenuPopover', }); - const { http, notifications } = useKibana().services; - const button = ( @@ -206,9 +213,6 @@ export const TakeAction = ({ enableBenchmarkRuleFn={enableBenchmarkRuleFn} setIsLoading={setIsLoading} closePopover={closePopover} - notifications={notifications} - http={http} - queryClient={queryClient} /> ); if (disableBenchmarkRuleFn) @@ -218,9 +222,6 @@ export const TakeAction = ({ disableBenchmarkRuleFn={disableBenchmarkRuleFn} setIsLoading={setIsLoading} closePopover={closePopover} - notifications={notifications} - http={http} - queryClient={queryClient} /> ); @@ -243,19 +244,17 @@ const CreateDetectionRule = ({ createRuleFn, setIsLoading, closePopover, - notifications, - http, queryClient, isCreateDetectionRuleDisabled = false, }: { createRuleFn: (http: HttpSetup) => Promise; setIsLoading: (isLoading: boolean) => void; closePopover: () => void; - notifications: NotificationsStart; - http: HttpSetup; queryClient: QueryClient; isCreateDetectionRuleDisabled: boolean; }) => { + const { http, ...startServices } = useKibana().services; + return ( Promise; setIsLoading: (isLoading: boolean) => void; closePopover: () => void; - notifications: NotificationsStart; - http: HttpSetup; - queryClient: QueryClient; }) => { return ( Promise; setIsLoading: (isLoading: boolean) => void; closePopover: () => void; - notifications: NotificationsStart; - http: HttpSetup; - queryClient: QueryClient; }) => { return ( { if (rule.metadata.benchmark.rule_number) { const rulesObjectRequest = { @@ -83,8 +85,8 @@ export const RuleFlyout = ({ onClose, rule, refetchRulesStates }: RuleFlyoutProp }; const nextRuleStates = isRuleMuted ? 'unmute' : 'mute'; await postRequestChangeRulesStates(nextRuleStates, [rulesObjectRequest]); - await refetchRulesStates(); - await showChangeBenchmarkRuleStatesSuccessToast(notifications, isRuleMuted, { + refetchRulesStates(); + showChangeBenchmarkRuleStatesSuccessToast(startServices, isRuleMuted, { numberOfRules: 1, numberOfDetectionRules: rulesData?.total || 0, }); diff --git a/x-pack/plugins/cloud_security_posture/public/pages/rules/rules_table.tsx b/x-pack/plugins/cloud_security_posture/public/pages/rules/rules_table.tsx index 586f0b9dee0cf..a9e4b0501cfdf 100644 --- a/x-pack/plugins/cloud_security_posture/public/pages/rules/rules_table.tsx +++ b/x-pack/plugins/cloud_security_posture/public/pages/rules/rules_table.tsx @@ -20,8 +20,9 @@ import { } from '@elastic/eui'; import { i18n } from '@kbn/i18n'; import { uniqBy } from 'lodash'; -import { CoreStart, HttpSetup, NotificationsStart } from '@kbn/core/public'; -import { useKibana } from '@kbn/kibana-react-plugin/public'; +import { HttpSetup } from '@kbn/core/public'; +import { CloudSecurityPostureStartServices } from '../../types'; +import { useKibana } from '../../common/hooks/use_kibana'; import { getFindingsDetectionRuleSearchTags } from '../../../common/utils/detection_rules'; import { ColumnNameWithTooltip } from '../../components/column_name_with_tooltip'; import type { CspBenchmarkRulesWithStates, RulesState } from './rules_container'; @@ -61,8 +62,8 @@ type GetColumnProps = Pick< currentPageRulesArray: CspBenchmarkRulesWithStates[], selectedRulesArray: CspBenchmarkRulesWithStates[] ) => boolean; - notifications: NotificationsStart; http: HttpSetup; + startServices: CloudSecurityPostureStartServices; }; export const RulesTable = ({ @@ -132,40 +133,42 @@ export const RulesTable = ({ return true; }; - const { http, notifications } = useKibana().services; + const { http, notifications, analytics, i18n: i18nStart, theme } = useKibana().services; useEffect(() => { if (selectedRules.length >= items.length && items.length > 0 && selectedRules.length > 0) setIsAllRulesSelectedThisPage(true); else setIsAllRulesSelectedThisPage(false); }, [items.length, selectedRules.length]); - const columns = useMemo( - () => - getColumns({ - refetchRulesStates, - postRequestChangeRulesStates, - selectedRules, - setSelectedRules, - items, - setIsAllRulesSelectedThisPage, - isAllRulesSelectedThisPage, - isCurrentPageRulesASubset, - onRuleClick, - notifications, - http, - }), - [ + const columns = useMemo(() => { + const startServices = { notifications, analytics, i18n: i18nStart, theme }; + return getColumns({ refetchRulesStates, postRequestChangeRulesStates, selectedRules, setSelectedRules, items, + setIsAllRulesSelectedThisPage, isAllRulesSelectedThisPage, + isCurrentPageRulesASubset, onRuleClick, - notifications, http, - ] - ); + startServices, + }); + }, [ + refetchRulesStates, + postRequestChangeRulesStates, + selectedRules, + setSelectedRules, + items, + isAllRulesSelectedThisPage, + onRuleClick, + notifications, + http, + analytics, + i18nStart, + theme, + ]); return ( <> @@ -194,8 +197,8 @@ const getColumns = ({ isAllRulesSelectedThisPage, isCurrentPageRulesASubset, onRuleClick, - notifications, http, + startServices, }: GetColumnProps): Array> => [ { field: 'action', @@ -203,7 +206,7 @@ const getColumns = ({ { + onChange={() => { const uniqueSelectedRules = uniqBy([...selectedRules, ...items], 'metadata.id'); const onChangeSelectAllThisPageFn = () => { setSelectedRules(uniqueSelectedRules); @@ -227,7 +230,7 @@ const getColumns = ({ ), width: '40px', sortable: false, - render: (rules, item: CspBenchmarkRulesWithStates) => { + render: (_rules, item: CspBenchmarkRulesWithStates) => { return ( { + render: (_name, rule: CspBenchmarkRulesWithStates) => { const rulesObjectRequest = { benchmark_id: rule?.metadata.benchmark.id, benchmark_version: rule?.metadata.benchmark.version, @@ -320,9 +323,9 @@ const getColumns = ({ http ) ).total; - await postRequestChangeRulesStates(nextRuleState, [rulesObjectRequest]); - await refetchRulesStates(); - await showChangeBenchmarkRuleStatesSuccessToast(notifications, isRuleMuted, { + postRequestChangeRulesStates(nextRuleState, [rulesObjectRequest]); + refetchRulesStates(); + showChangeBenchmarkRuleStatesSuccessToast(startServices, isRuleMuted, { numberOfRules: 1, numberOfDetectionRules: detectionRuleCount || 0, }); diff --git a/x-pack/plugins/cloud_security_posture/public/pages/rules/rules_table_header.tsx b/x-pack/plugins/cloud_security_posture/public/pages/rules/rules_table_header.tsx index 5ef77f70be82a..58a4ad46986eb 100644 --- a/x-pack/plugins/cloud_security_posture/public/pages/rules/rules_table_header.tsx +++ b/x-pack/plugins/cloud_security_posture/public/pages/rules/rules_table_header.tsx @@ -254,7 +254,8 @@ const CurrentPageOfTotal = ({ { match: 'any' } ); - const { notifications } = useKibana().services; + const { notifications, analytics, i18n: i18nStart, theme } = useKibana().services; + const startServices = { notifications, analytics, i18n: i18nStart, theme }; const postRequestChangeRulesState = useChangeCspRuleState(); const changeRulesState = async (state: 'mute' | 'unmute') => { @@ -269,9 +270,9 @@ const CurrentPageOfTotal = ({ // Only do the API Call IF there are no undefined value for rule number in the selected rules if (!bulkSelectedRules.some((rule) => rule.rule_number === undefined)) { await postRequestChangeRulesState(state, bulkSelectedRules); - await refetchRulesStates(); - await setIsPopoverOpen(false); - await showChangeBenchmarkRuleStatesSuccessToast(notifications, state !== 'mute', { + refetchRulesStates(); + setIsPopoverOpen(false); + showChangeBenchmarkRuleStatesSuccessToast(startServices, state !== 'mute', { numberOfRules: bulkSelectedRules.length, numberOfDetectionRules: rulesData?.total || 0, }); diff --git a/x-pack/plugins/cloud_security_posture/public/plugin.tsx b/x-pack/plugins/cloud_security_posture/public/plugin.tsx index f215841b30cea..bf014f83c1b0d 100755 --- a/x-pack/plugins/cloud_security_posture/public/plugin.tsx +++ b/x-pack/plugins/cloud_security_posture/public/plugin.tsx @@ -47,7 +47,7 @@ export class CspPlugin private isCloudEnabled?: boolean; public setup( - core: CoreSetup, + _core: CoreSetup, plugins: CspClientPluginSetupDeps ): CspClientPluginSetup { this.isCloudEnabled = plugins.cloud.isCloudEnabled; diff --git a/x-pack/plugins/cloud_security_posture/public/types.ts b/x-pack/plugins/cloud_security_posture/public/types.ts index 6766067df67e0..4b8499fdd82a0 100755 --- a/x-pack/plugins/cloud_security_posture/public/types.ts +++ b/x-pack/plugins/cloud_security_posture/public/types.ts @@ -14,7 +14,7 @@ import { UiActionsSetup, UiActionsStart } from '@kbn/ui-actions-plugin/public'; import { FieldFormatsStart } from '@kbn/field-formats-plugin/public'; import { IndexPatternFieldEditorStart } from '@kbn/data-view-field-editor-plugin/public'; import type { DataPublicPluginSetup, DataPublicPluginStart } from '@kbn/data-plugin/public'; -import { ToastsStart } from '@kbn/core/public'; +import { CoreStart, ToastsStart } from '@kbn/core/public'; import { Storage } from '@kbn/kibana-utils-plugin/public'; import type { ChartsPluginStart } from '@kbn/charts-plugin/public'; @@ -84,3 +84,8 @@ export interface CspSecuritySolutionContext { state?: Record; }>; } + +export type CloudSecurityPostureStartServices = Pick< + CoreStart, + 'notifications' | 'analytics' | 'i18n' | 'theme' +>; diff --git a/x-pack/plugins/cloud_security_posture/tsconfig.json b/x-pack/plugins/cloud_security_posture/tsconfig.json index 91d6b3711a245..907ff68fc3897 100755 --- a/x-pack/plugins/cloud_security_posture/tsconfig.json +++ b/x-pack/plugins/cloud_security_posture/tsconfig.json @@ -63,7 +63,8 @@ "@kbn/alerting-plugin", "@kbn/code-editor", "@kbn/code-editor-mock", - "@kbn/search-types" + "@kbn/search-types", + "@kbn/react-kibana-mount" ], "exclude": ["target/**/*"] } diff --git a/x-pack/plugins/osquery/public/application.tsx b/x-pack/plugins/osquery/public/application.tsx index 83156c0e8d9bc..37f5417d192f1 100644 --- a/x-pack/plugins/osquery/public/application.tsx +++ b/x-pack/plugins/osquery/public/application.tsx @@ -5,11 +5,9 @@ * 2.0. */ -import { EuiErrorBoundary } from '@elastic/eui'; import React from 'react'; import ReactDOM from 'react-dom'; import { Router } from '@kbn/shared-ux-router'; -import { I18nProvider } from '@kbn/i18n-react'; import { QueryClientProvider } from '@tanstack/react-query'; import { ReactQueryDevtools } from '@tanstack/react-query-devtools'; @@ -20,17 +18,17 @@ import { OsqueryApp } from './components/app'; import { PLUGIN_NAME } from '../common'; import { KibanaContextProvider } from './common/lib/kibana'; import { queryClient } from './query_client'; -import { KibanaThemeProvider } from './shared_imports'; +import { KibanaRenderContextProvider } from './shared_imports'; export const renderApp = ( core: CoreStart, services: AppPluginStartDependencies, - { element, history, theme$ }: AppMountParameters, + { element, history }: AppMountParameters, storage: Storage, kibanaVersion: string ) => { ReactDOM.render( - + - - - - - - - - - - + + + + + + - , + , element ); diff --git a/x-pack/plugins/osquery/public/shared_components/osquery_results/osquery_result_wrapper.tsx b/x-pack/plugins/osquery/public/shared_components/osquery_results/osquery_result_wrapper.tsx index 8bff73f67c982..a6f317fc4cac0 100644 --- a/x-pack/plugins/osquery/public/shared_components/osquery_results/osquery_result_wrapper.tsx +++ b/x-pack/plugins/osquery/public/shared_components/osquery_results/osquery_result_wrapper.tsx @@ -5,12 +5,13 @@ * 2.0. */ -import { EuiComment, EuiErrorBoundary } from '@elastic/eui'; +import { EuiComment } from '@elastic/eui'; import React, { useState, useEffect } from 'react'; import { FormattedRelative } from '@kbn/i18n-react'; import type { CoreStart } from '@kbn/core-lifecycle-browser'; -import { KibanaContextProvider, KibanaThemeProvider } from '@kbn/kibana-react-plugin/public'; +import { KibanaContextProvider } from '@kbn/kibana-react-plugin/public'; +import { KibanaRenderContextProvider } from '@kbn/react-kibana-context-render'; import { QueryClientProvider } from '@tanstack/react-query'; import { EmptyPrompt } from '../../routes/components/empty_prompt'; import { useKibana } from '../../common/lib/kibana'; @@ -72,15 +73,13 @@ const OsqueryActionResultWrapperComponent: React.FC ( - + - - - - - + + + - + ); const OsqueryActionResultWrapper = React.memo(OsqueryActionResultWrapperComponent); diff --git a/x-pack/plugins/osquery/public/shared_components/osquery_results/osquery_results.tsx b/x-pack/plugins/osquery/public/shared_components/osquery_results/osquery_results.tsx index 92f01cc76a076..c9108e028bb3f 100644 --- a/x-pack/plugins/osquery/public/shared_components/osquery_results/osquery_results.tsx +++ b/x-pack/plugins/osquery/public/shared_components/osquery_results/osquery_results.tsx @@ -5,7 +5,7 @@ * 2.0. */ -import { EuiErrorBoundary, EuiSpacer } from '@elastic/eui'; +import { EuiSpacer } from '@elastic/eui'; import React from 'react'; import { QueryClientProvider } from '@tanstack/react-query'; import type { CoreStart } from '@kbn/core/public'; @@ -14,7 +14,7 @@ import { EmptyPrompt } from '../../routes/components/empty_prompt'; import { KibanaContextProvider, useKibana } from '../../common/lib/kibana'; import { queryClient } from '../../query_client'; -import { KibanaThemeProvider } from '../../shared_imports'; +import { KibanaRenderContextProvider } from '../../shared_imports'; import type { StartPlugins } from '../../types'; import type { OsqueryActionResultsProps } from './types'; import { OsqueryResult } from './osquery_result'; @@ -61,15 +61,13 @@ const OsqueryActionResultsWrapperComponent: React.FC ( - + - - - - - + + + - + ); const OsqueryActionResultsWrapper = React.memo(OsqueryActionResultsWrapperComponent); diff --git a/x-pack/plugins/osquery/public/shared_components/services_wrapper.tsx b/x-pack/plugins/osquery/public/shared_components/services_wrapper.tsx index 7b6949696bbee..a45c39ac54da1 100644 --- a/x-pack/plugins/osquery/public/shared_components/services_wrapper.tsx +++ b/x-pack/plugins/osquery/public/shared_components/services_wrapper.tsx @@ -5,14 +5,13 @@ * 2.0. */ -import { EuiErrorBoundary } from '@elastic/eui'; import React from 'react'; import { QueryClientProvider } from '@tanstack/react-query'; import type { CoreStart } from '@kbn/core/public'; import { KibanaContextProvider } from '../common/lib/kibana'; import { queryClient } from '../query_client'; -import { KibanaThemeProvider } from '../shared_imports'; +import { KibanaRenderContextProvider } from '../shared_imports'; import type { StartPlugins } from '../types'; export interface ServicesWrapperProps { @@ -21,13 +20,11 @@ export interface ServicesWrapperProps { } const ServicesWrapperComponent: React.FC = ({ services, children }) => ( - + - - {children} - + {children} - + ); const ServicesWrapper = React.memo(ServicesWrapperComponent); diff --git a/x-pack/plugins/osquery/public/shared_imports.ts b/x-pack/plugins/osquery/public/shared_imports.ts index 83d7cd8d45bb4..0585ccef0fc30 100644 --- a/x-pack/plugins/osquery/public/shared_imports.ts +++ b/x-pack/plugins/osquery/public/shared_imports.ts @@ -45,4 +45,5 @@ export { export { fieldValidators } from '@kbn/es-ui-shared-plugin/static/forms/helpers'; export type { ERROR_CODE } from '@kbn/es-ui-shared-plugin/static/forms/helpers/field_validators/types'; -export { useUiSetting$, KibanaThemeProvider } from '@kbn/kibana-react-plugin/public'; +export { useUiSetting$ } from '@kbn/kibana-react-plugin/public'; +export { KibanaRenderContextProvider } from '@kbn/react-kibana-context-render'; diff --git a/x-pack/plugins/osquery/public/timelines/add_to_timeline_button.tsx b/x-pack/plugins/osquery/public/timelines/add_to_timeline_button.tsx index 48cd3a0ff71c1..6a03317c486d7 100644 --- a/x-pack/plugins/osquery/public/timelines/add_to_timeline_button.tsx +++ b/x-pack/plugins/osquery/public/timelines/add_to_timeline_button.tsx @@ -22,7 +22,8 @@ export interface AddToTimelineButtonProps { export const SECURITY_APP_NAME = 'Security'; export const AddToTimelineButton = (props: AddToTimelineButtonProps) => { - const { timelines, appName } = useKibana().services; + const { timelines, appName, analytics, i18n, theme } = useKibana().services; + const startServices = { analytics, i18n, theme }; const { field, value, isIcon, iconProps } = props; const queryIds = isArray(value) ? value : [value]; @@ -60,5 +61,6 @@ export const AddToTimelineButton = (props: AddToTimelineButtonProps) => { ...(isIcon ? { showTooltip: true, Component: TimelineIconComponent } : { Component: TimelineComponent }), + startServices, }); }; diff --git a/x-pack/plugins/osquery/tsconfig.json b/x-pack/plugins/osquery/tsconfig.json index d520d59c515f8..6d713311c777d 100644 --- a/x-pack/plugins/osquery/tsconfig.json +++ b/x-pack/plugins/osquery/tsconfig.json @@ -76,6 +76,7 @@ "@kbn/shared-ux-page-kibana-template", "@kbn/openapi-generator", "@kbn/code-editor", - "@kbn/search-types" + "@kbn/search-types", + "@kbn/react-kibana-context-render" ] } diff --git a/x-pack/plugins/security_solution/public/common/components/hover_actions/use_hover_action_items.tsx b/x-pack/plugins/security_solution/public/common/components/hover_actions/use_hover_action_items.tsx index b254fcb9e7d09..866acee43b6d5 100644 --- a/x-pack/plugins/security_solution/public/common/components/hover_actions/use_hover_action_items.tsx +++ b/x-pack/plugins/security_solution/public/common/components/hover_actions/use_hover_action_items.tsx @@ -82,7 +82,7 @@ export const useHoverActionItems = ({ }: UseHoverActionItemsProps): UseHoverActionItems => { const kibana = useKibana(); const dispatch = useDispatch(); - const { timelines, timelineFilterManager } = kibana.services; + const { timelines, timelineFilterManager, analytics, i18n, theme } = kibana.services; const dataViewId = useDataViewId(getSourcererScopeId(scopeId ?? '')); // Common actions used by the alert table and alert flyout @@ -168,127 +168,130 @@ export const useHoverActionItems = ({ ] ); - const allItems = useMemo( - () => - [ - showFilters ? ( -
- {getFilterForValueButton({ - defaultFocusedButtonRef, - field, - filterManager, - keyboardEvent: stKeyboardEvent, - onClick: handleHoverActionClicked, - onFilterAdded, - ownFocus, - showTooltip: enableOverflowButton ? false : true, - value: values, - dataViewId, - })} -
- ) : null, - showFilters ? ( -
- {getFilterOutValueButton({ - field, - filterManager, - keyboardEvent: stKeyboardEvent, - onFilterAdded, - ownFocus, - onClick: handleHoverActionClicked, - showTooltip: enableOverflowButton ? false : true, - value: values, - dataViewId, - })} -
- ) : null, - toggleColumn && !shouldDisableColumnToggle ? ( -
- {getColumnToggleButton({ - Component: enableOverflowButton ? EuiContextMenuItem : undefined, - field, - isDisabled: isObjectArray && dataType !== 'geo_point', - isObjectArray, - keyboardEvent: stKeyboardEvent, - ownFocus, - onClick: handleHoverActionClicked, - showTooltip: enableOverflowButton ? false : true, - toggleColumn, - value: values, - })} -
- ) : null, - values != null && (draggableId != null || !isEmpty(dataProvider)) && !hideAddToTimeline ? ( -
- {getAddToTimelineButton({ - Component: enableOverflowButton ? EuiContextMenuItem : undefined, - dataProvider, - draggableId, - field, - keyboardEvent: stKeyboardEvent, - ownFocus, - onClick: onAddToTimelineClicked, - showTooltip: enableOverflowButton ? false : true, - value: values, - })} -
- ) : null, - allowTopN({ - fieldType, - isAggregatable, - fieldName: field, - hideTopN, - }) - ? showTopNBtn - : null, - field != null ? ( -
- {getCopyButton({ - Component: enableOverflowButton ? EuiContextMenuItem : undefined, - field, - isHoverAction: true, - keyboardEvent: stKeyboardEvent, - ownFocus, - onClick: handleHoverActionClicked, - showTooltip: enableOverflowButton ? false : true, - value: values, - })} -
- ) : null, - ].filter((item) => { - return item != null; - }), - [ - dataProvider, - dataType, - defaultFocusedButtonRef, - draggableId, - enableOverflowButton, - field, - fieldType, - isAggregatable, - filterManager, - getAddToTimelineButton, - getColumnToggleButton, - getCopyButton, - getFilterForValueButton, - getFilterOutValueButton, - handleHoverActionClicked, - onAddToTimelineClicked, - hideAddToTimeline, - hideTopN, - isObjectArray, - onFilterAdded, - ownFocus, - shouldDisableColumnToggle, - showFilters, - showTopNBtn, - stKeyboardEvent, - toggleColumn, - values, - dataViewId, - ] - ) as JSX.Element[]; + const allItems = useMemo(() => { + const startServices = { analytics, i18n, theme }; + return [ + showFilters ? ( +
+ {getFilterForValueButton({ + defaultFocusedButtonRef, + field, + filterManager, + keyboardEvent: stKeyboardEvent, + onClick: handleHoverActionClicked, + onFilterAdded, + ownFocus, + showTooltip: enableOverflowButton ? false : true, + value: values, + dataViewId, + })} +
+ ) : null, + showFilters ? ( +
+ {getFilterOutValueButton({ + field, + filterManager, + keyboardEvent: stKeyboardEvent, + onFilterAdded, + ownFocus, + onClick: handleHoverActionClicked, + showTooltip: enableOverflowButton ? false : true, + value: values, + dataViewId, + })} +
+ ) : null, + toggleColumn && !shouldDisableColumnToggle ? ( +
+ {getColumnToggleButton({ + Component: enableOverflowButton ? EuiContextMenuItem : undefined, + field, + isDisabled: isObjectArray && dataType !== 'geo_point', + isObjectArray, + keyboardEvent: stKeyboardEvent, + ownFocus, + onClick: handleHoverActionClicked, + showTooltip: enableOverflowButton ? false : true, + toggleColumn, + value: values, + })} +
+ ) : null, + values != null && (draggableId != null || !isEmpty(dataProvider)) && !hideAddToTimeline ? ( +
+ {getAddToTimelineButton({ + Component: enableOverflowButton ? EuiContextMenuItem : undefined, + dataProvider, + draggableId, + field, + keyboardEvent: stKeyboardEvent, + ownFocus, + onClick: onAddToTimelineClicked, + showTooltip: enableOverflowButton ? false : true, + value: values, + startServices, + })} +
+ ) : null, + allowTopN({ + fieldType, + isAggregatable, + fieldName: field, + hideTopN, + }) + ? showTopNBtn + : null, + field != null ? ( +
+ {getCopyButton({ + Component: enableOverflowButton ? EuiContextMenuItem : undefined, + field, + isHoverAction: true, + keyboardEvent: stKeyboardEvent, + ownFocus, + onClick: handleHoverActionClicked, + showTooltip: enableOverflowButton ? false : true, + value: values, + })} +
+ ) : null, + ].filter((item) => { + return item != null; + }); + }, [ + dataProvider, + dataType, + defaultFocusedButtonRef, + draggableId, + enableOverflowButton, + field, + fieldType, + isAggregatable, + filterManager, + getAddToTimelineButton, + getColumnToggleButton, + getCopyButton, + getFilterForValueButton, + getFilterOutValueButton, + handleHoverActionClicked, + onAddToTimelineClicked, + hideAddToTimeline, + hideTopN, + isObjectArray, + onFilterAdded, + ownFocus, + shouldDisableColumnToggle, + showFilters, + showTopNBtn, + stKeyboardEvent, + toggleColumn, + values, + dataViewId, + analytics, + i18n, + theme, + ]) as JSX.Element[]; const overflowActionItems = useMemo( () => diff --git a/x-pack/plugins/security_solution/public/common/components/sourcerer/use_update_data_view.test.tsx b/x-pack/plugins/security_solution/public/common/components/sourcerer/use_update_data_view.test.tsx index 4b88b5cca19ab..b6be02ccdad53 100644 --- a/x-pack/plugins/security_solution/public/common/components/sourcerer/use_update_data_view.test.tsx +++ b/x-pack/plugins/security_solution/public/common/components/sourcerer/use_update_data_view.test.tsx @@ -29,8 +29,8 @@ jest.mock('../../lib/kibana', () => { useKibana: () => mockedUseKibana, }; }); -jest.mock('@kbn/kibana-react-plugin/public', () => { - const original = jest.requireActual('@kbn/kibana-react-plugin/public'); +jest.mock('@kbn/react-kibana-mount', () => { + const original = jest.requireActual('@kbn/react-kibana-mount'); return { ...original, diff --git a/x-pack/plugins/security_solution/public/resolver/types.ts b/x-pack/plugins/security_solution/public/resolver/types.ts index 576ee0979cb1f..7c21667df34bf 100644 --- a/x-pack/plugins/security_solution/public/resolver/types.ts +++ b/x-pack/plugins/security_solution/public/resolver/types.ts @@ -878,7 +878,7 @@ export interface ResolverPluginSetup { /** * The Resolver component without the required Providers. - * You must wrap this component in: `I18nProvider`, `Router` (from react-router,) `KibanaContextProvider`, + * You must wrap this component in: `KibanaRenderContextProvider`, `Router` (from react-router,) `KibanaContextProvider`, * and the `Provider` component provided by this object. */ ResolverWithoutProviders: React.MemoExoticComponent< diff --git a/x-pack/plugins/threat_intelligence/public/modules/timeline/components/add_to_timeline.tsx b/x-pack/plugins/threat_intelligence/public/modules/timeline/components/add_to_timeline.tsx index 71d3071ee2c4a..214a6472bb600 100644 --- a/x-pack/plugins/threat_intelligence/public/modules/timeline/components/add_to_timeline.tsx +++ b/x-pack/plugins/threat_intelligence/public/modules/timeline/components/add_to_timeline.tsx @@ -94,8 +94,9 @@ export const AddToTimelineButtonEmpty: VFC = ({ const buttonRef = useRef(null); - const addToTimelineButton = - useKibana().services.timelines.getHoverActions().getAddToTimelineButton; + const { timelines, analytics, i18n: i18nStart, theme } = useKibana().services; + const startServices = { analytics, i18n: i18nStart, theme }; + const addToTimelineButton = timelines.getHoverActions().getAddToTimelineButton; const { key, value } = typeof data === 'string' ? { key: field, value: data } : getIndicatorFieldAndValue(data, field); @@ -110,6 +111,7 @@ export const AddToTimelineButtonEmpty: VFC = ({ dataProvider, field: key, ownFocus: false, + startServices, }; // Use case is for the barchart legend (for example). @@ -153,8 +155,10 @@ export const AddToTimelineContextMenu: VFC = ({ const contextMenuRef = useRef(null); - const addToTimelineButton = - useKibana().services.timelines.getHoverActions().getAddToTimelineButton; + const { timelines, analytics, i18n: i18nStart, theme } = useKibana().services; + const startServices = { analytics, i18n: i18nStart, theme }; + + const addToTimelineButton = timelines.getHoverActions().getAddToTimelineButton; const { key, value } = typeof data === 'string' ? { key: field, value: data } : getIndicatorFieldAndValue(data, field); @@ -169,6 +173,7 @@ export const AddToTimelineContextMenu: VFC = ({ dataProvider, field: key, ownFocus: false, + startServices, }; // Use case is for the barchart legend (for example). 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 index ab69481d3b528..f40df09a49830 100644 --- 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 @@ -7,6 +7,7 @@ import { DataProvider } from '@kbn/timelines-plugin/common'; import { AddToTimelineButtonProps } from '@kbn/timelines-plugin/public'; +import { useKibana } from '../../../hooks/use_kibana'; import { generateDataProvider } from '../utils/data_provider'; import { fieldAndValueValid, getIndicatorFieldAndValue } from '../../indicators/utils/field_value'; import { Indicator } from '../../../../common/types/indicator'; @@ -38,6 +39,9 @@ export const useAddToTimeline = ({ indicator, field, }: UseAddToTimelineParam): UseAddToTimelineValue => { + const { analytics, i18n, theme } = useKibana().services; + const startServices = { analytics, i18n, theme }; + const { key, value } = typeof indicator === 'string' ? { key: field, value: indicator } @@ -53,6 +57,7 @@ export const useAddToTimeline = ({ dataProvider, field: key, ownFocus: false, + startServices, }; return { diff --git a/x-pack/plugins/threat_intelligence/public/plugin.tsx b/x-pack/plugins/threat_intelligence/public/plugin.tsx index 49f6b3b7724bf..09a0925577284 100755 --- a/x-pack/plugins/threat_intelligence/public/plugin.tsx +++ b/x-pack/plugins/threat_intelligence/public/plugin.tsx @@ -56,7 +56,7 @@ export const createApp = export class ThreatIntelligencePlugin implements Plugin { public async setup( - core: CoreSetup, + _core: CoreSetup, plugins: SetupPlugins ): Promise { const externalAttachmentType: ExternalReferenceAttachmentType = generateAttachmentType(); @@ -73,11 +73,11 @@ export class ThreatIntelligencePlugin implements Plugin { storage: new Storage(localStorage), }; - const services = { + const services: Services = { ...localPluginServices, ...core, ...plugins, - } as Services; + }; return { getComponent: createApp(services), diff --git a/x-pack/plugins/threat_intelligence/public/types.ts b/x-pack/plugins/threat_intelligence/public/types.ts index 45da610592cee..d1fdb8831e518 100644 --- a/x-pack/plugins/threat_intelligence/public/types.ts +++ b/x-pack/plugins/threat_intelligence/public/types.ts @@ -45,18 +45,17 @@ export interface ThreatIntelligencePluginStart { export interface ThreatIntelligencePluginStartDeps { data: DataPublicPluginStart; -} - -export type Services = { cases: CasesPublicStart; - data: DataPublicPluginStart; - storage: Storage; dataViews: DataViewsPublicPluginStart; triggersActionsUi: TriggersActionsStart; timelines: TimelinesUIStart; securityLayout: any; inspector: InspectorPluginStart; -} & CoreStart; +} + +export interface Services extends CoreStart, ThreatIntelligencePluginStartDeps { + storage: Storage; +} export interface LicenseAware { isEnterprise(): boolean; diff --git a/x-pack/plugins/timelines/public/components/hover_actions/actions/add_to_timeline.test.tsx b/x-pack/plugins/timelines/public/components/hover_actions/actions/add_to_timeline.test.tsx index 9e05720913f19..32c502271e618 100644 --- a/x-pack/plugins/timelines/public/components/hover_actions/actions/add_to_timeline.test.tsx +++ b/x-pack/plugins/timelines/public/components/hover_actions/actions/add_to_timeline.test.tsx @@ -7,6 +7,7 @@ import { EuiButtonEmpty } from '@elastic/eui'; import { act, fireEvent, render, screen } from '@testing-library/react'; +import { coreMock } from '@kbn/core/public/mocks'; import React from 'react'; import AddToTimelineButton, { @@ -18,6 +19,8 @@ import { DataProvider, IS_OPERATOR } from '../../../../common/types'; import { TestProviders } from '../../../mock'; import * as i18n from './translations'; +const coreStart = coreMock.createStart(); + const mockAddSuccess = jest.fn(); jest.mock('../../../hooks/use_app_toasts', () => ({ useAppToasts: () => ({ @@ -93,7 +96,7 @@ describe('add to timeline', () => { beforeEach(() => { render( - + ); }); @@ -111,7 +114,12 @@ describe('add to timeline', () => { beforeEach(() => { render( - + ); }); @@ -128,7 +136,12 @@ describe('add to timeline', () => { test('it renders a tooltip when `showTooltip` is true', () => { const { container } = render( - + ); @@ -138,7 +151,7 @@ describe('add to timeline', () => { test('it does NOT render a tooltip when `showTooltip` is false (default)', () => { const { container } = render( - + ); @@ -151,7 +164,12 @@ describe('add to timeline', () => { test('it starts dragging to timeline when a `draggableId` is provided', () => { render( - + ); @@ -163,7 +181,7 @@ describe('add to timeline', () => { test('it does NOT start dragging to timeline when a `draggableId` is NOT provided', () => { render( - + ); @@ -175,7 +193,12 @@ describe('add to timeline', () => { test('it dispatches a single `addProviderToTimeline` action when a single, non-array `dataProvider` is provided', () => { render( - + ); @@ -209,6 +232,7 @@ describe('add to timeline', () => { dataProvider={[providerA, providerB]} field={field} ownFocus={false} + startServices={coreStart} /> ); @@ -217,7 +241,7 @@ describe('add to timeline', () => { expect(mockDispatch).toHaveBeenCalledTimes(2); - providers.forEach((p, i) => + providers.forEach((_p, i) => expect(mockDispatch).toHaveBeenNthCalledWith(i + 1, { payload: { dataProvider: { @@ -241,7 +265,12 @@ describe('add to timeline', () => { render( - + ); @@ -273,6 +302,7 @@ describe('add to timeline', () => { keyboardEvent={keyboardEvent} ownFocus={true} showTooltip={true} + startServices={coreStart} /> ); @@ -290,6 +320,7 @@ describe('add to timeline', () => { keyboardEvent={keyboardEvent} ownFocus={true} showTooltip={true} + startServices={coreStart} /> ); @@ -308,6 +339,7 @@ describe('add to timeline', () => { keyboardEvent={keyboardEvent} ownFocus={true} showTooltip={true} + startServices={coreStart} /> ); @@ -338,6 +370,7 @@ describe('add to timeline', () => { keyboardEvent={keyboardEvent} ownFocus={true} showTooltip={true} + startServices={coreStart} /> ); @@ -355,6 +388,7 @@ describe('add to timeline', () => { keyboardEvent={keyboardEvent} ownFocus={true} showTooltip={true} + startServices={coreStart} /> ); @@ -373,6 +407,7 @@ describe('add to timeline', () => { keyboardEvent={keyboardEvent} ownFocus={true} showTooltip={true} + startServices={coreStart} /> ); @@ -387,7 +422,12 @@ describe('add to timeline', () => { test('Add success is called with "timeline" if timeline type is timeline', () => { render( - + ); @@ -408,6 +448,7 @@ describe('add to timeline', () => { field={field} ownFocus={false} timelineType={'template'} + startServices={coreStart} /> ); diff --git a/x-pack/plugins/timelines/public/components/hover_actions/actions/add_to_timeline.tsx b/x-pack/plugins/timelines/public/components/hover_actions/actions/add_to_timeline.tsx index d927729a2e4af..c96a35e5cd472 100644 --- a/x-pack/plugins/timelines/public/components/hover_actions/actions/add_to_timeline.tsx +++ b/x-pack/plugins/timelines/public/components/hover_actions/actions/add_to_timeline.tsx @@ -11,7 +11,8 @@ import { DraggableId } from '@hello-pangea/dnd'; import { isEmpty } from 'lodash'; import { useDispatch } from 'react-redux'; -import { toMountPoint } from '@kbn/kibana-react-plugin/public'; +import { toMountPoint } from '@kbn/react-kibana-mount'; +import { TimelinesStartServices } from '../../..'; import { TimelineId } from '../../../store/timeline'; import { addProviderToTimeline } from '../../../store/timeline/actions'; import { stopPropagationAndPreventDefault } from '../../../../common/utils/accessibility'; @@ -63,6 +64,7 @@ export interface AddToTimelineButtonProps extends HoverActionComponentProps { draggableId?: DraggableId; dataProvider?: DataProvider[] | DataProvider; timelineType?: string; + startServices: TimelinesStartServices; } const AddToTimelineButton: React.FC = React.memo( @@ -78,6 +80,7 @@ const AddToTimelineButton: React.FC = React.memo( showTooltip = false, value, timelineType = 'default', + startServices, }) => { const dispatch = useDispatch(); const { addSuccess } = useAppToasts(); @@ -103,7 +106,8 @@ const AddToTimelineButton: React.FC = React.memo( provider.name, timelineType === 'default' )} - + , + startServices ), }); } @@ -121,6 +125,7 @@ const AddToTimelineButton: React.FC = React.memo( onClick, startDragToTimeline, timelineType, + startServices, ]); useEffect(() => { diff --git a/x-pack/plugins/timelines/public/index.ts b/x-pack/plugins/timelines/public/index.ts index 2efefc82f18da..7e6a71025e3ec 100644 --- a/x-pack/plugins/timelines/public/index.ts +++ b/x-pack/plugins/timelines/public/index.ts @@ -14,6 +14,8 @@ // first download since the other plugins/areas of your code can directly pull from the package in their async imports. // See: https://docs.elastic.dev/kibana-dev-docs/key-concepts/platform-intro#public-plugin-api +import type { CoreStart } from '@kbn/core/public'; + import { TimelinesPlugin } from './plugin'; export type { TimelinesUIStart } from './types'; @@ -49,3 +51,5 @@ export function plugin() { } export type { AddToTimelineButtonProps } from './components/hover_actions/actions/add_to_timeline'; + +export type TimelinesStartServices = Pick; diff --git a/x-pack/plugins/timelines/tsconfig.json b/x-pack/plugins/timelines/tsconfig.json index 3038d455e010c..a3350a2f2110b 100644 --- a/x-pack/plugins/timelines/tsconfig.json +++ b/x-pack/plugins/timelines/tsconfig.json @@ -2,7 +2,7 @@ { "extends": "../../../tsconfig.base.json", "compilerOptions": { - "outDir": "target/types", + "outDir": "target/types" }, "include": [ "common/**/*", @@ -36,8 +36,9 @@ "@kbn/logging", "@kbn/search-errors", "@kbn/search-types", + "@kbn/react-kibana-mount" ], "exclude": [ - "target/**/*", + "target/**/*" ] } From 014efa4c399d4cd93ba98f56f771cf16f786f42a Mon Sep 17 00:00:00 2001 From: Kibana Machine <42973632+kibanamachine@users.noreply.github.com> Date: Tue, 7 May 2024 00:53:13 -0400 Subject: [PATCH 05/86] [api-docs] 2024-05-07 Daily api_docs build (#182769) Generated by https://buildkite.com/elastic/kibana-api-docs-daily/builds/699 --- api_docs/actions.mdx | 2 +- api_docs/advanced_settings.mdx | 2 +- .../ai_assistant_management_selection.mdx | 2 +- api_docs/aiops.mdx | 2 +- api_docs/alerting.mdx | 2 +- api_docs/apm.mdx | 2 +- api_docs/apm_data_access.mdx | 2 +- api_docs/asset_manager.mdx | 2 +- api_docs/assets_data_access.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_data_migration.mdx | 2 +- api_docs/cloud_defend.mdx | 2 +- api_docs/cloud_experiments.mdx | 2 +- api_docs/cloud_security_posture.mdx | 2 +- api_docs/console.mdx | 2 +- api_docs/content_management.mdx | 2 +- api_docs/controls.mdx | 2 +- api_docs/custom_integrations.mdx | 2 +- api_docs/dashboard.devdocs.json | 171 ++- api_docs/dashboard.mdx | 4 +- api_docs/dashboard_enhanced.mdx | 2 +- api_docs/data.devdocs.json | 1004 +----------- api_docs/data.mdx | 4 +- api_docs/data_query.mdx | 4 +- api_docs/data_search.devdocs.json | 1357 ++--------------- api_docs/data_search.mdx | 4 +- 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/dataset_quality.mdx | 2 +- api_docs/deprecations_by_api.mdx | 8 +- api_docs/deprecations_by_plugin.mdx | 14 +- 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/discover_shared.mdx | 2 +- api_docs/ecs_data_quality_dashboard.mdx | 2 +- api_docs/elastic_assistant.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_annotation_listing.mdx | 2 +- api_docs/event_log.mdx | 2 +- api_docs/exploratory_view.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/files_management.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/image_embeddable.mdx | 2 +- api_docs/index_lifecycle_management.mdx | 2 +- api_docs/index_management.mdx | 2 +- api_docs/infra.mdx | 2 +- api_docs/ingest_pipelines.mdx | 2 +- api_docs/inspector.mdx | 2 +- api_docs/interactive_setup.mdx | 2 +- api_docs/kbn_ace.mdx | 2 +- api_docs/kbn_actions_types.mdx | 2 +- api_docs/kbn_aiops_components.mdx | 2 +- api_docs/kbn_aiops_log_pattern_analysis.mdx | 2 +- api_docs/kbn_aiops_log_rate_analysis.mdx | 2 +- .../kbn_alerting_api_integration_helpers.mdx | 2 +- api_docs/kbn_alerting_state_types.mdx | 2 +- api_docs/kbn_alerting_types.mdx | 2 +- api_docs/kbn_alerts_as_data_utils.mdx | 2 +- api_docs/kbn_alerts_ui_shared.mdx | 2 +- api_docs/kbn_analytics.mdx | 2 +- api_docs/kbn_analytics_client.mdx | 2 +- api_docs/kbn_analytics_collection_utils.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_data_view.mdx | 2 +- api_docs/kbn_apm_synthtrace.mdx | 2 +- api_docs/kbn_apm_synthtrace_client.mdx | 2 +- api_docs/kbn_apm_utils.mdx | 2 +- api_docs/kbn_axe_config.mdx | 2 +- api_docs/kbn_bfetch_error.mdx | 2 +- api_docs/kbn_calculate_auto.mdx | 2 +- .../kbn_calculate_width_from_char_count.mdx | 2 +- api_docs/kbn_cases_components.mdx | 2 +- api_docs/kbn_cell_actions.mdx | 2 +- api_docs/kbn_chart_expressions_common.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_code_editor.mdx | 2 +- api_docs/kbn_code_editor_mock.mdx | 2 +- api_docs/kbn_code_owners.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_content_editor.mdx | 2 +- ...tent_management_tabbed_table_list_view.mdx | 2 +- ...kbn_content_management_table_list_view.mdx | 2 +- ...tent_management_table_list_view_common.mdx | 2 +- ...ntent_management_table_list_view_table.mdx | 2 +- api_docs/kbn_content_management_utils.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_apps_server_internal.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_custom_branding_browser.mdx | 2 +- ..._core_custom_branding_browser_internal.mdx | 2 +- ...kbn_core_custom_branding_browser_mocks.mdx | 2 +- api_docs/kbn_core_custom_branding_common.mdx | 2 +- api_docs/kbn_core_custom_branding_server.mdx | 2 +- ...n_core_custom_branding_server_internal.mdx | 2 +- .../kbn_core_custom_branding_server_mocks.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 +- ...elasticsearch_server_internal.devdocs.json | 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 +- api_docs/kbn_core_http_resources_server.mdx | 2 +- ...bn_core_http_resources_server_internal.mdx | 2 +- .../kbn_core_http_resources_server_mocks.mdx | 2 +- ...e_http_router_server_internal.devdocs.json | 33 - .../kbn_core_http_router_server_internal.mdx | 4 +- .../kbn_core_http_router_server_mocks.mdx | 2 +- api_docs/kbn_core_http_server.devdocs.json | 33 + api_docs/kbn_core_http_server.mdx | 4 +- ...kbn_core_http_server_internal.devdocs.json | 2 +- api_docs/kbn_core_http_server_internal.mdx | 2 +- .../kbn_core_http_server_mocks.devdocs.json | 4 +- 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 +- ...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_lifecycle_server.mdx | 2 +- api_docs/kbn_core_lifecycle_server_mocks.mdx | 2 +- api_docs/kbn_core_logging_browser_mocks.mdx | 2 +- api_docs/kbn_core_logging_common_internal.mdx | 2 +- api_docs/kbn_core_logging_server.mdx | 2 +- ..._core_logging_server_internal.devdocs.json | 4 +- 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 +- .../kbn_core_plugins_contracts_browser.mdx | 2 +- .../kbn_core_plugins_contracts_server.mdx | 2 +- api_docs/kbn_core_plugins_server.devdocs.json | 6 +- api_docs/kbn_core_plugins_server.mdx | 2 +- api_docs/kbn_core_plugins_server_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_rendering_server_internal.mdx | 2 +- api_docs/kbn_core_rendering_server_mocks.mdx | 2 +- api_docs/kbn_core_root_server_internal.mdx | 2 +- .../kbn_core_saved_objects_api_browser.mdx | 2 +- .../kbn_core_saved_objects_api_server.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_security_browser.mdx | 2 +- .../kbn_core_security_browser_internal.mdx | 2 +- api_docs/kbn_core_security_browser_mocks.mdx | 2 +- api_docs/kbn_core_security_common.mdx | 2 +- api_docs/kbn_core_security_server.mdx | 2 +- .../kbn_core_security_server_internal.mdx | 2 +- api_docs/kbn_core_security_server_mocks.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_test_helpers_kbn_server.mdx | 2 +- .../kbn_core_test_helpers_model_versions.mdx | 2 +- ...n_core_test_helpers_so_type_serializer.mdx | 2 +- api_docs/kbn_core_test_helpers_test_utils.mdx | 2 +- api_docs/kbn_core_theme_browser.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_core_user_profile_browser.mdx | 2 +- ...kbn_core_user_profile_browser_internal.mdx | 2 +- .../kbn_core_user_profile_browser_mocks.mdx | 2 +- api_docs/kbn_core_user_profile_common.mdx | 2 +- api_docs/kbn_core_user_profile_server.mdx | 2 +- .../kbn_core_user_profile_server_internal.mdx | 2 +- .../kbn_core_user_profile_server_mocks.mdx | 2 +- api_docs/kbn_core_user_settings_server.mdx | 2 +- .../kbn_core_user_settings_server_mocks.mdx | 2 +- api_docs/kbn_crypto.mdx | 2 +- api_docs/kbn_crypto_browser.mdx | 2 +- api_docs/kbn_custom_icons.mdx | 2 +- api_docs/kbn_custom_integrations.mdx | 2 +- api_docs/kbn_cypress_config.mdx | 2 +- api_docs/kbn_data_forge.mdx | 2 +- api_docs/kbn_data_service.mdx | 2 +- api_docs/kbn_data_stream_adapter.mdx | 2 +- api_docs/kbn_data_view_utils.mdx | 2 +- api_docs/kbn_datemath.mdx | 2 +- api_docs/kbn_deeplinks_analytics.mdx | 2 +- api_docs/kbn_deeplinks_devtools.mdx | 2 +- api_docs/kbn_deeplinks_fleet.mdx | 2 +- api_docs/kbn_deeplinks_management.mdx | 2 +- api_docs/kbn_deeplinks_ml.mdx | 2 +- api_docs/kbn_deeplinks_observability.mdx | 2 +- api_docs/kbn_deeplinks_search.mdx | 2 +- api_docs/kbn_deeplinks_security.mdx | 2 +- api_docs/kbn_deeplinks_shared.mdx | 2 +- api_docs/kbn_default_nav_analytics.mdx | 2 +- api_docs/kbn_default_nav_devtools.mdx | 2 +- api_docs/kbn_default_nav_management.mdx | 2 +- api_docs/kbn_default_nav_ml.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_discover_utils.mdx | 2 +- api_docs/kbn_doc_links.mdx | 2 +- api_docs/kbn_docs_utils.mdx | 2 +- api_docs/kbn_dom_drag_drop.mdx | 2 +- api_docs/kbn_ebt_tools.mdx | 2 +- api_docs/kbn_ecs_data_quality_dashboard.mdx | 2 +- api_docs/kbn_elastic_agent_utils.mdx | 2 +- api_docs/kbn_elastic_assistant.mdx | 2 +- api_docs/kbn_elastic_assistant_common.mdx | 2 +- api_docs/kbn_es.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_esql_ast.mdx | 2 +- api_docs/kbn_esql_utils.devdocs.json | 267 ++++ api_docs/kbn_esql_utils.mdx | 4 +- api_docs/kbn_esql_validation_autocomplete.mdx | 2 +- api_docs/kbn_event_annotation_common.mdx | 2 +- api_docs/kbn_event_annotation_components.mdx | 2 +- api_docs/kbn_expandable_flyout.mdx | 2 +- api_docs/kbn_field_types.mdx | 2 +- api_docs/kbn_field_utils.mdx | 2 +- api_docs/kbn_find_used_node_modules.mdx | 2 +- api_docs/kbn_formatters.mdx | 2 +- .../kbn_ftr_common_functional_services.mdx | 2 +- .../kbn_ftr_common_functional_ui_services.mdx | 2 +- api_docs/kbn_generate.mdx | 2 +- api_docs/kbn_generate_console_definitions.mdx | 2 +- api_docs/kbn_generate_csv.mdx | 2 +- api_docs/kbn_guided_onboarding.mdx | 2 +- api_docs/kbn_handlebars.mdx | 2 +- api_docs/kbn_hapi_mocks.mdx | 2 +- api_docs/kbn_health_gateway_server.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_i18n_react.mdx | 2 +- api_docs/kbn_import_resolver.mdx | 2 +- api_docs/kbn_index_management.mdx | 2 +- api_docs/kbn_inference_integration_flyout.mdx | 2 +- api_docs/kbn_infra_forge.mdx | 2 +- api_docs/kbn_interpreter.mdx | 2 +- api_docs/kbn_io_ts_utils.mdx | 2 +- api_docs/kbn_ipynb.mdx | 2 +- api_docs/kbn_jest_serializers.mdx | 2 +- api_docs/kbn_journeys.mdx | 2 +- api_docs/kbn_json_ast.mdx | 2 +- api_docs/kbn_kibana_manifest_schema.mdx | 2 +- .../kbn_language_documentation_popover.mdx | 2 +- api_docs/kbn_lens_embeddable_utils.mdx | 2 +- api_docs/kbn_lens_formula_docs.mdx | 2 +- api_docs/kbn_logging.mdx | 2 +- api_docs/kbn_logging_mocks.mdx | 2 +- api_docs/kbn_managed_content_badge.mdx | 2 +- api_docs/kbn_managed_vscode_config.mdx | 2 +- api_docs/kbn_management_cards_navigation.mdx | 2 +- .../kbn_management_settings_application.mdx | 2 +- ...ent_settings_components_field_category.mdx | 2 +- ...gement_settings_components_field_input.mdx | 2 +- ...nagement_settings_components_field_row.mdx | 2 +- ...bn_management_settings_components_form.mdx | 2 +- ...n_management_settings_field_definition.mdx | 2 +- api_docs/kbn_management_settings_ids.mdx | 2 +- ...n_management_settings_section_registry.mdx | 2 +- api_docs/kbn_management_settings_types.mdx | 2 +- .../kbn_management_settings_utilities.mdx | 2 +- api_docs/kbn_management_storybook_config.mdx | 2 +- api_docs/kbn_mapbox_gl.mdx | 2 +- api_docs/kbn_maps_vector_tile_utils.mdx | 2 +- api_docs/kbn_ml_agg_utils.mdx | 2 +- api_docs/kbn_ml_anomaly_utils.mdx | 2 +- .../kbn_ml_cancellable_search.devdocs.json | 8 +- api_docs/kbn_ml_cancellable_search.mdx | 2 +- api_docs/kbn_ml_category_validator.mdx | 2 +- api_docs/kbn_ml_chi2test.mdx | 2 +- .../kbn_ml_data_frame_analytics_utils.mdx | 2 +- api_docs/kbn_ml_data_grid.mdx | 2 +- api_docs/kbn_ml_date_picker.mdx | 2 +- api_docs/kbn_ml_date_utils.mdx | 2 +- api_docs/kbn_ml_error_utils.mdx | 2 +- api_docs/kbn_ml_in_memory_table.mdx | 2 +- api_docs/kbn_ml_is_defined.mdx | 2 +- api_docs/kbn_ml_is_populated_object.mdx | 2 +- api_docs/kbn_ml_kibana_theme.mdx | 2 +- api_docs/kbn_ml_local_storage.mdx | 2 +- api_docs/kbn_ml_nested_property.mdx | 2 +- api_docs/kbn_ml_number_utils.mdx | 2 +- api_docs/kbn_ml_query_utils.mdx | 2 +- api_docs/kbn_ml_random_sampler_utils.mdx | 2 +- api_docs/kbn_ml_route_utils.mdx | 2 +- api_docs/kbn_ml_runtime_field_utils.mdx | 2 +- api_docs/kbn_ml_string_hash.mdx | 2 +- api_docs/kbn_ml_time_buckets.mdx | 2 +- api_docs/kbn_ml_trained_models_utils.mdx | 2 +- api_docs/kbn_ml_ui_actions.mdx | 2 +- api_docs/kbn_ml_url_state.mdx | 2 +- api_docs/kbn_mock_idp_utils.mdx | 2 +- api_docs/kbn_monaco.mdx | 2 +- api_docs/kbn_object_versioning.mdx | 2 +- api_docs/kbn_observability_alert_details.mdx | 2 +- .../kbn_observability_alerting_test_data.mdx | 2 +- ...ility_get_padded_alert_time_range_util.mdx | 2 +- api_docs/kbn_openapi_bundler.mdx | 2 +- api_docs/kbn_openapi_generator.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_panel_loader.mdx | 2 +- ..._performance_testing_dataset_extractor.mdx | 2 +- api_docs/kbn_plugin_check.mdx | 2 +- api_docs/kbn_plugin_generator.mdx | 2 +- api_docs/kbn_plugin_helpers.mdx | 2 +- api_docs/kbn_presentation_containers.mdx | 2 +- api_docs/kbn_presentation_publishing.mdx | 2 +- api_docs/kbn_profiling_utils.mdx | 2 +- api_docs/kbn_random_sampling.mdx | 2 +- api_docs/kbn_react_field.mdx | 2 +- api_docs/kbn_react_hooks.devdocs.json | 170 +++ api_docs/kbn_react_hooks.mdx | 36 + api_docs/kbn_react_kibana_context_common.mdx | 2 +- api_docs/kbn_react_kibana_context_render.mdx | 2 +- api_docs/kbn_react_kibana_context_root.mdx | 2 +- api_docs/kbn_react_kibana_context_styled.mdx | 2 +- api_docs/kbn_react_kibana_context_theme.mdx | 2 +- api_docs/kbn_react_kibana_mount.mdx | 2 +- api_docs/kbn_repo_file_maps.mdx | 2 +- api_docs/kbn_repo_linter.mdx | 2 +- api_docs/kbn_repo_path.mdx | 2 +- api_docs/kbn_repo_source_classifier.mdx | 2 +- api_docs/kbn_reporting_common.mdx | 2 +- api_docs/kbn_reporting_csv_share_panel.mdx | 2 +- api_docs/kbn_reporting_export_types_csv.mdx | 2 +- .../kbn_reporting_export_types_csv_common.mdx | 2 +- api_docs/kbn_reporting_export_types_pdf.mdx | 2 +- .../kbn_reporting_export_types_pdf_common.mdx | 2 +- api_docs/kbn_reporting_export_types_png.mdx | 2 +- .../kbn_reporting_export_types_png_common.mdx | 2 +- api_docs/kbn_reporting_mocks_server.mdx | 2 +- api_docs/kbn_reporting_public.mdx | 2 +- api_docs/kbn_reporting_server.mdx | 2 +- api_docs/kbn_resizable_layout.mdx | 2 +- api_docs/kbn_rison.mdx | 2 +- api_docs/kbn_router_to_openapispec.mdx | 2 +- api_docs/kbn_router_utils.mdx | 2 +- api_docs/kbn_rrule.mdx | 2 +- api_docs/kbn_rule_data_utils.mdx | 2 +- api_docs/kbn_saved_objects_settings.mdx | 2 +- api_docs/kbn_search_api_panels.mdx | 2 +- api_docs/kbn_search_connectors.mdx | 2 +- api_docs/kbn_search_errors.devdocs.json | 19 +- api_docs/kbn_search_errors.mdx | 2 +- api_docs/kbn_search_index_documents.mdx | 2 +- api_docs/kbn_search_response_warnings.mdx | 2 +- api_docs/kbn_search_types.devdocs.json | 1023 +++++++++++++ api_docs/kbn_search_types.mdx | 33 + api_docs/kbn_security_hardening.mdx | 2 +- api_docs/kbn_security_plugin_types_common.mdx | 2 +- api_docs/kbn_security_plugin_types_public.mdx | 2 +- api_docs/kbn_security_plugin_types_server.mdx | 2 +- api_docs/kbn_security_solution_features.mdx | 2 +- api_docs/kbn_security_solution_navigation.mdx | 2 +- api_docs/kbn_security_solution_side_nav.mdx | 2 +- ...kbn_security_solution_storybook_config.mdx | 2 +- .../kbn_securitysolution_autocomplete.mdx | 2 +- api_docs/kbn_securitysolution_data_table.mdx | 2 +- api_docs/kbn_securitysolution_ecs.mdx | 2 +- api_docs/kbn_securitysolution_es_utils.mdx | 2 +- ...ritysolution_exception_list_components.mdx | 2 +- api_docs/kbn_securitysolution_grouping.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_serverless_common_settings.mdx | 2 +- .../kbn_serverless_observability_settings.mdx | 2 +- api_docs/kbn_serverless_project_switcher.mdx | 2 +- api_docs/kbn_serverless_search_settings.mdx | 2 +- api_docs/kbn_serverless_security_settings.mdx | 2 +- api_docs/kbn_serverless_storybook_config.mdx | 2 +- api_docs/kbn_shared_svg.mdx | 2 +- api_docs/kbn_shared_ux_avatar_solution.mdx | 2 +- .../kbn_shared_ux_button_exit_full_screen.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_chrome_navigation.mdx | 2 +- api_docs/kbn_shared_ux_error_boundary.mdx | 2 +- api_docs/kbn_shared_ux_file_context.mdx | 2 +- api_docs/kbn_shared_ux_file_image.mdx | 2 +- api_docs/kbn_shared_ux_file_image_mocks.mdx | 2 +- api_docs/kbn_shared_ux_file_mocks.mdx | 2 +- api_docs/kbn_shared_ux_file_picker.mdx | 2 +- api_docs/kbn_shared_ux_file_types.mdx | 2 +- api_docs/kbn_shared_ux_file_upload.mdx | 2 +- api_docs/kbn_shared_ux_file_util.mdx | 2 +- api_docs/kbn_shared_ux_link_redirect_app.mdx | 2 +- .../kbn_shared_ux_link_redirect_app_mocks.mdx | 2 +- api_docs/kbn_shared_ux_markdown.mdx | 2 +- api_docs/kbn_shared_ux_markdown_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_prompt_not_found.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_tabbed_modal.mdx | 2 +- api_docs/kbn_shared_ux_utility.mdx | 2 +- api_docs/kbn_slo_schema.mdx | 2 +- api_docs/kbn_solution_nav_es.mdx | 2 +- api_docs/kbn_solution_nav_oblt.mdx | 2 +- api_docs/kbn_some_dev_log.mdx | 2 +- api_docs/kbn_sort_predicates.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_eui_helpers.devdocs.json | 168 ++ api_docs/kbn_test_eui_helpers.mdx | 4 +- api_docs/kbn_test_jest_helpers.mdx | 2 +- api_docs/kbn_test_subj_selector.mdx | 2 +- api_docs/kbn_text_based_editor.mdx | 2 +- api_docs/kbn_timerange.mdx | 2 +- api_docs/kbn_tooling_log.mdx | 2 +- api_docs/kbn_triggers_actions_ui_types.mdx | 2 +- api_docs/kbn_ts_projects.mdx | 2 +- api_docs/kbn_typed_react_router_config.mdx | 2 +- api_docs/kbn_ui_actions_browser.mdx | 2 +- api_docs/kbn_ui_shared_deps_src.mdx | 2 +- api_docs/kbn_ui_theme.mdx | 2 +- api_docs/kbn_unified_data_table.devdocs.json | 54 +- api_docs/kbn_unified_data_table.mdx | 4 +- api_docs/kbn_unified_doc_viewer.mdx | 4 +- api_docs/kbn_unified_field_list.mdx | 2 +- api_docs/kbn_unsaved_changes_badge.mdx | 2 +- api_docs/kbn_use_tracked_promise.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_visualization_ui_components.mdx | 2 +- api_docs/kbn_visualization_utils.mdx | 2 +- api_docs/kbn_xstate_utils.mdx | 2 +- api_docs/kbn_yarn_lock_validator.mdx | 2 +- api_docs/kbn_zod_helpers.mdx | 2 +- api_docs/kibana_overview.mdx | 2 +- api_docs/kibana_react.devdocs.json | 140 -- 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/links.devdocs.json | 16 +- api_docs/links.mdx | 2 +- api_docs/lists.mdx | 2 +- api_docs/logs_explorer.mdx | 2 +- api_docs/logs_shared.mdx | 2 +- api_docs/management.mdx | 2 +- api_docs/maps.mdx | 2 +- api_docs/maps_ems.mdx | 2 +- api_docs/metrics_data_access.mdx | 2 +- api_docs/ml.mdx | 2 +- api_docs/mock_idp_plugin.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/no_data_page.mdx | 2 +- api_docs/notifications.mdx | 2 +- api_docs/observability.mdx | 2 +- .../observability_a_i_assistant.devdocs.json | 75 +- api_docs/observability_a_i_assistant.mdx | 4 +- api_docs/observability_a_i_assistant_app.mdx | 2 +- .../observability_ai_assistant_management.mdx | 2 +- api_docs/observability_logs_explorer.mdx | 2 +- api_docs/observability_onboarding.mdx | 2 +- api_docs/observability_shared.mdx | 2 +- api_docs/osquery.mdx | 2 +- api_docs/painless_lab.mdx | 2 +- api_docs/plugin_directory.mdx | 30 +- api_docs/presentation_panel.mdx | 2 +- api_docs/presentation_util.mdx | 2 +- api_docs/profiling.mdx | 2 +- api_docs/profiling_data_access.mdx | 2 +- api_docs/remote_clusters.mdx | 2 +- api_docs/reporting.mdx | 2 +- api_docs/rollup.mdx | 2 +- api_docs/rule_registry.devdocs.json | 12 +- 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.devdocs.json | 4 +- api_docs/saved_search.mdx | 2 +- api_docs/screenshot_mode.mdx | 2 +- api_docs/screenshotting.mdx | 2 +- api_docs/search_connectors.mdx | 2 +- api_docs/search_notebooks.mdx | 2 +- api_docs/search_playground.mdx | 2 +- api_docs/security.mdx | 2 +- api_docs/security_solution.mdx | 2 +- api_docs/security_solution_ess.mdx | 2 +- api_docs/security_solution_serverless.mdx | 2 +- api_docs/serverless.mdx | 2 +- api_docs/serverless_observability.mdx | 2 +- api_docs/serverless_search.mdx | 2 +- api_docs/session_view.mdx | 2 +- api_docs/share.mdx | 2 +- api_docs/slo.devdocs.json | 20 + api_docs/slo.mdx | 4 +- 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.devdocs.json | 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/text_based_languages.mdx | 2 +- api_docs/threat_intelligence.mdx | 2 +- api_docs/timelines.devdocs.json | 97 +- api_docs/timelines.mdx | 4 +- 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_doc_viewer.mdx | 2 +- api_docs/unified_histogram.mdx | 2 +- api_docs/unified_search.devdocs.json | 8 +- api_docs/unified_search.mdx | 2 +- api_docs/unified_search_autocomplete.mdx | 2 +- api_docs/uptime.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 +- 715 files changed, 2956 insertions(+), 3258 deletions(-) create mode 100644 api_docs/kbn_react_hooks.devdocs.json create mode 100644 api_docs/kbn_react_hooks.mdx create mode 100644 api_docs/kbn_search_types.devdocs.json create mode 100644 api_docs/kbn_search_types.mdx diff --git a/api_docs/actions.mdx b/api_docs/actions.mdx index 709ce8c9c1674..0024b7036c12d 100644 --- a/api_docs/actions.mdx +++ b/api_docs/actions.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/actions title: "actions" image: https://source.unsplash.com/400x175/?github description: API docs for the actions plugin -date: 2024-05-06 +date: 2024-05-07 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 173ed91a9a850..40537f6bc3efa 100644 --- a/api_docs/advanced_settings.mdx +++ b/api_docs/advanced_settings.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/advancedSettings title: "advancedSettings" image: https://source.unsplash.com/400x175/?github description: API docs for the advancedSettings plugin -date: 2024-05-06 +date: 2024-05-07 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'advancedSettings'] --- import advancedSettingsObj from './advanced_settings.devdocs.json'; diff --git a/api_docs/ai_assistant_management_selection.mdx b/api_docs/ai_assistant_management_selection.mdx index b23807e92e502..9c66f645d9e99 100644 --- a/api_docs/ai_assistant_management_selection.mdx +++ b/api_docs/ai_assistant_management_selection.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/aiAssistantManagementSelection title: "aiAssistantManagementSelection" image: https://source.unsplash.com/400x175/?github description: API docs for the aiAssistantManagementSelection plugin -date: 2024-05-06 +date: 2024-05-07 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'aiAssistantManagementSelection'] --- import aiAssistantManagementSelectionObj from './ai_assistant_management_selection.devdocs.json'; diff --git a/api_docs/aiops.mdx b/api_docs/aiops.mdx index 49139a3b4058a..535eaf0b3c3d6 100644 --- a/api_docs/aiops.mdx +++ b/api_docs/aiops.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/aiops title: "aiops" image: https://source.unsplash.com/400x175/?github description: API docs for the aiops plugin -date: 2024-05-06 +date: 2024-05-07 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 095bc4d551205..e90c347a9bcd1 100644 --- a/api_docs/alerting.mdx +++ b/api_docs/alerting.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/alerting title: "alerting" image: https://source.unsplash.com/400x175/?github description: API docs for the alerting plugin -date: 2024-05-06 +date: 2024-05-07 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 a0a7a03572657..7c4c49462a8c6 100644 --- a/api_docs/apm.mdx +++ b/api_docs/apm.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/apm title: "apm" image: https://source.unsplash.com/400x175/?github description: API docs for the apm plugin -date: 2024-05-06 +date: 2024-05-07 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'apm'] --- import apmObj from './apm.devdocs.json'; diff --git a/api_docs/apm_data_access.mdx b/api_docs/apm_data_access.mdx index 0844fa4dd3fe3..80a6fc8e95c48 100644 --- a/api_docs/apm_data_access.mdx +++ b/api_docs/apm_data_access.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/apmDataAccess title: "apmDataAccess" image: https://source.unsplash.com/400x175/?github description: API docs for the apmDataAccess plugin -date: 2024-05-06 +date: 2024-05-07 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'apmDataAccess'] --- import apmDataAccessObj from './apm_data_access.devdocs.json'; diff --git a/api_docs/asset_manager.mdx b/api_docs/asset_manager.mdx index de01bf7f76ed9..256d8489bc172 100644 --- a/api_docs/asset_manager.mdx +++ b/api_docs/asset_manager.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/assetManager title: "assetManager" image: https://source.unsplash.com/400x175/?github description: API docs for the assetManager plugin -date: 2024-05-06 +date: 2024-05-07 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'assetManager'] --- import assetManagerObj from './asset_manager.devdocs.json'; diff --git a/api_docs/assets_data_access.mdx b/api_docs/assets_data_access.mdx index 7b99fda286bae..0f888ef73cfb6 100644 --- a/api_docs/assets_data_access.mdx +++ b/api_docs/assets_data_access.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/assetsDataAccess title: "assetsDataAccess" image: https://source.unsplash.com/400x175/?github description: API docs for the assetsDataAccess plugin -date: 2024-05-06 +date: 2024-05-07 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'assetsDataAccess'] --- import assetsDataAccessObj from './assets_data_access.devdocs.json'; diff --git a/api_docs/banners.mdx b/api_docs/banners.mdx index c7dbcabe37daf..06162e4d0bdbc 100644 --- a/api_docs/banners.mdx +++ b/api_docs/banners.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/banners title: "banners" image: https://source.unsplash.com/400x175/?github description: API docs for the banners plugin -date: 2024-05-06 +date: 2024-05-07 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 663b7dd1cb538..8568d66cc91a1 100644 --- a/api_docs/bfetch.mdx +++ b/api_docs/bfetch.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/bfetch title: "bfetch" image: https://source.unsplash.com/400x175/?github description: API docs for the bfetch plugin -date: 2024-05-06 +date: 2024-05-07 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 5bc2cc57f2743..c81333834a486 100644 --- a/api_docs/canvas.mdx +++ b/api_docs/canvas.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/canvas title: "canvas" image: https://source.unsplash.com/400x175/?github description: API docs for the canvas plugin -date: 2024-05-06 +date: 2024-05-07 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 bb409c50cc116..7405871ccccf6 100644 --- a/api_docs/cases.mdx +++ b/api_docs/cases.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/cases title: "cases" image: https://source.unsplash.com/400x175/?github description: API docs for the cases plugin -date: 2024-05-06 +date: 2024-05-07 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 7226a09be9006..dc1b676960da1 100644 --- a/api_docs/charts.mdx +++ b/api_docs/charts.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/charts title: "charts" image: https://source.unsplash.com/400x175/?github description: API docs for the charts plugin -date: 2024-05-06 +date: 2024-05-07 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 d1f671e74d57b..8230a1bbd091d 100644 --- a/api_docs/cloud.mdx +++ b/api_docs/cloud.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/cloud title: "cloud" image: https://source.unsplash.com/400x175/?github description: API docs for the cloud plugin -date: 2024-05-06 +date: 2024-05-07 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'cloud'] --- import cloudObj from './cloud.devdocs.json'; diff --git a/api_docs/cloud_data_migration.mdx b/api_docs/cloud_data_migration.mdx index 1634bd8716509..98be65ddae27d 100644 --- a/api_docs/cloud_data_migration.mdx +++ b/api_docs/cloud_data_migration.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/cloudDataMigration title: "cloudDataMigration" image: https://source.unsplash.com/400x175/?github description: API docs for the cloudDataMigration plugin -date: 2024-05-06 +date: 2024-05-07 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'cloudDataMigration'] --- import cloudDataMigrationObj from './cloud_data_migration.devdocs.json'; diff --git a/api_docs/cloud_defend.mdx b/api_docs/cloud_defend.mdx index 5588ec3b565d2..1fbdc26f79c5f 100644 --- a/api_docs/cloud_defend.mdx +++ b/api_docs/cloud_defend.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/cloudDefend title: "cloudDefend" image: https://source.unsplash.com/400x175/?github description: API docs for the cloudDefend plugin -date: 2024-05-06 +date: 2024-05-07 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'cloudDefend'] --- import cloudDefendObj from './cloud_defend.devdocs.json'; diff --git a/api_docs/cloud_experiments.mdx b/api_docs/cloud_experiments.mdx index 9b53acccd0876..a3b9f713ad2e4 100644 --- a/api_docs/cloud_experiments.mdx +++ b/api_docs/cloud_experiments.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/cloudExperiments title: "cloudExperiments" image: https://source.unsplash.com/400x175/?github description: API docs for the cloudExperiments plugin -date: 2024-05-06 +date: 2024-05-07 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 89b93bd765013..f48b7e99397fb 100644 --- a/api_docs/cloud_security_posture.mdx +++ b/api_docs/cloud_security_posture.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/cloudSecurityPosture title: "cloudSecurityPosture" image: https://source.unsplash.com/400x175/?github description: API docs for the cloudSecurityPosture plugin -date: 2024-05-06 +date: 2024-05-07 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 a5a3a671c1236..b17be506e6f25 100644 --- a/api_docs/console.mdx +++ b/api_docs/console.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/console title: "console" image: https://source.unsplash.com/400x175/?github description: API docs for the console plugin -date: 2024-05-06 +date: 2024-05-07 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'console'] --- import consoleObj from './console.devdocs.json'; diff --git a/api_docs/content_management.mdx b/api_docs/content_management.mdx index 35ed12091f46f..61241131bc759 100644 --- a/api_docs/content_management.mdx +++ b/api_docs/content_management.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/contentManagement title: "contentManagement" image: https://source.unsplash.com/400x175/?github description: API docs for the contentManagement plugin -date: 2024-05-06 +date: 2024-05-07 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'contentManagement'] --- import contentManagementObj from './content_management.devdocs.json'; diff --git a/api_docs/controls.mdx b/api_docs/controls.mdx index 58fe59fed06ca..26d83121fe660 100644 --- a/api_docs/controls.mdx +++ b/api_docs/controls.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/controls title: "controls" image: https://source.unsplash.com/400x175/?github description: API docs for the controls plugin -date: 2024-05-06 +date: 2024-05-07 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'controls'] --- import controlsObj from './controls.devdocs.json'; diff --git a/api_docs/custom_integrations.mdx b/api_docs/custom_integrations.mdx index e0524524cd58b..5ff6bb57966ff 100644 --- a/api_docs/custom_integrations.mdx +++ b/api_docs/custom_integrations.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/customIntegrations title: "customIntegrations" image: https://source.unsplash.com/400x175/?github description: API docs for the customIntegrations plugin -date: 2024-05-06 +date: 2024-05-07 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'customIntegrations'] --- import customIntegrationsObj from './custom_integrations.devdocs.json'; diff --git a/api_docs/dashboard.devdocs.json b/api_docs/dashboard.devdocs.json index 2a1d5cfce3cd1..612cf9f1ea2ec 100644 --- a/api_docs/dashboard.devdocs.json +++ b/api_docs/dashboard.devdocs.json @@ -393,54 +393,6 @@ ], "returnComment": [], "initialIsOpen": false - }, - { - "parentPluginId": "dashboard", - "id": "def-public.registerDashboardPanelPlacementSetting", - "type": "Function", - "tags": [], - "label": "registerDashboardPanelPlacementSetting", - "description": [], - "signature": [ - "(embeddableType: string, getPanelPlacementSettings: GetPanelPlacementSettings) => void" - ], - "path": "src/plugins/dashboard/public/dashboard_container/external_api/dashboard_panel_placement_registry.ts", - "deprecated": false, - "trackAdoption": false, - "children": [ - { - "parentPluginId": "dashboard", - "id": "def-public.registerDashboardPanelPlacementSetting.$1", - "type": "string", - "tags": [], - "label": "embeddableType", - "description": [], - "signature": [ - "string" - ], - "path": "src/plugins/dashboard/public/dashboard_container/external_api/dashboard_panel_placement_registry.ts", - "deprecated": false, - "trackAdoption": false, - "isRequired": true - }, - { - "parentPluginId": "dashboard", - "id": "def-public.registerDashboardPanelPlacementSetting.$2", - "type": "Function", - "tags": [], - "label": "getPanelPlacementSettings", - "description": [], - "signature": [ - "GetPanelPlacementSettings" - ], - "path": "src/plugins/dashboard/public/dashboard_container/external_api/dashboard_panel_placement_registry.ts", - "deprecated": false, - "trackAdoption": false, - "isRequired": true - } - ], - "returnComment": [], - "initialIsOpen": false } ], "interfaces": [ @@ -724,6 +676,79 @@ } ], "initialIsOpen": false + }, + { + "parentPluginId": "dashboard", + "id": "def-public.IProvidesLegacyPanelPlacementSettings", + "type": "Interface", + "tags": [], + "label": "IProvidesLegacyPanelPlacementSettings", + "description": [], + "signature": [ + { + "pluginId": "dashboard", + "scope": "public", + "docId": "kibDashboardPluginApi", + "section": "def-public.IProvidesLegacyPanelPlacementSettings", + "text": "IProvidesLegacyPanelPlacementSettings" + }, + "" + ], + "path": "src/plugins/dashboard/public/dashboard_container/panel_placement/types.ts", + "deprecated": false, + "trackAdoption": false, + "children": [ + { + "parentPluginId": "dashboard", + "id": "def-public.IProvidesLegacyPanelPlacementSettings.getLegacyPanelPlacementSettings", + "type": "Function", + "tags": [], + "label": "getLegacyPanelPlacementSettings", + "description": [], + "signature": [ + "(input: InputType, attributes?: AttributesType | undefined) => Partial<", + "PanelPlacementSettings", + ">" + ], + "path": "src/plugins/dashboard/public/dashboard_container/panel_placement/types.ts", + "deprecated": false, + "trackAdoption": false, + "children": [ + { + "parentPluginId": "dashboard", + "id": "def-public.IProvidesLegacyPanelPlacementSettings.getLegacyPanelPlacementSettings.$1", + "type": "Uncategorized", + "tags": [], + "label": "input", + "description": [], + "signature": [ + "InputType" + ], + "path": "src/plugins/dashboard/public/dashboard_container/panel_placement/types.ts", + "deprecated": false, + "trackAdoption": false, + "isRequired": true + }, + { + "parentPluginId": "dashboard", + "id": "def-public.IProvidesLegacyPanelPlacementSettings.getLegacyPanelPlacementSettings.$2", + "type": "Uncategorized", + "tags": [], + "label": "attributes", + "description": [], + "signature": [ + "AttributesType | undefined" + ], + "path": "src/plugins/dashboard/public/dashboard_container/panel_placement/types.ts", + "deprecated": false, + "trackAdoption": false, + "isRequired": false + } + ], + "returnComment": [] + } + ], + "initialIsOpen": false } ], "enums": [ @@ -1089,6 +1114,56 @@ "trackAdoption": false, "children": [], "returnComment": [] + }, + { + "parentPluginId": "dashboard", + "id": "def-public.DashboardStart.registerDashboardPanelPlacementSetting", + "type": "Function", + "tags": [], + "label": "registerDashboardPanelPlacementSetting", + "description": [], + "signature": [ + "(embeddableType: string, getPanelPlacementSettings: ", + "GetPanelPlacementSettings", + ") => void" + ], + "path": "src/plugins/dashboard/public/plugin.tsx", + "deprecated": false, + "trackAdoption": false, + "children": [ + { + "parentPluginId": "dashboard", + "id": "def-public.DashboardStart.registerDashboardPanelPlacementSetting.$1", + "type": "string", + "tags": [], + "label": "embeddableType", + "description": [], + "signature": [ + "string" + ], + "path": "src/plugins/dashboard/public/plugin.tsx", + "deprecated": false, + "trackAdoption": false, + "isRequired": true + }, + { + "parentPluginId": "dashboard", + "id": "def-public.DashboardStart.registerDashboardPanelPlacementSetting.$2", + "type": "Function", + "tags": [], + "label": "getPanelPlacementSettings", + "description": [], + "signature": [ + "GetPanelPlacementSettings", + "" + ], + "path": "src/plugins/dashboard/public/plugin.tsx", + "deprecated": false, + "trackAdoption": false, + "isRequired": true + } + ], + "returnComment": [] } ], "lifecycle": "start", diff --git a/api_docs/dashboard.mdx b/api_docs/dashboard.mdx index 53bb6a224cdd6..e84bbaaba214c 100644 --- a/api_docs/dashboard.mdx +++ b/api_docs/dashboard.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/dashboard title: "dashboard" image: https://source.unsplash.com/400x175/?github description: API docs for the dashboard plugin -date: 2024-05-06 +date: 2024-05-07 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'dashboard'] --- import dashboardObj from './dashboard.devdocs.json'; @@ -21,7 +21,7 @@ Contact [@elastic/kibana-presentation](https://github.com/orgs/elastic/teams/kib | Public API count | Any count | Items lacking comments | Missing exports | |-------------------|-----------|------------------------|-----------------| -| 112 | 0 | 109 | 12 | +| 116 | 0 | 113 | 13 | ## Client diff --git a/api_docs/dashboard_enhanced.mdx b/api_docs/dashboard_enhanced.mdx index df982a4052f9f..fd432d385317a 100644 --- a/api_docs/dashboard_enhanced.mdx +++ b/api_docs/dashboard_enhanced.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/dashboardEnhanced title: "dashboardEnhanced" image: https://source.unsplash.com/400x175/?github description: API docs for the dashboardEnhanced plugin -date: 2024-05-06 +date: 2024-05-07 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'dashboardEnhanced'] --- import dashboardEnhancedObj from './dashboard_enhanced.devdocs.json'; diff --git a/api_docs/data.devdocs.json b/api_docs/data.devdocs.json index c204f00dce9b7..0fbdccbfc5bab 100644 --- a/api_docs/data.devdocs.json +++ b/api_docs/data.devdocs.json @@ -504,9 +504,9 @@ }, ", options?: ", { - "pluginId": "data", + "pluginId": "@kbn/search-types", "scope": "common", - "docId": "kibDataSearchPluginApi", + "docId": "kibKbnSearchTypesPluginApi", "section": "def-common.ISearchOptions", "text": "ISearchOptions" }, @@ -546,9 +546,9 @@ "description": [], "signature": [ { - "pluginId": "data", + "pluginId": "@kbn/search-types", "scope": "common", - "docId": "kibDataSearchPluginApi", + "docId": "kibKbnSearchTypesPluginApi", "section": "def-common.ISearchOptions", "text": "ISearchOptions" }, @@ -2208,17 +2208,17 @@ "signature": [ "(response: ", { - "pluginId": "data", + "pluginId": "@kbn/search-types", "scope": "common", - "docId": "kibDataSearchPluginApi", + "docId": "kibKbnSearchTypesPluginApi", "section": "def-common.IEsSearchResponse", "text": "IEsSearchResponse" }, ") => ", { - "pluginId": "data", + "pluginId": "@kbn/search-types", "scope": "common", - "docId": "kibDataSearchPluginApi", + "docId": "kibKbnSearchTypesPluginApi", "section": "def-common.IEsSearchResponse", "text": "IEsSearchResponse" }, @@ -2237,9 +2237,9 @@ "description": [], "signature": [ { - "pluginId": "data", + "pluginId": "@kbn/search-types", "scope": "common", - "docId": "kibDataSearchPluginApi", + "docId": "kibKbnSearchTypesPluginApi", "section": "def-common.IEsSearchResponse", "text": "IEsSearchResponse" }, @@ -2385,9 +2385,9 @@ }, ", options?: ", { - "pluginId": "data", + "pluginId": "@kbn/search-types", "scope": "common", - "docId": "kibDataSearchPluginApi", + "docId": "kibKbnSearchTypesPluginApi", "section": "def-common.ISearchOptions", "text": "ISearchOptions" }, @@ -2427,9 +2427,9 @@ "description": [], "signature": [ { - "pluginId": "data", + "pluginId": "@kbn/search-types", "scope": "common", - "docId": "kibDataSearchPluginApi", + "docId": "kibKbnSearchTypesPluginApi", "section": "def-common.ISearchOptions", "text": "ISearchOptions" }, @@ -3837,9 +3837,9 @@ "Observable", "<", { - "pluginId": "data", + "pluginId": "@kbn/search-types", "scope": "common", - "docId": "kibDataSearchPluginApi", + "docId": "kibKbnSearchTypesPluginApi", "section": "def-common.IKibanaSearchResponse", "text": "IKibanaSearchResponse" }, @@ -4598,9 +4598,9 @@ }, "; }) => ", { - "pluginId": "data", + "pluginId": "@kbn/search-types", "scope": "common", - "docId": "kibDataSearchPluginApi", + "docId": "kibKbnSearchTypesPluginApi", "section": "def-common.ISearchRequestParams", "text": "ISearchRequestParams" } @@ -4954,9 +4954,9 @@ "signature": [ "(response?: ", { - "pluginId": "data", + "pluginId": "@kbn/search-types", "scope": "common", - "docId": "kibDataSearchPluginApi", + "docId": "kibKbnSearchTypesPluginApi", "section": "def-common.IKibanaSearchResponse", "text": "IKibanaSearchResponse" }, @@ -4975,9 +4975,9 @@ "description": [], "signature": [ { - "pluginId": "data", + "pluginId": "@kbn/search-types", "scope": "common", - "docId": "kibDataSearchPluginApi", + "docId": "kibKbnSearchTypesPluginApi", "section": "def-common.IKibanaSearchResponse", "text": "IKibanaSearchResponse" }, @@ -7565,503 +7565,6 @@ ], "initialIsOpen": false }, - { - "parentPluginId": "data", - "id": "def-public.IEsSearchRequest", - "type": "Interface", - "tags": [], - "label": "IEsSearchRequest", - "description": [], - "signature": [ - { - "pluginId": "data", - "scope": "common", - "docId": "kibDataSearchPluginApi", - "section": "def-common.IEsSearchRequest", - "text": "IEsSearchRequest" - }, - " extends ", - { - "pluginId": "data", - "scope": "common", - "docId": "kibDataSearchPluginApi", - "section": "def-common.IKibanaSearchRequest", - "text": "IKibanaSearchRequest" - }, - "" - ], - "path": "src/plugins/data/common/search/strategies/es_search/types.ts", - "deprecated": false, - "trackAdoption": false, - "children": [ - { - "parentPluginId": "data", - "id": "def-public.IEsSearchRequest.indexType", - "type": "string", - "tags": [], - "label": "indexType", - "description": [], - "signature": [ - "string | undefined" - ], - "path": "src/plugins/data/common/search/strategies/es_search/types.ts", - "deprecated": false, - "trackAdoption": false - } - ], - "initialIsOpen": false - }, - { - "parentPluginId": "data", - "id": "def-public.IKibanaSearchRequest", - "type": "Interface", - "tags": [], - "label": "IKibanaSearchRequest", - "description": [], - "signature": [ - { - "pluginId": "data", - "scope": "common", - "docId": "kibDataSearchPluginApi", - "section": "def-common.IKibanaSearchRequest", - "text": "IKibanaSearchRequest" - }, - "" - ], - "path": "src/plugins/data/common/search/types.ts", - "deprecated": false, - "trackAdoption": false, - "children": [ - { - "parentPluginId": "data", - "id": "def-public.IKibanaSearchRequest.id", - "type": "string", - "tags": [], - "label": "id", - "description": [ - "\nAn id can be used to uniquely identify this request." - ], - "signature": [ - "string | undefined" - ], - "path": "src/plugins/data/common/search/types.ts", - "deprecated": false, - "trackAdoption": false - }, - { - "parentPluginId": "data", - "id": "def-public.IKibanaSearchRequest.params", - "type": "Uncategorized", - "tags": [], - "label": "params", - "description": [], - "signature": [ - "Params | undefined" - ], - "path": "src/plugins/data/common/search/types.ts", - "deprecated": false, - "trackAdoption": false - } - ], - "initialIsOpen": false - }, - { - "parentPluginId": "data", - "id": "def-public.IKibanaSearchResponse", - "type": "Interface", - "tags": [], - "label": "IKibanaSearchResponse", - "description": [], - "signature": [ - { - "pluginId": "data", - "scope": "common", - "docId": "kibDataSearchPluginApi", - "section": "def-common.IKibanaSearchResponse", - "text": "IKibanaSearchResponse" - }, - "" - ], - "path": "src/plugins/data/common/search/types.ts", - "deprecated": false, - "trackAdoption": false, - "children": [ - { - "parentPluginId": "data", - "id": "def-public.IKibanaSearchResponse.id", - "type": "string", - "tags": [], - "label": "id", - "description": [ - "\nSome responses may contain a unique id to identify the request this response came from." - ], - "signature": [ - "string | undefined" - ], - "path": "src/plugins/data/common/search/types.ts", - "deprecated": false, - "trackAdoption": false - }, - { - "parentPluginId": "data", - "id": "def-public.IKibanaSearchResponse.total", - "type": "number", - "tags": [], - "label": "total", - "description": [ - "\nIf relevant to the search strategy, return a total number\nthat represents how progress is indicated." - ], - "signature": [ - "number | undefined" - ], - "path": "src/plugins/data/common/search/types.ts", - "deprecated": false, - "trackAdoption": false - }, - { - "parentPluginId": "data", - "id": "def-public.IKibanaSearchResponse.loaded", - "type": "number", - "tags": [], - "label": "loaded", - "description": [ - "\nIf relevant to the search strategy, return a loaded number\nthat represents how progress is indicated." - ], - "signature": [ - "number | undefined" - ], - "path": "src/plugins/data/common/search/types.ts", - "deprecated": false, - "trackAdoption": false - }, - { - "parentPluginId": "data", - "id": "def-public.IKibanaSearchResponse.isRunning", - "type": "CompoundType", - "tags": [], - "label": "isRunning", - "description": [ - "\nIndicates whether search is still in flight" - ], - "signature": [ - "boolean | undefined" - ], - "path": "src/plugins/data/common/search/types.ts", - "deprecated": false, - "trackAdoption": false - }, - { - "parentPluginId": "data", - "id": "def-public.IKibanaSearchResponse.isPartial", - "type": "CompoundType", - "tags": [], - "label": "isPartial", - "description": [ - "\nIndicates whether the results returned are complete or partial" - ], - "signature": [ - "boolean | undefined" - ], - "path": "src/plugins/data/common/search/types.ts", - "deprecated": false, - "trackAdoption": false - }, - { - "parentPluginId": "data", - "id": "def-public.IKibanaSearchResponse.isRestored", - "type": "CompoundType", - "tags": [], - "label": "isRestored", - "description": [ - "\nIndicates whether the results returned are from the async-search index" - ], - "signature": [ - "boolean | undefined" - ], - "path": "src/plugins/data/common/search/types.ts", - "deprecated": false, - "trackAdoption": false - }, - { - "parentPluginId": "data", - "id": "def-public.IKibanaSearchResponse.isStored", - "type": "CompoundType", - "tags": [], - "label": "isStored", - "description": [ - "\nIndicates whether the search has been saved to a search-session object and long keepAlive was set" - ], - "signature": [ - "boolean | undefined" - ], - "path": "src/plugins/data/common/search/types.ts", - "deprecated": false, - "trackAdoption": false - }, - { - "parentPluginId": "data", - "id": "def-public.IKibanaSearchResponse.warning", - "type": "string", - "tags": [], - "label": "warning", - "description": [ - "\nOptional warnings returned from Elasticsearch (for example, deprecation warnings)" - ], - "signature": [ - "string | undefined" - ], - "path": "src/plugins/data/common/search/types.ts", - "deprecated": false, - "trackAdoption": false - }, - { - "parentPluginId": "data", - "id": "def-public.IKibanaSearchResponse.rawResponse", - "type": "Uncategorized", - "tags": [], - "label": "rawResponse", - "description": [ - "\nThe raw response returned by the internal search method (usually the raw ES response)" - ], - "signature": [ - "RawResponse" - ], - "path": "src/plugins/data/common/search/types.ts", - "deprecated": false, - "trackAdoption": false - }, - { - "parentPluginId": "data", - "id": "def-public.IKibanaSearchResponse.requestParams", - "type": "Object", - "tags": [], - "label": "requestParams", - "description": [ - "\nHTTP request parameters from elasticsearch transport client t" - ], - "signature": [ - { - "pluginId": "data", - "scope": "common", - "docId": "kibDataSearchPluginApi", - "section": "def-common.SanitizedConnectionRequestParams", - "text": "SanitizedConnectionRequestParams" - }, - " | undefined" - ], - "path": "src/plugins/data/common/search/types.ts", - "deprecated": false, - "trackAdoption": false - } - ], - "initialIsOpen": false - }, - { - "parentPluginId": "data", - "id": "def-public.ISearchOptions", - "type": "Interface", - "tags": [], - "label": "ISearchOptions", - "description": [], - "path": "src/plugins/data/common/search/types.ts", - "deprecated": false, - "trackAdoption": false, - "children": [ - { - "parentPluginId": "data", - "id": "def-public.ISearchOptions.abortSignal", - "type": "Object", - "tags": [], - "label": "abortSignal", - "description": [ - "\nAn `AbortSignal` that allows the caller of `search` to abort a search request." - ], - "signature": [ - "AbortSignal | undefined" - ], - "path": "src/plugins/data/common/search/types.ts", - "deprecated": false, - "trackAdoption": false - }, - { - "parentPluginId": "data", - "id": "def-public.ISearchOptions.strategy", - "type": "string", - "tags": [], - "label": "strategy", - "description": [ - "\nUse this option to force using a specific server side search strategy. Leave empty to use the default strategy." - ], - "signature": [ - "string | undefined" - ], - "path": "src/plugins/data/common/search/types.ts", - "deprecated": false, - "trackAdoption": false - }, - { - "parentPluginId": "data", - "id": "def-public.ISearchOptions.legacyHitsTotal", - "type": "CompoundType", - "tags": [], - "label": "legacyHitsTotal", - "description": [ - "\nRequest the legacy format for the total number of hits. If sending `rest_total_hits_as_int` to\nsomething other than `true`, this should be set to `false`." - ], - "signature": [ - "boolean | undefined" - ], - "path": "src/plugins/data/common/search/types.ts", - "deprecated": false, - "trackAdoption": false - }, - { - "parentPluginId": "data", - "id": "def-public.ISearchOptions.sessionId", - "type": "string", - "tags": [], - "label": "sessionId", - "description": [ - "\nA session ID, grouping multiple search requests into a single session." - ], - "signature": [ - "string | undefined" - ], - "path": "src/plugins/data/common/search/types.ts", - "deprecated": false, - "trackAdoption": false - }, - { - "parentPluginId": "data", - "id": "def-public.ISearchOptions.isStored", - "type": "CompoundType", - "tags": [], - "label": "isStored", - "description": [ - "\nWhether the session is already saved (i.e. sent to background)" - ], - "signature": [ - "boolean | undefined" - ], - "path": "src/plugins/data/common/search/types.ts", - "deprecated": false, - "trackAdoption": false - }, - { - "parentPluginId": "data", - "id": "def-public.ISearchOptions.isSearchStored", - "type": "CompoundType", - "tags": [], - "label": "isSearchStored", - "description": [ - "\nWhether the search was successfully polled after session was saved. Search was added to a session saved object and keepAlive extended." - ], - "signature": [ - "boolean | undefined" - ], - "path": "src/plugins/data/common/search/types.ts", - "deprecated": false, - "trackAdoption": false - }, - { - "parentPluginId": "data", - "id": "def-public.ISearchOptions.isRestore", - "type": "CompoundType", - "tags": [], - "label": "isRestore", - "description": [ - "\nWhether the session is restored (i.e. search requests should re-use the stored search IDs,\nrather than starting from scratch)" - ], - "signature": [ - "boolean | undefined" - ], - "path": "src/plugins/data/common/search/types.ts", - "deprecated": false, - "trackAdoption": false - }, - { - "parentPluginId": "data", - "id": "def-public.ISearchOptions.retrieveResults", - "type": "CompoundType", - "tags": [], - "label": "retrieveResults", - "description": [ - "\nBy default, when polling, we don't retrieve the results of the search request (until it is complete). (For async\nsearch, this is the difference between calling _async_search/{id} and _async_search/status/{id}.) setting this to\n`true` will request the search results, regardless of whether or not the search is complete." - ], - "signature": [ - "boolean | undefined" - ], - "path": "src/plugins/data/common/search/types.ts", - "deprecated": false, - "trackAdoption": false - }, - { - "parentPluginId": "data", - "id": "def-public.ISearchOptions.executionContext", - "type": "Object", - "tags": [], - "label": "executionContext", - "description": [ - "\nRepresents a meta-information about a Kibana entity intitating a saerch request." - ], - "signature": [ - { - "pluginId": "@kbn/core-execution-context-common", - "scope": "common", - "docId": "kibKbnCoreExecutionContextCommonPluginApi", - "section": "def-common.KibanaExecutionContext", - "text": "KibanaExecutionContext" - }, - " | undefined" - ], - "path": "src/plugins/data/common/search/types.ts", - "deprecated": false, - "trackAdoption": false - }, - { - "parentPluginId": "data", - "id": "def-public.ISearchOptions.indexPattern", - "type": "Object", - "tags": [], - "label": "indexPattern", - "description": [ - "\nIndex pattern reference is used for better error messages" - ], - "signature": [ - { - "pluginId": "dataViews", - "scope": "common", - "docId": "kibDataViewsPluginApi", - "section": "def-common.DataView", - "text": "DataView" - }, - " | undefined" - ], - "path": "src/plugins/data/common/search/types.ts", - "deprecated": false, - "trackAdoption": false - }, - { - "parentPluginId": "data", - "id": "def-public.ISearchOptions.transport", - "type": "Object", - "tags": [], - "label": "transport", - "description": [ - "\nTransportRequestOptions, other than `signal`, to pass through to the ES client.\nTo pass an abort signal, use {@link ISearchOptions.abortSignal}" - ], - "signature": [ - "Omit<", - "TransportRequestOptions", - ", \"signal\"> | undefined" - ], - "path": "src/plugins/data/common/search/types.ts", - "deprecated": false, - "trackAdoption": false - } - ], - "initialIsOpen": false - }, { "parentPluginId": "data", "id": "def-public.ISearchStartSearchSource", @@ -9926,32 +9429,6 @@ "trackAdoption": false, "initialIsOpen": false }, - { - "parentPluginId": "data", - "id": "def-public.IEsSearchResponse", - "type": "Type", - "tags": [], - "label": "IEsSearchResponse", - "description": [], - "signature": [ - { - "pluginId": "data", - "scope": "common", - "docId": "kibDataSearchPluginApi", - "section": "def-common.IKibanaSearchResponse", - "text": "IKibanaSearchResponse" - }, - "<", - "SearchResponse", - ">>" - ], - "path": "src/plugins/data/common/search/strategies/es_search/types.ts", - "deprecated": false, - "trackAdoption": false, - "initialIsOpen": false - }, { "parentPluginId": "data", "id": "def-public.IFieldParamType", @@ -10022,126 +9499,23 @@ { "pluginId": "expressions", "scope": "common", - "docId": "kibExpressionsPluginApi", - "section": "def-common.ExecutionContext", - "text": "ExecutionContext" - }, - "<", - { - "pluginId": "inspector", - "scope": "common", - "docId": "kibInspectorPluginApi", - "section": "def-common.Adapters", - "text": "Adapters" - }, - ">>" - ], - "path": "src/plugins/data_views/common/expressions/load_index_pattern.ts", - "deprecated": false, - "trackAdoption": false, - "initialIsOpen": false - }, - { - "parentPluginId": "data", - "id": "def-public.ISearchGeneric", - "type": "Type", - "tags": [], - "label": "ISearchGeneric", - "description": [], - "signature": [ - " = ", - { - "pluginId": "data", - "scope": "common", - "docId": "kibDataSearchPluginApi", - "section": "def-common.IEsSearchRequest", - "text": "IEsSearchRequest" - }, - "<", - { - "pluginId": "data", - "scope": "common", - "docId": "kibDataSearchPluginApi", - "section": "def-common.ISearchRequestParams", - "text": "ISearchRequestParams" - }, - ">, SearchStrategyResponse extends ", - { - "pluginId": "data", - "scope": "common", - "docId": "kibDataSearchPluginApi", - "section": "def-common.IKibanaSearchResponse", - "text": "IKibanaSearchResponse" - }, - " = ", - { - "pluginId": "data", - "scope": "common", - "docId": "kibDataSearchPluginApi", - "section": "def-common.IEsSearchResponse", - "text": "IEsSearchResponse" - }, - ">(request: SearchStrategyRequest, options?: ", - { - "pluginId": "data", - "scope": "common", - "docId": "kibDataSearchPluginApi", - "section": "def-common.ISearchOptions", - "text": "ISearchOptions" - }, - " | undefined) => ", - "Observable", - "" - ], - "path": "src/plugins/data/common/search/types.ts", - "deprecated": false, - "trackAdoption": false, - "returnComment": [], - "children": [ - { - "parentPluginId": "data", - "id": "def-public.ISearchGeneric.$1", - "type": "Uncategorized", - "tags": [], - "label": "request", - "description": [], - "signature": [ - "SearchStrategyRequest" - ], - "path": "src/plugins/data/common/search/types.ts", - "deprecated": false, - "trackAdoption": false + "docId": "kibExpressionsPluginApi", + "section": "def-common.ExecutionContext", + "text": "ExecutionContext" }, + "<", { - "parentPluginId": "data", - "id": "def-public.ISearchGeneric.$2", - "type": "Object", - "tags": [], - "label": "options", - "description": [], - "signature": [ - { - "pluginId": "data", - "scope": "common", - "docId": "kibDataSearchPluginApi", - "section": "def-common.ISearchOptions", - "text": "ISearchOptions" - }, - " | undefined" - ], - "path": "src/plugins/data/common/search/types.ts", - "deprecated": false, - "trackAdoption": false - } + "pluginId": "inspector", + "scope": "common", + "docId": "kibInspectorPluginApi", + "section": "def-common.Adapters", + "text": "Adapters" + }, + ">>" ], + "path": "src/plugins/data_views/common/expressions/load_index_pattern.ts", + "deprecated": false, + "trackAdoption": false, "initialIsOpen": false }, { @@ -10320,9 +9694,9 @@ "Observable", "<", { - "pluginId": "data", + "pluginId": "@kbn/search-types", "scope": "common", - "docId": "kibDataSearchPluginApi", + "docId": "kibKbnSearchTypesPluginApi", "section": "def-common.IKibanaSearchResponse", "text": "IKibanaSearchResponse" }, @@ -12663,25 +12037,25 @@ "ISearchStart", "<", { - "pluginId": "data", + "pluginId": "@kbn/search-types", "scope": "common", - "docId": "kibDataSearchPluginApi", + "docId": "kibKbnSearchTypesPluginApi", "section": "def-common.IEsSearchRequest", "text": "IEsSearchRequest" }, "<", { - "pluginId": "data", + "pluginId": "@kbn/search-types", "scope": "common", - "docId": "kibDataSearchPluginApi", + "docId": "kibKbnSearchTypesPluginApi", "section": "def-common.ISearchRequestParams", "text": "ISearchRequestParams" }, ">, ", { - "pluginId": "data", + "pluginId": "@kbn/search-types", "scope": "common", - "docId": "kibDataSearchPluginApi", + "docId": "kibKbnSearchTypesPluginApi", "section": "def-common.IEsSearchResponse", "text": "IEsSearchResponse" }, @@ -17816,258 +17190,6 @@ } ], "initialIsOpen": false - }, - { - "parentPluginId": "data", - "id": "def-server.IEsSearchRequest", - "type": "Interface", - "tags": [], - "label": "IEsSearchRequest", - "description": [], - "signature": [ - { - "pluginId": "data", - "scope": "common", - "docId": "kibDataSearchPluginApi", - "section": "def-common.IEsSearchRequest", - "text": "IEsSearchRequest" - }, - " extends ", - { - "pluginId": "data", - "scope": "common", - "docId": "kibDataSearchPluginApi", - "section": "def-common.IKibanaSearchRequest", - "text": "IKibanaSearchRequest" - }, - "" - ], - "path": "src/plugins/data/common/search/strategies/es_search/types.ts", - "deprecated": false, - "trackAdoption": false, - "children": [ - { - "parentPluginId": "data", - "id": "def-server.IEsSearchRequest.indexType", - "type": "string", - "tags": [], - "label": "indexType", - "description": [], - "signature": [ - "string | undefined" - ], - "path": "src/plugins/data/common/search/strategies/es_search/types.ts", - "deprecated": false, - "trackAdoption": false - } - ], - "initialIsOpen": false - }, - { - "parentPluginId": "data", - "id": "def-server.ISearchOptions", - "type": "Interface", - "tags": [], - "label": "ISearchOptions", - "description": [], - "path": "src/plugins/data/common/search/types.ts", - "deprecated": false, - "trackAdoption": false, - "children": [ - { - "parentPluginId": "data", - "id": "def-server.ISearchOptions.abortSignal", - "type": "Object", - "tags": [], - "label": "abortSignal", - "description": [ - "\nAn `AbortSignal` that allows the caller of `search` to abort a search request." - ], - "signature": [ - "AbortSignal | undefined" - ], - "path": "src/plugins/data/common/search/types.ts", - "deprecated": false, - "trackAdoption": false - }, - { - "parentPluginId": "data", - "id": "def-server.ISearchOptions.strategy", - "type": "string", - "tags": [], - "label": "strategy", - "description": [ - "\nUse this option to force using a specific server side search strategy. Leave empty to use the default strategy." - ], - "signature": [ - "string | undefined" - ], - "path": "src/plugins/data/common/search/types.ts", - "deprecated": false, - "trackAdoption": false - }, - { - "parentPluginId": "data", - "id": "def-server.ISearchOptions.legacyHitsTotal", - "type": "CompoundType", - "tags": [], - "label": "legacyHitsTotal", - "description": [ - "\nRequest the legacy format for the total number of hits. If sending `rest_total_hits_as_int` to\nsomething other than `true`, this should be set to `false`." - ], - "signature": [ - "boolean | undefined" - ], - "path": "src/plugins/data/common/search/types.ts", - "deprecated": false, - "trackAdoption": false - }, - { - "parentPluginId": "data", - "id": "def-server.ISearchOptions.sessionId", - "type": "string", - "tags": [], - "label": "sessionId", - "description": [ - "\nA session ID, grouping multiple search requests into a single session." - ], - "signature": [ - "string | undefined" - ], - "path": "src/plugins/data/common/search/types.ts", - "deprecated": false, - "trackAdoption": false - }, - { - "parentPluginId": "data", - "id": "def-server.ISearchOptions.isStored", - "type": "CompoundType", - "tags": [], - "label": "isStored", - "description": [ - "\nWhether the session is already saved (i.e. sent to background)" - ], - "signature": [ - "boolean | undefined" - ], - "path": "src/plugins/data/common/search/types.ts", - "deprecated": false, - "trackAdoption": false - }, - { - "parentPluginId": "data", - "id": "def-server.ISearchOptions.isSearchStored", - "type": "CompoundType", - "tags": [], - "label": "isSearchStored", - "description": [ - "\nWhether the search was successfully polled after session was saved. Search was added to a session saved object and keepAlive extended." - ], - "signature": [ - "boolean | undefined" - ], - "path": "src/plugins/data/common/search/types.ts", - "deprecated": false, - "trackAdoption": false - }, - { - "parentPluginId": "data", - "id": "def-server.ISearchOptions.isRestore", - "type": "CompoundType", - "tags": [], - "label": "isRestore", - "description": [ - "\nWhether the session is restored (i.e. search requests should re-use the stored search IDs,\nrather than starting from scratch)" - ], - "signature": [ - "boolean | undefined" - ], - "path": "src/plugins/data/common/search/types.ts", - "deprecated": false, - "trackAdoption": false - }, - { - "parentPluginId": "data", - "id": "def-server.ISearchOptions.retrieveResults", - "type": "CompoundType", - "tags": [], - "label": "retrieveResults", - "description": [ - "\nBy default, when polling, we don't retrieve the results of the search request (until it is complete). (For async\nsearch, this is the difference between calling _async_search/{id} and _async_search/status/{id}.) setting this to\n`true` will request the search results, regardless of whether or not the search is complete." - ], - "signature": [ - "boolean | undefined" - ], - "path": "src/plugins/data/common/search/types.ts", - "deprecated": false, - "trackAdoption": false - }, - { - "parentPluginId": "data", - "id": "def-server.ISearchOptions.executionContext", - "type": "Object", - "tags": [], - "label": "executionContext", - "description": [ - "\nRepresents a meta-information about a Kibana entity intitating a saerch request." - ], - "signature": [ - { - "pluginId": "@kbn/core-execution-context-common", - "scope": "common", - "docId": "kibKbnCoreExecutionContextCommonPluginApi", - "section": "def-common.KibanaExecutionContext", - "text": "KibanaExecutionContext" - }, - " | undefined" - ], - "path": "src/plugins/data/common/search/types.ts", - "deprecated": false, - "trackAdoption": false - }, - { - "parentPluginId": "data", - "id": "def-server.ISearchOptions.indexPattern", - "type": "Object", - "tags": [], - "label": "indexPattern", - "description": [ - "\nIndex pattern reference is used for better error messages" - ], - "signature": [ - { - "pluginId": "dataViews", - "scope": "common", - "docId": "kibDataViewsPluginApi", - "section": "def-common.DataView", - "text": "DataView" - }, - " | undefined" - ], - "path": "src/plugins/data/common/search/types.ts", - "deprecated": false, - "trackAdoption": false - }, - { - "parentPluginId": "data", - "id": "def-server.ISearchOptions.transport", - "type": "Object", - "tags": [], - "label": "transport", - "description": [ - "\nTransportRequestOptions, other than `signal`, to pass through to the ES client.\nTo pass an abort signal, use {@link ISearchOptions.abortSignal}" - ], - "signature": [ - "Omit<", - "TransportRequestOptions", - ", \"signal\"> | undefined" - ], - "path": "src/plugins/data/common/search/types.ts", - "deprecated": false, - "trackAdoption": false - } - ], - "initialIsOpen": false } ], "enums": [ @@ -18139,32 +17261,6 @@ "trackAdoption": false, "initialIsOpen": false }, - { - "parentPluginId": "data", - "id": "def-server.IEsSearchResponse", - "type": "Type", - "tags": [], - "label": "IEsSearchResponse", - "description": [], - "signature": [ - { - "pluginId": "data", - "scope": "common", - "docId": "kibDataSearchPluginApi", - "section": "def-common.IKibanaSearchResponse", - "text": "IKibanaSearchResponse" - }, - "<", - "SearchResponse", - ">>" - ], - "path": "src/plugins/data/common/search/strategies/es_search/types.ts", - "deprecated": false, - "trackAdoption": false, - "initialIsOpen": false - }, { "parentPluginId": "data", "id": "def-server.ParsedInterval", @@ -18556,25 +17652,25 @@ "ISearchStart", "<", { - "pluginId": "data", + "pluginId": "@kbn/search-types", "scope": "common", - "docId": "kibDataSearchPluginApi", + "docId": "kibKbnSearchTypesPluginApi", "section": "def-common.IEsSearchRequest", "text": "IEsSearchRequest" }, "<", { - "pluginId": "data", + "pluginId": "@kbn/search-types", "scope": "common", - "docId": "kibDataSearchPluginApi", + "docId": "kibKbnSearchTypesPluginApi", "section": "def-common.ISearchRequestParams", "text": "ISearchRequestParams" }, ">, ", { - "pluginId": "data", + "pluginId": "@kbn/search-types", "scope": "common", - "docId": "kibDataSearchPluginApi", + "docId": "kibKbnSearchTypesPluginApi", "section": "def-common.IEsSearchResponse", "text": "IEsSearchResponse" }, diff --git a/api_docs/data.mdx b/api_docs/data.mdx index a24e4d2ffabd6..929ad09c59515 100644 --- a/api_docs/data.mdx +++ b/api_docs/data.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/data title: "data" image: https://source.unsplash.com/400x175/?github description: API docs for the data plugin -date: 2024-05-06 +date: 2024-05-07 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'data'] --- import dataObj from './data.devdocs.json'; @@ -21,7 +21,7 @@ Contact [@elastic/kibana-visualizations](https://github.com/orgs/elastic/teams/k | Public API count | Any count | Items lacking comments | Missing exports | |-------------------|-----------|------------------------|-----------------| -| 3290 | 31 | 2621 | 23 | +| 3186 | 31 | 2575 | 23 | ## Client diff --git a/api_docs/data_query.mdx b/api_docs/data_query.mdx index 0bf26636c080a..fba801c23db31 100644 --- a/api_docs/data_query.mdx +++ b/api_docs/data_query.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/data-query title: "data.query" image: https://source.unsplash.com/400x175/?github description: API docs for the data.query plugin -date: 2024-05-06 +date: 2024-05-07 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'data.query'] --- import dataQueryObj from './data_query.devdocs.json'; @@ -21,7 +21,7 @@ Contact [@elastic/kibana-visualizations](https://github.com/orgs/elastic/teams/k | Public API count | Any count | Items lacking comments | Missing exports | |-------------------|-----------|------------------------|-----------------| -| 3290 | 31 | 2621 | 23 | +| 3186 | 31 | 2575 | 23 | ## Client diff --git a/api_docs/data_search.devdocs.json b/api_docs/data_search.devdocs.json index 4bc4cce6d7450..b4bd0847179ab 100644 --- a/api_docs/data_search.devdocs.json +++ b/api_docs/data_search.devdocs.json @@ -179,9 +179,9 @@ "Observable", "; isStored: () => boolean; isRestore: () => boolean; restore: (sessionId: string) => void; continue: (sessionId: string) => void; cancel: () => Promise; renameCurrentSession: (newName: string) => Promise; isCurrentSession: (sessionId?: string | undefined) => boolean; getSearchOptions: (sessionId?: string | undefined) => Required = ", { - "pluginId": "data", + "pluginId": "@kbn/search-types", "scope": "common", - "docId": "kibDataSearchPluginApi", + "docId": "kibKbnSearchTypesPluginApi", "section": "def-common.IEsSearchRequest", "text": "IEsSearchRequest" }, "<", { - "pluginId": "data", + "pluginId": "@kbn/search-types", "scope": "common", - "docId": "kibDataSearchPluginApi", + "docId": "kibKbnSearchTypesPluginApi", "section": "def-common.ISearchRequestParams", "text": "ISearchRequestParams" }, ">, SearchStrategyResponse extends ", { - "pluginId": "data", + "pluginId": "@kbn/search-types", "scope": "common", - "docId": "kibDataSearchPluginApi", + "docId": "kibKbnSearchTypesPluginApi", "section": "def-common.IKibanaSearchResponse", "text": "IKibanaSearchResponse" }, " = ", { - "pluginId": "data", + "pluginId": "@kbn/search-types", "scope": "common", - "docId": "kibDataSearchPluginApi", + "docId": "kibKbnSearchTypesPluginApi", "section": "def-common.IEsSearchResponse", "text": "IEsSearchResponse" }, ">(request: SearchStrategyRequest, options?: ", { - "pluginId": "data", + "pluginId": "@kbn/search-types", "scope": "common", - "docId": "kibDataSearchPluginApi", + "docId": "kibKbnSearchTypesPluginApi", "section": "def-common.ISearchOptions", "text": "ISearchOptions" }, @@ -440,7 +440,7 @@ "signature": [ "SearchStrategyRequest" ], - "path": "src/plugins/data/common/search/types.ts", + "path": "packages/kbn-search-types/src/types.ts", "deprecated": false, "trackAdoption": false }, @@ -453,15 +453,15 @@ "description": [], "signature": [ { - "pluginId": "data", + "pluginId": "@kbn/search-types", "scope": "common", - "docId": "kibDataSearchPluginApi", + "docId": "kibKbnSearchTypesPluginApi", "section": "def-common.ISearchOptions", "text": "ISearchOptions" }, " | undefined" ], - "path": "src/plugins/data/common/search/types.ts", + "path": "packages/kbn-search-types/src/types.ts", "deprecated": false, "trackAdoption": false } @@ -635,9 +635,9 @@ "Observable", "; isStored: () => boolean; isRestore: () => boolean; restore: (sessionId: string) => void; continue: (sessionId: string) => void; cancel: () => Promise; renameCurrentSession: (newName: string) => Promise; isCurrentSession: (sessionId?: string | undefined) => boolean; getSearchOptions: (sessionId?: string | undefined) => Required; isStored: () => boolean; isRestore: () => boolean; restore: (sessionId: string) => void; continue: (sessionId: string) => void; cancel: () => Promise; renameCurrentSession: (newName: string) => Promise; isCurrentSession: (sessionId?: string | undefined) => boolean; getSearchOptions: (sessionId?: string | undefined) => Required) => { getId: (args_0: ", { - "pluginId": "data", + "pluginId": "@kbn/search-types", "scope": "common", - "docId": "kibDataSearchPluginApi", + "docId": "kibKbnSearchTypesPluginApi", "section": "def-common.IKibanaSearchRequest", "text": "IKibanaSearchRequest" }, ", args_1: ", { - "pluginId": "data", + "pluginId": "@kbn/search-types", "scope": "common", - "docId": "kibDataSearchPluginApi", + "docId": "kibKbnSearchTypesPluginApi", "section": "def-common.ISearchOptions", "text": "ISearchOptions" }, ") => Promise; trackId: (searchRequest: ", { - "pluginId": "data", + "pluginId": "@kbn/search-types", "scope": "common", - "docId": "kibDataSearchPluginApi", + "docId": "kibKbnSearchTypesPluginApi", "section": "def-common.IKibanaSearchRequest", "text": "IKibanaSearchRequest" }, ", searchId: string, options: ", { - "pluginId": "data", + "pluginId": "@kbn/search-types", "scope": "common", - "docId": "kibDataSearchPluginApi", + "docId": "kibKbnSearchTypesPluginApi", "section": "def-common.ISearchOptions", "text": "ISearchOptions" }, @@ -2689,9 +2689,9 @@ }, " extends ", { - "pluginId": "data", + "pluginId": "@kbn/search-types", "scope": "common", - "docId": "kibDataSearchPluginApi", + "docId": "kibKbnSearchTypesPluginApi", "section": "def-common.ISearchClient", "text": "ISearchClient" } @@ -3272,9 +3272,9 @@ "signature": [ "(request: SearchStrategyRequest, options: ", { - "pluginId": "data", + "pluginId": "@kbn/search-types", "scope": "common", - "docId": "kibDataSearchPluginApi", + "docId": "kibKbnSearchTypesPluginApi", "section": "def-common.ISearchOptions", "text": "ISearchOptions" }, @@ -3318,9 +3318,9 @@ "description": [], "signature": [ { - "pluginId": "data", + "pluginId": "@kbn/search-types", "scope": "common", - "docId": "kibDataSearchPluginApi", + "docId": "kibKbnSearchTypesPluginApi", "section": "def-common.ISearchOptions", "text": "ISearchOptions" } @@ -3364,9 +3364,9 @@ "signature": [ "((id: string, options: ", { - "pluginId": "data", + "pluginId": "@kbn/search-types", "scope": "common", - "docId": "kibDataSearchPluginApi", + "docId": "kibKbnSearchTypesPluginApi", "section": "def-common.ISearchOptions", "text": "ISearchOptions" }, @@ -3408,9 +3408,9 @@ "description": [], "signature": [ { - "pluginId": "data", + "pluginId": "@kbn/search-types", "scope": "common", - "docId": "kibDataSearchPluginApi", + "docId": "kibKbnSearchTypesPluginApi", "section": "def-common.ISearchOptions", "text": "ISearchOptions" } @@ -3454,9 +3454,9 @@ "signature": [ "((id: string, keepAlive: string, options: ", { - "pluginId": "data", + "pluginId": "@kbn/search-types", "scope": "common", - "docId": "kibDataSearchPluginApi", + "docId": "kibKbnSearchTypesPluginApi", "section": "def-common.ISearchOptions", "text": "ISearchOptions" }, @@ -3513,9 +3513,9 @@ "description": [], "signature": [ { - "pluginId": "data", + "pluginId": "@kbn/search-types", "scope": "common", - "docId": "kibDataSearchPluginApi", + "docId": "kibKbnSearchTypesPluginApi", "section": "def-common.ISearchOptions", "text": "ISearchOptions" } @@ -4245,9 +4245,9 @@ }, ", options?: ", { - "pluginId": "data", + "pluginId": "@kbn/search-types", "scope": "common", - "docId": "kibDataSearchPluginApi", + "docId": "kibKbnSearchTypesPluginApi", "section": "def-common.ISearchOptions", "text": "ISearchOptions" }, @@ -4287,9 +4287,9 @@ "description": [], "signature": [ { - "pluginId": "data", + "pluginId": "@kbn/search-types", "scope": "common", - "docId": "kibDataSearchPluginApi", + "docId": "kibKbnSearchTypesPluginApi", "section": "def-common.ISearchOptions", "text": "ISearchOptions" }, @@ -5949,17 +5949,17 @@ "signature": [ "(response: ", { - "pluginId": "data", + "pluginId": "@kbn/search-types", "scope": "common", - "docId": "kibDataSearchPluginApi", + "docId": "kibKbnSearchTypesPluginApi", "section": "def-common.IEsSearchResponse", "text": "IEsSearchResponse" }, ") => ", { - "pluginId": "data", + "pluginId": "@kbn/search-types", "scope": "common", - "docId": "kibDataSearchPluginApi", + "docId": "kibKbnSearchTypesPluginApi", "section": "def-common.IEsSearchResponse", "text": "IEsSearchResponse" }, @@ -5978,9 +5978,9 @@ "description": [], "signature": [ { - "pluginId": "data", + "pluginId": "@kbn/search-types", "scope": "common", - "docId": "kibDataSearchPluginApi", + "docId": "kibKbnSearchTypesPluginApi", "section": "def-common.IEsSearchResponse", "text": "IEsSearchResponse" }, @@ -6126,9 +6126,9 @@ }, ", options?: ", { - "pluginId": "data", + "pluginId": "@kbn/search-types", "scope": "common", - "docId": "kibDataSearchPluginApi", + "docId": "kibKbnSearchTypesPluginApi", "section": "def-common.ISearchOptions", "text": "ISearchOptions" }, @@ -6168,9 +6168,9 @@ "description": [], "signature": [ { - "pluginId": "data", + "pluginId": "@kbn/search-types", "scope": "common", - "docId": "kibDataSearchPluginApi", + "docId": "kibKbnSearchTypesPluginApi", "section": "def-common.ISearchOptions", "text": "ISearchOptions" }, @@ -7152,9 +7152,9 @@ "Observable", "<", { - "pluginId": "data", + "pluginId": "@kbn/search-types", "scope": "common", - "docId": "kibDataSearchPluginApi", + "docId": "kibKbnSearchTypesPluginApi", "section": "def-common.IKibanaSearchResponse", "text": "IKibanaSearchResponse" }, @@ -8169,9 +8169,9 @@ }, " | undefined, options?: ", { - "pluginId": "data", + "pluginId": "@kbn/search-types", "scope": "common", - "docId": "kibDataSearchPluginApi", + "docId": "kibKbnSearchTypesPluginApi", "section": "def-common.ISearchOptions", "text": "ISearchOptions" }, @@ -8226,9 +8226,9 @@ "description": [], "signature": [ { - "pluginId": "data", + "pluginId": "@kbn/search-types", "scope": "common", - "docId": "kibDataSearchPluginApi", + "docId": "kibKbnSearchTypesPluginApi", "section": "def-common.ISearchOptions", "text": "ISearchOptions" }, @@ -9567,9 +9567,9 @@ "description": [], "signature": [ { - "pluginId": "data", + "pluginId": "@kbn/search-types", "scope": "common", - "docId": "kibDataSearchPluginApi", + "docId": "kibKbnSearchTypesPluginApi", "section": "def-common.IKibanaSearchResponse", "text": "IKibanaSearchResponse" }, @@ -9624,9 +9624,9 @@ "description": [], "signature": [ { - "pluginId": "data", + "pluginId": "@kbn/search-types", "scope": "common", - "docId": "kibDataSearchPluginApi", + "docId": "kibKbnSearchTypesPluginApi", "section": "def-common.IKibanaSearchResponse", "text": "IKibanaSearchResponse" }, @@ -10349,9 +10349,9 @@ "Observable", "<", { - "pluginId": "data", + "pluginId": "@kbn/search-types", "scope": "common", - "docId": "kibDataSearchPluginApi", + "docId": "kibKbnSearchTypesPluginApi", "section": "def-common.IKibanaSearchResponse", "text": "IKibanaSearchResponse" }, @@ -14831,9 +14831,9 @@ }, "; }) => ", { - "pluginId": "data", + "pluginId": "@kbn/search-types", "scope": "common", - "docId": "kibDataSearchPluginApi", + "docId": "kibKbnSearchTypesPluginApi", "section": "def-common.ISearchRequestParams", "text": "ISearchRequestParams" } @@ -15747,9 +15747,9 @@ "signature": [ "(response?: ", { - "pluginId": "data", + "pluginId": "@kbn/search-types", "scope": "common", - "docId": "kibDataSearchPluginApi", + "docId": "kibKbnSearchTypesPluginApi", "section": "def-common.IKibanaSearchResponse", "text": "IKibanaSearchResponse" }, @@ -15768,9 +15768,9 @@ "description": [], "signature": [ { - "pluginId": "data", + "pluginId": "@kbn/search-types", "scope": "common", - "docId": "kibDataSearchPluginApi", + "docId": "kibKbnSearchTypesPluginApi", "section": "def-common.IKibanaSearchResponse", "text": "IKibanaSearchResponse" }, @@ -16047,9 +16047,9 @@ "signature": [ "(response?: ", { - "pluginId": "data", + "pluginId": "@kbn/search-types", "scope": "common", - "docId": "kibDataSearchPluginApi", + "docId": "kibKbnSearchTypesPluginApi", "section": "def-common.IKibanaSearchResponse", "text": "IKibanaSearchResponse" }, @@ -16068,9 +16068,9 @@ "description": [], "signature": [ { - "pluginId": "data", + "pluginId": "@kbn/search-types", "scope": "common", - "docId": "kibDataSearchPluginApi", + "docId": "kibKbnSearchTypesPluginApi", "section": "def-common.IKibanaSearchResponse", "text": "IKibanaSearchResponse" }, @@ -16624,9 +16624,9 @@ "signature": [ " ", { - "pluginId": "data", + "pluginId": "@kbn/search-types", "scope": "common", - "docId": "kibDataSearchPluginApi", + "docId": "kibKbnSearchTypesPluginApi", "section": "def-common.IKibanaSearchResponse", "text": "IKibanaSearchResponse" }, @@ -26913,9 +26913,9 @@ "description": [], "signature": [ { - "pluginId": "data", + "pluginId": "@kbn/search-types", "scope": "common", - "docId": "kibDataSearchPluginApi", + "docId": "kibKbnSearchTypesPluginApi", "section": "def-common.IKibanaSearchResponse", "text": "IKibanaSearchResponse" }, @@ -27373,119 +27373,6 @@ ], "initialIsOpen": false }, - { - "parentPluginId": "data", - "id": "def-common.IEsErrorAttributes", - "type": "Interface", - "tags": [], - "label": "IEsErrorAttributes", - "description": [], - "path": "src/plugins/data/common/search/types.ts", - "deprecated": false, - "trackAdoption": false, - "children": [ - { - "parentPluginId": "data", - "id": "def-common.IEsErrorAttributes.error", - "type": "CompoundType", - "tags": [], - "label": "error", - "description": [], - "signature": [ - "ErrorCause", - " | undefined" - ], - "path": "src/plugins/data/common/search/types.ts", - "deprecated": false, - "trackAdoption": false - }, - { - "parentPluginId": "data", - "id": "def-common.IEsErrorAttributes.rawResponse", - "type": "Object", - "tags": [], - "label": "rawResponse", - "description": [], - "signature": [ - "SearchResponseBody", - "> | undefined" - ], - "path": "src/plugins/data/common/search/types.ts", - "deprecated": false, - "trackAdoption": false - }, - { - "parentPluginId": "data", - "id": "def-common.IEsErrorAttributes.requestParams", - "type": "Object", - "tags": [], - "label": "requestParams", - "description": [], - "signature": [ - { - "pluginId": "data", - "scope": "common", - "docId": "kibDataSearchPluginApi", - "section": "def-common.SanitizedConnectionRequestParams", - "text": "SanitizedConnectionRequestParams" - }, - " | undefined" - ], - "path": "src/plugins/data/common/search/types.ts", - "deprecated": false, - "trackAdoption": false - } - ], - "initialIsOpen": false - }, - { - "parentPluginId": "data", - "id": "def-common.IEsSearchRequest", - "type": "Interface", - "tags": [], - "label": "IEsSearchRequest", - "description": [], - "signature": [ - { - "pluginId": "data", - "scope": "common", - "docId": "kibDataSearchPluginApi", - "section": "def-common.IEsSearchRequest", - "text": "IEsSearchRequest" - }, - " extends ", - { - "pluginId": "data", - "scope": "common", - "docId": "kibDataSearchPluginApi", - "section": "def-common.IKibanaSearchRequest", - "text": "IKibanaSearchRequest" - }, - "" - ], - "path": "src/plugins/data/common/search/strategies/es_search/types.ts", - "deprecated": false, - "trackAdoption": false, - "children": [ - { - "parentPluginId": "data", - "id": "def-common.IEsSearchRequest.indexType", - "type": "string", - "tags": [], - "label": "indexType", - "description": [], - "signature": [ - "string | undefined" - ], - "path": "src/plugins/data/common/search/strategies/es_search/types.ts", - "deprecated": false, - "trackAdoption": false - } - ], - "initialIsOpen": false - }, { "parentPluginId": "data", "id": "def-common.IInspectorInfo", @@ -27560,251 +27447,6 @@ ], "initialIsOpen": false }, - { - "parentPluginId": "data", - "id": "def-common.IKibanaSearchRequest", - "type": "Interface", - "tags": [], - "label": "IKibanaSearchRequest", - "description": [], - "signature": [ - { - "pluginId": "data", - "scope": "common", - "docId": "kibDataSearchPluginApi", - "section": "def-common.IKibanaSearchRequest", - "text": "IKibanaSearchRequest" - }, - "" - ], - "path": "src/plugins/data/common/search/types.ts", - "deprecated": false, - "trackAdoption": false, - "children": [ - { - "parentPluginId": "data", - "id": "def-common.IKibanaSearchRequest.id", - "type": "string", - "tags": [], - "label": "id", - "description": [ - "\nAn id can be used to uniquely identify this request." - ], - "signature": [ - "string | undefined" - ], - "path": "src/plugins/data/common/search/types.ts", - "deprecated": false, - "trackAdoption": false - }, - { - "parentPluginId": "data", - "id": "def-common.IKibanaSearchRequest.params", - "type": "Uncategorized", - "tags": [], - "label": "params", - "description": [], - "signature": [ - "Params | undefined" - ], - "path": "src/plugins/data/common/search/types.ts", - "deprecated": false, - "trackAdoption": false - } - ], - "initialIsOpen": false - }, - { - "parentPluginId": "data", - "id": "def-common.IKibanaSearchResponse", - "type": "Interface", - "tags": [], - "label": "IKibanaSearchResponse", - "description": [], - "signature": [ - { - "pluginId": "data", - "scope": "common", - "docId": "kibDataSearchPluginApi", - "section": "def-common.IKibanaSearchResponse", - "text": "IKibanaSearchResponse" - }, - "" - ], - "path": "src/plugins/data/common/search/types.ts", - "deprecated": false, - "trackAdoption": false, - "children": [ - { - "parentPluginId": "data", - "id": "def-common.IKibanaSearchResponse.id", - "type": "string", - "tags": [], - "label": "id", - "description": [ - "\nSome responses may contain a unique id to identify the request this response came from." - ], - "signature": [ - "string | undefined" - ], - "path": "src/plugins/data/common/search/types.ts", - "deprecated": false, - "trackAdoption": false - }, - { - "parentPluginId": "data", - "id": "def-common.IKibanaSearchResponse.total", - "type": "number", - "tags": [], - "label": "total", - "description": [ - "\nIf relevant to the search strategy, return a total number\nthat represents how progress is indicated." - ], - "signature": [ - "number | undefined" - ], - "path": "src/plugins/data/common/search/types.ts", - "deprecated": false, - "trackAdoption": false - }, - { - "parentPluginId": "data", - "id": "def-common.IKibanaSearchResponse.loaded", - "type": "number", - "tags": [], - "label": "loaded", - "description": [ - "\nIf relevant to the search strategy, return a loaded number\nthat represents how progress is indicated." - ], - "signature": [ - "number | undefined" - ], - "path": "src/plugins/data/common/search/types.ts", - "deprecated": false, - "trackAdoption": false - }, - { - "parentPluginId": "data", - "id": "def-common.IKibanaSearchResponse.isRunning", - "type": "CompoundType", - "tags": [], - "label": "isRunning", - "description": [ - "\nIndicates whether search is still in flight" - ], - "signature": [ - "boolean | undefined" - ], - "path": "src/plugins/data/common/search/types.ts", - "deprecated": false, - "trackAdoption": false - }, - { - "parentPluginId": "data", - "id": "def-common.IKibanaSearchResponse.isPartial", - "type": "CompoundType", - "tags": [], - "label": "isPartial", - "description": [ - "\nIndicates whether the results returned are complete or partial" - ], - "signature": [ - "boolean | undefined" - ], - "path": "src/plugins/data/common/search/types.ts", - "deprecated": false, - "trackAdoption": false - }, - { - "parentPluginId": "data", - "id": "def-common.IKibanaSearchResponse.isRestored", - "type": "CompoundType", - "tags": [], - "label": "isRestored", - "description": [ - "\nIndicates whether the results returned are from the async-search index" - ], - "signature": [ - "boolean | undefined" - ], - "path": "src/plugins/data/common/search/types.ts", - "deprecated": false, - "trackAdoption": false - }, - { - "parentPluginId": "data", - "id": "def-common.IKibanaSearchResponse.isStored", - "type": "CompoundType", - "tags": [], - "label": "isStored", - "description": [ - "\nIndicates whether the search has been saved to a search-session object and long keepAlive was set" - ], - "signature": [ - "boolean | undefined" - ], - "path": "src/plugins/data/common/search/types.ts", - "deprecated": false, - "trackAdoption": false - }, - { - "parentPluginId": "data", - "id": "def-common.IKibanaSearchResponse.warning", - "type": "string", - "tags": [], - "label": "warning", - "description": [ - "\nOptional warnings returned from Elasticsearch (for example, deprecation warnings)" - ], - "signature": [ - "string | undefined" - ], - "path": "src/plugins/data/common/search/types.ts", - "deprecated": false, - "trackAdoption": false - }, - { - "parentPluginId": "data", - "id": "def-common.IKibanaSearchResponse.rawResponse", - "type": "Uncategorized", - "tags": [], - "label": "rawResponse", - "description": [ - "\nThe raw response returned by the internal search method (usually the raw ES response)" - ], - "signature": [ - "RawResponse" - ], - "path": "src/plugins/data/common/search/types.ts", - "deprecated": false, - "trackAdoption": false - }, - { - "parentPluginId": "data", - "id": "def-common.IKibanaSearchResponse.requestParams", - "type": "Object", - "tags": [], - "label": "requestParams", - "description": [ - "\nHTTP request parameters from elasticsearch transport client t" - ], - "signature": [ - { - "pluginId": "data", - "scope": "common", - "docId": "kibDataSearchPluginApi", - "section": "def-common.SanitizedConnectionRequestParams", - "text": "SanitizedConnectionRequestParams" - }, - " | undefined" - ], - "path": "src/plugins/data/common/search/types.ts", - "deprecated": false, - "trackAdoption": false - } - ], - "initialIsOpen": false - }, { "parentPluginId": "data", "id": "def-common.IMetricAggConfig", @@ -27943,457 +27585,6 @@ ], "initialIsOpen": false }, - { - "parentPluginId": "data", - "id": "def-common.ISearchClient", - "type": "Interface", - "tags": [], - "label": "ISearchClient", - "description": [], - "path": "src/plugins/data/common/search/types.ts", - "deprecated": false, - "trackAdoption": false, - "children": [ - { - "parentPluginId": "data", - "id": "def-common.ISearchClient.search", - "type": "Function", - "tags": [], - "label": "search", - "description": [], - "signature": [ - " = ", - { - "pluginId": "data", - "scope": "common", - "docId": "kibDataSearchPluginApi", - "section": "def-common.IEsSearchRequest", - "text": "IEsSearchRequest" - }, - "<", - { - "pluginId": "data", - "scope": "common", - "docId": "kibDataSearchPluginApi", - "section": "def-common.ISearchRequestParams", - "text": "ISearchRequestParams" - }, - ">, SearchStrategyResponse extends ", - { - "pluginId": "data", - "scope": "common", - "docId": "kibDataSearchPluginApi", - "section": "def-common.IKibanaSearchResponse", - "text": "IKibanaSearchResponse" - }, - " = ", - { - "pluginId": "data", - "scope": "common", - "docId": "kibDataSearchPluginApi", - "section": "def-common.IEsSearchResponse", - "text": "IEsSearchResponse" - }, - ">(request: SearchStrategyRequest, options?: ", - { - "pluginId": "data", - "scope": "common", - "docId": "kibDataSearchPluginApi", - "section": "def-common.ISearchOptions", - "text": "ISearchOptions" - }, - " | undefined) => ", - "Observable", - "" - ], - "path": "src/plugins/data/common/search/types.ts", - "deprecated": false, - "trackAdoption": false, - "returnComment": [], - "children": [ - { - "parentPluginId": "data", - "id": "def-common.ISearchClient.search.$1", - "type": "Uncategorized", - "tags": [], - "label": "request", - "description": [], - "signature": [ - "SearchStrategyRequest" - ], - "path": "src/plugins/data/common/search/types.ts", - "deprecated": false, - "trackAdoption": false - }, - { - "parentPluginId": "data", - "id": "def-common.ISearchClient.search.$2", - "type": "Object", - "tags": [], - "label": "options", - "description": [], - "signature": [ - { - "pluginId": "data", - "scope": "common", - "docId": "kibDataSearchPluginApi", - "section": "def-common.ISearchOptions", - "text": "ISearchOptions" - }, - " | undefined" - ], - "path": "src/plugins/data/common/search/types.ts", - "deprecated": false, - "trackAdoption": false - } - ] - }, - { - "parentPluginId": "data", - "id": "def-common.ISearchClient.cancel", - "type": "Function", - "tags": [], - "label": "cancel", - "description": [ - "\nUsed to cancel an in-progress search request." - ], - "signature": [ - "(id: string, options?: ", - { - "pluginId": "data", - "scope": "common", - "docId": "kibDataSearchPluginApi", - "section": "def-common.ISearchOptions", - "text": "ISearchOptions" - }, - " | undefined) => Promise" - ], - "path": "src/plugins/data/common/search/types.ts", - "deprecated": false, - "trackAdoption": false, - "returnComment": [], - "children": [ - { - "parentPluginId": "data", - "id": "def-common.ISearchClient.cancel.$1", - "type": "string", - "tags": [], - "label": "id", - "description": [], - "path": "src/plugins/data/common/search/types.ts", - "deprecated": false, - "trackAdoption": false - }, - { - "parentPluginId": "data", - "id": "def-common.ISearchClient.cancel.$2", - "type": "Object", - "tags": [], - "label": "options", - "description": [], - "signature": [ - { - "pluginId": "data", - "scope": "common", - "docId": "kibDataSearchPluginApi", - "section": "def-common.ISearchOptions", - "text": "ISearchOptions" - }, - " | undefined" - ], - "path": "src/plugins/data/common/search/types.ts", - "deprecated": false, - "trackAdoption": false - } - ] - }, - { - "parentPluginId": "data", - "id": "def-common.ISearchClient.extend", - "type": "Function", - "tags": [], - "label": "extend", - "description": [ - "\nUsed to extend the TTL of an in-progress search request." - ], - "signature": [ - "(id: string, keepAlive: string, options?: ", - { - "pluginId": "data", - "scope": "common", - "docId": "kibDataSearchPluginApi", - "section": "def-common.ISearchOptions", - "text": "ISearchOptions" - }, - " | undefined) => Promise" - ], - "path": "src/plugins/data/common/search/types.ts", - "deprecated": false, - "trackAdoption": false, - "returnComment": [], - "children": [ - { - "parentPluginId": "data", - "id": "def-common.ISearchClient.extend.$1", - "type": "string", - "tags": [], - "label": "id", - "description": [], - "path": "src/plugins/data/common/search/types.ts", - "deprecated": false, - "trackAdoption": false - }, - { - "parentPluginId": "data", - "id": "def-common.ISearchClient.extend.$2", - "type": "string", - "tags": [], - "label": "keepAlive", - "description": [], - "path": "src/plugins/data/common/search/types.ts", - "deprecated": false, - "trackAdoption": false - }, - { - "parentPluginId": "data", - "id": "def-common.ISearchClient.extend.$3", - "type": "Object", - "tags": [], - "label": "options", - "description": [], - "signature": [ - { - "pluginId": "data", - "scope": "common", - "docId": "kibDataSearchPluginApi", - "section": "def-common.ISearchOptions", - "text": "ISearchOptions" - }, - " | undefined" - ], - "path": "src/plugins/data/common/search/types.ts", - "deprecated": false, - "trackAdoption": false - } - ] - } - ], - "initialIsOpen": false - }, - { - "parentPluginId": "data", - "id": "def-common.ISearchOptions", - "type": "Interface", - "tags": [], - "label": "ISearchOptions", - "description": [], - "path": "src/plugins/data/common/search/types.ts", - "deprecated": false, - "trackAdoption": false, - "children": [ - { - "parentPluginId": "data", - "id": "def-common.ISearchOptions.abortSignal", - "type": "Object", - "tags": [], - "label": "abortSignal", - "description": [ - "\nAn `AbortSignal` that allows the caller of `search` to abort a search request." - ], - "signature": [ - "AbortSignal | undefined" - ], - "path": "src/plugins/data/common/search/types.ts", - "deprecated": false, - "trackAdoption": false - }, - { - "parentPluginId": "data", - "id": "def-common.ISearchOptions.strategy", - "type": "string", - "tags": [], - "label": "strategy", - "description": [ - "\nUse this option to force using a specific server side search strategy. Leave empty to use the default strategy." - ], - "signature": [ - "string | undefined" - ], - "path": "src/plugins/data/common/search/types.ts", - "deprecated": false, - "trackAdoption": false - }, - { - "parentPluginId": "data", - "id": "def-common.ISearchOptions.legacyHitsTotal", - "type": "CompoundType", - "tags": [], - "label": "legacyHitsTotal", - "description": [ - "\nRequest the legacy format for the total number of hits. If sending `rest_total_hits_as_int` to\nsomething other than `true`, this should be set to `false`." - ], - "signature": [ - "boolean | undefined" - ], - "path": "src/plugins/data/common/search/types.ts", - "deprecated": false, - "trackAdoption": false - }, - { - "parentPluginId": "data", - "id": "def-common.ISearchOptions.sessionId", - "type": "string", - "tags": [], - "label": "sessionId", - "description": [ - "\nA session ID, grouping multiple search requests into a single session." - ], - "signature": [ - "string | undefined" - ], - "path": "src/plugins/data/common/search/types.ts", - "deprecated": false, - "trackAdoption": false - }, - { - "parentPluginId": "data", - "id": "def-common.ISearchOptions.isStored", - "type": "CompoundType", - "tags": [], - "label": "isStored", - "description": [ - "\nWhether the session is already saved (i.e. sent to background)" - ], - "signature": [ - "boolean | undefined" - ], - "path": "src/plugins/data/common/search/types.ts", - "deprecated": false, - "trackAdoption": false - }, - { - "parentPluginId": "data", - "id": "def-common.ISearchOptions.isSearchStored", - "type": "CompoundType", - "tags": [], - "label": "isSearchStored", - "description": [ - "\nWhether the search was successfully polled after session was saved. Search was added to a session saved object and keepAlive extended." - ], - "signature": [ - "boolean | undefined" - ], - "path": "src/plugins/data/common/search/types.ts", - "deprecated": false, - "trackAdoption": false - }, - { - "parentPluginId": "data", - "id": "def-common.ISearchOptions.isRestore", - "type": "CompoundType", - "tags": [], - "label": "isRestore", - "description": [ - "\nWhether the session is restored (i.e. search requests should re-use the stored search IDs,\nrather than starting from scratch)" - ], - "signature": [ - "boolean | undefined" - ], - "path": "src/plugins/data/common/search/types.ts", - "deprecated": false, - "trackAdoption": false - }, - { - "parentPluginId": "data", - "id": "def-common.ISearchOptions.retrieveResults", - "type": "CompoundType", - "tags": [], - "label": "retrieveResults", - "description": [ - "\nBy default, when polling, we don't retrieve the results of the search request (until it is complete). (For async\nsearch, this is the difference between calling _async_search/{id} and _async_search/status/{id}.) setting this to\n`true` will request the search results, regardless of whether or not the search is complete." - ], - "signature": [ - "boolean | undefined" - ], - "path": "src/plugins/data/common/search/types.ts", - "deprecated": false, - "trackAdoption": false - }, - { - "parentPluginId": "data", - "id": "def-common.ISearchOptions.executionContext", - "type": "Object", - "tags": [], - "label": "executionContext", - "description": [ - "\nRepresents a meta-information about a Kibana entity intitating a saerch request." - ], - "signature": [ - { - "pluginId": "@kbn/core-execution-context-common", - "scope": "common", - "docId": "kibKbnCoreExecutionContextCommonPluginApi", - "section": "def-common.KibanaExecutionContext", - "text": "KibanaExecutionContext" - }, - " | undefined" - ], - "path": "src/plugins/data/common/search/types.ts", - "deprecated": false, - "trackAdoption": false - }, - { - "parentPluginId": "data", - "id": "def-common.ISearchOptions.indexPattern", - "type": "Object", - "tags": [], - "label": "indexPattern", - "description": [ - "\nIndex pattern reference is used for better error messages" - ], - "signature": [ - { - "pluginId": "dataViews", - "scope": "common", - "docId": "kibDataViewsPluginApi", - "section": "def-common.DataView", - "text": "DataView" - }, - " | undefined" - ], - "path": "src/plugins/data/common/search/types.ts", - "deprecated": false, - "trackAdoption": false - }, - { - "parentPluginId": "data", - "id": "def-common.ISearchOptions.transport", - "type": "Object", - "tags": [], - "label": "transport", - "description": [ - "\nTransportRequestOptions, other than `signal`, to pass through to the ES client.\nTo pass an abort signal, use {@link ISearchOptions.abortSignal}" - ], - "signature": [ - "Omit<", - "TransportRequestOptions", - ", \"signal\"> | undefined" - ], - "path": "src/plugins/data/common/search/types.ts", - "deprecated": false, - "trackAdoption": false - } - ], - "initialIsOpen": false - }, { "parentPluginId": "data", "id": "def-common.ISearchStartSearchSource", @@ -29938,49 +29129,49 @@ "signature": [ " = ", { - "pluginId": "data", + "pluginId": "@kbn/search-types", "scope": "common", - "docId": "kibDataSearchPluginApi", + "docId": "kibKbnSearchTypesPluginApi", "section": "def-common.IEsSearchRequest", "text": "IEsSearchRequest" }, "<", { - "pluginId": "data", + "pluginId": "@kbn/search-types", "scope": "common", - "docId": "kibDataSearchPluginApi", + "docId": "kibKbnSearchTypesPluginApi", "section": "def-common.ISearchRequestParams", "text": "ISearchRequestParams" }, ">, SearchStrategyResponse extends ", { - "pluginId": "data", + "pluginId": "@kbn/search-types", "scope": "common", - "docId": "kibDataSearchPluginApi", + "docId": "kibKbnSearchTypesPluginApi", "section": "def-common.IKibanaSearchResponse", "text": "IKibanaSearchResponse" }, " = ", { - "pluginId": "data", + "pluginId": "@kbn/search-types", "scope": "common", - "docId": "kibDataSearchPluginApi", + "docId": "kibKbnSearchTypesPluginApi", "section": "def-common.IEsSearchResponse", "text": "IEsSearchResponse" }, ">(request: SearchStrategyRequest, options?: ", { - "pluginId": "data", + "pluginId": "@kbn/search-types", "scope": "common", - "docId": "kibDataSearchPluginApi", + "docId": "kibKbnSearchTypesPluginApi", "section": "def-common.ISearchOptions", "text": "ISearchOptions" }, @@ -30003,7 +29194,7 @@ "signature": [ "SearchStrategyRequest" ], - "path": "src/plugins/data/common/search/types.ts", + "path": "packages/kbn-search-types/src/types.ts", "deprecated": false, "trackAdoption": false }, @@ -30016,15 +29207,15 @@ "description": [], "signature": [ { - "pluginId": "data", + "pluginId": "@kbn/search-types", "scope": "common", - "docId": "kibDataSearchPluginApi", + "docId": "kibKbnSearchTypesPluginApi", "section": "def-common.ISearchOptions", "text": "ISearchOptions" }, " | undefined" ], - "path": "src/plugins/data/common/search/types.ts", + "path": "packages/kbn-search-types/src/types.ts", "deprecated": false, "trackAdoption": false } @@ -30499,9 +29690,9 @@ }, " extends ", { - "pluginId": "data", + "pluginId": "@kbn/search-types", "scope": "common", - "docId": "kibDataSearchPluginApi", + "docId": "kibKbnSearchTypesPluginApi", "section": "def-common.ISearchOptions", "text": "ISearchOptions" } @@ -30569,9 +29760,9 @@ }, " extends ", { - "pluginId": "data", + "pluginId": "@kbn/search-types", "scope": "common", - "docId": "kibDataSearchPluginApi", + "docId": "kibKbnSearchTypesPluginApi", "section": "def-common.IKibanaSearchResponse", "text": "IKibanaSearchResponse" }, @@ -31950,9 +31141,9 @@ "description": [], "signature": [ { - "pluginId": "data", + "pluginId": "@kbn/search-types", "scope": "common", - "docId": "kibDataSearchPluginApi", + "docId": "kibKbnSearchTypesPluginApi", "section": "def-common.IKibanaSearchResponse", "text": "IKibanaSearchResponse" }, @@ -33585,32 +32776,6 @@ "trackAdoption": false, "initialIsOpen": false }, - { - "parentPluginId": "data", - "id": "def-common.IEsSearchResponse", - "type": "Type", - "tags": [], - "label": "IEsSearchResponse", - "description": [], - "signature": [ - { - "pluginId": "data", - "scope": "common", - "docId": "kibDataSearchPluginApi", - "section": "def-common.IKibanaSearchResponse", - "text": "IKibanaSearchResponse" - }, - "<", - "SearchResponse", - ">>" - ], - "path": "src/plugins/data/common/search/strategies/es_search/types.ts", - "deprecated": false, - "trackAdoption": false, - "initialIsOpen": false - }, { "parentPluginId": "data", "id": "def-common.IFieldParamType", @@ -33803,277 +32968,6 @@ "trackAdoption": false, "initialIsOpen": false }, - { - "parentPluginId": "data", - "id": "def-common.ISearchCancelGeneric", - "type": "Type", - "tags": [], - "label": "ISearchCancelGeneric", - "description": [], - "signature": [ - "(id: string, options?: ", - { - "pluginId": "data", - "scope": "common", - "docId": "kibDataSearchPluginApi", - "section": "def-common.ISearchOptions", - "text": "ISearchOptions" - }, - " | undefined) => Promise" - ], - "path": "src/plugins/data/common/search/types.ts", - "deprecated": false, - "trackAdoption": false, - "returnComment": [], - "children": [ - { - "parentPluginId": "data", - "id": "def-common.ISearchCancelGeneric.$1", - "type": "string", - "tags": [], - "label": "id", - "description": [], - "path": "src/plugins/data/common/search/types.ts", - "deprecated": false, - "trackAdoption": false - }, - { - "parentPluginId": "data", - "id": "def-common.ISearchCancelGeneric.$2", - "type": "Object", - "tags": [], - "label": "options", - "description": [], - "signature": [ - { - "pluginId": "data", - "scope": "common", - "docId": "kibDataSearchPluginApi", - "section": "def-common.ISearchOptions", - "text": "ISearchOptions" - }, - " | undefined" - ], - "path": "src/plugins/data/common/search/types.ts", - "deprecated": false, - "trackAdoption": false - } - ], - "initialIsOpen": false - }, - { - "parentPluginId": "data", - "id": "def-common.ISearchExtendGeneric", - "type": "Type", - "tags": [], - "label": "ISearchExtendGeneric", - "description": [], - "signature": [ - "(id: string, keepAlive: string, options?: ", - { - "pluginId": "data", - "scope": "common", - "docId": "kibDataSearchPluginApi", - "section": "def-common.ISearchOptions", - "text": "ISearchOptions" - }, - " | undefined) => Promise" - ], - "path": "src/plugins/data/common/search/types.ts", - "deprecated": false, - "trackAdoption": false, - "returnComment": [], - "children": [ - { - "parentPluginId": "data", - "id": "def-common.ISearchExtendGeneric.$1", - "type": "string", - "tags": [], - "label": "id", - "description": [], - "path": "src/plugins/data/common/search/types.ts", - "deprecated": false, - "trackAdoption": false - }, - { - "parentPluginId": "data", - "id": "def-common.ISearchExtendGeneric.$2", - "type": "string", - "tags": [], - "label": "keepAlive", - "description": [], - "path": "src/plugins/data/common/search/types.ts", - "deprecated": false, - "trackAdoption": false - }, - { - "parentPluginId": "data", - "id": "def-common.ISearchExtendGeneric.$3", - "type": "Object", - "tags": [], - "label": "options", - "description": [], - "signature": [ - { - "pluginId": "data", - "scope": "common", - "docId": "kibDataSearchPluginApi", - "section": "def-common.ISearchOptions", - "text": "ISearchOptions" - }, - " | undefined" - ], - "path": "src/plugins/data/common/search/types.ts", - "deprecated": false, - "trackAdoption": false - } - ], - "initialIsOpen": false - }, - { - "parentPluginId": "data", - "id": "def-common.ISearchGeneric", - "type": "Type", - "tags": [], - "label": "ISearchGeneric", - "description": [], - "signature": [ - " = ", - { - "pluginId": "data", - "scope": "common", - "docId": "kibDataSearchPluginApi", - "section": "def-common.IEsSearchRequest", - "text": "IEsSearchRequest" - }, - "<", - { - "pluginId": "data", - "scope": "common", - "docId": "kibDataSearchPluginApi", - "section": "def-common.ISearchRequestParams", - "text": "ISearchRequestParams" - }, - ">, SearchStrategyResponse extends ", - { - "pluginId": "data", - "scope": "common", - "docId": "kibDataSearchPluginApi", - "section": "def-common.IKibanaSearchResponse", - "text": "IKibanaSearchResponse" - }, - " = ", - { - "pluginId": "data", - "scope": "common", - "docId": "kibDataSearchPluginApi", - "section": "def-common.IEsSearchResponse", - "text": "IEsSearchResponse" - }, - ">(request: SearchStrategyRequest, options?: ", - { - "pluginId": "data", - "scope": "common", - "docId": "kibDataSearchPluginApi", - "section": "def-common.ISearchOptions", - "text": "ISearchOptions" - }, - " | undefined) => ", - "Observable", - "" - ], - "path": "src/plugins/data/common/search/types.ts", - "deprecated": false, - "trackAdoption": false, - "returnComment": [], - "children": [ - { - "parentPluginId": "data", - "id": "def-common.ISearchGeneric.$1", - "type": "Uncategorized", - "tags": [], - "label": "request", - "description": [], - "signature": [ - "SearchStrategyRequest" - ], - "path": "src/plugins/data/common/search/types.ts", - "deprecated": false, - "trackAdoption": false - }, - { - "parentPluginId": "data", - "id": "def-common.ISearchGeneric.$2", - "type": "Object", - "tags": [], - "label": "options", - "description": [], - "signature": [ - { - "pluginId": "data", - "scope": "common", - "docId": "kibDataSearchPluginApi", - "section": "def-common.ISearchOptions", - "text": "ISearchOptions" - }, - " | undefined" - ], - "path": "src/plugins/data/common/search/types.ts", - "deprecated": false, - "trackAdoption": false - } - ], - "initialIsOpen": false - }, - { - "parentPluginId": "data", - "id": "def-common.ISearchOptionsSerializable", - "type": "Type", - "tags": [], - "label": "ISearchOptionsSerializable", - "description": [ - "\nSame as `ISearchOptions`, but contains only serializable fields, which can\nbe sent over the network." - ], - "signature": [ - "{ executionContext?: ", - { - "pluginId": "@kbn/core-execution-context-common", - "scope": "common", - "docId": "kibKbnCoreExecutionContextCommonPluginApi", - "section": "def-common.KibanaExecutionContext", - "text": "KibanaExecutionContext" - }, - " | undefined; isStored?: boolean | undefined; isRestore?: boolean | undefined; sessionId?: string | undefined; strategy?: string | undefined; legacyHitsTotal?: boolean | undefined; isSearchStored?: boolean | undefined; retrieveResults?: boolean | undefined; }" - ], - "path": "src/plugins/data/common/search/types.ts", - "deprecated": false, - "trackAdoption": false, - "initialIsOpen": false - }, - { - "parentPluginId": "data", - "id": "def-common.ISearchRequestParams", - "type": "Type", - "tags": [], - "label": "ISearchRequestParams", - "description": [], - "signature": [ - "{ trackTotalHits?: boolean | undefined; } & ", - "SearchRequest" - ], - "path": "src/plugins/data/common/search/strategies/es_search/types.ts", - "deprecated": false, - "trackAdoption": false, - "initialIsOpen": false - }, { "parentPluginId": "data", "id": "def-common.ISearchSource", @@ -34250,9 +33144,9 @@ "Observable", "<", { - "pluginId": "data", + "pluginId": "@kbn/search-types", "scope": "common", - "docId": "kibDataSearchPluginApi", + "docId": "kibKbnSearchTypesPluginApi", "section": "def-common.IKibanaSearchResponse", "text": "IKibanaSearchResponse" }, @@ -34585,21 +33479,6 @@ "trackAdoption": false, "initialIsOpen": false }, - { - "parentPluginId": "data", - "id": "def-common.SanitizedConnectionRequestParams", - "type": "Type", - "tags": [], - "label": "SanitizedConnectionRequestParams", - "description": [], - "signature": [ - "{ path: string; method: string; querystring?: string | undefined; }" - ], - "path": "src/plugins/data/common/search/types.ts", - "deprecated": false, - "trackAdoption": false, - "initialIsOpen": false - }, { "parentPluginId": "data", "id": "def-common.SEARCH_SESSION_TYPE", @@ -34869,9 +33748,9 @@ "description": [], "signature": [ { - "pluginId": "data", + "pluginId": "@kbn/search-types", "scope": "common", - "docId": "kibDataSearchPluginApi", + "docId": "kibKbnSearchTypesPluginApi", "section": "def-common.IKibanaSearchRequest", "text": "IKibanaSearchRequest" }, @@ -38820,9 +37699,9 @@ }, " | undefined, options?: ", { - "pluginId": "data", + "pluginId": "@kbn/search-types", "scope": "common", - "docId": "kibDataSearchPluginApi", + "docId": "kibKbnSearchTypesPluginApi", "section": "def-common.ISearchOptions", "text": "ISearchOptions" }, diff --git a/api_docs/data_search.mdx b/api_docs/data_search.mdx index 9415fe33098ca..8d97225e9c340 100644 --- a/api_docs/data_search.mdx +++ b/api_docs/data_search.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/data-search title: "data.search" image: https://source.unsplash.com/400x175/?github description: API docs for the data.search plugin -date: 2024-05-06 +date: 2024-05-07 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'data.search'] --- import dataSearchObj from './data_search.devdocs.json'; @@ -21,7 +21,7 @@ Contact [@elastic/kibana-visualizations](https://github.com/orgs/elastic/teams/k | Public API count | Any count | Items lacking comments | Missing exports | |-------------------|-----------|------------------------|-----------------| -| 3290 | 31 | 2621 | 23 | +| 3186 | 31 | 2575 | 23 | ## Client diff --git a/api_docs/data_view_editor.mdx b/api_docs/data_view_editor.mdx index 869b23298d66f..62ee6a25e60c3 100644 --- a/api_docs/data_view_editor.mdx +++ b/api_docs/data_view_editor.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/dataViewEditor title: "dataViewEditor" image: https://source.unsplash.com/400x175/?github description: API docs for the dataViewEditor plugin -date: 2024-05-06 +date: 2024-05-07 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 1ddda81277c9f..b5d9c46d50411 100644 --- a/api_docs/data_view_field_editor.mdx +++ b/api_docs/data_view_field_editor.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/dataViewFieldEditor title: "dataViewFieldEditor" image: https://source.unsplash.com/400x175/?github description: API docs for the dataViewFieldEditor plugin -date: 2024-05-06 +date: 2024-05-07 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 48cf5d9d19191..cae57f617679c 100644 --- a/api_docs/data_view_management.mdx +++ b/api_docs/data_view_management.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/dataViewManagement title: "dataViewManagement" image: https://source.unsplash.com/400x175/?github description: API docs for the dataViewManagement plugin -date: 2024-05-06 +date: 2024-05-07 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 21d3b7fd7eb6c..843bcf1faa316 100644 --- a/api_docs/data_views.mdx +++ b/api_docs/data_views.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/dataViews title: "dataViews" image: https://source.unsplash.com/400x175/?github description: API docs for the dataViews plugin -date: 2024-05-06 +date: 2024-05-07 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 0b86d3d8cae54..9cf018297f500 100644 --- a/api_docs/data_visualizer.mdx +++ b/api_docs/data_visualizer.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/dataVisualizer title: "dataVisualizer" image: https://source.unsplash.com/400x175/?github description: API docs for the dataVisualizer plugin -date: 2024-05-06 +date: 2024-05-07 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'dataVisualizer'] --- import dataVisualizerObj from './data_visualizer.devdocs.json'; diff --git a/api_docs/dataset_quality.mdx b/api_docs/dataset_quality.mdx index 0d9610cc17ed8..dcfc00e706997 100644 --- a/api_docs/dataset_quality.mdx +++ b/api_docs/dataset_quality.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/datasetQuality title: "datasetQuality" image: https://source.unsplash.com/400x175/?github description: API docs for the datasetQuality plugin -date: 2024-05-06 +date: 2024-05-07 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'datasetQuality'] --- import datasetQualityObj from './dataset_quality.devdocs.json'; diff --git a/api_docs/deprecations_by_api.mdx b/api_docs/deprecations_by_api.mdx index 76cead6936a2e..7adb51c6f54a2 100644 --- a/api_docs/deprecations_by_api.mdx +++ b/api_docs/deprecations_by_api.mdx @@ -7,7 +7,7 @@ id: kibDevDocsDeprecationsByApi slug: /kibana-dev-docs/api-meta/deprecated-api-list-by-api title: Deprecated API usage by API description: A list of deprecated APIs, which plugins are still referencing them, and when they need to be removed by. -date: 2024-05-06 +date: 2024-05-07 tags: ['contributor', 'dev', 'apidocs', 'kibana'] --- @@ -100,7 +100,6 @@ tags: ['contributor', 'dev', 'apidocs', 'kibana'] | | graph, visTypeTimeseries, dataViewManagement, dataViews | - | | | graph, visTypeTimeseries, dataViewManagement | - | | | visualizations, graph | - | -| | devTools, console, crossClusterReplication, grokdebugger, ingestPipelines, osquery, infra, painlessLab, searchprofiler, metricsDataAccess, apm, observabilityOnboarding, filesManagement | - | | | @kbn/core, lens, savedObjects | - | | | dashboard | - | | | embeddable, dashboard | - | @@ -116,7 +115,6 @@ tags: ['contributor', 'dev', 'apidocs', 'kibana'] | | dataViewManagement | - | | | unifiedSearch | - | | | unifiedSearch | - | -| | data, timelines, observabilityShared, cloudSecurityPosture, console, runtimeFields, indexManagement | - | | | embeddableEnhanced | - | | | visTypeGauge | - | | | visTypePie | - | @@ -132,11 +130,13 @@ tags: ['contributor', 'dev', 'apidocs', 'kibana'] | | canvas | - | | | canvas | - | | | spaces, savedObjectsManagement | - | +| | devTools, console, crossClusterReplication, grokdebugger, ingestPipelines, infra, painlessLab, searchprofiler, metricsDataAccess, apm, observabilityOnboarding | - | +| | observabilityShared, console, runtimeFields, indexManagement | - | | | @kbn/core-elasticsearch-server-internal, @kbn/core-plugins-server-internal, enterpriseSearch, observabilityOnboarding, console | - | -| | @kbn/content-management-table-list-view, filesManagement | - | | | @kbn/react-kibana-context-styled, kibanaReact | - | | | enterpriseSearch | - | | | encryptedSavedObjects | - | +| | @kbn/content-management-table-list-view, filesManagement | - | | | @kbn/core | - | | | @kbn/core | - | | | @kbn/core-lifecycle-browser-mocks, @kbn/core, @kbn/core-plugins-browser-internal | - | diff --git a/api_docs/deprecations_by_plugin.mdx b/api_docs/deprecations_by_plugin.mdx index 27c5df18820d2..75ca802622d62 100644 --- a/api_docs/deprecations_by_plugin.mdx +++ b/api_docs/deprecations_by_plugin.mdx @@ -7,7 +7,7 @@ id: kibDevDocsDeprecationsByPlugin slug: /kibana-dev-docs/api-meta/deprecated-api-list-by-plugin title: Deprecated API usage by plugin description: A list of deprecated APIs, which plugins are still referencing them, and when they need to be removed by. -date: 2024-05-06 +date: 2024-05-07 tags: ['contributor', 'dev', 'apidocs', 'kibana'] --- @@ -498,7 +498,6 @@ tags: ['contributor', 'dev', 'apidocs', 'kibana'] | Deprecated API | Reference location(s) | Remove By | | ---------------|-----------|-----------| | | [overview_tab.tsx](https://github.com/elastic/kibana/tree/main/x-pack/plugins/cloud_security_posture/public/pages/configurations/findings_flyout/overview_tab.tsx#:~:text=indexPatternId) | - | -| | [take_action.tsx](https://github.com/elastic/kibana/tree/main/x-pack/plugins/cloud_security_posture/public/components/take_action.tsx#:~:text=toMountPoint), [take_action.tsx](https://github.com/elastic/kibana/tree/main/x-pack/plugins/cloud_security_posture/public/components/take_action.tsx#:~:text=toMountPoint), [take_action.tsx](https://github.com/elastic/kibana/tree/main/x-pack/plugins/cloud_security_posture/public/components/take_action.tsx#:~:text=toMountPoint), [take_action.tsx](https://github.com/elastic/kibana/tree/main/x-pack/plugins/cloud_security_posture/public/components/take_action.tsx#:~:text=toMountPoint), [take_action.tsx](https://github.com/elastic/kibana/tree/main/x-pack/plugins/cloud_security_posture/public/components/take_action.tsx#:~:text=toMountPoint) | - | | | [csp_benchmark_rule.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/cloud_security_posture/server/saved_objects/csp_benchmark_rule.ts#:~:text=migrations) | - | | | [csp_benchmark_rule.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/cloud_security_posture/server/saved_objects/csp_benchmark_rule.ts#:~:text=schemas), [csp_settings.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/cloud_security_posture/server/saved_objects/csp_settings.ts#:~:text=schemas) | - | @@ -566,7 +565,6 @@ tags: ['contributor', 'dev', 'apidocs', 'kibana'] | Deprecated API | Reference location(s) | Remove By | | ---------------|-----------|-----------| -| | [delete_button.tsx](https://github.com/elastic/kibana/tree/main/src/plugins/data/public/search/session/sessions_mgmt/components/actions/delete_button.tsx#:~:text=toMountPoint), [delete_button.tsx](https://github.com/elastic/kibana/tree/main/src/plugins/data/public/search/session/sessions_mgmt/components/actions/delete_button.tsx#:~:text=toMountPoint), [extend_button.tsx](https://github.com/elastic/kibana/tree/main/src/plugins/data/public/search/session/sessions_mgmt/components/actions/extend_button.tsx#:~:text=toMountPoint), [extend_button.tsx](https://github.com/elastic/kibana/tree/main/src/plugins/data/public/search/session/sessions_mgmt/components/actions/extend_button.tsx#:~:text=toMountPoint), [inspect_button.tsx](https://github.com/elastic/kibana/tree/main/src/plugins/data/public/search/session/sessions_mgmt/components/actions/inspect_button.tsx#:~:text=toMountPoint), [inspect_button.tsx](https://github.com/elastic/kibana/tree/main/src/plugins/data/public/search/session/sessions_mgmt/components/actions/inspect_button.tsx#:~:text=toMountPoint), [rename_button.tsx](https://github.com/elastic/kibana/tree/main/src/plugins/data/public/search/session/sessions_mgmt/components/actions/rename_button.tsx#:~:text=toMountPoint), [rename_button.tsx](https://github.com/elastic/kibana/tree/main/src/plugins/data/public/search/session/sessions_mgmt/components/actions/rename_button.tsx#:~:text=toMountPoint), [search_interceptor.ts](https://github.com/elastic/kibana/tree/main/src/plugins/data/public/search/search_interceptor/search_interceptor.ts#:~:text=toMountPoint), [search_interceptor.ts](https://github.com/elastic/kibana/tree/main/src/plugins/data/public/search/search_interceptor/search_interceptor.ts#:~:text=toMountPoint)+ 2 more | - | | | [session_service.ts](https://github.com/elastic/kibana/tree/main/src/plugins/data/server/search/session/session_service.ts#:~:text=authc) | - | | | [data_table.tsx](https://github.com/elastic/kibana/tree/main/src/plugins/data/public/utils/table_inspector_view/components/data_table.tsx#:~:text=executeTriggerActions), [data_table.tsx](https://github.com/elastic/kibana/tree/main/src/plugins/data/public/utils/table_inspector_view/components/data_table.tsx#:~:text=executeTriggerActions) | - | | | [persistable_state.ts](https://github.com/elastic/kibana/tree/main/src/plugins/data/common/query/filters/persistable_state.ts#:~:text=SavedObjectReference), [persistable_state.ts](https://github.com/elastic/kibana/tree/main/src/plugins/data/common/query/filters/persistable_state.ts#:~:text=SavedObjectReference), [persistable_state.ts](https://github.com/elastic/kibana/tree/main/src/plugins/data/common/query/filters/persistable_state.ts#:~:text=SavedObjectReference), [persistable_state.ts](https://github.com/elastic/kibana/tree/main/src/plugins/data/common/query/persistable_state.ts#:~:text=SavedObjectReference), [persistable_state.ts](https://github.com/elastic/kibana/tree/main/src/plugins/data/common/query/persistable_state.ts#:~:text=SavedObjectReference), [persistable_state.ts](https://github.com/elastic/kibana/tree/main/src/plugins/data/common/query/persistable_state.ts#:~:text=SavedObjectReference) | - | @@ -729,7 +727,6 @@ tags: ['contributor', 'dev', 'apidocs', 'kibana'] | Deprecated API | Reference location(s) | Remove By | | ---------------|-----------|-----------| -| | [mount_management_section.tsx](https://github.com/elastic/kibana/tree/main/src/plugins/files_management/public/mount_management_section.tsx#:~:text=KibanaThemeProvider), [mount_management_section.tsx](https://github.com/elastic/kibana/tree/main/src/plugins/files_management/public/mount_management_section.tsx#:~:text=KibanaThemeProvider), [mount_management_section.tsx](https://github.com/elastic/kibana/tree/main/src/plugins/files_management/public/mount_management_section.tsx#:~:text=KibanaThemeProvider) | - | | | [app.tsx](https://github.com/elastic/kibana/tree/main/src/plugins/files_management/public/app.tsx#:~:text=withoutPageTemplateWrapper) | - | @@ -1026,7 +1023,6 @@ tags: ['contributor', 'dev', 'apidocs', 'kibana'] | | [read_pack_route.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/osquery/server/routes/pack/read_pack_route.ts#:~:text=migrationVersion) | - | | | [read_pack_route.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/osquery/server/routes/pack/read_pack_route.ts#:~:text=migrationVersion), [read_pack_route.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/osquery/server/routes/pack/read_pack_route.ts#:~:text=migrationVersion), [read_pack_route.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/osquery/server/routes/pack/read_pack_route.ts#:~:text=migrationVersion), [read_pack_route.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/osquery/server/routes/pack/read_pack_route.ts#:~:text=migrationVersion) | - | | | [pack_queries_status_table.tsx](https://github.com/elastic/kibana/tree/main/x-pack/plugins/osquery/public/packs/pack_queries_status_table.tsx#:~:text=indexPatternId), [view_results_in_discover.tsx](https://github.com/elastic/kibana/tree/main/x-pack/plugins/osquery/public/discover/view_results_in_discover.tsx#:~:text=indexPatternId), [use_discover_link.tsx](https://github.com/elastic/kibana/tree/main/x-pack/plugins/osquery/public/common/hooks/use_discover_link.tsx#:~:text=indexPatternId) | - | -| | [osquery_result_wrapper.tsx](https://github.com/elastic/kibana/tree/main/x-pack/plugins/osquery/public/shared_components/osquery_results/osquery_result_wrapper.tsx#:~:text=KibanaThemeProvider), [osquery_result_wrapper.tsx](https://github.com/elastic/kibana/tree/main/x-pack/plugins/osquery/public/shared_components/osquery_results/osquery_result_wrapper.tsx#:~:text=KibanaThemeProvider), [osquery_result_wrapper.tsx](https://github.com/elastic/kibana/tree/main/x-pack/plugins/osquery/public/shared_components/osquery_results/osquery_result_wrapper.tsx#:~:text=KibanaThemeProvider), [shared_imports.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/osquery/public/shared_imports.ts#:~:text=KibanaThemeProvider), [osquery_results.tsx](https://github.com/elastic/kibana/tree/main/x-pack/plugins/osquery/public/shared_components/osquery_results/osquery_results.tsx#:~:text=KibanaThemeProvider), [osquery_results.tsx](https://github.com/elastic/kibana/tree/main/x-pack/plugins/osquery/public/shared_components/osquery_results/osquery_results.tsx#:~:text=KibanaThemeProvider), [osquery_results.tsx](https://github.com/elastic/kibana/tree/main/x-pack/plugins/osquery/public/shared_components/osquery_results/osquery_results.tsx#:~:text=KibanaThemeProvider), [services_wrapper.tsx](https://github.com/elastic/kibana/tree/main/x-pack/plugins/osquery/public/shared_components/services_wrapper.tsx#:~:text=KibanaThemeProvider), [services_wrapper.tsx](https://github.com/elastic/kibana/tree/main/x-pack/plugins/osquery/public/shared_components/services_wrapper.tsx#:~:text=KibanaThemeProvider), [services_wrapper.tsx](https://github.com/elastic/kibana/tree/main/x-pack/plugins/osquery/public/shared_components/services_wrapper.tsx#:~:text=KibanaThemeProvider)+ 3 more | - | | | [create_action_service.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/osquery/server/handlers/action/create_action_service.ts#:~:text=license%24) | 8.8.0 | @@ -1316,14 +1312,6 @@ migrates to using the Kibana Privilege model: https://github.com/elastic/kibana/ -## timelines - -| Deprecated API | Reference location(s) | Remove By | -| ---------------|-----------|-----------| -| | [add_to_timeline.tsx](https://github.com/elastic/kibana/tree/main/x-pack/plugins/timelines/public/components/hover_actions/actions/add_to_timeline.tsx#:~:text=toMountPoint), [add_to_timeline.tsx](https://github.com/elastic/kibana/tree/main/x-pack/plugins/timelines/public/components/hover_actions/actions/add_to_timeline.tsx#:~:text=toMountPoint) | - | - - - ## transform | Deprecated API | Reference location(s) | Remove By | diff --git a/api_docs/deprecations_by_team.mdx b/api_docs/deprecations_by_team.mdx index 45880b3aab478..42ba2230557dc 100644 --- a/api_docs/deprecations_by_team.mdx +++ b/api_docs/deprecations_by_team.mdx @@ -7,7 +7,7 @@ id: kibDevDocsDeprecationsDueByTeam slug: /kibana-dev-docs/api-meta/deprecations-due-by-team title: Deprecated APIs due to be removed, by team description: Lists the teams that are referencing deprecated APIs with a remove by date. -date: 2024-05-06 +date: 2024-05-07 tags: ['contributor', 'dev', 'apidocs', 'kibana'] --- diff --git a/api_docs/dev_tools.mdx b/api_docs/dev_tools.mdx index 70d8fec48f675..4e7b2e4e17609 100644 --- a/api_docs/dev_tools.mdx +++ b/api_docs/dev_tools.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/devTools title: "devTools" image: https://source.unsplash.com/400x175/?github description: API docs for the devTools plugin -date: 2024-05-06 +date: 2024-05-07 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 3ed163306f4d8..7084e624d8f4e 100644 --- a/api_docs/discover.mdx +++ b/api_docs/discover.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/discover title: "discover" image: https://source.unsplash.com/400x175/?github description: API docs for the discover plugin -date: 2024-05-06 +date: 2024-05-07 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 574ec86ffa16b..fa64182133a50 100644 --- a/api_docs/discover_enhanced.mdx +++ b/api_docs/discover_enhanced.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/discoverEnhanced title: "discoverEnhanced" image: https://source.unsplash.com/400x175/?github description: API docs for the discoverEnhanced plugin -date: 2024-05-06 +date: 2024-05-07 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'discoverEnhanced'] --- import discoverEnhancedObj from './discover_enhanced.devdocs.json'; diff --git a/api_docs/discover_shared.mdx b/api_docs/discover_shared.mdx index 1ebf9f0042d24..778eb248ae077 100644 --- a/api_docs/discover_shared.mdx +++ b/api_docs/discover_shared.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/discoverShared title: "discoverShared" image: https://source.unsplash.com/400x175/?github description: API docs for the discoverShared plugin -date: 2024-05-06 +date: 2024-05-07 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'discoverShared'] --- import discoverSharedObj from './discover_shared.devdocs.json'; diff --git a/api_docs/ecs_data_quality_dashboard.mdx b/api_docs/ecs_data_quality_dashboard.mdx index c5cebb79ff606..7b2bfc47994a2 100644 --- a/api_docs/ecs_data_quality_dashboard.mdx +++ b/api_docs/ecs_data_quality_dashboard.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/ecsDataQualityDashboard title: "ecsDataQualityDashboard" image: https://source.unsplash.com/400x175/?github description: API docs for the ecsDataQualityDashboard plugin -date: 2024-05-06 +date: 2024-05-07 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'ecsDataQualityDashboard'] --- import ecsDataQualityDashboardObj from './ecs_data_quality_dashboard.devdocs.json'; diff --git a/api_docs/elastic_assistant.mdx b/api_docs/elastic_assistant.mdx index b7b731a79f6bc..11443315bc7ff 100644 --- a/api_docs/elastic_assistant.mdx +++ b/api_docs/elastic_assistant.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/elasticAssistant title: "elasticAssistant" image: https://source.unsplash.com/400x175/?github description: API docs for the elasticAssistant plugin -date: 2024-05-06 +date: 2024-05-07 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'elasticAssistant'] --- import elasticAssistantObj from './elastic_assistant.devdocs.json'; diff --git a/api_docs/embeddable.mdx b/api_docs/embeddable.mdx index 3341d4cbcb067..2f80903482f49 100644 --- a/api_docs/embeddable.mdx +++ b/api_docs/embeddable.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/embeddable title: "embeddable" image: https://source.unsplash.com/400x175/?github description: API docs for the embeddable plugin -date: 2024-05-06 +date: 2024-05-07 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 da425a48825c4..b6c4a626657b0 100644 --- a/api_docs/embeddable_enhanced.mdx +++ b/api_docs/embeddable_enhanced.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/embeddableEnhanced title: "embeddableEnhanced" image: https://source.unsplash.com/400x175/?github description: API docs for the embeddableEnhanced plugin -date: 2024-05-06 +date: 2024-05-07 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 51b077a35e624..9955fccd14fff 100644 --- a/api_docs/encrypted_saved_objects.mdx +++ b/api_docs/encrypted_saved_objects.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/encryptedSavedObjects title: "encryptedSavedObjects" image: https://source.unsplash.com/400x175/?github description: API docs for the encryptedSavedObjects plugin -date: 2024-05-06 +date: 2024-05-07 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 e166c2cd4760e..4dd9f4f3eafa5 100644 --- a/api_docs/enterprise_search.mdx +++ b/api_docs/enterprise_search.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/enterpriseSearch title: "enterpriseSearch" image: https://source.unsplash.com/400x175/?github description: API docs for the enterpriseSearch plugin -date: 2024-05-06 +date: 2024-05-07 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 499395d0a5f80..9fc31cc8dd1d5 100644 --- a/api_docs/es_ui_shared.mdx +++ b/api_docs/es_ui_shared.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/esUiShared title: "esUiShared" image: https://source.unsplash.com/400x175/?github description: API docs for the esUiShared plugin -date: 2024-05-06 +date: 2024-05-07 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 38ae9906bbfa3..7c0e973cc27a5 100644 --- a/api_docs/event_annotation.mdx +++ b/api_docs/event_annotation.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/eventAnnotation title: "eventAnnotation" image: https://source.unsplash.com/400x175/?github description: API docs for the eventAnnotation plugin -date: 2024-05-06 +date: 2024-05-07 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'eventAnnotation'] --- import eventAnnotationObj from './event_annotation.devdocs.json'; diff --git a/api_docs/event_annotation_listing.mdx b/api_docs/event_annotation_listing.mdx index 795776becbba7..ff430d7d2a99c 100644 --- a/api_docs/event_annotation_listing.mdx +++ b/api_docs/event_annotation_listing.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/eventAnnotationListing title: "eventAnnotationListing" image: https://source.unsplash.com/400x175/?github description: API docs for the eventAnnotationListing plugin -date: 2024-05-06 +date: 2024-05-07 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'eventAnnotationListing'] --- import eventAnnotationListingObj from './event_annotation_listing.devdocs.json'; diff --git a/api_docs/event_log.mdx b/api_docs/event_log.mdx index 6a3318686eb2b..7fdb95fa42cb4 100644 --- a/api_docs/event_log.mdx +++ b/api_docs/event_log.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/eventLog title: "eventLog" image: https://source.unsplash.com/400x175/?github description: API docs for the eventLog plugin -date: 2024-05-06 +date: 2024-05-07 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'eventLog'] --- import eventLogObj from './event_log.devdocs.json'; diff --git a/api_docs/exploratory_view.mdx b/api_docs/exploratory_view.mdx index 3eeab1bd6a119..06907d5023e57 100644 --- a/api_docs/exploratory_view.mdx +++ b/api_docs/exploratory_view.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/exploratoryView title: "exploratoryView" image: https://source.unsplash.com/400x175/?github description: API docs for the exploratoryView plugin -date: 2024-05-06 +date: 2024-05-07 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'exploratoryView'] --- import exploratoryViewObj from './exploratory_view.devdocs.json'; diff --git a/api_docs/expression_error.mdx b/api_docs/expression_error.mdx index 8fad6c1899f93..9caa4bc5fe4c6 100644 --- a/api_docs/expression_error.mdx +++ b/api_docs/expression_error.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/expressionError title: "expressionError" image: https://source.unsplash.com/400x175/?github description: API docs for the expressionError plugin -date: 2024-05-06 +date: 2024-05-07 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 3c8968b906c6c..36b6311ae7faa 100644 --- a/api_docs/expression_gauge.mdx +++ b/api_docs/expression_gauge.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/expressionGauge title: "expressionGauge" image: https://source.unsplash.com/400x175/?github description: API docs for the expressionGauge plugin -date: 2024-05-06 +date: 2024-05-07 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 dee5f318899c5..140f70583de20 100644 --- a/api_docs/expression_heatmap.mdx +++ b/api_docs/expression_heatmap.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/expressionHeatmap title: "expressionHeatmap" image: https://source.unsplash.com/400x175/?github description: API docs for the expressionHeatmap plugin -date: 2024-05-06 +date: 2024-05-07 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 5d9503c29f4ca..6d0463df51c2c 100644 --- a/api_docs/expression_image.mdx +++ b/api_docs/expression_image.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/expressionImage title: "expressionImage" image: https://source.unsplash.com/400x175/?github description: API docs for the expressionImage plugin -date: 2024-05-06 +date: 2024-05-07 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 7acfddbfa1d9d..4ac4755a2491e 100644 --- a/api_docs/expression_legacy_metric_vis.mdx +++ b/api_docs/expression_legacy_metric_vis.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/expressionLegacyMetricVis title: "expressionLegacyMetricVis" image: https://source.unsplash.com/400x175/?github description: API docs for the expressionLegacyMetricVis plugin -date: 2024-05-06 +date: 2024-05-07 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 7e131e0d95bef..b177ba24403a7 100644 --- a/api_docs/expression_metric.mdx +++ b/api_docs/expression_metric.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/expressionMetric title: "expressionMetric" image: https://source.unsplash.com/400x175/?github description: API docs for the expressionMetric plugin -date: 2024-05-06 +date: 2024-05-07 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 da3a895aa85fc..916b3ec32dd3a 100644 --- a/api_docs/expression_metric_vis.mdx +++ b/api_docs/expression_metric_vis.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/expressionMetricVis title: "expressionMetricVis" image: https://source.unsplash.com/400x175/?github description: API docs for the expressionMetricVis plugin -date: 2024-05-06 +date: 2024-05-07 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 ee70ec383511b..e95acec85247b 100644 --- a/api_docs/expression_partition_vis.mdx +++ b/api_docs/expression_partition_vis.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/expressionPartitionVis title: "expressionPartitionVis" image: https://source.unsplash.com/400x175/?github description: API docs for the expressionPartitionVis plugin -date: 2024-05-06 +date: 2024-05-07 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 78d2e31c20b4d..87be212eaf098 100644 --- a/api_docs/expression_repeat_image.mdx +++ b/api_docs/expression_repeat_image.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/expressionRepeatImage title: "expressionRepeatImage" image: https://source.unsplash.com/400x175/?github description: API docs for the expressionRepeatImage plugin -date: 2024-05-06 +date: 2024-05-07 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 c60b801cce605..358da93c8b325 100644 --- a/api_docs/expression_reveal_image.mdx +++ b/api_docs/expression_reveal_image.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/expressionRevealImage title: "expressionRevealImage" image: https://source.unsplash.com/400x175/?github description: API docs for the expressionRevealImage plugin -date: 2024-05-06 +date: 2024-05-07 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 a87d18068d2f4..0c877c394eb60 100644 --- a/api_docs/expression_shape.mdx +++ b/api_docs/expression_shape.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/expressionShape title: "expressionShape" image: https://source.unsplash.com/400x175/?github description: API docs for the expressionShape plugin -date: 2024-05-06 +date: 2024-05-07 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 1750cd4bdb8f6..82823542a32bc 100644 --- a/api_docs/expression_tagcloud.mdx +++ b/api_docs/expression_tagcloud.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/expressionTagcloud title: "expressionTagcloud" image: https://source.unsplash.com/400x175/?github description: API docs for the expressionTagcloud plugin -date: 2024-05-06 +date: 2024-05-07 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 b3713d1daf0a6..0f2758ff69406 100644 --- a/api_docs/expression_x_y.mdx +++ b/api_docs/expression_x_y.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/expressionXY title: "expressionXY" image: https://source.unsplash.com/400x175/?github description: API docs for the expressionXY plugin -date: 2024-05-06 +date: 2024-05-07 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 eb6779c5d6d10..b1fd799c327e2 100644 --- a/api_docs/expressions.mdx +++ b/api_docs/expressions.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/expressions title: "expressions" image: https://source.unsplash.com/400x175/?github description: API docs for the expressions plugin -date: 2024-05-06 +date: 2024-05-07 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 d39de9e24ca0f..904389d85b6a9 100644 --- a/api_docs/features.mdx +++ b/api_docs/features.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/features title: "features" image: https://source.unsplash.com/400x175/?github description: API docs for the features plugin -date: 2024-05-06 +date: 2024-05-07 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 d391a443c8239..20886b7bda8d8 100644 --- a/api_docs/field_formats.mdx +++ b/api_docs/field_formats.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/fieldFormats title: "fieldFormats" image: https://source.unsplash.com/400x175/?github description: API docs for the fieldFormats plugin -date: 2024-05-06 +date: 2024-05-07 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 f6d4decc4253f..b8da4309bd71c 100644 --- a/api_docs/file_upload.mdx +++ b/api_docs/file_upload.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/fileUpload title: "fileUpload" image: https://source.unsplash.com/400x175/?github description: API docs for the fileUpload plugin -date: 2024-05-06 +date: 2024-05-07 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 c4c663ceb012a..54cc3e0acbfb9 100644 --- a/api_docs/files.mdx +++ b/api_docs/files.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/files title: "files" image: https://source.unsplash.com/400x175/?github description: API docs for the files plugin -date: 2024-05-06 +date: 2024-05-07 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'files'] --- import filesObj from './files.devdocs.json'; diff --git a/api_docs/files_management.mdx b/api_docs/files_management.mdx index 41878c8cdd293..658c969a85975 100644 --- a/api_docs/files_management.mdx +++ b/api_docs/files_management.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/filesManagement title: "filesManagement" image: https://source.unsplash.com/400x175/?github description: API docs for the filesManagement plugin -date: 2024-05-06 +date: 2024-05-07 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'filesManagement'] --- import filesManagementObj from './files_management.devdocs.json'; diff --git a/api_docs/fleet.mdx b/api_docs/fleet.mdx index 17c7135fc4aad..565976b07e9ce 100644 --- a/api_docs/fleet.mdx +++ b/api_docs/fleet.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/fleet title: "fleet" image: https://source.unsplash.com/400x175/?github description: API docs for the fleet plugin -date: 2024-05-06 +date: 2024-05-07 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 7f45d347348b5..04072d42c72a5 100644 --- a/api_docs/global_search.mdx +++ b/api_docs/global_search.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/globalSearch title: "globalSearch" image: https://source.unsplash.com/400x175/?github description: API docs for the globalSearch plugin -date: 2024-05-06 +date: 2024-05-07 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 e481317b42753..a2b022670178b 100644 --- a/api_docs/guided_onboarding.mdx +++ b/api_docs/guided_onboarding.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/guidedOnboarding title: "guidedOnboarding" image: https://source.unsplash.com/400x175/?github description: API docs for the guidedOnboarding plugin -date: 2024-05-06 +date: 2024-05-07 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 9848246ec3030..3e534604dc13e 100644 --- a/api_docs/home.mdx +++ b/api_docs/home.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/home title: "home" image: https://source.unsplash.com/400x175/?github description: API docs for the home plugin -date: 2024-05-06 +date: 2024-05-07 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'home'] --- import homeObj from './home.devdocs.json'; diff --git a/api_docs/image_embeddable.mdx b/api_docs/image_embeddable.mdx index 470efd0812c03..9df973212a34b 100644 --- a/api_docs/image_embeddable.mdx +++ b/api_docs/image_embeddable.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/imageEmbeddable title: "imageEmbeddable" image: https://source.unsplash.com/400x175/?github description: API docs for the imageEmbeddable plugin -date: 2024-05-06 +date: 2024-05-07 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'imageEmbeddable'] --- import imageEmbeddableObj from './image_embeddable.devdocs.json'; diff --git a/api_docs/index_lifecycle_management.mdx b/api_docs/index_lifecycle_management.mdx index e3f14ee9e0660..9208878c79c7b 100644 --- a/api_docs/index_lifecycle_management.mdx +++ b/api_docs/index_lifecycle_management.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/indexLifecycleManagement title: "indexLifecycleManagement" image: https://source.unsplash.com/400x175/?github description: API docs for the indexLifecycleManagement plugin -date: 2024-05-06 +date: 2024-05-07 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 ee494624f0757..ef7b6a3d6f684 100644 --- a/api_docs/index_management.mdx +++ b/api_docs/index_management.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/indexManagement title: "indexManagement" image: https://source.unsplash.com/400x175/?github description: API docs for the indexManagement plugin -date: 2024-05-06 +date: 2024-05-07 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 d858892f9033f..142d9f70eb126 100644 --- a/api_docs/infra.mdx +++ b/api_docs/infra.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/infra title: "infra" image: https://source.unsplash.com/400x175/?github description: API docs for the infra plugin -date: 2024-05-06 +date: 2024-05-07 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'infra'] --- import infraObj from './infra.devdocs.json'; diff --git a/api_docs/ingest_pipelines.mdx b/api_docs/ingest_pipelines.mdx index 37ee393ee2f8f..bb6edb2dbbc68 100644 --- a/api_docs/ingest_pipelines.mdx +++ b/api_docs/ingest_pipelines.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/ingestPipelines title: "ingestPipelines" image: https://source.unsplash.com/400x175/?github description: API docs for the ingestPipelines plugin -date: 2024-05-06 +date: 2024-05-07 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'ingestPipelines'] --- import ingestPipelinesObj from './ingest_pipelines.devdocs.json'; diff --git a/api_docs/inspector.mdx b/api_docs/inspector.mdx index 1b976ae1b0e81..81ee2077a0ff6 100644 --- a/api_docs/inspector.mdx +++ b/api_docs/inspector.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/inspector title: "inspector" image: https://source.unsplash.com/400x175/?github description: API docs for the inspector plugin -date: 2024-05-06 +date: 2024-05-07 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 8729d7559fa72..21c050cca81a2 100644 --- a/api_docs/interactive_setup.mdx +++ b/api_docs/interactive_setup.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/interactiveSetup title: "interactiveSetup" image: https://source.unsplash.com/400x175/?github description: API docs for the interactiveSetup plugin -date: 2024-05-06 +date: 2024-05-07 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 d893c481508a4..27e5a41474beb 100644 --- a/api_docs/kbn_ace.mdx +++ b/api_docs/kbn_ace.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-ace title: "@kbn/ace" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/ace plugin -date: 2024-05-06 +date: 2024-05-07 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/ace'] --- import kbnAceObj from './kbn_ace.devdocs.json'; diff --git a/api_docs/kbn_actions_types.mdx b/api_docs/kbn_actions_types.mdx index 2757c4931f8bc..f52be74d588e2 100644 --- a/api_docs/kbn_actions_types.mdx +++ b/api_docs/kbn_actions_types.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-actions-types title: "@kbn/actions-types" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/actions-types plugin -date: 2024-05-06 +date: 2024-05-07 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/actions-types'] --- import kbnActionsTypesObj from './kbn_actions_types.devdocs.json'; diff --git a/api_docs/kbn_aiops_components.mdx b/api_docs/kbn_aiops_components.mdx index 589e2f702c117..355562e336752 100644 --- a/api_docs/kbn_aiops_components.mdx +++ b/api_docs/kbn_aiops_components.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-aiops-components title: "@kbn/aiops-components" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/aiops-components plugin -date: 2024-05-06 +date: 2024-05-07 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/aiops-components'] --- import kbnAiopsComponentsObj from './kbn_aiops_components.devdocs.json'; diff --git a/api_docs/kbn_aiops_log_pattern_analysis.mdx b/api_docs/kbn_aiops_log_pattern_analysis.mdx index 051536dd66167..638072377c243 100644 --- a/api_docs/kbn_aiops_log_pattern_analysis.mdx +++ b/api_docs/kbn_aiops_log_pattern_analysis.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-aiops-log-pattern-analysis title: "@kbn/aiops-log-pattern-analysis" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/aiops-log-pattern-analysis plugin -date: 2024-05-06 +date: 2024-05-07 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/aiops-log-pattern-analysis'] --- import kbnAiopsLogPatternAnalysisObj from './kbn_aiops_log_pattern_analysis.devdocs.json'; diff --git a/api_docs/kbn_aiops_log_rate_analysis.mdx b/api_docs/kbn_aiops_log_rate_analysis.mdx index d1941f9637db7..bd8739ec02409 100644 --- a/api_docs/kbn_aiops_log_rate_analysis.mdx +++ b/api_docs/kbn_aiops_log_rate_analysis.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-aiops-log-rate-analysis title: "@kbn/aiops-log-rate-analysis" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/aiops-log-rate-analysis plugin -date: 2024-05-06 +date: 2024-05-07 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/aiops-log-rate-analysis'] --- import kbnAiopsLogRateAnalysisObj from './kbn_aiops_log_rate_analysis.devdocs.json'; diff --git a/api_docs/kbn_alerting_api_integration_helpers.mdx b/api_docs/kbn_alerting_api_integration_helpers.mdx index 8762f3ee24736..97e2b2204f3e9 100644 --- a/api_docs/kbn_alerting_api_integration_helpers.mdx +++ b/api_docs/kbn_alerting_api_integration_helpers.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-alerting-api-integration-helpers title: "@kbn/alerting-api-integration-helpers" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/alerting-api-integration-helpers plugin -date: 2024-05-06 +date: 2024-05-07 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/alerting-api-integration-helpers'] --- import kbnAlertingApiIntegrationHelpersObj from './kbn_alerting_api_integration_helpers.devdocs.json'; diff --git a/api_docs/kbn_alerting_state_types.mdx b/api_docs/kbn_alerting_state_types.mdx index 3312c155a68bc..047c8d5400c71 100644 --- a/api_docs/kbn_alerting_state_types.mdx +++ b/api_docs/kbn_alerting_state_types.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-alerting-state-types title: "@kbn/alerting-state-types" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/alerting-state-types plugin -date: 2024-05-06 +date: 2024-05-07 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/alerting-state-types'] --- import kbnAlertingStateTypesObj from './kbn_alerting_state_types.devdocs.json'; diff --git a/api_docs/kbn_alerting_types.mdx b/api_docs/kbn_alerting_types.mdx index 1ccb81c3e7eb6..58c544500ea2d 100644 --- a/api_docs/kbn_alerting_types.mdx +++ b/api_docs/kbn_alerting_types.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-alerting-types title: "@kbn/alerting-types" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/alerting-types plugin -date: 2024-05-06 +date: 2024-05-07 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/alerting-types'] --- import kbnAlertingTypesObj from './kbn_alerting_types.devdocs.json'; diff --git a/api_docs/kbn_alerts_as_data_utils.mdx b/api_docs/kbn_alerts_as_data_utils.mdx index be184f83ddaf3..1c430d15fd5f2 100644 --- a/api_docs/kbn_alerts_as_data_utils.mdx +++ b/api_docs/kbn_alerts_as_data_utils.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-alerts-as-data-utils title: "@kbn/alerts-as-data-utils" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/alerts-as-data-utils plugin -date: 2024-05-06 +date: 2024-05-07 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/alerts-as-data-utils'] --- import kbnAlertsAsDataUtilsObj from './kbn_alerts_as_data_utils.devdocs.json'; diff --git a/api_docs/kbn_alerts_ui_shared.mdx b/api_docs/kbn_alerts_ui_shared.mdx index acb84b4355cc6..9c57fb0c42a21 100644 --- a/api_docs/kbn_alerts_ui_shared.mdx +++ b/api_docs/kbn_alerts_ui_shared.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-alerts-ui-shared title: "@kbn/alerts-ui-shared" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/alerts-ui-shared plugin -date: 2024-05-06 +date: 2024-05-07 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/alerts-ui-shared'] --- import kbnAlertsUiSharedObj from './kbn_alerts_ui_shared.devdocs.json'; diff --git a/api_docs/kbn_analytics.mdx b/api_docs/kbn_analytics.mdx index e7abeb156a96d..22ea159ed7ca6 100644 --- a/api_docs/kbn_analytics.mdx +++ b/api_docs/kbn_analytics.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-analytics title: "@kbn/analytics" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/analytics plugin -date: 2024-05-06 +date: 2024-05-07 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 02fa34ce165a4..8f21b60642264 100644 --- a/api_docs/kbn_analytics_client.mdx +++ b/api_docs/kbn_analytics_client.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-analytics-client title: "@kbn/analytics-client" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/analytics-client plugin -date: 2024-05-06 +date: 2024-05-07 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/analytics-client'] --- import kbnAnalyticsClientObj from './kbn_analytics_client.devdocs.json'; diff --git a/api_docs/kbn_analytics_collection_utils.mdx b/api_docs/kbn_analytics_collection_utils.mdx index fd9c2319bd577..04e2782354ab5 100644 --- a/api_docs/kbn_analytics_collection_utils.mdx +++ b/api_docs/kbn_analytics_collection_utils.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-analytics-collection-utils title: "@kbn/analytics-collection-utils" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/analytics-collection-utils plugin -date: 2024-05-06 +date: 2024-05-07 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/analytics-collection-utils'] --- import kbnAnalyticsCollectionUtilsObj from './kbn_analytics_collection_utils.devdocs.json'; diff --git a/api_docs/kbn_analytics_shippers_elastic_v3_browser.mdx b/api_docs/kbn_analytics_shippers_elastic_v3_browser.mdx index 0e0c8ef36becb..739d8d3b105cf 100644 --- a/api_docs/kbn_analytics_shippers_elastic_v3_browser.mdx +++ b/api_docs/kbn_analytics_shippers_elastic_v3_browser.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-analytics-shippers-elastic-v3-browser title: "@kbn/analytics-shippers-elastic-v3-browser" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/analytics-shippers-elastic-v3-browser plugin -date: 2024-05-06 +date: 2024-05-07 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 18d59b670641c..7011c16301bf3 100644 --- a/api_docs/kbn_analytics_shippers_elastic_v3_common.mdx +++ b/api_docs/kbn_analytics_shippers_elastic_v3_common.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-analytics-shippers-elastic-v3-common title: "@kbn/analytics-shippers-elastic-v3-common" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/analytics-shippers-elastic-v3-common plugin -date: 2024-05-06 +date: 2024-05-07 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 9bd18a3d9abec..f673a97ae8549 100644 --- a/api_docs/kbn_analytics_shippers_elastic_v3_server.mdx +++ b/api_docs/kbn_analytics_shippers_elastic_v3_server.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-analytics-shippers-elastic-v3-server title: "@kbn/analytics-shippers-elastic-v3-server" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/analytics-shippers-elastic-v3-server plugin -date: 2024-05-06 +date: 2024-05-07 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 c15b7c7ef5b7d..97c1f3ab1b5ee 100644 --- a/api_docs/kbn_analytics_shippers_fullstory.mdx +++ b/api_docs/kbn_analytics_shippers_fullstory.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-analytics-shippers-fullstory title: "@kbn/analytics-shippers-fullstory" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/analytics-shippers-fullstory plugin -date: 2024-05-06 +date: 2024-05-07 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 09638a5f6b74b..504b2462befc6 100644 --- a/api_docs/kbn_apm_config_loader.mdx +++ b/api_docs/kbn_apm_config_loader.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-apm-config-loader title: "@kbn/apm-config-loader" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/apm-config-loader plugin -date: 2024-05-06 +date: 2024-05-07 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/apm-config-loader'] --- import kbnApmConfigLoaderObj from './kbn_apm_config_loader.devdocs.json'; diff --git a/api_docs/kbn_apm_data_view.mdx b/api_docs/kbn_apm_data_view.mdx index 6540dbab69c59..6d98bf6a2a14e 100644 --- a/api_docs/kbn_apm_data_view.mdx +++ b/api_docs/kbn_apm_data_view.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-apm-data-view title: "@kbn/apm-data-view" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/apm-data-view plugin -date: 2024-05-06 +date: 2024-05-07 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/apm-data-view'] --- import kbnApmDataViewObj from './kbn_apm_data_view.devdocs.json'; diff --git a/api_docs/kbn_apm_synthtrace.mdx b/api_docs/kbn_apm_synthtrace.mdx index f6b92ad91107b..05418059279f8 100644 --- a/api_docs/kbn_apm_synthtrace.mdx +++ b/api_docs/kbn_apm_synthtrace.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-apm-synthtrace title: "@kbn/apm-synthtrace" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/apm-synthtrace plugin -date: 2024-05-06 +date: 2024-05-07 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/apm-synthtrace'] --- import kbnApmSynthtraceObj from './kbn_apm_synthtrace.devdocs.json'; diff --git a/api_docs/kbn_apm_synthtrace_client.mdx b/api_docs/kbn_apm_synthtrace_client.mdx index bfbcb567342b0..caa4cd14b39f7 100644 --- a/api_docs/kbn_apm_synthtrace_client.mdx +++ b/api_docs/kbn_apm_synthtrace_client.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-apm-synthtrace-client title: "@kbn/apm-synthtrace-client" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/apm-synthtrace-client plugin -date: 2024-05-06 +date: 2024-05-07 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/apm-synthtrace-client'] --- import kbnApmSynthtraceClientObj from './kbn_apm_synthtrace_client.devdocs.json'; diff --git a/api_docs/kbn_apm_utils.mdx b/api_docs/kbn_apm_utils.mdx index 657a310a53098..c8e47128ef8a6 100644 --- a/api_docs/kbn_apm_utils.mdx +++ b/api_docs/kbn_apm_utils.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-apm-utils title: "@kbn/apm-utils" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/apm-utils plugin -date: 2024-05-06 +date: 2024-05-07 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 e4524f172df03..45871652bfa04 100644 --- a/api_docs/kbn_axe_config.mdx +++ b/api_docs/kbn_axe_config.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-axe-config title: "@kbn/axe-config" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/axe-config plugin -date: 2024-05-06 +date: 2024-05-07 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/axe-config'] --- import kbnAxeConfigObj from './kbn_axe_config.devdocs.json'; diff --git a/api_docs/kbn_bfetch_error.mdx b/api_docs/kbn_bfetch_error.mdx index 36099e3986fb7..649620f5135e4 100644 --- a/api_docs/kbn_bfetch_error.mdx +++ b/api_docs/kbn_bfetch_error.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-bfetch-error title: "@kbn/bfetch-error" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/bfetch-error plugin -date: 2024-05-06 +date: 2024-05-07 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/bfetch-error'] --- import kbnBfetchErrorObj from './kbn_bfetch_error.devdocs.json'; diff --git a/api_docs/kbn_calculate_auto.mdx b/api_docs/kbn_calculate_auto.mdx index c98158a697585..1dea9352f47f2 100644 --- a/api_docs/kbn_calculate_auto.mdx +++ b/api_docs/kbn_calculate_auto.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-calculate-auto title: "@kbn/calculate-auto" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/calculate-auto plugin -date: 2024-05-06 +date: 2024-05-07 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/calculate-auto'] --- import kbnCalculateAutoObj from './kbn_calculate_auto.devdocs.json'; diff --git a/api_docs/kbn_calculate_width_from_char_count.mdx b/api_docs/kbn_calculate_width_from_char_count.mdx index 8dbddc0741730..fa2439bbaea1f 100644 --- a/api_docs/kbn_calculate_width_from_char_count.mdx +++ b/api_docs/kbn_calculate_width_from_char_count.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-calculate-width-from-char-count title: "@kbn/calculate-width-from-char-count" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/calculate-width-from-char-count plugin -date: 2024-05-06 +date: 2024-05-07 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/calculate-width-from-char-count'] --- import kbnCalculateWidthFromCharCountObj from './kbn_calculate_width_from_char_count.devdocs.json'; diff --git a/api_docs/kbn_cases_components.mdx b/api_docs/kbn_cases_components.mdx index e994af75fb2f4..c4b952f504d18 100644 --- a/api_docs/kbn_cases_components.mdx +++ b/api_docs/kbn_cases_components.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-cases-components title: "@kbn/cases-components" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/cases-components plugin -date: 2024-05-06 +date: 2024-05-07 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/cases-components'] --- import kbnCasesComponentsObj from './kbn_cases_components.devdocs.json'; diff --git a/api_docs/kbn_cell_actions.mdx b/api_docs/kbn_cell_actions.mdx index f18bec1cf3968..b62a4b7330e49 100644 --- a/api_docs/kbn_cell_actions.mdx +++ b/api_docs/kbn_cell_actions.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-cell-actions title: "@kbn/cell-actions" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/cell-actions plugin -date: 2024-05-06 +date: 2024-05-07 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/cell-actions'] --- import kbnCellActionsObj from './kbn_cell_actions.devdocs.json'; diff --git a/api_docs/kbn_chart_expressions_common.mdx b/api_docs/kbn_chart_expressions_common.mdx index d37c702da68b2..d60b559f97ba1 100644 --- a/api_docs/kbn_chart_expressions_common.mdx +++ b/api_docs/kbn_chart_expressions_common.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-chart-expressions-common title: "@kbn/chart-expressions-common" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/chart-expressions-common plugin -date: 2024-05-06 +date: 2024-05-07 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/chart-expressions-common'] --- import kbnChartExpressionsCommonObj from './kbn_chart_expressions_common.devdocs.json'; diff --git a/api_docs/kbn_chart_icons.mdx b/api_docs/kbn_chart_icons.mdx index c4ecf87c8763b..45c8c62ff2e12 100644 --- a/api_docs/kbn_chart_icons.mdx +++ b/api_docs/kbn_chart_icons.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-chart-icons title: "@kbn/chart-icons" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/chart-icons plugin -date: 2024-05-06 +date: 2024-05-07 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 68075f8d06843..b828230139dbc 100644 --- a/api_docs/kbn_ci_stats_core.mdx +++ b/api_docs/kbn_ci_stats_core.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-ci-stats-core title: "@kbn/ci-stats-core" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/ci-stats-core plugin -date: 2024-05-06 +date: 2024-05-07 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 4a8eca2d9af65..f5184158b6b56 100644 --- a/api_docs/kbn_ci_stats_performance_metrics.mdx +++ b/api_docs/kbn_ci_stats_performance_metrics.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-ci-stats-performance-metrics title: "@kbn/ci-stats-performance-metrics" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/ci-stats-performance-metrics plugin -date: 2024-05-06 +date: 2024-05-07 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 2e359484dcc0d..47c0e9853fb05 100644 --- a/api_docs/kbn_ci_stats_reporter.mdx +++ b/api_docs/kbn_ci_stats_reporter.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-ci-stats-reporter title: "@kbn/ci-stats-reporter" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/ci-stats-reporter plugin -date: 2024-05-06 +date: 2024-05-07 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 1a73689359748..81c59c1d8658e 100644 --- a/api_docs/kbn_cli_dev_mode.mdx +++ b/api_docs/kbn_cli_dev_mode.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-cli-dev-mode title: "@kbn/cli-dev-mode" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/cli-dev-mode plugin -date: 2024-05-06 +date: 2024-05-07 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/cli-dev-mode'] --- import kbnCliDevModeObj from './kbn_cli_dev_mode.devdocs.json'; diff --git a/api_docs/kbn_code_editor.mdx b/api_docs/kbn_code_editor.mdx index 7031acdf265e3..78cbf871b1dc1 100644 --- a/api_docs/kbn_code_editor.mdx +++ b/api_docs/kbn_code_editor.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-code-editor title: "@kbn/code-editor" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/code-editor plugin -date: 2024-05-06 +date: 2024-05-07 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/code-editor'] --- import kbnCodeEditorObj from './kbn_code_editor.devdocs.json'; diff --git a/api_docs/kbn_code_editor_mock.mdx b/api_docs/kbn_code_editor_mock.mdx index cb3a3a75d675f..82ce6d2ce0201 100644 --- a/api_docs/kbn_code_editor_mock.mdx +++ b/api_docs/kbn_code_editor_mock.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-code-editor-mock title: "@kbn/code-editor-mock" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/code-editor-mock plugin -date: 2024-05-06 +date: 2024-05-07 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/code-editor-mock'] --- import kbnCodeEditorMockObj from './kbn_code_editor_mock.devdocs.json'; diff --git a/api_docs/kbn_code_owners.mdx b/api_docs/kbn_code_owners.mdx index da05dea343893..08d5b567e91b0 100644 --- a/api_docs/kbn_code_owners.mdx +++ b/api_docs/kbn_code_owners.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-code-owners title: "@kbn/code-owners" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/code-owners plugin -date: 2024-05-06 +date: 2024-05-07 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/code-owners'] --- import kbnCodeOwnersObj from './kbn_code_owners.devdocs.json'; diff --git a/api_docs/kbn_coloring.mdx b/api_docs/kbn_coloring.mdx index e6dc15dbc8453..5ed2f613a869e 100644 --- a/api_docs/kbn_coloring.mdx +++ b/api_docs/kbn_coloring.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-coloring title: "@kbn/coloring" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/coloring plugin -date: 2024-05-06 +date: 2024-05-07 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 2ebb2d897eeaf..afaf3fbe4fdb0 100644 --- a/api_docs/kbn_config.mdx +++ b/api_docs/kbn_config.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-config title: "@kbn/config" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/config plugin -date: 2024-05-06 +date: 2024-05-07 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 7a14311fe30e0..007540d8b986f 100644 --- a/api_docs/kbn_config_mocks.mdx +++ b/api_docs/kbn_config_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-config-mocks title: "@kbn/config-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/config-mocks plugin -date: 2024-05-06 +date: 2024-05-07 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 0fc39d33b308a..bbbe36d4bd85f 100644 --- a/api_docs/kbn_config_schema.mdx +++ b/api_docs/kbn_config_schema.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-config-schema title: "@kbn/config-schema" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/config-schema plugin -date: 2024-05-06 +date: 2024-05-07 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/config-schema'] --- import kbnConfigSchemaObj from './kbn_config_schema.devdocs.json'; diff --git a/api_docs/kbn_content_management_content_editor.mdx b/api_docs/kbn_content_management_content_editor.mdx index a8a8ebd43f2e9..b9e0d2959be5f 100644 --- a/api_docs/kbn_content_management_content_editor.mdx +++ b/api_docs/kbn_content_management_content_editor.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-content-management-content-editor title: "@kbn/content-management-content-editor" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/content-management-content-editor plugin -date: 2024-05-06 +date: 2024-05-07 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/content-management-content-editor'] --- import kbnContentManagementContentEditorObj from './kbn_content_management_content_editor.devdocs.json'; diff --git a/api_docs/kbn_content_management_tabbed_table_list_view.mdx b/api_docs/kbn_content_management_tabbed_table_list_view.mdx index 9edbb1bcc79e9..bdda37790a9fb 100644 --- a/api_docs/kbn_content_management_tabbed_table_list_view.mdx +++ b/api_docs/kbn_content_management_tabbed_table_list_view.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-content-management-tabbed-table-list-view title: "@kbn/content-management-tabbed-table-list-view" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/content-management-tabbed-table-list-view plugin -date: 2024-05-06 +date: 2024-05-07 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/content-management-tabbed-table-list-view'] --- import kbnContentManagementTabbedTableListViewObj from './kbn_content_management_tabbed_table_list_view.devdocs.json'; diff --git a/api_docs/kbn_content_management_table_list_view.mdx b/api_docs/kbn_content_management_table_list_view.mdx index c4e702effe2ed..f1fb4af0a9b37 100644 --- a/api_docs/kbn_content_management_table_list_view.mdx +++ b/api_docs/kbn_content_management_table_list_view.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-content-management-table-list-view title: "@kbn/content-management-table-list-view" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/content-management-table-list-view plugin -date: 2024-05-06 +date: 2024-05-07 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/content-management-table-list-view'] --- import kbnContentManagementTableListViewObj from './kbn_content_management_table_list_view.devdocs.json'; diff --git a/api_docs/kbn_content_management_table_list_view_common.mdx b/api_docs/kbn_content_management_table_list_view_common.mdx index c7f2d0b14bf3b..198f3a0728826 100644 --- a/api_docs/kbn_content_management_table_list_view_common.mdx +++ b/api_docs/kbn_content_management_table_list_view_common.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-content-management-table-list-view-common title: "@kbn/content-management-table-list-view-common" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/content-management-table-list-view-common plugin -date: 2024-05-06 +date: 2024-05-07 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/content-management-table-list-view-common'] --- import kbnContentManagementTableListViewCommonObj from './kbn_content_management_table_list_view_common.devdocs.json'; diff --git a/api_docs/kbn_content_management_table_list_view_table.mdx b/api_docs/kbn_content_management_table_list_view_table.mdx index 304e2ebc2be29..7d9e734fb0c6f 100644 --- a/api_docs/kbn_content_management_table_list_view_table.mdx +++ b/api_docs/kbn_content_management_table_list_view_table.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-content-management-table-list-view-table title: "@kbn/content-management-table-list-view-table" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/content-management-table-list-view-table plugin -date: 2024-05-06 +date: 2024-05-07 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/content-management-table-list-view-table'] --- import kbnContentManagementTableListViewTableObj from './kbn_content_management_table_list_view_table.devdocs.json'; diff --git a/api_docs/kbn_content_management_utils.mdx b/api_docs/kbn_content_management_utils.mdx index d527c61de76fa..67fcab0f2fb1b 100644 --- a/api_docs/kbn_content_management_utils.mdx +++ b/api_docs/kbn_content_management_utils.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-content-management-utils title: "@kbn/content-management-utils" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/content-management-utils plugin -date: 2024-05-06 +date: 2024-05-07 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/content-management-utils'] --- import kbnContentManagementUtilsObj from './kbn_content_management_utils.devdocs.json'; diff --git a/api_docs/kbn_core_analytics_browser.mdx b/api_docs/kbn_core_analytics_browser.mdx index 06529e168fde7..390b3613c52ad 100644 --- a/api_docs/kbn_core_analytics_browser.mdx +++ b/api_docs/kbn_core_analytics_browser.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-analytics-browser title: "@kbn/core-analytics-browser" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-analytics-browser plugin -date: 2024-05-06 +date: 2024-05-07 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 38252235b09c1..516e770be8644 100644 --- a/api_docs/kbn_core_analytics_browser_internal.mdx +++ b/api_docs/kbn_core_analytics_browser_internal.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-analytics-browser-internal title: "@kbn/core-analytics-browser-internal" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-analytics-browser-internal plugin -date: 2024-05-06 +date: 2024-05-07 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 35cdeca0a43f0..1039ca58feeb7 100644 --- a/api_docs/kbn_core_analytics_browser_mocks.mdx +++ b/api_docs/kbn_core_analytics_browser_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-analytics-browser-mocks title: "@kbn/core-analytics-browser-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-analytics-browser-mocks plugin -date: 2024-05-06 +date: 2024-05-07 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 361ff3ce6ad42..09efab12cb2d2 100644 --- a/api_docs/kbn_core_analytics_server.mdx +++ b/api_docs/kbn_core_analytics_server.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-analytics-server title: "@kbn/core-analytics-server" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-analytics-server plugin -date: 2024-05-06 +date: 2024-05-07 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 a95e15382c2e4..b94cd5f3f8e0a 100644 --- a/api_docs/kbn_core_analytics_server_internal.mdx +++ b/api_docs/kbn_core_analytics_server_internal.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-analytics-server-internal title: "@kbn/core-analytics-server-internal" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-analytics-server-internal plugin -date: 2024-05-06 +date: 2024-05-07 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 6bd8c64715367..0556a7e806da7 100644 --- a/api_docs/kbn_core_analytics_server_mocks.mdx +++ b/api_docs/kbn_core_analytics_server_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-analytics-server-mocks title: "@kbn/core-analytics-server-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-analytics-server-mocks plugin -date: 2024-05-06 +date: 2024-05-07 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 0ad672567dadd..a5a3cf6e6f04f 100644 --- a/api_docs/kbn_core_application_browser.mdx +++ b/api_docs/kbn_core_application_browser.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-application-browser title: "@kbn/core-application-browser" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-application-browser plugin -date: 2024-05-06 +date: 2024-05-07 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 a03f34a6daba3..ef0675c702f15 100644 --- a/api_docs/kbn_core_application_browser_internal.mdx +++ b/api_docs/kbn_core_application_browser_internal.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-application-browser-internal title: "@kbn/core-application-browser-internal" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-application-browser-internal plugin -date: 2024-05-06 +date: 2024-05-07 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 94d1c4c5893a2..545c07055a738 100644 --- a/api_docs/kbn_core_application_browser_mocks.mdx +++ b/api_docs/kbn_core_application_browser_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-application-browser-mocks title: "@kbn/core-application-browser-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-application-browser-mocks plugin -date: 2024-05-06 +date: 2024-05-07 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 bdc261c3715f7..d1116c9a45086 100644 --- a/api_docs/kbn_core_application_common.mdx +++ b/api_docs/kbn_core_application_common.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-application-common title: "@kbn/core-application-common" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-application-common plugin -date: 2024-05-06 +date: 2024-05-07 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 532d09c5de9d0..f269be4656e37 100644 --- a/api_docs/kbn_core_apps_browser_internal.mdx +++ b/api_docs/kbn_core_apps_browser_internal.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-apps-browser-internal title: "@kbn/core-apps-browser-internal" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-apps-browser-internal plugin -date: 2024-05-06 +date: 2024-05-07 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 6e6bd57d09d2a..851911b746ad5 100644 --- a/api_docs/kbn_core_apps_browser_mocks.mdx +++ b/api_docs/kbn_core_apps_browser_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-apps-browser-mocks title: "@kbn/core-apps-browser-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-apps-browser-mocks plugin -date: 2024-05-06 +date: 2024-05-07 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-apps-browser-mocks'] --- import kbnCoreAppsBrowserMocksObj from './kbn_core_apps_browser_mocks.devdocs.json'; diff --git a/api_docs/kbn_core_apps_server_internal.mdx b/api_docs/kbn_core_apps_server_internal.mdx index a41bafe2cbfa8..d9c3e43ae9058 100644 --- a/api_docs/kbn_core_apps_server_internal.mdx +++ b/api_docs/kbn_core_apps_server_internal.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-apps-server-internal title: "@kbn/core-apps-server-internal" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-apps-server-internal plugin -date: 2024-05-06 +date: 2024-05-07 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-apps-server-internal'] --- import kbnCoreAppsServerInternalObj from './kbn_core_apps_server_internal.devdocs.json'; diff --git a/api_docs/kbn_core_base_browser_mocks.mdx b/api_docs/kbn_core_base_browser_mocks.mdx index 6fd71fa75f235..66406ea34f7f0 100644 --- a/api_docs/kbn_core_base_browser_mocks.mdx +++ b/api_docs/kbn_core_base_browser_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-base-browser-mocks title: "@kbn/core-base-browser-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-base-browser-mocks plugin -date: 2024-05-06 +date: 2024-05-07 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 1d3ec84bb49e8..523dc8fb52a20 100644 --- a/api_docs/kbn_core_base_common.mdx +++ b/api_docs/kbn_core_base_common.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-base-common title: "@kbn/core-base-common" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-base-common plugin -date: 2024-05-06 +date: 2024-05-07 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 ff19c00a9abba..70f177efe6301 100644 --- a/api_docs/kbn_core_base_server_internal.mdx +++ b/api_docs/kbn_core_base_server_internal.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-base-server-internal title: "@kbn/core-base-server-internal" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-base-server-internal plugin -date: 2024-05-06 +date: 2024-05-07 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 bef8de0e02bb4..5befe25252e90 100644 --- a/api_docs/kbn_core_base_server_mocks.mdx +++ b/api_docs/kbn_core_base_server_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-base-server-mocks title: "@kbn/core-base-server-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-base-server-mocks plugin -date: 2024-05-06 +date: 2024-05-07 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 a062d7d3d30d1..f1d53d7a05f58 100644 --- a/api_docs/kbn_core_capabilities_browser_mocks.mdx +++ b/api_docs/kbn_core_capabilities_browser_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-capabilities-browser-mocks title: "@kbn/core-capabilities-browser-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-capabilities-browser-mocks plugin -date: 2024-05-06 +date: 2024-05-07 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 9959e2e522134..98f0cd95bdb6b 100644 --- a/api_docs/kbn_core_capabilities_common.mdx +++ b/api_docs/kbn_core_capabilities_common.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-capabilities-common title: "@kbn/core-capabilities-common" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-capabilities-common plugin -date: 2024-05-06 +date: 2024-05-07 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 2316c0aaad5ff..95291065ce45f 100644 --- a/api_docs/kbn_core_capabilities_server.mdx +++ b/api_docs/kbn_core_capabilities_server.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-capabilities-server title: "@kbn/core-capabilities-server" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-capabilities-server plugin -date: 2024-05-06 +date: 2024-05-07 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 1f814f098b0f9..7a084fc1f8e09 100644 --- a/api_docs/kbn_core_capabilities_server_mocks.mdx +++ b/api_docs/kbn_core_capabilities_server_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-capabilities-server-mocks title: "@kbn/core-capabilities-server-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-capabilities-server-mocks plugin -date: 2024-05-06 +date: 2024-05-07 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 5a94d0dfa4a6f..284b0784a3763 100644 --- a/api_docs/kbn_core_chrome_browser.mdx +++ b/api_docs/kbn_core_chrome_browser.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-chrome-browser title: "@kbn/core-chrome-browser" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-chrome-browser plugin -date: 2024-05-06 +date: 2024-05-07 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 73b2fbf4e3441..1d6b6ec2a3498 100644 --- a/api_docs/kbn_core_chrome_browser_mocks.mdx +++ b/api_docs/kbn_core_chrome_browser_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-chrome-browser-mocks title: "@kbn/core-chrome-browser-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-chrome-browser-mocks plugin -date: 2024-05-06 +date: 2024-05-07 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 76820f579d703..6b6da0e70fe15 100644 --- a/api_docs/kbn_core_config_server_internal.mdx +++ b/api_docs/kbn_core_config_server_internal.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-config-server-internal title: "@kbn/core-config-server-internal" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-config-server-internal plugin -date: 2024-05-06 +date: 2024-05-07 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-config-server-internal'] --- import kbnCoreConfigServerInternalObj from './kbn_core_config_server_internal.devdocs.json'; diff --git a/api_docs/kbn_core_custom_branding_browser.mdx b/api_docs/kbn_core_custom_branding_browser.mdx index 99bbf94dea6ec..b745ba9695ca5 100644 --- a/api_docs/kbn_core_custom_branding_browser.mdx +++ b/api_docs/kbn_core_custom_branding_browser.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-custom-branding-browser title: "@kbn/core-custom-branding-browser" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-custom-branding-browser plugin -date: 2024-05-06 +date: 2024-05-07 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-custom-branding-browser'] --- import kbnCoreCustomBrandingBrowserObj from './kbn_core_custom_branding_browser.devdocs.json'; diff --git a/api_docs/kbn_core_custom_branding_browser_internal.mdx b/api_docs/kbn_core_custom_branding_browser_internal.mdx index 22dc903841248..dd7ce22ded0f6 100644 --- a/api_docs/kbn_core_custom_branding_browser_internal.mdx +++ b/api_docs/kbn_core_custom_branding_browser_internal.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-custom-branding-browser-internal title: "@kbn/core-custom-branding-browser-internal" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-custom-branding-browser-internal plugin -date: 2024-05-06 +date: 2024-05-07 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-custom-branding-browser-internal'] --- import kbnCoreCustomBrandingBrowserInternalObj from './kbn_core_custom_branding_browser_internal.devdocs.json'; diff --git a/api_docs/kbn_core_custom_branding_browser_mocks.mdx b/api_docs/kbn_core_custom_branding_browser_mocks.mdx index 095378610de76..6f1282da05669 100644 --- a/api_docs/kbn_core_custom_branding_browser_mocks.mdx +++ b/api_docs/kbn_core_custom_branding_browser_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-custom-branding-browser-mocks title: "@kbn/core-custom-branding-browser-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-custom-branding-browser-mocks plugin -date: 2024-05-06 +date: 2024-05-07 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-custom-branding-browser-mocks'] --- import kbnCoreCustomBrandingBrowserMocksObj from './kbn_core_custom_branding_browser_mocks.devdocs.json'; diff --git a/api_docs/kbn_core_custom_branding_common.mdx b/api_docs/kbn_core_custom_branding_common.mdx index 75a0bd6c3b847..5a0eb1d1e9828 100644 --- a/api_docs/kbn_core_custom_branding_common.mdx +++ b/api_docs/kbn_core_custom_branding_common.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-custom-branding-common title: "@kbn/core-custom-branding-common" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-custom-branding-common plugin -date: 2024-05-06 +date: 2024-05-07 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-custom-branding-common'] --- import kbnCoreCustomBrandingCommonObj from './kbn_core_custom_branding_common.devdocs.json'; diff --git a/api_docs/kbn_core_custom_branding_server.mdx b/api_docs/kbn_core_custom_branding_server.mdx index d3d35d5d42a24..22a2258837a8c 100644 --- a/api_docs/kbn_core_custom_branding_server.mdx +++ b/api_docs/kbn_core_custom_branding_server.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-custom-branding-server title: "@kbn/core-custom-branding-server" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-custom-branding-server plugin -date: 2024-05-06 +date: 2024-05-07 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-custom-branding-server'] --- import kbnCoreCustomBrandingServerObj from './kbn_core_custom_branding_server.devdocs.json'; diff --git a/api_docs/kbn_core_custom_branding_server_internal.mdx b/api_docs/kbn_core_custom_branding_server_internal.mdx index 4c331a7d984db..7ed901dcb0e04 100644 --- a/api_docs/kbn_core_custom_branding_server_internal.mdx +++ b/api_docs/kbn_core_custom_branding_server_internal.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-custom-branding-server-internal title: "@kbn/core-custom-branding-server-internal" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-custom-branding-server-internal plugin -date: 2024-05-06 +date: 2024-05-07 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-custom-branding-server-internal'] --- import kbnCoreCustomBrandingServerInternalObj from './kbn_core_custom_branding_server_internal.devdocs.json'; diff --git a/api_docs/kbn_core_custom_branding_server_mocks.mdx b/api_docs/kbn_core_custom_branding_server_mocks.mdx index bcc323b87fa97..43de0b144e401 100644 --- a/api_docs/kbn_core_custom_branding_server_mocks.mdx +++ b/api_docs/kbn_core_custom_branding_server_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-custom-branding-server-mocks title: "@kbn/core-custom-branding-server-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-custom-branding-server-mocks plugin -date: 2024-05-06 +date: 2024-05-07 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-custom-branding-server-mocks'] --- import kbnCoreCustomBrandingServerMocksObj from './kbn_core_custom_branding_server_mocks.devdocs.json'; diff --git a/api_docs/kbn_core_deprecations_browser.mdx b/api_docs/kbn_core_deprecations_browser.mdx index 51f92dd52a091..5fe94635256c0 100644 --- a/api_docs/kbn_core_deprecations_browser.mdx +++ b/api_docs/kbn_core_deprecations_browser.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-deprecations-browser title: "@kbn/core-deprecations-browser" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-deprecations-browser plugin -date: 2024-05-06 +date: 2024-05-07 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 04c7a9dde51b0..f61c1857fdf42 100644 --- a/api_docs/kbn_core_deprecations_browser_internal.mdx +++ b/api_docs/kbn_core_deprecations_browser_internal.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-deprecations-browser-internal title: "@kbn/core-deprecations-browser-internal" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-deprecations-browser-internal plugin -date: 2024-05-06 +date: 2024-05-07 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 330726097ef53..4ec550282062e 100644 --- a/api_docs/kbn_core_deprecations_browser_mocks.mdx +++ b/api_docs/kbn_core_deprecations_browser_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-deprecations-browser-mocks title: "@kbn/core-deprecations-browser-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-deprecations-browser-mocks plugin -date: 2024-05-06 +date: 2024-05-07 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 a6059f5f0f551..58e9c6ff54de2 100644 --- a/api_docs/kbn_core_deprecations_common.mdx +++ b/api_docs/kbn_core_deprecations_common.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-deprecations-common title: "@kbn/core-deprecations-common" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-deprecations-common plugin -date: 2024-05-06 +date: 2024-05-07 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 6691494e3e29e..45221cb46655e 100644 --- a/api_docs/kbn_core_deprecations_server.mdx +++ b/api_docs/kbn_core_deprecations_server.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-deprecations-server title: "@kbn/core-deprecations-server" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-deprecations-server plugin -date: 2024-05-06 +date: 2024-05-07 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 aa441e6a4cca5..a90de14827350 100644 --- a/api_docs/kbn_core_deprecations_server_internal.mdx +++ b/api_docs/kbn_core_deprecations_server_internal.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-deprecations-server-internal title: "@kbn/core-deprecations-server-internal" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-deprecations-server-internal plugin -date: 2024-05-06 +date: 2024-05-07 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 92056c0cae36a..67188bc7ed692 100644 --- a/api_docs/kbn_core_deprecations_server_mocks.mdx +++ b/api_docs/kbn_core_deprecations_server_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-deprecations-server-mocks title: "@kbn/core-deprecations-server-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-deprecations-server-mocks plugin -date: 2024-05-06 +date: 2024-05-07 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 2a18583cc2918..c0c732a77eb82 100644 --- a/api_docs/kbn_core_doc_links_browser.mdx +++ b/api_docs/kbn_core_doc_links_browser.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-doc-links-browser title: "@kbn/core-doc-links-browser" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-doc-links-browser plugin -date: 2024-05-06 +date: 2024-05-07 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 d9d9b5e3ea011..5d59b4e63994b 100644 --- a/api_docs/kbn_core_doc_links_browser_mocks.mdx +++ b/api_docs/kbn_core_doc_links_browser_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-doc-links-browser-mocks title: "@kbn/core-doc-links-browser-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-doc-links-browser-mocks plugin -date: 2024-05-06 +date: 2024-05-07 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 95edbdc790eef..87feb21601208 100644 --- a/api_docs/kbn_core_doc_links_server.mdx +++ b/api_docs/kbn_core_doc_links_server.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-doc-links-server title: "@kbn/core-doc-links-server" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-doc-links-server plugin -date: 2024-05-06 +date: 2024-05-07 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 71c9b0ab17617..110627c9d497f 100644 --- a/api_docs/kbn_core_doc_links_server_mocks.mdx +++ b/api_docs/kbn_core_doc_links_server_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-doc-links-server-mocks title: "@kbn/core-doc-links-server-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-doc-links-server-mocks plugin -date: 2024-05-06 +date: 2024-05-07 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 9bb13e132ee72..f2307ac78610f 100644 --- a/api_docs/kbn_core_elasticsearch_client_server_internal.mdx +++ b/api_docs/kbn_core_elasticsearch_client_server_internal.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-elasticsearch-client-server-internal title: "@kbn/core-elasticsearch-client-server-internal" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-elasticsearch-client-server-internal plugin -date: 2024-05-06 +date: 2024-05-07 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 09ecb830110f5..a4742f0b146ae 100644 --- a/api_docs/kbn_core_elasticsearch_client_server_mocks.mdx +++ b/api_docs/kbn_core_elasticsearch_client_server_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-elasticsearch-client-server-mocks title: "@kbn/core-elasticsearch-client-server-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-elasticsearch-client-server-mocks plugin -date: 2024-05-06 +date: 2024-05-07 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 acfcdf31c7fa6..bbbecdc2b700d 100644 --- a/api_docs/kbn_core_elasticsearch_server.mdx +++ b/api_docs/kbn_core_elasticsearch_server.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-elasticsearch-server title: "@kbn/core-elasticsearch-server" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-elasticsearch-server plugin -date: 2024-05-06 +date: 2024-05-07 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.devdocs.json b/api_docs/kbn_core_elasticsearch_server_internal.devdocs.json index bb7b98d72132f..1c0a249cb0f90 100644 --- a/api_docs/kbn_core_elasticsearch_server_internal.devdocs.json +++ b/api_docs/kbn_core_elasticsearch_server_internal.devdocs.json @@ -3114,7 +3114,7 @@ "label": "ElasticsearchConfigType", "description": [], "signature": [ - "{ readonly username?: string | undefined; readonly password?: string | undefined; readonly serviceAccountToken?: string | undefined; readonly ssl: Readonly<{ key?: string | undefined; certificateAuthorities?: string | string[] | undefined; certificate?: string | undefined; keyPassphrase?: string | undefined; } & { verificationMode: \"none\" | \"full\" | \"certificate\"; keystore: Readonly<{ path?: string | undefined; password?: string | undefined; } & {}>; truststore: Readonly<{ path?: string | undefined; password?: string | undefined; } & {}>; alwaysPresentCertificate: boolean; }>; readonly healthCheck: Readonly<{} & { delay: moment.Duration; startupDelay: moment.Duration; }>; readonly hosts: string | string[]; readonly requestTimeout: moment.Duration; readonly compression: boolean; readonly apiVersion: string; readonly customHeaders: Record; readonly sniffOnStart: boolean; readonly sniffInterval: false | moment.Duration; readonly sniffOnConnectionFault: boolean; readonly maxSockets: number; readonly maxIdleSockets: number; readonly idleSocketTimeout: moment.Duration; readonly requestHeadersWhitelist: string | string[]; readonly shardTimeout: moment.Duration; readonly pingTimeout: moment.Duration; readonly logQueries: boolean; readonly ignoreVersionMismatch: boolean; readonly skipStartupConnectionCheck: boolean; readonly apisToRedactInLogs: Readonly<{ method?: string | undefined; } & { path: string; }>[]; }" + "{ readonly username?: string | undefined; readonly password?: string | undefined; readonly serviceAccountToken?: string | undefined; readonly ssl: Readonly<{ key?: string | undefined; certificateAuthorities?: string | string[] | undefined; certificate?: string | undefined; keyPassphrase?: string | undefined; } & { verificationMode: \"none\" | \"full\" | \"certificate\"; keystore: Readonly<{ path?: string | undefined; password?: string | undefined; } & {}>; truststore: Readonly<{ path?: string | undefined; password?: string | undefined; } & {}>; alwaysPresentCertificate: boolean; }>; readonly healthCheck: Readonly<{} & { delay: moment.Duration; startupDelay: moment.Duration; }>; readonly hosts: string | string[]; readonly apiVersion: string; readonly customHeaders: Record; readonly sniffOnStart: boolean; readonly sniffInterval: false | moment.Duration; readonly sniffOnConnectionFault: boolean; readonly maxSockets: number; readonly maxIdleSockets: number; readonly idleSocketTimeout: moment.Duration; readonly compression: boolean; readonly requestHeadersWhitelist: string | string[]; readonly shardTimeout: moment.Duration; readonly requestTimeout: moment.Duration; readonly pingTimeout: moment.Duration; readonly logQueries: boolean; readonly ignoreVersionMismatch: boolean; readonly skipStartupConnectionCheck: boolean; readonly apisToRedactInLogs: Readonly<{ method?: string | undefined; } & { path: string; }>[]; }" ], "path": "packages/core/elasticsearch/core-elasticsearch-server-internal/src/elasticsearch_config.ts", "deprecated": false, diff --git a/api_docs/kbn_core_elasticsearch_server_internal.mdx b/api_docs/kbn_core_elasticsearch_server_internal.mdx index 1ce07eb4f3baf..a1d8dfb5dfa5e 100644 --- a/api_docs/kbn_core_elasticsearch_server_internal.mdx +++ b/api_docs/kbn_core_elasticsearch_server_internal.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-elasticsearch-server-internal title: "@kbn/core-elasticsearch-server-internal" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-elasticsearch-server-internal plugin -date: 2024-05-06 +date: 2024-05-07 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 2849dc0a39603..75343b2932aa8 100644 --- a/api_docs/kbn_core_elasticsearch_server_mocks.mdx +++ b/api_docs/kbn_core_elasticsearch_server_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-elasticsearch-server-mocks title: "@kbn/core-elasticsearch-server-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-elasticsearch-server-mocks plugin -date: 2024-05-06 +date: 2024-05-07 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 64c5d74ecbb10..9c6748418d79c 100644 --- a/api_docs/kbn_core_environment_server_internal.mdx +++ b/api_docs/kbn_core_environment_server_internal.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-environment-server-internal title: "@kbn/core-environment-server-internal" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-environment-server-internal plugin -date: 2024-05-06 +date: 2024-05-07 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 75b694bb064c8..c5e88e4d8a5d7 100644 --- a/api_docs/kbn_core_environment_server_mocks.mdx +++ b/api_docs/kbn_core_environment_server_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-environment-server-mocks title: "@kbn/core-environment-server-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-environment-server-mocks plugin -date: 2024-05-06 +date: 2024-05-07 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 91d1d170b5795..6b3ff46a69ad1 100644 --- a/api_docs/kbn_core_execution_context_browser.mdx +++ b/api_docs/kbn_core_execution_context_browser.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-execution-context-browser title: "@kbn/core-execution-context-browser" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-execution-context-browser plugin -date: 2024-05-06 +date: 2024-05-07 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 3da6175d3f3b0..bd3fb3d7b9346 100644 --- a/api_docs/kbn_core_execution_context_browser_internal.mdx +++ b/api_docs/kbn_core_execution_context_browser_internal.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-execution-context-browser-internal title: "@kbn/core-execution-context-browser-internal" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-execution-context-browser-internal plugin -date: 2024-05-06 +date: 2024-05-07 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 60f8a79f50fa7..1d1df8fbe8740 100644 --- a/api_docs/kbn_core_execution_context_browser_mocks.mdx +++ b/api_docs/kbn_core_execution_context_browser_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-execution-context-browser-mocks title: "@kbn/core-execution-context-browser-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-execution-context-browser-mocks plugin -date: 2024-05-06 +date: 2024-05-07 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 db245e7272a86..bc05b4efc60d8 100644 --- a/api_docs/kbn_core_execution_context_common.mdx +++ b/api_docs/kbn_core_execution_context_common.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-execution-context-common title: "@kbn/core-execution-context-common" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-execution-context-common plugin -date: 2024-05-06 +date: 2024-05-07 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 37a2da21eb8ed..3af3a533c38e2 100644 --- a/api_docs/kbn_core_execution_context_server.mdx +++ b/api_docs/kbn_core_execution_context_server.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-execution-context-server title: "@kbn/core-execution-context-server" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-execution-context-server plugin -date: 2024-05-06 +date: 2024-05-07 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 75e0be1c9858a..74642173b5b56 100644 --- a/api_docs/kbn_core_execution_context_server_internal.mdx +++ b/api_docs/kbn_core_execution_context_server_internal.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-execution-context-server-internal title: "@kbn/core-execution-context-server-internal" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-execution-context-server-internal plugin -date: 2024-05-06 +date: 2024-05-07 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 df8908743e40b..c9fa04e37ff64 100644 --- a/api_docs/kbn_core_execution_context_server_mocks.mdx +++ b/api_docs/kbn_core_execution_context_server_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-execution-context-server-mocks title: "@kbn/core-execution-context-server-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-execution-context-server-mocks plugin -date: 2024-05-06 +date: 2024-05-07 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 7f47d3a0a744f..709bad3c9ef99 100644 --- a/api_docs/kbn_core_fatal_errors_browser.mdx +++ b/api_docs/kbn_core_fatal_errors_browser.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-fatal-errors-browser title: "@kbn/core-fatal-errors-browser" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-fatal-errors-browser plugin -date: 2024-05-06 +date: 2024-05-07 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 100239a806ae8..ec2a5eb064a7f 100644 --- a/api_docs/kbn_core_fatal_errors_browser_mocks.mdx +++ b/api_docs/kbn_core_fatal_errors_browser_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-fatal-errors-browser-mocks title: "@kbn/core-fatal-errors-browser-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-fatal-errors-browser-mocks plugin -date: 2024-05-06 +date: 2024-05-07 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 afae0e5f3a8c3..7c667de386921 100644 --- a/api_docs/kbn_core_http_browser.mdx +++ b/api_docs/kbn_core_http_browser.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-http-browser title: "@kbn/core-http-browser" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-http-browser plugin -date: 2024-05-06 +date: 2024-05-07 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 21c3099fe03a0..086b28a0340d7 100644 --- a/api_docs/kbn_core_http_browser_internal.mdx +++ b/api_docs/kbn_core_http_browser_internal.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-http-browser-internal title: "@kbn/core-http-browser-internal" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-http-browser-internal plugin -date: 2024-05-06 +date: 2024-05-07 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 75f6a45ba516b..e60c30d9b5867 100644 --- a/api_docs/kbn_core_http_browser_mocks.mdx +++ b/api_docs/kbn_core_http_browser_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-http-browser-mocks title: "@kbn/core-http-browser-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-http-browser-mocks plugin -date: 2024-05-06 +date: 2024-05-07 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 1055592ea94a4..4e41084d85ed6 100644 --- a/api_docs/kbn_core_http_common.mdx +++ b/api_docs/kbn_core_http_common.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-http-common title: "@kbn/core-http-common" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-http-common plugin -date: 2024-05-06 +date: 2024-05-07 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 1c0fbe3d2dc24..29bb658986a05 100644 --- a/api_docs/kbn_core_http_context_server_mocks.mdx +++ b/api_docs/kbn_core_http_context_server_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-http-context-server-mocks title: "@kbn/core-http-context-server-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-http-context-server-mocks plugin -date: 2024-05-06 +date: 2024-05-07 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 7a6dcb74cf6f6..93c9bc6a42370 100644 --- a/api_docs/kbn_core_http_request_handler_context_server.mdx +++ b/api_docs/kbn_core_http_request_handler_context_server.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-http-request-handler-context-server title: "@kbn/core-http-request-handler-context-server" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-http-request-handler-context-server plugin -date: 2024-05-06 +date: 2024-05-07 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-http-request-handler-context-server'] --- import kbnCoreHttpRequestHandlerContextServerObj from './kbn_core_http_request_handler_context_server.devdocs.json'; diff --git a/api_docs/kbn_core_http_resources_server.mdx b/api_docs/kbn_core_http_resources_server.mdx index 7a90c62273848..69b07132e6dc0 100644 --- a/api_docs/kbn_core_http_resources_server.mdx +++ b/api_docs/kbn_core_http_resources_server.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-http-resources-server title: "@kbn/core-http-resources-server" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-http-resources-server plugin -date: 2024-05-06 +date: 2024-05-07 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-http-resources-server'] --- import kbnCoreHttpResourcesServerObj from './kbn_core_http_resources_server.devdocs.json'; diff --git a/api_docs/kbn_core_http_resources_server_internal.mdx b/api_docs/kbn_core_http_resources_server_internal.mdx index 1ab82caded78f..bd07407dc8e2b 100644 --- a/api_docs/kbn_core_http_resources_server_internal.mdx +++ b/api_docs/kbn_core_http_resources_server_internal.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-http-resources-server-internal title: "@kbn/core-http-resources-server-internal" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-http-resources-server-internal plugin -date: 2024-05-06 +date: 2024-05-07 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-http-resources-server-internal'] --- import kbnCoreHttpResourcesServerInternalObj from './kbn_core_http_resources_server_internal.devdocs.json'; diff --git a/api_docs/kbn_core_http_resources_server_mocks.mdx b/api_docs/kbn_core_http_resources_server_mocks.mdx index a85a3ab667db4..69be18716ddbe 100644 --- a/api_docs/kbn_core_http_resources_server_mocks.mdx +++ b/api_docs/kbn_core_http_resources_server_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-http-resources-server-mocks title: "@kbn/core-http-resources-server-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-http-resources-server-mocks plugin -date: 2024-05-06 +date: 2024-05-07 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-http-resources-server-mocks'] --- import kbnCoreHttpResourcesServerMocksObj from './kbn_core_http_resources_server_mocks.devdocs.json'; diff --git a/api_docs/kbn_core_http_router_server_internal.devdocs.json b/api_docs/kbn_core_http_router_server_internal.devdocs.json index 829b1aa399a2a..389698df3e85c 100644 --- a/api_docs/kbn_core_http_router_server_internal.devdocs.json +++ b/api_docs/kbn_core_http_router_server_internal.devdocs.json @@ -722,39 +722,6 @@ "returnComment": [], "initialIsOpen": false }, - { - "parentPluginId": "@kbn/core-http-router-server-internal", - "id": "def-common.isKibanaResponse", - "type": "Function", - "tags": [], - "label": "isKibanaResponse", - "description": [], - "signature": [ - "(response: Record) => boolean" - ], - "path": "packages/core/http/core-http-router-server-internal/src/response.ts", - "deprecated": false, - "trackAdoption": false, - "children": [ - { - "parentPluginId": "@kbn/core-http-router-server-internal", - "id": "def-common.isKibanaResponse.$1", - "type": "Object", - "tags": [], - "label": "response", - "description": [], - "signature": [ - "Record" - ], - "path": "packages/core/http/core-http-router-server-internal/src/response.ts", - "deprecated": false, - "trackAdoption": false, - "isRequired": true - } - ], - "returnComment": [], - "initialIsOpen": false - }, { "parentPluginId": "@kbn/core-http-router-server-internal", "id": "def-common.isSafeMethod", diff --git a/api_docs/kbn_core_http_router_server_internal.mdx b/api_docs/kbn_core_http_router_server_internal.mdx index 8fd07425cc0e0..df114b2c609ac 100644 --- a/api_docs/kbn_core_http_router_server_internal.mdx +++ b/api_docs/kbn_core_http_router_server_internal.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-http-router-server-internal title: "@kbn/core-http-router-server-internal" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-http-router-server-internal plugin -date: 2024-05-06 +date: 2024-05-07 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-http-router-server-internal'] --- import kbnCoreHttpRouterServerInternalObj from './kbn_core_http_router_server_internal.devdocs.json'; @@ -21,7 +21,7 @@ Contact [@elastic/kibana-core](https://github.com/orgs/elastic/teams/kibana-core | Public API count | Any count | Items lacking comments | Missing exports | |-------------------|-----------|------------------------|-----------------| -| 50 | 7 | 50 | 6 | +| 48 | 7 | 48 | 6 | ## Common diff --git a/api_docs/kbn_core_http_router_server_mocks.mdx b/api_docs/kbn_core_http_router_server_mocks.mdx index f2c3593331481..e04a26dc799ab 100644 --- a/api_docs/kbn_core_http_router_server_mocks.mdx +++ b/api_docs/kbn_core_http_router_server_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-http-router-server-mocks title: "@kbn/core-http-router-server-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-http-router-server-mocks plugin -date: 2024-05-06 +date: 2024-05-07 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-http-router-server-mocks'] --- import kbnCoreHttpRouterServerMocksObj from './kbn_core_http_router_server_mocks.devdocs.json'; diff --git a/api_docs/kbn_core_http_server.devdocs.json b/api_docs/kbn_core_http_server.devdocs.json index 0dcd5420dc4c1..74a728d7294c4 100644 --- a/api_docs/kbn_core_http_server.devdocs.json +++ b/api_docs/kbn_core_http_server.devdocs.json @@ -282,6 +282,39 @@ ], "returnComment": [], "initialIsOpen": false + }, + { + "parentPluginId": "@kbn/core-http-server", + "id": "def-common.isKibanaResponse", + "type": "Function", + "tags": [], + "label": "isKibanaResponse", + "description": [], + "signature": [ + "(response: Record) => boolean" + ], + "path": "packages/core/http/core-http-server/src/router/response.ts", + "deprecated": false, + "trackAdoption": false, + "children": [ + { + "parentPluginId": "@kbn/core-http-server", + "id": "def-common.isKibanaResponse.$1", + "type": "Object", + "tags": [], + "label": "response", + "description": [], + "signature": [ + "Record" + ], + "path": "packages/core/http/core-http-server/src/router/response.ts", + "deprecated": false, + "trackAdoption": false, + "isRequired": true + } + ], + "returnComment": [], + "initialIsOpen": false } ], "interfaces": [ diff --git a/api_docs/kbn_core_http_server.mdx b/api_docs/kbn_core_http_server.mdx index c472f0ebe5ff6..1c275ae6b771d 100644 --- a/api_docs/kbn_core_http_server.mdx +++ b/api_docs/kbn_core_http_server.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-http-server title: "@kbn/core-http-server" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-http-server plugin -date: 2024-05-06 +date: 2024-05-07 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-http-server'] --- import kbnCoreHttpServerObj from './kbn_core_http_server.devdocs.json'; @@ -21,7 +21,7 @@ Contact [@elastic/kibana-core](https://github.com/orgs/elastic/teams/kibana-core | Public API count | Any count | Items lacking comments | Missing exports | |-------------------|-----------|------------------------|-----------------| -| 481 | 2 | 191 | 0 | +| 483 | 2 | 193 | 0 | ## Common diff --git a/api_docs/kbn_core_http_server_internal.devdocs.json b/api_docs/kbn_core_http_server_internal.devdocs.json index c4010593eac4d..6d7734efc14d9 100644 --- a/api_docs/kbn_core_http_server_internal.devdocs.json +++ b/api_docs/kbn_core_http_server_internal.devdocs.json @@ -1449,7 +1449,7 @@ "label": "HttpConfigType", "description": [], "signature": [ - "{ readonly uuid?: string | undefined; readonly basePath?: string | undefined; readonly publicBaseUrl?: string | undefined; readonly name: string; readonly ssl: Readonly<{ key?: string | undefined; certificateAuthorities?: string | string[] | undefined; certificate?: string | undefined; keyPassphrase?: string | undefined; redirectHttpFromPort?: number | undefined; } & { enabled: boolean; keystore: Readonly<{ path?: string | undefined; password?: string | undefined; } & {}>; truststore: Readonly<{ path?: string | undefined; password?: string | undefined; } & {}>; cipherSuites: string[]; supportedProtocols: string[]; clientAuthentication: \"none\" | \"optional\" | \"required\"; }>; readonly host: string; readonly compression: Readonly<{ referrerWhitelist?: string[] | undefined; } & { enabled: boolean; brotli: Readonly<{} & { enabled: boolean; quality: number; }>; }>; readonly port: number; readonly cors: Readonly<{} & { enabled: boolean; allowCredentials: boolean; allowOrigin: string[] | \"*\"[]; }>; readonly versioned: Readonly<{} & { useVersionResolutionStrategyForInternalPaths: string[]; versionResolution: \"none\" | \"oldest\" | \"newest\"; strictClientVersionCheck: boolean; }>; readonly autoListen: boolean; readonly shutdownTimeout: moment.Duration; readonly cdn: Readonly<{ url?: string | undefined; } & {}>; readonly oas: Readonly<{} & { enabled: boolean; }>; readonly securityResponseHeaders: Readonly<{} & { referrerPolicy: \"origin\" | \"no-referrer\" | \"no-referrer-when-downgrade\" | \"origin-when-cross-origin\" | \"same-origin\" | \"strict-origin\" | \"strict-origin-when-cross-origin\" | \"unsafe-url\" | null; strictTransportSecurity: string | null; xContentTypeOptions: \"nosniff\" | null; permissionsPolicy: string | null; disableEmbedding: boolean; crossOriginOpenerPolicy: \"same-origin\" | \"unsafe-none\" | \"same-origin-allow-popups\" | null; }>; readonly customResponseHeaders: Record; readonly maxPayload: ", + "{ readonly uuid?: string | undefined; readonly basePath?: string | undefined; readonly publicBaseUrl?: string | undefined; readonly name: string; readonly ssl: Readonly<{ key?: string | undefined; certificateAuthorities?: string | string[] | undefined; certificate?: string | undefined; keyPassphrase?: string | undefined; redirectHttpFromPort?: number | undefined; } & { enabled: boolean; keystore: Readonly<{ path?: string | undefined; password?: string | undefined; } & {}>; truststore: Readonly<{ path?: string | undefined; password?: string | undefined; } & {}>; cipherSuites: string[]; supportedProtocols: string[]; clientAuthentication: \"none\" | \"optional\" | \"required\"; }>; readonly host: string; readonly port: number; readonly compression: Readonly<{ referrerWhitelist?: string[] | undefined; } & { enabled: boolean; brotli: Readonly<{} & { enabled: boolean; quality: number; }>; }>; readonly cors: Readonly<{} & { enabled: boolean; allowCredentials: boolean; allowOrigin: string[] | \"*\"[]; }>; readonly versioned: Readonly<{} & { useVersionResolutionStrategyForInternalPaths: string[]; versionResolution: \"none\" | \"oldest\" | \"newest\"; strictClientVersionCheck: boolean; }>; readonly autoListen: boolean; readonly shutdownTimeout: moment.Duration; readonly cdn: Readonly<{ url?: string | undefined; } & {}>; readonly oas: Readonly<{} & { enabled: boolean; }>; readonly securityResponseHeaders: Readonly<{} & { referrerPolicy: \"origin\" | \"no-referrer\" | \"no-referrer-when-downgrade\" | \"origin-when-cross-origin\" | \"same-origin\" | \"strict-origin\" | \"strict-origin-when-cross-origin\" | \"unsafe-url\" | null; strictTransportSecurity: string | null; xContentTypeOptions: \"nosniff\" | null; permissionsPolicy: string | null; disableEmbedding: boolean; crossOriginOpenerPolicy: \"same-origin\" | \"unsafe-none\" | \"same-origin-allow-popups\" | null; }>; readonly customResponseHeaders: Record; readonly maxPayload: ", { "pluginId": "@kbn/config-schema", "scope": "common", diff --git a/api_docs/kbn_core_http_server_internal.mdx b/api_docs/kbn_core_http_server_internal.mdx index 910010ca0ceb2..f380f09c68fdc 100644 --- a/api_docs/kbn_core_http_server_internal.mdx +++ b/api_docs/kbn_core_http_server_internal.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-http-server-internal title: "@kbn/core-http-server-internal" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-http-server-internal plugin -date: 2024-05-06 +date: 2024-05-07 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.devdocs.json b/api_docs/kbn_core_http_server_mocks.devdocs.json index 45b54fad65d91..780df3a7f05fc 100644 --- a/api_docs/kbn_core_http_server_mocks.devdocs.json +++ b/api_docs/kbn_core_http_server_mocks.devdocs.json @@ -27,7 +27,7 @@ "label": "createConfigService", "description": [], "signature": [ - "({ server, externalUrl, csp, }?: Partial<{ server: Partial; truststore: Readonly<{ path?: string | undefined; password?: string | undefined; } & {}>; cipherSuites: string[]; supportedProtocols: string[]; clientAuthentication: \"none\" | \"optional\" | \"required\"; }>; host: string; compression: Readonly<{ referrerWhitelist?: string[] | undefined; } & { enabled: boolean; brotli: Readonly<{} & { enabled: boolean; quality: number; }>; }>; port: number; cors: Readonly<{} & { enabled: boolean; allowCredentials: boolean; allowOrigin: string[] | \"*\"[]; }>; versioned: Readonly<{} & { useVersionResolutionStrategyForInternalPaths: string[]; versionResolution: \"none\" | \"oldest\" | \"newest\"; strictClientVersionCheck: boolean; }>; autoListen: boolean; shutdownTimeout: moment.Duration; cdn: Readonly<{ url?: string | undefined; } & {}>; oas: Readonly<{} & { enabled: boolean; }>; securityResponseHeaders: Readonly<{} & { referrerPolicy: \"origin\" | \"no-referrer\" | \"no-referrer-when-downgrade\" | \"origin-when-cross-origin\" | \"same-origin\" | \"strict-origin\" | \"strict-origin-when-cross-origin\" | \"unsafe-url\" | null; strictTransportSecurity: string | null; xContentTypeOptions: \"nosniff\" | null; permissionsPolicy: string | null; disableEmbedding: boolean; crossOriginOpenerPolicy: \"same-origin\" | \"unsafe-none\" | \"same-origin-allow-popups\" | null; }>; customResponseHeaders: Record; maxPayload: ", + "({ server, externalUrl, csp, }?: Partial<{ server: Partial; truststore: Readonly<{ path?: string | undefined; password?: string | undefined; } & {}>; cipherSuites: string[]; supportedProtocols: string[]; clientAuthentication: \"none\" | \"optional\" | \"required\"; }>; host: string; port: number; compression: Readonly<{ referrerWhitelist?: string[] | undefined; } & { enabled: boolean; brotli: Readonly<{} & { enabled: boolean; quality: number; }>; }>; cors: Readonly<{} & { enabled: boolean; allowCredentials: boolean; allowOrigin: string[] | \"*\"[]; }>; versioned: Readonly<{} & { useVersionResolutionStrategyForInternalPaths: string[]; versionResolution: \"none\" | \"oldest\" | \"newest\"; strictClientVersionCheck: boolean; }>; autoListen: boolean; shutdownTimeout: moment.Duration; cdn: Readonly<{ url?: string | undefined; } & {}>; oas: Readonly<{} & { enabled: boolean; }>; securityResponseHeaders: Readonly<{} & { referrerPolicy: \"origin\" | \"no-referrer\" | \"no-referrer-when-downgrade\" | \"origin-when-cross-origin\" | \"same-origin\" | \"strict-origin\" | \"strict-origin-when-cross-origin\" | \"unsafe-url\" | null; strictTransportSecurity: string | null; xContentTypeOptions: \"nosniff\" | null; permissionsPolicy: string | null; disableEmbedding: boolean; crossOriginOpenerPolicy: \"same-origin\" | \"unsafe-none\" | \"same-origin-allow-popups\" | null; }>; customResponseHeaders: Record; maxPayload: ", { "pluginId": "@kbn/config-schema", "scope": "common", @@ -64,7 +64,7 @@ "label": "{\n server,\n externalUrl,\n csp,\n}", "description": [], "signature": [ - "Partial<{ server: Partial; truststore: Readonly<{ path?: string | undefined; password?: string | undefined; } & {}>; cipherSuites: string[]; supportedProtocols: string[]; clientAuthentication: \"none\" | \"optional\" | \"required\"; }>; host: string; compression: Readonly<{ referrerWhitelist?: string[] | undefined; } & { enabled: boolean; brotli: Readonly<{} & { enabled: boolean; quality: number; }>; }>; port: number; cors: Readonly<{} & { enabled: boolean; allowCredentials: boolean; allowOrigin: string[] | \"*\"[]; }>; versioned: Readonly<{} & { useVersionResolutionStrategyForInternalPaths: string[]; versionResolution: \"none\" | \"oldest\" | \"newest\"; strictClientVersionCheck: boolean; }>; autoListen: boolean; shutdownTimeout: moment.Duration; cdn: Readonly<{ url?: string | undefined; } & {}>; oas: Readonly<{} & { enabled: boolean; }>; securityResponseHeaders: Readonly<{} & { referrerPolicy: \"origin\" | \"no-referrer\" | \"no-referrer-when-downgrade\" | \"origin-when-cross-origin\" | \"same-origin\" | \"strict-origin\" | \"strict-origin-when-cross-origin\" | \"unsafe-url\" | null; strictTransportSecurity: string | null; xContentTypeOptions: \"nosniff\" | null; permissionsPolicy: string | null; disableEmbedding: boolean; crossOriginOpenerPolicy: \"same-origin\" | \"unsafe-none\" | \"same-origin-allow-popups\" | null; }>; customResponseHeaders: Record; maxPayload: ", + "Partial<{ server: Partial; truststore: Readonly<{ path?: string | undefined; password?: string | undefined; } & {}>; cipherSuites: string[]; supportedProtocols: string[]; clientAuthentication: \"none\" | \"optional\" | \"required\"; }>; host: string; port: number; compression: Readonly<{ referrerWhitelist?: string[] | undefined; } & { enabled: boolean; brotli: Readonly<{} & { enabled: boolean; quality: number; }>; }>; cors: Readonly<{} & { enabled: boolean; allowCredentials: boolean; allowOrigin: string[] | \"*\"[]; }>; versioned: Readonly<{} & { useVersionResolutionStrategyForInternalPaths: string[]; versionResolution: \"none\" | \"oldest\" | \"newest\"; strictClientVersionCheck: boolean; }>; autoListen: boolean; shutdownTimeout: moment.Duration; cdn: Readonly<{ url?: string | undefined; } & {}>; oas: Readonly<{} & { enabled: boolean; }>; securityResponseHeaders: Readonly<{} & { referrerPolicy: \"origin\" | \"no-referrer\" | \"no-referrer-when-downgrade\" | \"origin-when-cross-origin\" | \"same-origin\" | \"strict-origin\" | \"strict-origin-when-cross-origin\" | \"unsafe-url\" | null; strictTransportSecurity: string | null; xContentTypeOptions: \"nosniff\" | null; permissionsPolicy: string | null; disableEmbedding: boolean; crossOriginOpenerPolicy: \"same-origin\" | \"unsafe-none\" | \"same-origin-allow-popups\" | null; }>; customResponseHeaders: Record; maxPayload: ", { "pluginId": "@kbn/config-schema", "scope": "common", diff --git a/api_docs/kbn_core_http_server_mocks.mdx b/api_docs/kbn_core_http_server_mocks.mdx index 89445d54b7b71..c4cac44b95787 100644 --- a/api_docs/kbn_core_http_server_mocks.mdx +++ b/api_docs/kbn_core_http_server_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-http-server-mocks title: "@kbn/core-http-server-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-http-server-mocks plugin -date: 2024-05-06 +date: 2024-05-07 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 73f2fefbfc46d..a5df4593cee14 100644 --- a/api_docs/kbn_core_i18n_browser.mdx +++ b/api_docs/kbn_core_i18n_browser.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-i18n-browser title: "@kbn/core-i18n-browser" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-i18n-browser plugin -date: 2024-05-06 +date: 2024-05-07 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 066273b3b0e0c..7957b22820633 100644 --- a/api_docs/kbn_core_i18n_browser_mocks.mdx +++ b/api_docs/kbn_core_i18n_browser_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-i18n-browser-mocks title: "@kbn/core-i18n-browser-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-i18n-browser-mocks plugin -date: 2024-05-06 +date: 2024-05-07 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 381f45c60f72e..3a952ee57a131 100644 --- a/api_docs/kbn_core_i18n_server.mdx +++ b/api_docs/kbn_core_i18n_server.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-i18n-server title: "@kbn/core-i18n-server" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-i18n-server plugin -date: 2024-05-06 +date: 2024-05-07 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 07e1549cde04f..e32580693f4cc 100644 --- a/api_docs/kbn_core_i18n_server_internal.mdx +++ b/api_docs/kbn_core_i18n_server_internal.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-i18n-server-internal title: "@kbn/core-i18n-server-internal" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-i18n-server-internal plugin -date: 2024-05-06 +date: 2024-05-07 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 fc583cb5f8bcb..71eff66fb0005 100644 --- a/api_docs/kbn_core_i18n_server_mocks.mdx +++ b/api_docs/kbn_core_i18n_server_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-i18n-server-mocks title: "@kbn/core-i18n-server-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-i18n-server-mocks plugin -date: 2024-05-06 +date: 2024-05-07 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-i18n-server-mocks'] --- import kbnCoreI18nServerMocksObj from './kbn_core_i18n_server_mocks.devdocs.json'; diff --git a/api_docs/kbn_core_injected_metadata_browser_mocks.mdx b/api_docs/kbn_core_injected_metadata_browser_mocks.mdx index 90b96fefbe14e..0bcd9ec519e7a 100644 --- a/api_docs/kbn_core_injected_metadata_browser_mocks.mdx +++ b/api_docs/kbn_core_injected_metadata_browser_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-injected-metadata-browser-mocks title: "@kbn/core-injected-metadata-browser-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-injected-metadata-browser-mocks plugin -date: 2024-05-06 +date: 2024-05-07 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 ae23ca4179954..158bff429478a 100644 --- a/api_docs/kbn_core_integrations_browser_internal.mdx +++ b/api_docs/kbn_core_integrations_browser_internal.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-integrations-browser-internal title: "@kbn/core-integrations-browser-internal" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-integrations-browser-internal plugin -date: 2024-05-06 +date: 2024-05-07 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 0a38fc21c7c9e..7d241333f1f9e 100644 --- a/api_docs/kbn_core_integrations_browser_mocks.mdx +++ b/api_docs/kbn_core_integrations_browser_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-integrations-browser-mocks title: "@kbn/core-integrations-browser-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-integrations-browser-mocks plugin -date: 2024-05-06 +date: 2024-05-07 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 806e6c1c00ac6..7071be09ff389 100644 --- a/api_docs/kbn_core_lifecycle_browser.mdx +++ b/api_docs/kbn_core_lifecycle_browser.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-lifecycle-browser title: "@kbn/core-lifecycle-browser" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-lifecycle-browser plugin -date: 2024-05-06 +date: 2024-05-07 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 372effb040a6e..bba0ed1f8b13b 100644 --- a/api_docs/kbn_core_lifecycle_browser_mocks.mdx +++ b/api_docs/kbn_core_lifecycle_browser_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-lifecycle-browser-mocks title: "@kbn/core-lifecycle-browser-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-lifecycle-browser-mocks plugin -date: 2024-05-06 +date: 2024-05-07 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-lifecycle-browser-mocks'] --- import kbnCoreLifecycleBrowserMocksObj from './kbn_core_lifecycle_browser_mocks.devdocs.json'; diff --git a/api_docs/kbn_core_lifecycle_server.mdx b/api_docs/kbn_core_lifecycle_server.mdx index b1d494155a09e..5c666b9423a1d 100644 --- a/api_docs/kbn_core_lifecycle_server.mdx +++ b/api_docs/kbn_core_lifecycle_server.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-lifecycle-server title: "@kbn/core-lifecycle-server" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-lifecycle-server plugin -date: 2024-05-06 +date: 2024-05-07 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-lifecycle-server'] --- import kbnCoreLifecycleServerObj from './kbn_core_lifecycle_server.devdocs.json'; diff --git a/api_docs/kbn_core_lifecycle_server_mocks.mdx b/api_docs/kbn_core_lifecycle_server_mocks.mdx index 29232e1a58112..c00f3b8c6c0b1 100644 --- a/api_docs/kbn_core_lifecycle_server_mocks.mdx +++ b/api_docs/kbn_core_lifecycle_server_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-lifecycle-server-mocks title: "@kbn/core-lifecycle-server-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-lifecycle-server-mocks plugin -date: 2024-05-06 +date: 2024-05-07 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-lifecycle-server-mocks'] --- import kbnCoreLifecycleServerMocksObj from './kbn_core_lifecycle_server_mocks.devdocs.json'; diff --git a/api_docs/kbn_core_logging_browser_mocks.mdx b/api_docs/kbn_core_logging_browser_mocks.mdx index b2e91c9e80541..fa8e3a132ddea 100644 --- a/api_docs/kbn_core_logging_browser_mocks.mdx +++ b/api_docs/kbn_core_logging_browser_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-logging-browser-mocks title: "@kbn/core-logging-browser-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-logging-browser-mocks plugin -date: 2024-05-06 +date: 2024-05-07 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-logging-browser-mocks'] --- import kbnCoreLoggingBrowserMocksObj from './kbn_core_logging_browser_mocks.devdocs.json'; diff --git a/api_docs/kbn_core_logging_common_internal.mdx b/api_docs/kbn_core_logging_common_internal.mdx index e4d8d49777d28..cb4880a69e9e0 100644 --- a/api_docs/kbn_core_logging_common_internal.mdx +++ b/api_docs/kbn_core_logging_common_internal.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-logging-common-internal title: "@kbn/core-logging-common-internal" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-logging-common-internal plugin -date: 2024-05-06 +date: 2024-05-07 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-logging-common-internal'] --- import kbnCoreLoggingCommonInternalObj from './kbn_core_logging_common_internal.devdocs.json'; diff --git a/api_docs/kbn_core_logging_server.mdx b/api_docs/kbn_core_logging_server.mdx index 747260090f84f..8b98467aefa5d 100644 --- a/api_docs/kbn_core_logging_server.mdx +++ b/api_docs/kbn_core_logging_server.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-logging-server title: "@kbn/core-logging-server" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-logging-server plugin -date: 2024-05-06 +date: 2024-05-07 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.devdocs.json b/api_docs/kbn_core_logging_server_internal.devdocs.json index cff5e7635a67a..a0af84675aefe 100644 --- a/api_docs/kbn_core_logging_server_internal.devdocs.json +++ b/api_docs/kbn_core_logging_server_internal.devdocs.json @@ -143,7 +143,7 @@ "section": "def-common.ByteSizeValue", "text": "ByteSizeValue" }, - "; }> | Readonly<{} & { type: \"time-interval\"; interval: moment.Duration; modulate: boolean; }>; strategy: ", + "; }> | Readonly<{} & { type: \"time-interval\"; interval: moment.Duration; modulate: boolean; }>; layout: Readonly<{} & { type: \"json\"; }> | Readonly<{ pattern?: string | undefined; highlight?: boolean | undefined; } & { type: \"pattern\"; }>; fileName: string; strategy: ", { "pluginId": "@kbn/core-logging-server", "scope": "common", @@ -151,7 +151,7 @@ "section": "def-common.NumericRollingStrategyConfig", "text": "NumericRollingStrategyConfig" }, - "; layout: Readonly<{} & { type: \"json\"; }> | Readonly<{ pattern?: string | undefined; highlight?: boolean | undefined; } & { type: \"pattern\"; }>; fileName: string; }>>" + "; }>>" ], "path": "packages/core/logging/core-logging-server-internal/src/appenders/appenders.ts", "deprecated": false, diff --git a/api_docs/kbn_core_logging_server_internal.mdx b/api_docs/kbn_core_logging_server_internal.mdx index b87806c8f29e7..8981344235067 100644 --- a/api_docs/kbn_core_logging_server_internal.mdx +++ b/api_docs/kbn_core_logging_server_internal.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-logging-server-internal title: "@kbn/core-logging-server-internal" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-logging-server-internal plugin -date: 2024-05-06 +date: 2024-05-07 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 7e34e4dccb834..af6eac80fe0d5 100644 --- a/api_docs/kbn_core_logging_server_mocks.mdx +++ b/api_docs/kbn_core_logging_server_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-logging-server-mocks title: "@kbn/core-logging-server-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-logging-server-mocks plugin -date: 2024-05-06 +date: 2024-05-07 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 53e97ef2bd19a..36718d3225443 100644 --- a/api_docs/kbn_core_metrics_collectors_server_internal.mdx +++ b/api_docs/kbn_core_metrics_collectors_server_internal.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-metrics-collectors-server-internal title: "@kbn/core-metrics-collectors-server-internal" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-metrics-collectors-server-internal plugin -date: 2024-05-06 +date: 2024-05-07 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 24a7e5c131ad0..563da30ebeaf2 100644 --- a/api_docs/kbn_core_metrics_collectors_server_mocks.mdx +++ b/api_docs/kbn_core_metrics_collectors_server_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-metrics-collectors-server-mocks title: "@kbn/core-metrics-collectors-server-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-metrics-collectors-server-mocks plugin -date: 2024-05-06 +date: 2024-05-07 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 e6316d6979319..ff6e128bba576 100644 --- a/api_docs/kbn_core_metrics_server.mdx +++ b/api_docs/kbn_core_metrics_server.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-metrics-server title: "@kbn/core-metrics-server" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-metrics-server plugin -date: 2024-05-06 +date: 2024-05-07 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 1a53f81f2ef61..d6996a660acbc 100644 --- a/api_docs/kbn_core_metrics_server_internal.mdx +++ b/api_docs/kbn_core_metrics_server_internal.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-metrics-server-internal title: "@kbn/core-metrics-server-internal" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-metrics-server-internal plugin -date: 2024-05-06 +date: 2024-05-07 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 68ae2c809567c..72f7f1e2cdf89 100644 --- a/api_docs/kbn_core_metrics_server_mocks.mdx +++ b/api_docs/kbn_core_metrics_server_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-metrics-server-mocks title: "@kbn/core-metrics-server-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-metrics-server-mocks plugin -date: 2024-05-06 +date: 2024-05-07 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 9f316811e7b09..418eeae8874dd 100644 --- a/api_docs/kbn_core_mount_utils_browser.mdx +++ b/api_docs/kbn_core_mount_utils_browser.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-mount-utils-browser title: "@kbn/core-mount-utils-browser" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-mount-utils-browser plugin -date: 2024-05-06 +date: 2024-05-07 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 586fce400dfc1..2d997930f420c 100644 --- a/api_docs/kbn_core_node_server.mdx +++ b/api_docs/kbn_core_node_server.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-node-server title: "@kbn/core-node-server" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-node-server plugin -date: 2024-05-06 +date: 2024-05-07 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 abbb03ebc3abe..57428615957b8 100644 --- a/api_docs/kbn_core_node_server_internal.mdx +++ b/api_docs/kbn_core_node_server_internal.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-node-server-internal title: "@kbn/core-node-server-internal" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-node-server-internal plugin -date: 2024-05-06 +date: 2024-05-07 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 6395df82803cc..58dbbd12d718a 100644 --- a/api_docs/kbn_core_node_server_mocks.mdx +++ b/api_docs/kbn_core_node_server_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-node-server-mocks title: "@kbn/core-node-server-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-node-server-mocks plugin -date: 2024-05-06 +date: 2024-05-07 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 e3ce6e4a5f2f0..25fce8c4f38fd 100644 --- a/api_docs/kbn_core_notifications_browser.mdx +++ b/api_docs/kbn_core_notifications_browser.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-notifications-browser title: "@kbn/core-notifications-browser" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-notifications-browser plugin -date: 2024-05-06 +date: 2024-05-07 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 2ea0fe3132c10..0f4d5e46a350d 100644 --- a/api_docs/kbn_core_notifications_browser_internal.mdx +++ b/api_docs/kbn_core_notifications_browser_internal.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-notifications-browser-internal title: "@kbn/core-notifications-browser-internal" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-notifications-browser-internal plugin -date: 2024-05-06 +date: 2024-05-07 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 44e15976edd6b..45600dbea3165 100644 --- a/api_docs/kbn_core_notifications_browser_mocks.mdx +++ b/api_docs/kbn_core_notifications_browser_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-notifications-browser-mocks title: "@kbn/core-notifications-browser-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-notifications-browser-mocks plugin -date: 2024-05-06 +date: 2024-05-07 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 81f51e12a7dcb..9ad43cd51fb31 100644 --- a/api_docs/kbn_core_overlays_browser.mdx +++ b/api_docs/kbn_core_overlays_browser.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-overlays-browser title: "@kbn/core-overlays-browser" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-overlays-browser plugin -date: 2024-05-06 +date: 2024-05-07 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 fa09cc682b6a2..54e69cb4b3053 100644 --- a/api_docs/kbn_core_overlays_browser_internal.mdx +++ b/api_docs/kbn_core_overlays_browser_internal.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-overlays-browser-internal title: "@kbn/core-overlays-browser-internal" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-overlays-browser-internal plugin -date: 2024-05-06 +date: 2024-05-07 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 9757ae8a9d5e6..e85af2c1abefd 100644 --- a/api_docs/kbn_core_overlays_browser_mocks.mdx +++ b/api_docs/kbn_core_overlays_browser_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-overlays-browser-mocks title: "@kbn/core-overlays-browser-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-overlays-browser-mocks plugin -date: 2024-05-06 +date: 2024-05-07 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 1512a06899618..7f6204408a0a9 100644 --- a/api_docs/kbn_core_plugins_browser.mdx +++ b/api_docs/kbn_core_plugins_browser.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-plugins-browser title: "@kbn/core-plugins-browser" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-plugins-browser plugin -date: 2024-05-06 +date: 2024-05-07 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 48a0d4a499103..ade37cc3113e1 100644 --- a/api_docs/kbn_core_plugins_browser_mocks.mdx +++ b/api_docs/kbn_core_plugins_browser_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-plugins-browser-mocks title: "@kbn/core-plugins-browser-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-plugins-browser-mocks plugin -date: 2024-05-06 +date: 2024-05-07 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-plugins-browser-mocks'] --- import kbnCorePluginsBrowserMocksObj from './kbn_core_plugins_browser_mocks.devdocs.json'; diff --git a/api_docs/kbn_core_plugins_contracts_browser.mdx b/api_docs/kbn_core_plugins_contracts_browser.mdx index dbc9f639fb173..dd36d5022e058 100644 --- a/api_docs/kbn_core_plugins_contracts_browser.mdx +++ b/api_docs/kbn_core_plugins_contracts_browser.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-plugins-contracts-browser title: "@kbn/core-plugins-contracts-browser" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-plugins-contracts-browser plugin -date: 2024-05-06 +date: 2024-05-07 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-plugins-contracts-browser'] --- import kbnCorePluginsContractsBrowserObj from './kbn_core_plugins_contracts_browser.devdocs.json'; diff --git a/api_docs/kbn_core_plugins_contracts_server.mdx b/api_docs/kbn_core_plugins_contracts_server.mdx index c68d3738fc0d3..57ce91ae0e4d9 100644 --- a/api_docs/kbn_core_plugins_contracts_server.mdx +++ b/api_docs/kbn_core_plugins_contracts_server.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-plugins-contracts-server title: "@kbn/core-plugins-contracts-server" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-plugins-contracts-server plugin -date: 2024-05-06 +date: 2024-05-07 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-plugins-contracts-server'] --- import kbnCorePluginsContractsServerObj from './kbn_core_plugins_contracts_server.devdocs.json'; diff --git a/api_docs/kbn_core_plugins_server.devdocs.json b/api_docs/kbn_core_plugins_server.devdocs.json index 4a254538d5052..3fa52e5e006e1 100644 --- a/api_docs/kbn_core_plugins_server.devdocs.json +++ b/api_docs/kbn_core_plugins_server.devdocs.json @@ -647,7 +647,7 @@ "signature": [ "{ legacy: { globalConfig$: ", "Observable", - " moment.Duration; humanize: { (argWithSuffix?: boolean | undefined, argThresholds?: moment.argThresholdOpts | undefined): string; (argThresholds?: moment.argThresholdOpts | undefined): string; }; abs: () => moment.Duration; as: (units: moment.unitOfTime.Base) => number; get: (units: moment.unitOfTime.Base) => number; milliseconds: () => number; asMilliseconds: () => number; seconds: () => number; asSeconds: () => number; minutes: () => number; asMinutes: () => number; hours: () => number; asHours: () => number; days: () => number; asDays: () => number; weeks: () => number; asWeeks: () => number; months: () => number; asMonths: () => number; years: () => number; asYears: () => number; add: (inp?: moment.DurationInputArg1, unit?: moment.unitOfTime.DurationConstructor | undefined) => moment.Duration; subtract: (inp?: moment.DurationInputArg1, unit?: moment.unitOfTime.DurationConstructor | undefined) => moment.Duration; locale: { (): string; (locale: moment.LocaleSpecifier): moment.Duration; }; localeData: () => moment.Locale; toISOString: () => string; toJSON: () => string; isValid: () => boolean; lang: { (locale: moment.LocaleSpecifier): moment.Moment; (): moment.Locale; }; toIsoString: () => string; format: moment.Format; }>; readonly shardTimeout: Readonly<{ clone: () => moment.Duration; humanize: { (argWithSuffix?: boolean | undefined, argThresholds?: moment.argThresholdOpts | undefined): string; (argThresholds?: moment.argThresholdOpts | undefined): string; }; abs: () => moment.Duration; as: (units: moment.unitOfTime.Base) => number; get: (units: moment.unitOfTime.Base) => number; milliseconds: () => number; asMilliseconds: () => number; seconds: () => number; asSeconds: () => number; minutes: () => number; asMinutes: () => number; hours: () => number; asHours: () => number; days: () => number; asDays: () => number; weeks: () => number; asWeeks: () => number; months: () => number; asMonths: () => number; years: () => number; asYears: () => number; add: (inp?: moment.DurationInputArg1, unit?: moment.unitOfTime.DurationConstructor | undefined) => moment.Duration; subtract: (inp?: moment.DurationInputArg1, unit?: moment.unitOfTime.DurationConstructor | undefined) => moment.Duration; locale: { (): string; (locale: moment.LocaleSpecifier): moment.Duration; }; localeData: () => moment.Locale; toISOString: () => string; toJSON: () => string; isValid: () => boolean; lang: { (locale: moment.LocaleSpecifier): moment.Moment; (): moment.Locale; }; toIsoString: () => string; format: moment.Format; }>; readonly pingTimeout: Readonly<{ clone: () => moment.Duration; humanize: { (argWithSuffix?: boolean | undefined, argThresholds?: moment.argThresholdOpts | undefined): string; (argThresholds?: moment.argThresholdOpts | undefined): string; }; abs: () => moment.Duration; as: (units: moment.unitOfTime.Base) => number; get: (units: moment.unitOfTime.Base) => number; milliseconds: () => number; asMilliseconds: () => number; seconds: () => number; asSeconds: () => number; minutes: () => number; asMinutes: () => number; hours: () => number; asHours: () => number; days: () => number; asDays: () => number; weeks: () => number; asWeeks: () => number; months: () => number; asMonths: () => number; years: () => number; asYears: () => number; add: (inp?: moment.DurationInputArg1, unit?: moment.unitOfTime.DurationConstructor | undefined) => moment.Duration; subtract: (inp?: moment.DurationInputArg1, unit?: moment.unitOfTime.DurationConstructor | undefined) => moment.Duration; locale: { (): string; (locale: moment.LocaleSpecifier): moment.Duration; }; localeData: () => moment.Locale; toISOString: () => string; toJSON: () => string; isValid: () => boolean; lang: { (locale: moment.LocaleSpecifier): moment.Moment; (): moment.Locale; }; toIsoString: () => string; format: moment.Format; }>; }>; path: Readonly<{ readonly data: string; }>; savedObjects: Readonly<{ readonly maxImportPayloadBytes: Readonly<{ isGreaterThan: (other: ", + " moment.Duration; humanize: { (argWithSuffix?: boolean | undefined, argThresholds?: moment.argThresholdOpts | undefined): string; (argThresholds?: moment.argThresholdOpts | undefined): string; }; abs: () => moment.Duration; as: (units: moment.unitOfTime.Base) => number; get: (units: moment.unitOfTime.Base) => number; milliseconds: () => number; asMilliseconds: () => number; seconds: () => number; asSeconds: () => number; minutes: () => number; asMinutes: () => number; hours: () => number; asHours: () => number; days: () => number; asDays: () => number; weeks: () => number; asWeeks: () => number; months: () => number; asMonths: () => number; years: () => number; asYears: () => number; add: (inp?: moment.DurationInputArg1, unit?: moment.unitOfTime.DurationConstructor | undefined) => moment.Duration; subtract: (inp?: moment.DurationInputArg1, unit?: moment.unitOfTime.DurationConstructor | undefined) => moment.Duration; locale: { (): string; (locale: moment.LocaleSpecifier): moment.Duration; }; localeData: () => moment.Locale; toISOString: () => string; toJSON: () => string; isValid: () => boolean; lang: { (locale: moment.LocaleSpecifier): moment.Moment; (): moment.Locale; }; toIsoString: () => string; format: moment.Format; }>; readonly requestTimeout: Readonly<{ clone: () => moment.Duration; humanize: { (argWithSuffix?: boolean | undefined, argThresholds?: moment.argThresholdOpts | undefined): string; (argThresholds?: moment.argThresholdOpts | undefined): string; }; abs: () => moment.Duration; as: (units: moment.unitOfTime.Base) => number; get: (units: moment.unitOfTime.Base) => number; milliseconds: () => number; asMilliseconds: () => number; seconds: () => number; asSeconds: () => number; minutes: () => number; asMinutes: () => number; hours: () => number; asHours: () => number; days: () => number; asDays: () => number; weeks: () => number; asWeeks: () => number; months: () => number; asMonths: () => number; years: () => number; asYears: () => number; add: (inp?: moment.DurationInputArg1, unit?: moment.unitOfTime.DurationConstructor | undefined) => moment.Duration; subtract: (inp?: moment.DurationInputArg1, unit?: moment.unitOfTime.DurationConstructor | undefined) => moment.Duration; locale: { (): string; (locale: moment.LocaleSpecifier): moment.Duration; }; localeData: () => moment.Locale; toISOString: () => string; toJSON: () => string; isValid: () => boolean; lang: { (locale: moment.LocaleSpecifier): moment.Moment; (): moment.Locale; }; toIsoString: () => string; format: moment.Format; }>; readonly pingTimeout: Readonly<{ clone: () => moment.Duration; humanize: { (argWithSuffix?: boolean | undefined, argThresholds?: moment.argThresholdOpts | undefined): string; (argThresholds?: moment.argThresholdOpts | undefined): string; }; abs: () => moment.Duration; as: (units: moment.unitOfTime.Base) => number; get: (units: moment.unitOfTime.Base) => number; milliseconds: () => number; asMilliseconds: () => number; seconds: () => number; asSeconds: () => number; minutes: () => number; asMinutes: () => number; hours: () => number; asHours: () => number; days: () => number; asDays: () => number; weeks: () => number; asWeeks: () => number; months: () => number; asMonths: () => number; years: () => number; asYears: () => number; add: (inp?: moment.DurationInputArg1, unit?: moment.unitOfTime.DurationConstructor | undefined) => moment.Duration; subtract: (inp?: moment.DurationInputArg1, unit?: moment.unitOfTime.DurationConstructor | undefined) => moment.Duration; locale: { (): string; (locale: moment.LocaleSpecifier): moment.Duration; }; localeData: () => moment.Locale; toISOString: () => string; toJSON: () => string; isValid: () => boolean; lang: { (locale: moment.LocaleSpecifier): moment.Moment; (): moment.Locale; }; toIsoString: () => string; format: moment.Format; }>; }>; path: Readonly<{ readonly data: string; }>; savedObjects: Readonly<{ readonly maxImportPayloadBytes: Readonly<{ isGreaterThan: (other: ", { "pluginId": "@kbn/config-schema", "scope": "common", @@ -673,7 +673,7 @@ }, ") => boolean; getValueInBytes: () => number; toString: (returnUnit?: ", "ByteSizeValueUnit", - " | undefined) => string; }>; }>; }>>; get: () => Readonly<{ elasticsearch: Readonly<{ readonly requestTimeout: Readonly<{ clone: () => moment.Duration; humanize: { (argWithSuffix?: boolean | undefined, argThresholds?: moment.argThresholdOpts | undefined): string; (argThresholds?: moment.argThresholdOpts | undefined): string; }; abs: () => moment.Duration; as: (units: moment.unitOfTime.Base) => number; get: (units: moment.unitOfTime.Base) => number; milliseconds: () => number; asMilliseconds: () => number; seconds: () => number; asSeconds: () => number; minutes: () => number; asMinutes: () => number; hours: () => number; asHours: () => number; days: () => number; asDays: () => number; weeks: () => number; asWeeks: () => number; months: () => number; asMonths: () => number; years: () => number; asYears: () => number; add: (inp?: moment.DurationInputArg1, unit?: moment.unitOfTime.DurationConstructor | undefined) => moment.Duration; subtract: (inp?: moment.DurationInputArg1, unit?: moment.unitOfTime.DurationConstructor | undefined) => moment.Duration; locale: { (): string; (locale: moment.LocaleSpecifier): moment.Duration; }; localeData: () => moment.Locale; toISOString: () => string; toJSON: () => string; isValid: () => boolean; lang: { (locale: moment.LocaleSpecifier): moment.Moment; (): moment.Locale; }; toIsoString: () => string; format: moment.Format; }>; readonly shardTimeout: Readonly<{ clone: () => moment.Duration; humanize: { (argWithSuffix?: boolean | undefined, argThresholds?: moment.argThresholdOpts | undefined): string; (argThresholds?: moment.argThresholdOpts | undefined): string; }; abs: () => moment.Duration; as: (units: moment.unitOfTime.Base) => number; get: (units: moment.unitOfTime.Base) => number; milliseconds: () => number; asMilliseconds: () => number; seconds: () => number; asSeconds: () => number; minutes: () => number; asMinutes: () => number; hours: () => number; asHours: () => number; days: () => number; asDays: () => number; weeks: () => number; asWeeks: () => number; months: () => number; asMonths: () => number; years: () => number; asYears: () => number; add: (inp?: moment.DurationInputArg1, unit?: moment.unitOfTime.DurationConstructor | undefined) => moment.Duration; subtract: (inp?: moment.DurationInputArg1, unit?: moment.unitOfTime.DurationConstructor | undefined) => moment.Duration; locale: { (): string; (locale: moment.LocaleSpecifier): moment.Duration; }; localeData: () => moment.Locale; toISOString: () => string; toJSON: () => string; isValid: () => boolean; lang: { (locale: moment.LocaleSpecifier): moment.Moment; (): moment.Locale; }; toIsoString: () => string; format: moment.Format; }>; readonly pingTimeout: Readonly<{ clone: () => moment.Duration; humanize: { (argWithSuffix?: boolean | undefined, argThresholds?: moment.argThresholdOpts | undefined): string; (argThresholds?: moment.argThresholdOpts | undefined): string; }; abs: () => moment.Duration; as: (units: moment.unitOfTime.Base) => number; get: (units: moment.unitOfTime.Base) => number; milliseconds: () => number; asMilliseconds: () => number; seconds: () => number; asSeconds: () => number; minutes: () => number; asMinutes: () => number; hours: () => number; asHours: () => number; days: () => number; asDays: () => number; weeks: () => number; asWeeks: () => number; months: () => number; asMonths: () => number; years: () => number; asYears: () => number; add: (inp?: moment.DurationInputArg1, unit?: moment.unitOfTime.DurationConstructor | undefined) => moment.Duration; subtract: (inp?: moment.DurationInputArg1, unit?: moment.unitOfTime.DurationConstructor | undefined) => moment.Duration; locale: { (): string; (locale: moment.LocaleSpecifier): moment.Duration; }; localeData: () => moment.Locale; toISOString: () => string; toJSON: () => string; isValid: () => boolean; lang: { (locale: moment.LocaleSpecifier): moment.Moment; (): moment.Locale; }; toIsoString: () => string; format: moment.Format; }>; }>; path: Readonly<{ readonly data: string; }>; savedObjects: Readonly<{ readonly maxImportPayloadBytes: Readonly<{ isGreaterThan: (other: ", + " | undefined) => string; }>; }>; }>>; get: () => Readonly<{ elasticsearch: Readonly<{ readonly shardTimeout: Readonly<{ clone: () => moment.Duration; humanize: { (argWithSuffix?: boolean | undefined, argThresholds?: moment.argThresholdOpts | undefined): string; (argThresholds?: moment.argThresholdOpts | undefined): string; }; abs: () => moment.Duration; as: (units: moment.unitOfTime.Base) => number; get: (units: moment.unitOfTime.Base) => number; milliseconds: () => number; asMilliseconds: () => number; seconds: () => number; asSeconds: () => number; minutes: () => number; asMinutes: () => number; hours: () => number; asHours: () => number; days: () => number; asDays: () => number; weeks: () => number; asWeeks: () => number; months: () => number; asMonths: () => number; years: () => number; asYears: () => number; add: (inp?: moment.DurationInputArg1, unit?: moment.unitOfTime.DurationConstructor | undefined) => moment.Duration; subtract: (inp?: moment.DurationInputArg1, unit?: moment.unitOfTime.DurationConstructor | undefined) => moment.Duration; locale: { (): string; (locale: moment.LocaleSpecifier): moment.Duration; }; localeData: () => moment.Locale; toISOString: () => string; toJSON: () => string; isValid: () => boolean; lang: { (locale: moment.LocaleSpecifier): moment.Moment; (): moment.Locale; }; toIsoString: () => string; format: moment.Format; }>; readonly requestTimeout: Readonly<{ clone: () => moment.Duration; humanize: { (argWithSuffix?: boolean | undefined, argThresholds?: moment.argThresholdOpts | undefined): string; (argThresholds?: moment.argThresholdOpts | undefined): string; }; abs: () => moment.Duration; as: (units: moment.unitOfTime.Base) => number; get: (units: moment.unitOfTime.Base) => number; milliseconds: () => number; asMilliseconds: () => number; seconds: () => number; asSeconds: () => number; minutes: () => number; asMinutes: () => number; hours: () => number; asHours: () => number; days: () => number; asDays: () => number; weeks: () => number; asWeeks: () => number; months: () => number; asMonths: () => number; years: () => number; asYears: () => number; add: (inp?: moment.DurationInputArg1, unit?: moment.unitOfTime.DurationConstructor | undefined) => moment.Duration; subtract: (inp?: moment.DurationInputArg1, unit?: moment.unitOfTime.DurationConstructor | undefined) => moment.Duration; locale: { (): string; (locale: moment.LocaleSpecifier): moment.Duration; }; localeData: () => moment.Locale; toISOString: () => string; toJSON: () => string; isValid: () => boolean; lang: { (locale: moment.LocaleSpecifier): moment.Moment; (): moment.Locale; }; toIsoString: () => string; format: moment.Format; }>; readonly pingTimeout: Readonly<{ clone: () => moment.Duration; humanize: { (argWithSuffix?: boolean | undefined, argThresholds?: moment.argThresholdOpts | undefined): string; (argThresholds?: moment.argThresholdOpts | undefined): string; }; abs: () => moment.Duration; as: (units: moment.unitOfTime.Base) => number; get: (units: moment.unitOfTime.Base) => number; milliseconds: () => number; asMilliseconds: () => number; seconds: () => number; asSeconds: () => number; minutes: () => number; asMinutes: () => number; hours: () => number; asHours: () => number; days: () => number; asDays: () => number; weeks: () => number; asWeeks: () => number; months: () => number; asMonths: () => number; years: () => number; asYears: () => number; add: (inp?: moment.DurationInputArg1, unit?: moment.unitOfTime.DurationConstructor | undefined) => moment.Duration; subtract: (inp?: moment.DurationInputArg1, unit?: moment.unitOfTime.DurationConstructor | undefined) => moment.Duration; locale: { (): string; (locale: moment.LocaleSpecifier): moment.Duration; }; localeData: () => moment.Locale; toISOString: () => string; toJSON: () => string; isValid: () => boolean; lang: { (locale: moment.LocaleSpecifier): moment.Moment; (): moment.Locale; }; toIsoString: () => string; format: moment.Format; }>; }>; path: Readonly<{ readonly data: string; }>; savedObjects: Readonly<{ readonly maxImportPayloadBytes: Readonly<{ isGreaterThan: (other: ", { "pluginId": "@kbn/config-schema", "scope": "common", @@ -1285,7 +1285,7 @@ "label": "SharedGlobalConfig", "description": [], "signature": [ - "{ readonly elasticsearch: Readonly<{ readonly requestTimeout: Readonly<{ clone: () => moment.Duration; humanize: { (argWithSuffix?: boolean | undefined, argThresholds?: moment.argThresholdOpts | undefined): string; (argThresholds?: moment.argThresholdOpts | undefined): string; }; abs: () => moment.Duration; as: (units: moment.unitOfTime.Base) => number; get: (units: moment.unitOfTime.Base) => number; milliseconds: () => number; asMilliseconds: () => number; seconds: () => number; asSeconds: () => number; minutes: () => number; asMinutes: () => number; hours: () => number; asHours: () => number; days: () => number; asDays: () => number; weeks: () => number; asWeeks: () => number; months: () => number; asMonths: () => number; years: () => number; asYears: () => number; add: (inp?: moment.DurationInputArg1, unit?: moment.unitOfTime.DurationConstructor | undefined) => moment.Duration; subtract: (inp?: moment.DurationInputArg1, unit?: moment.unitOfTime.DurationConstructor | undefined) => moment.Duration; locale: { (): string; (locale: moment.LocaleSpecifier): moment.Duration; }; localeData: () => moment.Locale; toISOString: () => string; toJSON: () => string; isValid: () => boolean; lang: { (locale: moment.LocaleSpecifier): moment.Moment; (): moment.Locale; }; toIsoString: () => string; format: moment.Format; }>; readonly shardTimeout: Readonly<{ clone: () => moment.Duration; humanize: { (argWithSuffix?: boolean | undefined, argThresholds?: moment.argThresholdOpts | undefined): string; (argThresholds?: moment.argThresholdOpts | undefined): string; }; abs: () => moment.Duration; as: (units: moment.unitOfTime.Base) => number; get: (units: moment.unitOfTime.Base) => number; milliseconds: () => number; asMilliseconds: () => number; seconds: () => number; asSeconds: () => number; minutes: () => number; asMinutes: () => number; hours: () => number; asHours: () => number; days: () => number; asDays: () => number; weeks: () => number; asWeeks: () => number; months: () => number; asMonths: () => number; years: () => number; asYears: () => number; add: (inp?: moment.DurationInputArg1, unit?: moment.unitOfTime.DurationConstructor | undefined) => moment.Duration; subtract: (inp?: moment.DurationInputArg1, unit?: moment.unitOfTime.DurationConstructor | undefined) => moment.Duration; locale: { (): string; (locale: moment.LocaleSpecifier): moment.Duration; }; localeData: () => moment.Locale; toISOString: () => string; toJSON: () => string; isValid: () => boolean; lang: { (locale: moment.LocaleSpecifier): moment.Moment; (): moment.Locale; }; toIsoString: () => string; format: moment.Format; }>; readonly pingTimeout: Readonly<{ clone: () => moment.Duration; humanize: { (argWithSuffix?: boolean | undefined, argThresholds?: moment.argThresholdOpts | undefined): string; (argThresholds?: moment.argThresholdOpts | undefined): string; }; abs: () => moment.Duration; as: (units: moment.unitOfTime.Base) => number; get: (units: moment.unitOfTime.Base) => number; milliseconds: () => number; asMilliseconds: () => number; seconds: () => number; asSeconds: () => number; minutes: () => number; asMinutes: () => number; hours: () => number; asHours: () => number; days: () => number; asDays: () => number; weeks: () => number; asWeeks: () => number; months: () => number; asMonths: () => number; years: () => number; asYears: () => number; add: (inp?: moment.DurationInputArg1, unit?: moment.unitOfTime.DurationConstructor | undefined) => moment.Duration; subtract: (inp?: moment.DurationInputArg1, unit?: moment.unitOfTime.DurationConstructor | undefined) => moment.Duration; locale: { (): string; (locale: moment.LocaleSpecifier): moment.Duration; }; localeData: () => moment.Locale; toISOString: () => string; toJSON: () => string; isValid: () => boolean; lang: { (locale: moment.LocaleSpecifier): moment.Moment; (): moment.Locale; }; toIsoString: () => string; format: moment.Format; }>; }>; readonly path: Readonly<{ readonly data: string; }>; readonly savedObjects: Readonly<{ readonly maxImportPayloadBytes: Readonly<{ isGreaterThan: (other: ", + "{ readonly elasticsearch: Readonly<{ readonly shardTimeout: Readonly<{ clone: () => moment.Duration; humanize: { (argWithSuffix?: boolean | undefined, argThresholds?: moment.argThresholdOpts | undefined): string; (argThresholds?: moment.argThresholdOpts | undefined): string; }; abs: () => moment.Duration; as: (units: moment.unitOfTime.Base) => number; get: (units: moment.unitOfTime.Base) => number; milliseconds: () => number; asMilliseconds: () => number; seconds: () => number; asSeconds: () => number; minutes: () => number; asMinutes: () => number; hours: () => number; asHours: () => number; days: () => number; asDays: () => number; weeks: () => number; asWeeks: () => number; months: () => number; asMonths: () => number; years: () => number; asYears: () => number; add: (inp?: moment.DurationInputArg1, unit?: moment.unitOfTime.DurationConstructor | undefined) => moment.Duration; subtract: (inp?: moment.DurationInputArg1, unit?: moment.unitOfTime.DurationConstructor | undefined) => moment.Duration; locale: { (): string; (locale: moment.LocaleSpecifier): moment.Duration; }; localeData: () => moment.Locale; toISOString: () => string; toJSON: () => string; isValid: () => boolean; lang: { (locale: moment.LocaleSpecifier): moment.Moment; (): moment.Locale; }; toIsoString: () => string; format: moment.Format; }>; readonly requestTimeout: Readonly<{ clone: () => moment.Duration; humanize: { (argWithSuffix?: boolean | undefined, argThresholds?: moment.argThresholdOpts | undefined): string; (argThresholds?: moment.argThresholdOpts | undefined): string; }; abs: () => moment.Duration; as: (units: moment.unitOfTime.Base) => number; get: (units: moment.unitOfTime.Base) => number; milliseconds: () => number; asMilliseconds: () => number; seconds: () => number; asSeconds: () => number; minutes: () => number; asMinutes: () => number; hours: () => number; asHours: () => number; days: () => number; asDays: () => number; weeks: () => number; asWeeks: () => number; months: () => number; asMonths: () => number; years: () => number; asYears: () => number; add: (inp?: moment.DurationInputArg1, unit?: moment.unitOfTime.DurationConstructor | undefined) => moment.Duration; subtract: (inp?: moment.DurationInputArg1, unit?: moment.unitOfTime.DurationConstructor | undefined) => moment.Duration; locale: { (): string; (locale: moment.LocaleSpecifier): moment.Duration; }; localeData: () => moment.Locale; toISOString: () => string; toJSON: () => string; isValid: () => boolean; lang: { (locale: moment.LocaleSpecifier): moment.Moment; (): moment.Locale; }; toIsoString: () => string; format: moment.Format; }>; readonly pingTimeout: Readonly<{ clone: () => moment.Duration; humanize: { (argWithSuffix?: boolean | undefined, argThresholds?: moment.argThresholdOpts | undefined): string; (argThresholds?: moment.argThresholdOpts | undefined): string; }; abs: () => moment.Duration; as: (units: moment.unitOfTime.Base) => number; get: (units: moment.unitOfTime.Base) => number; milliseconds: () => number; asMilliseconds: () => number; seconds: () => number; asSeconds: () => number; minutes: () => number; asMinutes: () => number; hours: () => number; asHours: () => number; days: () => number; asDays: () => number; weeks: () => number; asWeeks: () => number; months: () => number; asMonths: () => number; years: () => number; asYears: () => number; add: (inp?: moment.DurationInputArg1, unit?: moment.unitOfTime.DurationConstructor | undefined) => moment.Duration; subtract: (inp?: moment.DurationInputArg1, unit?: moment.unitOfTime.DurationConstructor | undefined) => moment.Duration; locale: { (): string; (locale: moment.LocaleSpecifier): moment.Duration; }; localeData: () => moment.Locale; toISOString: () => string; toJSON: () => string; isValid: () => boolean; lang: { (locale: moment.LocaleSpecifier): moment.Moment; (): moment.Locale; }; toIsoString: () => string; format: moment.Format; }>; }>; readonly path: Readonly<{ readonly data: string; }>; readonly savedObjects: Readonly<{ readonly maxImportPayloadBytes: Readonly<{ isGreaterThan: (other: ", { "pluginId": "@kbn/config-schema", "scope": "common", diff --git a/api_docs/kbn_core_plugins_server.mdx b/api_docs/kbn_core_plugins_server.mdx index cc38691bbb838..26c802e93d312 100644 --- a/api_docs/kbn_core_plugins_server.mdx +++ b/api_docs/kbn_core_plugins_server.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-plugins-server title: "@kbn/core-plugins-server" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-plugins-server plugin -date: 2024-05-06 +date: 2024-05-07 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-plugins-server'] --- import kbnCorePluginsServerObj from './kbn_core_plugins_server.devdocs.json'; diff --git a/api_docs/kbn_core_plugins_server_mocks.mdx b/api_docs/kbn_core_plugins_server_mocks.mdx index a51129c15d708..63256fcde9daf 100644 --- a/api_docs/kbn_core_plugins_server_mocks.mdx +++ b/api_docs/kbn_core_plugins_server_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-plugins-server-mocks title: "@kbn/core-plugins-server-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-plugins-server-mocks plugin -date: 2024-05-06 +date: 2024-05-07 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-plugins-server-mocks'] --- import kbnCorePluginsServerMocksObj from './kbn_core_plugins_server_mocks.devdocs.json'; diff --git a/api_docs/kbn_core_preboot_server.mdx b/api_docs/kbn_core_preboot_server.mdx index 19a17e85d37f3..91e9ca68ce61d 100644 --- a/api_docs/kbn_core_preboot_server.mdx +++ b/api_docs/kbn_core_preboot_server.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-preboot-server title: "@kbn/core-preboot-server" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-preboot-server plugin -date: 2024-05-06 +date: 2024-05-07 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 33f23a14c5580..3f3e2c3d33de8 100644 --- a/api_docs/kbn_core_preboot_server_mocks.mdx +++ b/api_docs/kbn_core_preboot_server_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-preboot-server-mocks title: "@kbn/core-preboot-server-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-preboot-server-mocks plugin -date: 2024-05-06 +date: 2024-05-07 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 1e0e1b6a7f55d..12bf72a718b45 100644 --- a/api_docs/kbn_core_rendering_browser_mocks.mdx +++ b/api_docs/kbn_core_rendering_browser_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-rendering-browser-mocks title: "@kbn/core-rendering-browser-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-rendering-browser-mocks plugin -date: 2024-05-06 +date: 2024-05-07 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-rendering-browser-mocks'] --- import kbnCoreRenderingBrowserMocksObj from './kbn_core_rendering_browser_mocks.devdocs.json'; diff --git a/api_docs/kbn_core_rendering_server_internal.mdx b/api_docs/kbn_core_rendering_server_internal.mdx index f2b46a6881f19..1be26734e441b 100644 --- a/api_docs/kbn_core_rendering_server_internal.mdx +++ b/api_docs/kbn_core_rendering_server_internal.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-rendering-server-internal title: "@kbn/core-rendering-server-internal" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-rendering-server-internal plugin -date: 2024-05-06 +date: 2024-05-07 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-rendering-server-internal'] --- import kbnCoreRenderingServerInternalObj from './kbn_core_rendering_server_internal.devdocs.json'; diff --git a/api_docs/kbn_core_rendering_server_mocks.mdx b/api_docs/kbn_core_rendering_server_mocks.mdx index f2472b6e48ee6..47eb336e59c5f 100644 --- a/api_docs/kbn_core_rendering_server_mocks.mdx +++ b/api_docs/kbn_core_rendering_server_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-rendering-server-mocks title: "@kbn/core-rendering-server-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-rendering-server-mocks plugin -date: 2024-05-06 +date: 2024-05-07 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-rendering-server-mocks'] --- import kbnCoreRenderingServerMocksObj from './kbn_core_rendering_server_mocks.devdocs.json'; diff --git a/api_docs/kbn_core_root_server_internal.mdx b/api_docs/kbn_core_root_server_internal.mdx index ae67ba27724aa..60d21e5d11b1a 100644 --- a/api_docs/kbn_core_root_server_internal.mdx +++ b/api_docs/kbn_core_root_server_internal.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-root-server-internal title: "@kbn/core-root-server-internal" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-root-server-internal plugin -date: 2024-05-06 +date: 2024-05-07 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-root-server-internal'] --- import kbnCoreRootServerInternalObj from './kbn_core_root_server_internal.devdocs.json'; diff --git a/api_docs/kbn_core_saved_objects_api_browser.mdx b/api_docs/kbn_core_saved_objects_api_browser.mdx index e06735c97fdbb..8cfb5551e4319 100644 --- a/api_docs/kbn_core_saved_objects_api_browser.mdx +++ b/api_docs/kbn_core_saved_objects_api_browser.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-saved-objects-api-browser title: "@kbn/core-saved-objects-api-browser" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-saved-objects-api-browser plugin -date: 2024-05-06 +date: 2024-05-07 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 bb4378eadc76d..bff3e351aacf1 100644 --- a/api_docs/kbn_core_saved_objects_api_server.mdx +++ b/api_docs/kbn_core_saved_objects_api_server.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-saved-objects-api-server title: "@kbn/core-saved-objects-api-server" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-saved-objects-api-server plugin -date: 2024-05-06 +date: 2024-05-07 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-saved-objects-api-server'] --- import kbnCoreSavedObjectsApiServerObj from './kbn_core_saved_objects_api_server.devdocs.json'; diff --git a/api_docs/kbn_core_saved_objects_api_server_mocks.mdx b/api_docs/kbn_core_saved_objects_api_server_mocks.mdx index 5b75c3023f6ab..5b6252a72eb7b 100644 --- a/api_docs/kbn_core_saved_objects_api_server_mocks.mdx +++ b/api_docs/kbn_core_saved_objects_api_server_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-saved-objects-api-server-mocks title: "@kbn/core-saved-objects-api-server-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-saved-objects-api-server-mocks plugin -date: 2024-05-06 +date: 2024-05-07 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 93f2c1060b190..6e9dfefc016a9 100644 --- a/api_docs/kbn_core_saved_objects_base_server_internal.mdx +++ b/api_docs/kbn_core_saved_objects_base_server_internal.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-saved-objects-base-server-internal title: "@kbn/core-saved-objects-base-server-internal" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-saved-objects-base-server-internal plugin -date: 2024-05-06 +date: 2024-05-07 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 07c3849ccff85..46153a7c92c50 100644 --- a/api_docs/kbn_core_saved_objects_base_server_mocks.mdx +++ b/api_docs/kbn_core_saved_objects_base_server_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-saved-objects-base-server-mocks title: "@kbn/core-saved-objects-base-server-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-saved-objects-base-server-mocks plugin -date: 2024-05-06 +date: 2024-05-07 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 5a44952788449..ed96521a7a0fd 100644 --- a/api_docs/kbn_core_saved_objects_browser.mdx +++ b/api_docs/kbn_core_saved_objects_browser.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-saved-objects-browser title: "@kbn/core-saved-objects-browser" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-saved-objects-browser plugin -date: 2024-05-06 +date: 2024-05-07 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 b7be04c13a6ce..f497c99ebd54d 100644 --- a/api_docs/kbn_core_saved_objects_browser_internal.mdx +++ b/api_docs/kbn_core_saved_objects_browser_internal.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-saved-objects-browser-internal title: "@kbn/core-saved-objects-browser-internal" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-saved-objects-browser-internal plugin -date: 2024-05-06 +date: 2024-05-07 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 6f6b0f6bbb7b3..45446d76e681a 100644 --- a/api_docs/kbn_core_saved_objects_browser_mocks.mdx +++ b/api_docs/kbn_core_saved_objects_browser_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-saved-objects-browser-mocks title: "@kbn/core-saved-objects-browser-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-saved-objects-browser-mocks plugin -date: 2024-05-06 +date: 2024-05-07 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 257ca3b7da962..658758ec98cd8 100644 --- a/api_docs/kbn_core_saved_objects_common.mdx +++ b/api_docs/kbn_core_saved_objects_common.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-saved-objects-common title: "@kbn/core-saved-objects-common" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-saved-objects-common plugin -date: 2024-05-06 +date: 2024-05-07 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 50a7ff20c624a..a3107684dd170 100644 --- a/api_docs/kbn_core_saved_objects_import_export_server_internal.mdx +++ b/api_docs/kbn_core_saved_objects_import_export_server_internal.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-saved-objects-import-export-server-internal title: "@kbn/core-saved-objects-import-export-server-internal" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-saved-objects-import-export-server-internal plugin -date: 2024-05-06 +date: 2024-05-07 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 dc337e01a36ea..5ae2533ce628c 100644 --- a/api_docs/kbn_core_saved_objects_import_export_server_mocks.mdx +++ b/api_docs/kbn_core_saved_objects_import_export_server_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-saved-objects-import-export-server-mocks title: "@kbn/core-saved-objects-import-export-server-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-saved-objects-import-export-server-mocks plugin -date: 2024-05-06 +date: 2024-05-07 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 41fb3833ab207..bd4c3e6c84740 100644 --- a/api_docs/kbn_core_saved_objects_migration_server_internal.mdx +++ b/api_docs/kbn_core_saved_objects_migration_server_internal.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-saved-objects-migration-server-internal title: "@kbn/core-saved-objects-migration-server-internal" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-saved-objects-migration-server-internal plugin -date: 2024-05-06 +date: 2024-05-07 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 6b4d296b2269c..a07cf1a5c663b 100644 --- a/api_docs/kbn_core_saved_objects_migration_server_mocks.mdx +++ b/api_docs/kbn_core_saved_objects_migration_server_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-saved-objects-migration-server-mocks title: "@kbn/core-saved-objects-migration-server-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-saved-objects-migration-server-mocks plugin -date: 2024-05-06 +date: 2024-05-07 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 1c37c674251b2..775198e8d9e16 100644 --- a/api_docs/kbn_core_saved_objects_server.mdx +++ b/api_docs/kbn_core_saved_objects_server.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-saved-objects-server title: "@kbn/core-saved-objects-server" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-saved-objects-server plugin -date: 2024-05-06 +date: 2024-05-07 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 fc673edc2237d..97718171290bb 100644 --- a/api_docs/kbn_core_saved_objects_server_internal.mdx +++ b/api_docs/kbn_core_saved_objects_server_internal.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-saved-objects-server-internal title: "@kbn/core-saved-objects-server-internal" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-saved-objects-server-internal plugin -date: 2024-05-06 +date: 2024-05-07 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 ff3e1586ddfd9..30aeaf880df63 100644 --- a/api_docs/kbn_core_saved_objects_server_mocks.mdx +++ b/api_docs/kbn_core_saved_objects_server_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-saved-objects-server-mocks title: "@kbn/core-saved-objects-server-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-saved-objects-server-mocks plugin -date: 2024-05-06 +date: 2024-05-07 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 f115e3d4fb826..3e290eadd5335 100644 --- a/api_docs/kbn_core_saved_objects_utils_server.mdx +++ b/api_docs/kbn_core_saved_objects_utils_server.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-saved-objects-utils-server title: "@kbn/core-saved-objects-utils-server" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-saved-objects-utils-server plugin -date: 2024-05-06 +date: 2024-05-07 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-saved-objects-utils-server'] --- import kbnCoreSavedObjectsUtilsServerObj from './kbn_core_saved_objects_utils_server.devdocs.json'; diff --git a/api_docs/kbn_core_security_browser.mdx b/api_docs/kbn_core_security_browser.mdx index a7de3d3fa2e03..fea553ee4c729 100644 --- a/api_docs/kbn_core_security_browser.mdx +++ b/api_docs/kbn_core_security_browser.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-security-browser title: "@kbn/core-security-browser" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-security-browser plugin -date: 2024-05-06 +date: 2024-05-07 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-security-browser'] --- import kbnCoreSecurityBrowserObj from './kbn_core_security_browser.devdocs.json'; diff --git a/api_docs/kbn_core_security_browser_internal.mdx b/api_docs/kbn_core_security_browser_internal.mdx index 1c6a82a269a8a..6d5253870f398 100644 --- a/api_docs/kbn_core_security_browser_internal.mdx +++ b/api_docs/kbn_core_security_browser_internal.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-security-browser-internal title: "@kbn/core-security-browser-internal" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-security-browser-internal plugin -date: 2024-05-06 +date: 2024-05-07 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-security-browser-internal'] --- import kbnCoreSecurityBrowserInternalObj from './kbn_core_security_browser_internal.devdocs.json'; diff --git a/api_docs/kbn_core_security_browser_mocks.mdx b/api_docs/kbn_core_security_browser_mocks.mdx index 5d210e729f92a..90e4e92e72c64 100644 --- a/api_docs/kbn_core_security_browser_mocks.mdx +++ b/api_docs/kbn_core_security_browser_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-security-browser-mocks title: "@kbn/core-security-browser-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-security-browser-mocks plugin -date: 2024-05-06 +date: 2024-05-07 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-security-browser-mocks'] --- import kbnCoreSecurityBrowserMocksObj from './kbn_core_security_browser_mocks.devdocs.json'; diff --git a/api_docs/kbn_core_security_common.mdx b/api_docs/kbn_core_security_common.mdx index 310912ee46299..e3ac95d15116b 100644 --- a/api_docs/kbn_core_security_common.mdx +++ b/api_docs/kbn_core_security_common.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-security-common title: "@kbn/core-security-common" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-security-common plugin -date: 2024-05-06 +date: 2024-05-07 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-security-common'] --- import kbnCoreSecurityCommonObj from './kbn_core_security_common.devdocs.json'; diff --git a/api_docs/kbn_core_security_server.mdx b/api_docs/kbn_core_security_server.mdx index ee15f57320883..f822d67bd3c27 100644 --- a/api_docs/kbn_core_security_server.mdx +++ b/api_docs/kbn_core_security_server.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-security-server title: "@kbn/core-security-server" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-security-server plugin -date: 2024-05-06 +date: 2024-05-07 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-security-server'] --- import kbnCoreSecurityServerObj from './kbn_core_security_server.devdocs.json'; diff --git a/api_docs/kbn_core_security_server_internal.mdx b/api_docs/kbn_core_security_server_internal.mdx index 95a030beaf4b8..93916c6b37a70 100644 --- a/api_docs/kbn_core_security_server_internal.mdx +++ b/api_docs/kbn_core_security_server_internal.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-security-server-internal title: "@kbn/core-security-server-internal" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-security-server-internal plugin -date: 2024-05-06 +date: 2024-05-07 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-security-server-internal'] --- import kbnCoreSecurityServerInternalObj from './kbn_core_security_server_internal.devdocs.json'; diff --git a/api_docs/kbn_core_security_server_mocks.mdx b/api_docs/kbn_core_security_server_mocks.mdx index 4efa4716816fb..4e81859a099a6 100644 --- a/api_docs/kbn_core_security_server_mocks.mdx +++ b/api_docs/kbn_core_security_server_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-security-server-mocks title: "@kbn/core-security-server-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-security-server-mocks plugin -date: 2024-05-06 +date: 2024-05-07 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-security-server-mocks'] --- import kbnCoreSecurityServerMocksObj from './kbn_core_security_server_mocks.devdocs.json'; diff --git a/api_docs/kbn_core_status_common.mdx b/api_docs/kbn_core_status_common.mdx index b9daca78bda20..d6894bc522924 100644 --- a/api_docs/kbn_core_status_common.mdx +++ b/api_docs/kbn_core_status_common.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-status-common title: "@kbn/core-status-common" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-status-common plugin -date: 2024-05-06 +date: 2024-05-07 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 ce997b3e56b81..80366eb669e24 100644 --- a/api_docs/kbn_core_status_common_internal.mdx +++ b/api_docs/kbn_core_status_common_internal.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-status-common-internal title: "@kbn/core-status-common-internal" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-status-common-internal plugin -date: 2024-05-06 +date: 2024-05-07 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 4e19bf206c358..ab997b690b3d4 100644 --- a/api_docs/kbn_core_status_server.mdx +++ b/api_docs/kbn_core_status_server.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-status-server title: "@kbn/core-status-server" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-status-server plugin -date: 2024-05-06 +date: 2024-05-07 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 9709b22cbe738..adae7cfe81e23 100644 --- a/api_docs/kbn_core_status_server_internal.mdx +++ b/api_docs/kbn_core_status_server_internal.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-status-server-internal title: "@kbn/core-status-server-internal" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-status-server-internal plugin -date: 2024-05-06 +date: 2024-05-07 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 19d5948c5dd74..e42291004607f 100644 --- a/api_docs/kbn_core_status_server_mocks.mdx +++ b/api_docs/kbn_core_status_server_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-status-server-mocks title: "@kbn/core-status-server-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-status-server-mocks plugin -date: 2024-05-06 +date: 2024-05-07 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 0165cdfc937a2..a3aa65b563a5a 100644 --- a/api_docs/kbn_core_test_helpers_deprecations_getters.mdx +++ b/api_docs/kbn_core_test_helpers_deprecations_getters.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-test-helpers-deprecations-getters title: "@kbn/core-test-helpers-deprecations-getters" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-test-helpers-deprecations-getters plugin -date: 2024-05-06 +date: 2024-05-07 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 f969e1bd2a20d..68dd6cee71bb0 100644 --- a/api_docs/kbn_core_test_helpers_http_setup_browser.mdx +++ b/api_docs/kbn_core_test_helpers_http_setup_browser.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-test-helpers-http-setup-browser title: "@kbn/core-test-helpers-http-setup-browser" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-test-helpers-http-setup-browser plugin -date: 2024-05-06 +date: 2024-05-07 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-test-helpers-http-setup-browser'] --- import kbnCoreTestHelpersHttpSetupBrowserObj from './kbn_core_test_helpers_http_setup_browser.devdocs.json'; diff --git a/api_docs/kbn_core_test_helpers_kbn_server.mdx b/api_docs/kbn_core_test_helpers_kbn_server.mdx index a134001742210..91f3f12052938 100644 --- a/api_docs/kbn_core_test_helpers_kbn_server.mdx +++ b/api_docs/kbn_core_test_helpers_kbn_server.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-test-helpers-kbn-server title: "@kbn/core-test-helpers-kbn-server" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-test-helpers-kbn-server plugin -date: 2024-05-06 +date: 2024-05-07 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-test-helpers-kbn-server'] --- import kbnCoreTestHelpersKbnServerObj from './kbn_core_test_helpers_kbn_server.devdocs.json'; diff --git a/api_docs/kbn_core_test_helpers_model_versions.mdx b/api_docs/kbn_core_test_helpers_model_versions.mdx index 1802f6068f7ca..2cb0927c100c3 100644 --- a/api_docs/kbn_core_test_helpers_model_versions.mdx +++ b/api_docs/kbn_core_test_helpers_model_versions.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-test-helpers-model-versions title: "@kbn/core-test-helpers-model-versions" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-test-helpers-model-versions plugin -date: 2024-05-06 +date: 2024-05-07 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-test-helpers-model-versions'] --- import kbnCoreTestHelpersModelVersionsObj from './kbn_core_test_helpers_model_versions.devdocs.json'; diff --git a/api_docs/kbn_core_test_helpers_so_type_serializer.mdx b/api_docs/kbn_core_test_helpers_so_type_serializer.mdx index 69161336d824d..ecacd4381559d 100644 --- a/api_docs/kbn_core_test_helpers_so_type_serializer.mdx +++ b/api_docs/kbn_core_test_helpers_so_type_serializer.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-test-helpers-so-type-serializer title: "@kbn/core-test-helpers-so-type-serializer" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-test-helpers-so-type-serializer plugin -date: 2024-05-06 +date: 2024-05-07 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-test-helpers-so-type-serializer'] --- import kbnCoreTestHelpersSoTypeSerializerObj from './kbn_core_test_helpers_so_type_serializer.devdocs.json'; diff --git a/api_docs/kbn_core_test_helpers_test_utils.mdx b/api_docs/kbn_core_test_helpers_test_utils.mdx index 3ae9b3ac37b3f..f443a3ec751fb 100644 --- a/api_docs/kbn_core_test_helpers_test_utils.mdx +++ b/api_docs/kbn_core_test_helpers_test_utils.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-test-helpers-test-utils title: "@kbn/core-test-helpers-test-utils" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-test-helpers-test-utils plugin -date: 2024-05-06 +date: 2024-05-07 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-test-helpers-test-utils'] --- import kbnCoreTestHelpersTestUtilsObj from './kbn_core_test_helpers_test_utils.devdocs.json'; diff --git a/api_docs/kbn_core_theme_browser.mdx b/api_docs/kbn_core_theme_browser.mdx index 2e87a7a8a7f94..04e598d8aaa27 100644 --- a/api_docs/kbn_core_theme_browser.mdx +++ b/api_docs/kbn_core_theme_browser.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-theme-browser title: "@kbn/core-theme-browser" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-theme-browser plugin -date: 2024-05-06 +date: 2024-05-07 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-theme-browser'] --- import kbnCoreThemeBrowserObj from './kbn_core_theme_browser.devdocs.json'; diff --git a/api_docs/kbn_core_theme_browser_mocks.mdx b/api_docs/kbn_core_theme_browser_mocks.mdx index 9552b3616e07f..ed84d8dcac5c9 100644 --- a/api_docs/kbn_core_theme_browser_mocks.mdx +++ b/api_docs/kbn_core_theme_browser_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-theme-browser-mocks title: "@kbn/core-theme-browser-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-theme-browser-mocks plugin -date: 2024-05-06 +date: 2024-05-07 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 812e1bb2db4c8..b901959b636fb 100644 --- a/api_docs/kbn_core_ui_settings_browser.mdx +++ b/api_docs/kbn_core_ui_settings_browser.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-ui-settings-browser title: "@kbn/core-ui-settings-browser" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-ui-settings-browser plugin -date: 2024-05-06 +date: 2024-05-07 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 e1bb7155ef1d5..521e929ad34a7 100644 --- a/api_docs/kbn_core_ui_settings_browser_internal.mdx +++ b/api_docs/kbn_core_ui_settings_browser_internal.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-ui-settings-browser-internal title: "@kbn/core-ui-settings-browser-internal" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-ui-settings-browser-internal plugin -date: 2024-05-06 +date: 2024-05-07 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 8dd7e3b786f1b..3223832c86c00 100644 --- a/api_docs/kbn_core_ui_settings_browser_mocks.mdx +++ b/api_docs/kbn_core_ui_settings_browser_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-ui-settings-browser-mocks title: "@kbn/core-ui-settings-browser-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-ui-settings-browser-mocks plugin -date: 2024-05-06 +date: 2024-05-07 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 fb497b83c8508..5f6fabfda9648 100644 --- a/api_docs/kbn_core_ui_settings_common.mdx +++ b/api_docs/kbn_core_ui_settings_common.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-ui-settings-common title: "@kbn/core-ui-settings-common" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-ui-settings-common plugin -date: 2024-05-06 +date: 2024-05-07 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 6e4535e755767..bc00a1294bc20 100644 --- a/api_docs/kbn_core_ui_settings_server.mdx +++ b/api_docs/kbn_core_ui_settings_server.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-ui-settings-server title: "@kbn/core-ui-settings-server" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-ui-settings-server plugin -date: 2024-05-06 +date: 2024-05-07 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 fbd628e68db83..e3a50f01181b7 100644 --- a/api_docs/kbn_core_ui_settings_server_internal.mdx +++ b/api_docs/kbn_core_ui_settings_server_internal.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-ui-settings-server-internal title: "@kbn/core-ui-settings-server-internal" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-ui-settings-server-internal plugin -date: 2024-05-06 +date: 2024-05-07 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 ccd501052f76b..2fabb0ab3056e 100644 --- a/api_docs/kbn_core_ui_settings_server_mocks.mdx +++ b/api_docs/kbn_core_ui_settings_server_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-ui-settings-server-mocks title: "@kbn/core-ui-settings-server-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-ui-settings-server-mocks plugin -date: 2024-05-06 +date: 2024-05-07 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 5c6e081394321..1da8755a95730 100644 --- a/api_docs/kbn_core_usage_data_server.mdx +++ b/api_docs/kbn_core_usage_data_server.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-usage-data-server title: "@kbn/core-usage-data-server" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-usage-data-server plugin -date: 2024-05-06 +date: 2024-05-07 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 6f8402990befd..4c7af548bd012 100644 --- a/api_docs/kbn_core_usage_data_server_internal.mdx +++ b/api_docs/kbn_core_usage_data_server_internal.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-usage-data-server-internal title: "@kbn/core-usage-data-server-internal" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-usage-data-server-internal plugin -date: 2024-05-06 +date: 2024-05-07 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 69070d77bfa4d..f468c07f6f5b2 100644 --- a/api_docs/kbn_core_usage_data_server_mocks.mdx +++ b/api_docs/kbn_core_usage_data_server_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-usage-data-server-mocks title: "@kbn/core-usage-data-server-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-usage-data-server-mocks plugin -date: 2024-05-06 +date: 2024-05-07 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-usage-data-server-mocks'] --- import kbnCoreUsageDataServerMocksObj from './kbn_core_usage_data_server_mocks.devdocs.json'; diff --git a/api_docs/kbn_core_user_profile_browser.mdx b/api_docs/kbn_core_user_profile_browser.mdx index 04a57f8ba1604..293d453a4c0a9 100644 --- a/api_docs/kbn_core_user_profile_browser.mdx +++ b/api_docs/kbn_core_user_profile_browser.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-user-profile-browser title: "@kbn/core-user-profile-browser" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-user-profile-browser plugin -date: 2024-05-06 +date: 2024-05-07 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-user-profile-browser'] --- import kbnCoreUserProfileBrowserObj from './kbn_core_user_profile_browser.devdocs.json'; diff --git a/api_docs/kbn_core_user_profile_browser_internal.mdx b/api_docs/kbn_core_user_profile_browser_internal.mdx index 2e0ffc34911d8..f9955e6d69480 100644 --- a/api_docs/kbn_core_user_profile_browser_internal.mdx +++ b/api_docs/kbn_core_user_profile_browser_internal.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-user-profile-browser-internal title: "@kbn/core-user-profile-browser-internal" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-user-profile-browser-internal plugin -date: 2024-05-06 +date: 2024-05-07 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-user-profile-browser-internal'] --- import kbnCoreUserProfileBrowserInternalObj from './kbn_core_user_profile_browser_internal.devdocs.json'; diff --git a/api_docs/kbn_core_user_profile_browser_mocks.mdx b/api_docs/kbn_core_user_profile_browser_mocks.mdx index 07c5002dfa7fb..014759817f97d 100644 --- a/api_docs/kbn_core_user_profile_browser_mocks.mdx +++ b/api_docs/kbn_core_user_profile_browser_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-user-profile-browser-mocks title: "@kbn/core-user-profile-browser-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-user-profile-browser-mocks plugin -date: 2024-05-06 +date: 2024-05-07 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-user-profile-browser-mocks'] --- import kbnCoreUserProfileBrowserMocksObj from './kbn_core_user_profile_browser_mocks.devdocs.json'; diff --git a/api_docs/kbn_core_user_profile_common.mdx b/api_docs/kbn_core_user_profile_common.mdx index 9d7a978714b2b..8223dd75ed68e 100644 --- a/api_docs/kbn_core_user_profile_common.mdx +++ b/api_docs/kbn_core_user_profile_common.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-user-profile-common title: "@kbn/core-user-profile-common" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-user-profile-common plugin -date: 2024-05-06 +date: 2024-05-07 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-user-profile-common'] --- import kbnCoreUserProfileCommonObj from './kbn_core_user_profile_common.devdocs.json'; diff --git a/api_docs/kbn_core_user_profile_server.mdx b/api_docs/kbn_core_user_profile_server.mdx index 512ea9e7f6cd3..a5fa7fd756b6d 100644 --- a/api_docs/kbn_core_user_profile_server.mdx +++ b/api_docs/kbn_core_user_profile_server.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-user-profile-server title: "@kbn/core-user-profile-server" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-user-profile-server plugin -date: 2024-05-06 +date: 2024-05-07 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-user-profile-server'] --- import kbnCoreUserProfileServerObj from './kbn_core_user_profile_server.devdocs.json'; diff --git a/api_docs/kbn_core_user_profile_server_internal.mdx b/api_docs/kbn_core_user_profile_server_internal.mdx index b0f8d04fec13c..16640334ae503 100644 --- a/api_docs/kbn_core_user_profile_server_internal.mdx +++ b/api_docs/kbn_core_user_profile_server_internal.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-user-profile-server-internal title: "@kbn/core-user-profile-server-internal" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-user-profile-server-internal plugin -date: 2024-05-06 +date: 2024-05-07 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-user-profile-server-internal'] --- import kbnCoreUserProfileServerInternalObj from './kbn_core_user_profile_server_internal.devdocs.json'; diff --git a/api_docs/kbn_core_user_profile_server_mocks.mdx b/api_docs/kbn_core_user_profile_server_mocks.mdx index 478d3e5ee56e7..cc8b820894fed 100644 --- a/api_docs/kbn_core_user_profile_server_mocks.mdx +++ b/api_docs/kbn_core_user_profile_server_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-user-profile-server-mocks title: "@kbn/core-user-profile-server-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-user-profile-server-mocks plugin -date: 2024-05-06 +date: 2024-05-07 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-user-profile-server-mocks'] --- import kbnCoreUserProfileServerMocksObj from './kbn_core_user_profile_server_mocks.devdocs.json'; diff --git a/api_docs/kbn_core_user_settings_server.mdx b/api_docs/kbn_core_user_settings_server.mdx index 820dbb335f433..2bea4cbb475ab 100644 --- a/api_docs/kbn_core_user_settings_server.mdx +++ b/api_docs/kbn_core_user_settings_server.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-user-settings-server title: "@kbn/core-user-settings-server" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-user-settings-server plugin -date: 2024-05-06 +date: 2024-05-07 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-user-settings-server'] --- import kbnCoreUserSettingsServerObj from './kbn_core_user_settings_server.devdocs.json'; diff --git a/api_docs/kbn_core_user_settings_server_mocks.mdx b/api_docs/kbn_core_user_settings_server_mocks.mdx index cf495eca51d36..4253348adf2a1 100644 --- a/api_docs/kbn_core_user_settings_server_mocks.mdx +++ b/api_docs/kbn_core_user_settings_server_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-user-settings-server-mocks title: "@kbn/core-user-settings-server-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-user-settings-server-mocks plugin -date: 2024-05-06 +date: 2024-05-07 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-user-settings-server-mocks'] --- import kbnCoreUserSettingsServerMocksObj from './kbn_core_user_settings_server_mocks.devdocs.json'; diff --git a/api_docs/kbn_crypto.mdx b/api_docs/kbn_crypto.mdx index b917b3c2ddd8a..ee8ca515ae636 100644 --- a/api_docs/kbn_crypto.mdx +++ b/api_docs/kbn_crypto.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-crypto title: "@kbn/crypto" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/crypto plugin -date: 2024-05-06 +date: 2024-05-07 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 b90269f277bc3..e4c196f364214 100644 --- a/api_docs/kbn_crypto_browser.mdx +++ b/api_docs/kbn_crypto_browser.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-crypto-browser title: "@kbn/crypto-browser" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/crypto-browser plugin -date: 2024-05-06 +date: 2024-05-07 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/crypto-browser'] --- import kbnCryptoBrowserObj from './kbn_crypto_browser.devdocs.json'; diff --git a/api_docs/kbn_custom_icons.mdx b/api_docs/kbn_custom_icons.mdx index 8c26e4b54da23..1934481f20189 100644 --- a/api_docs/kbn_custom_icons.mdx +++ b/api_docs/kbn_custom_icons.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-custom-icons title: "@kbn/custom-icons" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/custom-icons plugin -date: 2024-05-06 +date: 2024-05-07 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/custom-icons'] --- import kbnCustomIconsObj from './kbn_custom_icons.devdocs.json'; diff --git a/api_docs/kbn_custom_integrations.mdx b/api_docs/kbn_custom_integrations.mdx index 67a86f5f16410..93c782565e195 100644 --- a/api_docs/kbn_custom_integrations.mdx +++ b/api_docs/kbn_custom_integrations.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-custom-integrations title: "@kbn/custom-integrations" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/custom-integrations plugin -date: 2024-05-06 +date: 2024-05-07 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/custom-integrations'] --- import kbnCustomIntegrationsObj from './kbn_custom_integrations.devdocs.json'; diff --git a/api_docs/kbn_cypress_config.mdx b/api_docs/kbn_cypress_config.mdx index 3109582a6ba43..c7b5867db054c 100644 --- a/api_docs/kbn_cypress_config.mdx +++ b/api_docs/kbn_cypress_config.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-cypress-config title: "@kbn/cypress-config" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/cypress-config plugin -date: 2024-05-06 +date: 2024-05-07 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/cypress-config'] --- import kbnCypressConfigObj from './kbn_cypress_config.devdocs.json'; diff --git a/api_docs/kbn_data_forge.mdx b/api_docs/kbn_data_forge.mdx index feb37fcd4a09e..6661861ca3309 100644 --- a/api_docs/kbn_data_forge.mdx +++ b/api_docs/kbn_data_forge.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-data-forge title: "@kbn/data-forge" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/data-forge plugin -date: 2024-05-06 +date: 2024-05-07 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/data-forge'] --- import kbnDataForgeObj from './kbn_data_forge.devdocs.json'; diff --git a/api_docs/kbn_data_service.mdx b/api_docs/kbn_data_service.mdx index 93b51c32f271a..da59b16111878 100644 --- a/api_docs/kbn_data_service.mdx +++ b/api_docs/kbn_data_service.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-data-service title: "@kbn/data-service" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/data-service plugin -date: 2024-05-06 +date: 2024-05-07 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/data-service'] --- import kbnDataServiceObj from './kbn_data_service.devdocs.json'; diff --git a/api_docs/kbn_data_stream_adapter.mdx b/api_docs/kbn_data_stream_adapter.mdx index eecc34cfd400a..85f4cc6b3df41 100644 --- a/api_docs/kbn_data_stream_adapter.mdx +++ b/api_docs/kbn_data_stream_adapter.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-data-stream-adapter title: "@kbn/data-stream-adapter" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/data-stream-adapter plugin -date: 2024-05-06 +date: 2024-05-07 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/data-stream-adapter'] --- import kbnDataStreamAdapterObj from './kbn_data_stream_adapter.devdocs.json'; diff --git a/api_docs/kbn_data_view_utils.mdx b/api_docs/kbn_data_view_utils.mdx index 7f72624e9b526..be97f21de2266 100644 --- a/api_docs/kbn_data_view_utils.mdx +++ b/api_docs/kbn_data_view_utils.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-data-view-utils title: "@kbn/data-view-utils" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/data-view-utils plugin -date: 2024-05-06 +date: 2024-05-07 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/data-view-utils'] --- import kbnDataViewUtilsObj from './kbn_data_view_utils.devdocs.json'; diff --git a/api_docs/kbn_datemath.mdx b/api_docs/kbn_datemath.mdx index 953def3a022cf..6a85ba8261699 100644 --- a/api_docs/kbn_datemath.mdx +++ b/api_docs/kbn_datemath.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-datemath title: "@kbn/datemath" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/datemath plugin -date: 2024-05-06 +date: 2024-05-07 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/datemath'] --- import kbnDatemathObj from './kbn_datemath.devdocs.json'; diff --git a/api_docs/kbn_deeplinks_analytics.mdx b/api_docs/kbn_deeplinks_analytics.mdx index 624bc803c91fa..c44d5c5bc9acf 100644 --- a/api_docs/kbn_deeplinks_analytics.mdx +++ b/api_docs/kbn_deeplinks_analytics.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-deeplinks-analytics title: "@kbn/deeplinks-analytics" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/deeplinks-analytics plugin -date: 2024-05-06 +date: 2024-05-07 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/deeplinks-analytics'] --- import kbnDeeplinksAnalyticsObj from './kbn_deeplinks_analytics.devdocs.json'; diff --git a/api_docs/kbn_deeplinks_devtools.mdx b/api_docs/kbn_deeplinks_devtools.mdx index 7823bf7450ba3..b82ff7391f4d3 100644 --- a/api_docs/kbn_deeplinks_devtools.mdx +++ b/api_docs/kbn_deeplinks_devtools.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-deeplinks-devtools title: "@kbn/deeplinks-devtools" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/deeplinks-devtools plugin -date: 2024-05-06 +date: 2024-05-07 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/deeplinks-devtools'] --- import kbnDeeplinksDevtoolsObj from './kbn_deeplinks_devtools.devdocs.json'; diff --git a/api_docs/kbn_deeplinks_fleet.mdx b/api_docs/kbn_deeplinks_fleet.mdx index 4d0666f647faa..cb67f297f14c3 100644 --- a/api_docs/kbn_deeplinks_fleet.mdx +++ b/api_docs/kbn_deeplinks_fleet.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-deeplinks-fleet title: "@kbn/deeplinks-fleet" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/deeplinks-fleet plugin -date: 2024-05-06 +date: 2024-05-07 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/deeplinks-fleet'] --- import kbnDeeplinksFleetObj from './kbn_deeplinks_fleet.devdocs.json'; diff --git a/api_docs/kbn_deeplinks_management.mdx b/api_docs/kbn_deeplinks_management.mdx index 5e0d20899efce..f3d12f6c2f38e 100644 --- a/api_docs/kbn_deeplinks_management.mdx +++ b/api_docs/kbn_deeplinks_management.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-deeplinks-management title: "@kbn/deeplinks-management" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/deeplinks-management plugin -date: 2024-05-06 +date: 2024-05-07 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/deeplinks-management'] --- import kbnDeeplinksManagementObj from './kbn_deeplinks_management.devdocs.json'; diff --git a/api_docs/kbn_deeplinks_ml.mdx b/api_docs/kbn_deeplinks_ml.mdx index 13e6fdc4f2670..71375e0e340d2 100644 --- a/api_docs/kbn_deeplinks_ml.mdx +++ b/api_docs/kbn_deeplinks_ml.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-deeplinks-ml title: "@kbn/deeplinks-ml" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/deeplinks-ml plugin -date: 2024-05-06 +date: 2024-05-07 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/deeplinks-ml'] --- import kbnDeeplinksMlObj from './kbn_deeplinks_ml.devdocs.json'; diff --git a/api_docs/kbn_deeplinks_observability.mdx b/api_docs/kbn_deeplinks_observability.mdx index 9119e91a60f35..bef17babdb5ce 100644 --- a/api_docs/kbn_deeplinks_observability.mdx +++ b/api_docs/kbn_deeplinks_observability.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-deeplinks-observability title: "@kbn/deeplinks-observability" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/deeplinks-observability plugin -date: 2024-05-06 +date: 2024-05-07 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/deeplinks-observability'] --- import kbnDeeplinksObservabilityObj from './kbn_deeplinks_observability.devdocs.json'; diff --git a/api_docs/kbn_deeplinks_search.mdx b/api_docs/kbn_deeplinks_search.mdx index b94ce2ca93cc4..c4a707aa1b263 100644 --- a/api_docs/kbn_deeplinks_search.mdx +++ b/api_docs/kbn_deeplinks_search.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-deeplinks-search title: "@kbn/deeplinks-search" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/deeplinks-search plugin -date: 2024-05-06 +date: 2024-05-07 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/deeplinks-search'] --- import kbnDeeplinksSearchObj from './kbn_deeplinks_search.devdocs.json'; diff --git a/api_docs/kbn_deeplinks_security.mdx b/api_docs/kbn_deeplinks_security.mdx index cdd7abddbe027..f8b42448773ea 100644 --- a/api_docs/kbn_deeplinks_security.mdx +++ b/api_docs/kbn_deeplinks_security.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-deeplinks-security title: "@kbn/deeplinks-security" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/deeplinks-security plugin -date: 2024-05-06 +date: 2024-05-07 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/deeplinks-security'] --- import kbnDeeplinksSecurityObj from './kbn_deeplinks_security.devdocs.json'; diff --git a/api_docs/kbn_deeplinks_shared.mdx b/api_docs/kbn_deeplinks_shared.mdx index 43f640f2bf29e..aac62d905e787 100644 --- a/api_docs/kbn_deeplinks_shared.mdx +++ b/api_docs/kbn_deeplinks_shared.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-deeplinks-shared title: "@kbn/deeplinks-shared" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/deeplinks-shared plugin -date: 2024-05-06 +date: 2024-05-07 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/deeplinks-shared'] --- import kbnDeeplinksSharedObj from './kbn_deeplinks_shared.devdocs.json'; diff --git a/api_docs/kbn_default_nav_analytics.mdx b/api_docs/kbn_default_nav_analytics.mdx index 54b4dae91e645..4e1422f660776 100644 --- a/api_docs/kbn_default_nav_analytics.mdx +++ b/api_docs/kbn_default_nav_analytics.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-default-nav-analytics title: "@kbn/default-nav-analytics" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/default-nav-analytics plugin -date: 2024-05-06 +date: 2024-05-07 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/default-nav-analytics'] --- import kbnDefaultNavAnalyticsObj from './kbn_default_nav_analytics.devdocs.json'; diff --git a/api_docs/kbn_default_nav_devtools.mdx b/api_docs/kbn_default_nav_devtools.mdx index 32a64921ec3d8..1255037e3c734 100644 --- a/api_docs/kbn_default_nav_devtools.mdx +++ b/api_docs/kbn_default_nav_devtools.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-default-nav-devtools title: "@kbn/default-nav-devtools" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/default-nav-devtools plugin -date: 2024-05-06 +date: 2024-05-07 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/default-nav-devtools'] --- import kbnDefaultNavDevtoolsObj from './kbn_default_nav_devtools.devdocs.json'; diff --git a/api_docs/kbn_default_nav_management.mdx b/api_docs/kbn_default_nav_management.mdx index a8d33f2f391cd..cfb352467c529 100644 --- a/api_docs/kbn_default_nav_management.mdx +++ b/api_docs/kbn_default_nav_management.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-default-nav-management title: "@kbn/default-nav-management" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/default-nav-management plugin -date: 2024-05-06 +date: 2024-05-07 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/default-nav-management'] --- import kbnDefaultNavManagementObj from './kbn_default_nav_management.devdocs.json'; diff --git a/api_docs/kbn_default_nav_ml.mdx b/api_docs/kbn_default_nav_ml.mdx index 8b219686c5783..2a177fd433180 100644 --- a/api_docs/kbn_default_nav_ml.mdx +++ b/api_docs/kbn_default_nav_ml.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-default-nav-ml title: "@kbn/default-nav-ml" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/default-nav-ml plugin -date: 2024-05-06 +date: 2024-05-07 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/default-nav-ml'] --- import kbnDefaultNavMlObj from './kbn_default_nav_ml.devdocs.json'; diff --git a/api_docs/kbn_dev_cli_errors.mdx b/api_docs/kbn_dev_cli_errors.mdx index 946c15fd9fdf7..b5d4de09efc4d 100644 --- a/api_docs/kbn_dev_cli_errors.mdx +++ b/api_docs/kbn_dev_cli_errors.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-dev-cli-errors title: "@kbn/dev-cli-errors" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/dev-cli-errors plugin -date: 2024-05-06 +date: 2024-05-07 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 b35ff786ae1ca..858efcb781cc6 100644 --- a/api_docs/kbn_dev_cli_runner.mdx +++ b/api_docs/kbn_dev_cli_runner.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-dev-cli-runner title: "@kbn/dev-cli-runner" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/dev-cli-runner plugin -date: 2024-05-06 +date: 2024-05-07 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 13ada6e7c678e..9f884edc2f3b4 100644 --- a/api_docs/kbn_dev_proc_runner.mdx +++ b/api_docs/kbn_dev_proc_runner.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-dev-proc-runner title: "@kbn/dev-proc-runner" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/dev-proc-runner plugin -date: 2024-05-06 +date: 2024-05-07 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 9cad77187b968..fa145b0254209 100644 --- a/api_docs/kbn_dev_utils.mdx +++ b/api_docs/kbn_dev_utils.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-dev-utils title: "@kbn/dev-utils" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/dev-utils plugin -date: 2024-05-06 +date: 2024-05-07 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/dev-utils'] --- import kbnDevUtilsObj from './kbn_dev_utils.devdocs.json'; diff --git a/api_docs/kbn_discover_utils.mdx b/api_docs/kbn_discover_utils.mdx index 04e043e1da456..9a6460e6b0621 100644 --- a/api_docs/kbn_discover_utils.mdx +++ b/api_docs/kbn_discover_utils.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-discover-utils title: "@kbn/discover-utils" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/discover-utils plugin -date: 2024-05-06 +date: 2024-05-07 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/discover-utils'] --- import kbnDiscoverUtilsObj from './kbn_discover_utils.devdocs.json'; diff --git a/api_docs/kbn_doc_links.mdx b/api_docs/kbn_doc_links.mdx index 7898719de430b..2b41c1fd52be0 100644 --- a/api_docs/kbn_doc_links.mdx +++ b/api_docs/kbn_doc_links.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-doc-links title: "@kbn/doc-links" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/doc-links plugin -date: 2024-05-06 +date: 2024-05-07 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 1c929bafba9ad..e72dac1c4f4b2 100644 --- a/api_docs/kbn_docs_utils.mdx +++ b/api_docs/kbn_docs_utils.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-docs-utils title: "@kbn/docs-utils" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/docs-utils plugin -date: 2024-05-06 +date: 2024-05-07 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/docs-utils'] --- import kbnDocsUtilsObj from './kbn_docs_utils.devdocs.json'; diff --git a/api_docs/kbn_dom_drag_drop.mdx b/api_docs/kbn_dom_drag_drop.mdx index e27ae0b79a759..5987b877f4e45 100644 --- a/api_docs/kbn_dom_drag_drop.mdx +++ b/api_docs/kbn_dom_drag_drop.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-dom-drag-drop title: "@kbn/dom-drag-drop" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/dom-drag-drop plugin -date: 2024-05-06 +date: 2024-05-07 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/dom-drag-drop'] --- import kbnDomDragDropObj from './kbn_dom_drag_drop.devdocs.json'; diff --git a/api_docs/kbn_ebt_tools.mdx b/api_docs/kbn_ebt_tools.mdx index 2d60b867b1b9e..df23414027d21 100644 --- a/api_docs/kbn_ebt_tools.mdx +++ b/api_docs/kbn_ebt_tools.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-ebt-tools title: "@kbn/ebt-tools" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/ebt-tools plugin -date: 2024-05-06 +date: 2024-05-07 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/ebt-tools'] --- import kbnEbtToolsObj from './kbn_ebt_tools.devdocs.json'; diff --git a/api_docs/kbn_ecs_data_quality_dashboard.mdx b/api_docs/kbn_ecs_data_quality_dashboard.mdx index ef9e8e6bff630..bf45e7d61ad6c 100644 --- a/api_docs/kbn_ecs_data_quality_dashboard.mdx +++ b/api_docs/kbn_ecs_data_quality_dashboard.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-ecs-data-quality-dashboard title: "@kbn/ecs-data-quality-dashboard" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/ecs-data-quality-dashboard plugin -date: 2024-05-06 +date: 2024-05-07 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/ecs-data-quality-dashboard'] --- import kbnEcsDataQualityDashboardObj from './kbn_ecs_data_quality_dashboard.devdocs.json'; diff --git a/api_docs/kbn_elastic_agent_utils.mdx b/api_docs/kbn_elastic_agent_utils.mdx index dbf7eda425f2c..7fa5ef3f3c913 100644 --- a/api_docs/kbn_elastic_agent_utils.mdx +++ b/api_docs/kbn_elastic_agent_utils.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-elastic-agent-utils title: "@kbn/elastic-agent-utils" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/elastic-agent-utils plugin -date: 2024-05-06 +date: 2024-05-07 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/elastic-agent-utils'] --- import kbnElasticAgentUtilsObj from './kbn_elastic_agent_utils.devdocs.json'; diff --git a/api_docs/kbn_elastic_assistant.mdx b/api_docs/kbn_elastic_assistant.mdx index a143e09478b97..f783c38853d0e 100644 --- a/api_docs/kbn_elastic_assistant.mdx +++ b/api_docs/kbn_elastic_assistant.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-elastic-assistant title: "@kbn/elastic-assistant" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/elastic-assistant plugin -date: 2024-05-06 +date: 2024-05-07 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/elastic-assistant'] --- import kbnElasticAssistantObj from './kbn_elastic_assistant.devdocs.json'; diff --git a/api_docs/kbn_elastic_assistant_common.mdx b/api_docs/kbn_elastic_assistant_common.mdx index 457890d11cedc..68564211be097 100644 --- a/api_docs/kbn_elastic_assistant_common.mdx +++ b/api_docs/kbn_elastic_assistant_common.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-elastic-assistant-common title: "@kbn/elastic-assistant-common" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/elastic-assistant-common plugin -date: 2024-05-06 +date: 2024-05-07 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/elastic-assistant-common'] --- import kbnElasticAssistantCommonObj from './kbn_elastic_assistant_common.devdocs.json'; diff --git a/api_docs/kbn_es.mdx b/api_docs/kbn_es.mdx index 62bad6209ec17..4c04657d76e3d 100644 --- a/api_docs/kbn_es.mdx +++ b/api_docs/kbn_es.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-es title: "@kbn/es" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/es plugin -date: 2024-05-06 +date: 2024-05-07 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/es'] --- import kbnEsObj from './kbn_es.devdocs.json'; diff --git a/api_docs/kbn_es_archiver.mdx b/api_docs/kbn_es_archiver.mdx index 24b4f9b43eac8..0172274ac1f35 100644 --- a/api_docs/kbn_es_archiver.mdx +++ b/api_docs/kbn_es_archiver.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-es-archiver title: "@kbn/es-archiver" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/es-archiver plugin -date: 2024-05-06 +date: 2024-05-07 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 da348a607361e..9e4a0c62db92c 100644 --- a/api_docs/kbn_es_errors.mdx +++ b/api_docs/kbn_es_errors.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-es-errors title: "@kbn/es-errors" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/es-errors plugin -date: 2024-05-06 +date: 2024-05-07 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 4635b574bcb82..4c19b964bad33 100644 --- a/api_docs/kbn_es_query.mdx +++ b/api_docs/kbn_es_query.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-es-query title: "@kbn/es-query" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/es-query plugin -date: 2024-05-06 +date: 2024-05-07 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 0811cc27d1ee0..bf08d8e9f2b16 100644 --- a/api_docs/kbn_es_types.mdx +++ b/api_docs/kbn_es_types.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-es-types title: "@kbn/es-types" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/es-types plugin -date: 2024-05-06 +date: 2024-05-07 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 8a7da6cc3d36f..ca85bf47ca96c 100644 --- a/api_docs/kbn_eslint_plugin_imports.mdx +++ b/api_docs/kbn_eslint_plugin_imports.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-eslint-plugin-imports title: "@kbn/eslint-plugin-imports" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/eslint-plugin-imports plugin -date: 2024-05-06 +date: 2024-05-07 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/eslint-plugin-imports'] --- import kbnEslintPluginImportsObj from './kbn_eslint_plugin_imports.devdocs.json'; diff --git a/api_docs/kbn_esql_ast.mdx b/api_docs/kbn_esql_ast.mdx index 023850ec9ab08..53abd297b3814 100644 --- a/api_docs/kbn_esql_ast.mdx +++ b/api_docs/kbn_esql_ast.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-esql-ast title: "@kbn/esql-ast" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/esql-ast plugin -date: 2024-05-06 +date: 2024-05-07 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/esql-ast'] --- import kbnEsqlAstObj from './kbn_esql_ast.devdocs.json'; diff --git a/api_docs/kbn_esql_utils.devdocs.json b/api_docs/kbn_esql_utils.devdocs.json index c96dcca210c0b..c8468e95b5a46 100644 --- a/api_docs/kbn_esql_utils.devdocs.json +++ b/api_docs/kbn_esql_utils.devdocs.json @@ -67,6 +67,99 @@ "returnComment": [], "initialIsOpen": false }, + { + "parentPluginId": "@kbn/esql-utils", + "id": "def-common.appendWhereClauseToESQLQuery", + "type": "Function", + "tags": [], + "label": "appendWhereClauseToESQLQuery", + "description": [], + "signature": [ + "(baseESQLQuery: string, field: string, value: unknown, operation: \"+\" | \"-\" | \"_exists_\", fieldType: string | undefined) => string" + ], + "path": "packages/kbn-esql-utils/src/utils/append_to_query.ts", + "deprecated": false, + "trackAdoption": false, + "children": [ + { + "parentPluginId": "@kbn/esql-utils", + "id": "def-common.appendWhereClauseToESQLQuery.$1", + "type": "string", + "tags": [], + "label": "baseESQLQuery", + "description": [], + "signature": [ + "string" + ], + "path": "packages/kbn-esql-utils/src/utils/append_to_query.ts", + "deprecated": false, + "trackAdoption": false, + "isRequired": true + }, + { + "parentPluginId": "@kbn/esql-utils", + "id": "def-common.appendWhereClauseToESQLQuery.$2", + "type": "string", + "tags": [], + "label": "field", + "description": [], + "signature": [ + "string" + ], + "path": "packages/kbn-esql-utils/src/utils/append_to_query.ts", + "deprecated": false, + "trackAdoption": false, + "isRequired": true + }, + { + "parentPluginId": "@kbn/esql-utils", + "id": "def-common.appendWhereClauseToESQLQuery.$3", + "type": "Unknown", + "tags": [], + "label": "value", + "description": [], + "signature": [ + "unknown" + ], + "path": "packages/kbn-esql-utils/src/utils/append_to_query.ts", + "deprecated": false, + "trackAdoption": false, + "isRequired": true + }, + { + "parentPluginId": "@kbn/esql-utils", + "id": "def-common.appendWhereClauseToESQLQuery.$4", + "type": "CompoundType", + "tags": [], + "label": "operation", + "description": [], + "signature": [ + "\"+\" | \"-\" | \"_exists_\"" + ], + "path": "packages/kbn-esql-utils/src/utils/append_to_query.ts", + "deprecated": false, + "trackAdoption": false, + "isRequired": true + }, + { + "parentPluginId": "@kbn/esql-utils", + "id": "def-common.appendWhereClauseToESQLQuery.$5", + "type": "string", + "tags": [], + "label": "fieldType", + "description": [], + "signature": [ + "string | undefined" + ], + "path": "packages/kbn-esql-utils/src/utils/append_to_query.ts", + "deprecated": false, + "trackAdoption": false, + "isRequired": false + } + ], + "returnComment": [], + "initialIsOpen": false + }, { "parentPluginId": "@kbn/esql-utils", "id": "def-common.getESQLAdHocDataview", @@ -137,6 +230,180 @@ "returnComment": [], "initialIsOpen": false }, + { + "parentPluginId": "@kbn/esql-utils", + "id": "def-common.getESQLQueryColumns", + "type": "Function", + "tags": [], + "label": "getESQLQueryColumns", + "description": [], + "signature": [ + "({\n esqlQuery,\n search,\n signal,\n}: { esqlQuery: string; search: ", + { + "pluginId": "@kbn/search-types", + "scope": "common", + "docId": "kibKbnSearchTypesPluginApi", + "section": "def-common.ISearchGeneric", + "text": "ISearchGeneric" + }, + "; signal?: AbortSignal | undefined; }) => Promise<", + { + "pluginId": "expressions", + "scope": "common", + "docId": "kibExpressionsPluginApi", + "section": "def-common.DatatableColumn", + "text": "DatatableColumn" + }, + "[]>" + ], + "path": "packages/kbn-esql-utils/src/utils/run_query.ts", + "deprecated": false, + "trackAdoption": false, + "children": [ + { + "parentPluginId": "@kbn/esql-utils", + "id": "def-common.getESQLQueryColumns.$1", + "type": "Object", + "tags": [], + "label": "{\n esqlQuery,\n search,\n signal,\n}", + "description": [], + "path": "packages/kbn-esql-utils/src/utils/run_query.ts", + "deprecated": false, + "trackAdoption": false, + "children": [ + { + "parentPluginId": "@kbn/esql-utils", + "id": "def-common.getESQLQueryColumns.$1.esqlQuery", + "type": "string", + "tags": [], + "label": "esqlQuery", + "description": [], + "path": "packages/kbn-esql-utils/src/utils/run_query.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/esql-utils", + "id": "def-common.getESQLQueryColumns.$1.search", + "type": "Function", + "tags": [], + "label": "search", + "description": [], + "signature": [ + " = ", + { + "pluginId": "@kbn/search-types", + "scope": "common", + "docId": "kibKbnSearchTypesPluginApi", + "section": "def-common.IEsSearchRequest", + "text": "IEsSearchRequest" + }, + "<", + { + "pluginId": "@kbn/search-types", + "scope": "common", + "docId": "kibKbnSearchTypesPluginApi", + "section": "def-common.ISearchRequestParams", + "text": "ISearchRequestParams" + }, + ">, SearchStrategyResponse extends ", + { + "pluginId": "@kbn/search-types", + "scope": "common", + "docId": "kibKbnSearchTypesPluginApi", + "section": "def-common.IKibanaSearchResponse", + "text": "IKibanaSearchResponse" + }, + " = ", + { + "pluginId": "@kbn/search-types", + "scope": "common", + "docId": "kibKbnSearchTypesPluginApi", + "section": "def-common.IEsSearchResponse", + "text": "IEsSearchResponse" + }, + ">(request: SearchStrategyRequest, options?: ", + { + "pluginId": "@kbn/search-types", + "scope": "common", + "docId": "kibKbnSearchTypesPluginApi", + "section": "def-common.ISearchOptions", + "text": "ISearchOptions" + }, + " | undefined) => ", + "Observable", + "" + ], + "path": "packages/kbn-esql-utils/src/utils/run_query.ts", + "deprecated": false, + "trackAdoption": false, + "returnComment": [], + "children": [ + { + "parentPluginId": "@kbn/esql-utils", + "id": "def-common.getESQLQueryColumns.$1.search.$1", + "type": "Uncategorized", + "tags": [], + "label": "request", + "description": [], + "signature": [ + "SearchStrategyRequest" + ], + "path": "packages/kbn-search-types/src/types.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/esql-utils", + "id": "def-common.getESQLQueryColumns.$1.search.$2", + "type": "Object", + "tags": [], + "label": "options", + "description": [], + "signature": [ + { + "pluginId": "@kbn/search-types", + "scope": "common", + "docId": "kibKbnSearchTypesPluginApi", + "section": "def-common.ISearchOptions", + "text": "ISearchOptions" + }, + " | undefined" + ], + "path": "packages/kbn-search-types/src/types.ts", + "deprecated": false, + "trackAdoption": false + } + ] + }, + { + "parentPluginId": "@kbn/esql-utils", + "id": "def-common.getESQLQueryColumns.$1.signal", + "type": "Object", + "tags": [], + "label": "signal", + "description": [], + "signature": [ + "AbortSignal | undefined" + ], + "path": "packages/kbn-esql-utils/src/utils/run_query.ts", + "deprecated": false, + "trackAdoption": false + } + ] + } + ], + "returnComment": [], + "initialIsOpen": false + }, { "parentPluginId": "@kbn/esql-utils", "id": "def-common.getESQLWithSafeLimit", diff --git a/api_docs/kbn_esql_utils.mdx b/api_docs/kbn_esql_utils.mdx index a2f4402ea34de..b0068228f73ab 100644 --- a/api_docs/kbn_esql_utils.mdx +++ b/api_docs/kbn_esql_utils.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-esql-utils title: "@kbn/esql-utils" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/esql-utils plugin -date: 2024-05-06 +date: 2024-05-07 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/esql-utils'] --- import kbnEsqlUtilsObj from './kbn_esql_utils.devdocs.json'; @@ -21,7 +21,7 @@ Contact [@elastic/kibana-esql](https://github.com/orgs/elastic/teams/kibana-esql | Public API count | Any count | Items lacking comments | Missing exports | |-------------------|-----------|------------------------|-----------------| -| 23 | 0 | 21 | 0 | +| 36 | 0 | 34 | 0 | ## Common diff --git a/api_docs/kbn_esql_validation_autocomplete.mdx b/api_docs/kbn_esql_validation_autocomplete.mdx index 249cb5ed75f3d..8bfb894e34295 100644 --- a/api_docs/kbn_esql_validation_autocomplete.mdx +++ b/api_docs/kbn_esql_validation_autocomplete.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-esql-validation-autocomplete title: "@kbn/esql-validation-autocomplete" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/esql-validation-autocomplete plugin -date: 2024-05-06 +date: 2024-05-07 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/esql-validation-autocomplete'] --- import kbnEsqlValidationAutocompleteObj from './kbn_esql_validation_autocomplete.devdocs.json'; diff --git a/api_docs/kbn_event_annotation_common.mdx b/api_docs/kbn_event_annotation_common.mdx index 522618f72a112..4274cb07349c5 100644 --- a/api_docs/kbn_event_annotation_common.mdx +++ b/api_docs/kbn_event_annotation_common.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-event-annotation-common title: "@kbn/event-annotation-common" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/event-annotation-common plugin -date: 2024-05-06 +date: 2024-05-07 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/event-annotation-common'] --- import kbnEventAnnotationCommonObj from './kbn_event_annotation_common.devdocs.json'; diff --git a/api_docs/kbn_event_annotation_components.mdx b/api_docs/kbn_event_annotation_components.mdx index 8d2d4837ecc8b..bba225b3b9113 100644 --- a/api_docs/kbn_event_annotation_components.mdx +++ b/api_docs/kbn_event_annotation_components.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-event-annotation-components title: "@kbn/event-annotation-components" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/event-annotation-components plugin -date: 2024-05-06 +date: 2024-05-07 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/event-annotation-components'] --- import kbnEventAnnotationComponentsObj from './kbn_event_annotation_components.devdocs.json'; diff --git a/api_docs/kbn_expandable_flyout.mdx b/api_docs/kbn_expandable_flyout.mdx index 70e8f3e01e482..714e799fef65d 100644 --- a/api_docs/kbn_expandable_flyout.mdx +++ b/api_docs/kbn_expandable_flyout.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-expandable-flyout title: "@kbn/expandable-flyout" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/expandable-flyout plugin -date: 2024-05-06 +date: 2024-05-07 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/expandable-flyout'] --- import kbnExpandableFlyoutObj from './kbn_expandable_flyout.devdocs.json'; diff --git a/api_docs/kbn_field_types.mdx b/api_docs/kbn_field_types.mdx index 4a79f85d7e498..d48043e624721 100644 --- a/api_docs/kbn_field_types.mdx +++ b/api_docs/kbn_field_types.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-field-types title: "@kbn/field-types" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/field-types plugin -date: 2024-05-06 +date: 2024-05-07 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/field-types'] --- import kbnFieldTypesObj from './kbn_field_types.devdocs.json'; diff --git a/api_docs/kbn_field_utils.mdx b/api_docs/kbn_field_utils.mdx index 4fb0a35c238be..19033e6ed8232 100644 --- a/api_docs/kbn_field_utils.mdx +++ b/api_docs/kbn_field_utils.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-field-utils title: "@kbn/field-utils" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/field-utils plugin -date: 2024-05-06 +date: 2024-05-07 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/field-utils'] --- import kbnFieldUtilsObj from './kbn_field_utils.devdocs.json'; diff --git a/api_docs/kbn_find_used_node_modules.mdx b/api_docs/kbn_find_used_node_modules.mdx index f6aa92280ce39..4fe930e065ddf 100644 --- a/api_docs/kbn_find_used_node_modules.mdx +++ b/api_docs/kbn_find_used_node_modules.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-find-used-node-modules title: "@kbn/find-used-node-modules" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/find-used-node-modules plugin -date: 2024-05-06 +date: 2024-05-07 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/find-used-node-modules'] --- import kbnFindUsedNodeModulesObj from './kbn_find_used_node_modules.devdocs.json'; diff --git a/api_docs/kbn_formatters.mdx b/api_docs/kbn_formatters.mdx index 54f6fb3e7ff3b..974150a300250 100644 --- a/api_docs/kbn_formatters.mdx +++ b/api_docs/kbn_formatters.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-formatters title: "@kbn/formatters" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/formatters plugin -date: 2024-05-06 +date: 2024-05-07 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/formatters'] --- import kbnFormattersObj from './kbn_formatters.devdocs.json'; diff --git a/api_docs/kbn_ftr_common_functional_services.mdx b/api_docs/kbn_ftr_common_functional_services.mdx index fb4e129fdc4b7..52a2f4632ac70 100644 --- a/api_docs/kbn_ftr_common_functional_services.mdx +++ b/api_docs/kbn_ftr_common_functional_services.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-ftr-common-functional-services title: "@kbn/ftr-common-functional-services" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/ftr-common-functional-services plugin -date: 2024-05-06 +date: 2024-05-07 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/ftr-common-functional-services'] --- import kbnFtrCommonFunctionalServicesObj from './kbn_ftr_common_functional_services.devdocs.json'; diff --git a/api_docs/kbn_ftr_common_functional_ui_services.mdx b/api_docs/kbn_ftr_common_functional_ui_services.mdx index f47c8d0c2ba8b..2a566f77d39c2 100644 --- a/api_docs/kbn_ftr_common_functional_ui_services.mdx +++ b/api_docs/kbn_ftr_common_functional_ui_services.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-ftr-common-functional-ui-services title: "@kbn/ftr-common-functional-ui-services" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/ftr-common-functional-ui-services plugin -date: 2024-05-06 +date: 2024-05-07 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/ftr-common-functional-ui-services'] --- import kbnFtrCommonFunctionalUiServicesObj from './kbn_ftr_common_functional_ui_services.devdocs.json'; diff --git a/api_docs/kbn_generate.mdx b/api_docs/kbn_generate.mdx index a927efa2d702f..3d8c56b579268 100644 --- a/api_docs/kbn_generate.mdx +++ b/api_docs/kbn_generate.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-generate title: "@kbn/generate" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/generate plugin -date: 2024-05-06 +date: 2024-05-07 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/generate'] --- import kbnGenerateObj from './kbn_generate.devdocs.json'; diff --git a/api_docs/kbn_generate_console_definitions.mdx b/api_docs/kbn_generate_console_definitions.mdx index 6edd155471161..8017604180b56 100644 --- a/api_docs/kbn_generate_console_definitions.mdx +++ b/api_docs/kbn_generate_console_definitions.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-generate-console-definitions title: "@kbn/generate-console-definitions" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/generate-console-definitions plugin -date: 2024-05-06 +date: 2024-05-07 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/generate-console-definitions'] --- import kbnGenerateConsoleDefinitionsObj from './kbn_generate_console_definitions.devdocs.json'; diff --git a/api_docs/kbn_generate_csv.mdx b/api_docs/kbn_generate_csv.mdx index 914af1dd7dd06..ee81a66c7b397 100644 --- a/api_docs/kbn_generate_csv.mdx +++ b/api_docs/kbn_generate_csv.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-generate-csv title: "@kbn/generate-csv" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/generate-csv plugin -date: 2024-05-06 +date: 2024-05-07 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/generate-csv'] --- import kbnGenerateCsvObj from './kbn_generate_csv.devdocs.json'; diff --git a/api_docs/kbn_guided_onboarding.mdx b/api_docs/kbn_guided_onboarding.mdx index 8cec7f511e239..ba7e307c03eb4 100644 --- a/api_docs/kbn_guided_onboarding.mdx +++ b/api_docs/kbn_guided_onboarding.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-guided-onboarding title: "@kbn/guided-onboarding" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/guided-onboarding plugin -date: 2024-05-06 +date: 2024-05-07 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/guided-onboarding'] --- import kbnGuidedOnboardingObj from './kbn_guided_onboarding.devdocs.json'; diff --git a/api_docs/kbn_handlebars.mdx b/api_docs/kbn_handlebars.mdx index 114518143d099..134c64a9559e5 100644 --- a/api_docs/kbn_handlebars.mdx +++ b/api_docs/kbn_handlebars.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-handlebars title: "@kbn/handlebars" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/handlebars plugin -date: 2024-05-06 +date: 2024-05-07 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 9da18676fc9e5..d123da471048c 100644 --- a/api_docs/kbn_hapi_mocks.mdx +++ b/api_docs/kbn_hapi_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-hapi-mocks title: "@kbn/hapi-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/hapi-mocks plugin -date: 2024-05-06 +date: 2024-05-07 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/hapi-mocks'] --- import kbnHapiMocksObj from './kbn_hapi_mocks.devdocs.json'; diff --git a/api_docs/kbn_health_gateway_server.mdx b/api_docs/kbn_health_gateway_server.mdx index b743ede5062f5..ab29833bf040d 100644 --- a/api_docs/kbn_health_gateway_server.mdx +++ b/api_docs/kbn_health_gateway_server.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-health-gateway-server title: "@kbn/health-gateway-server" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/health-gateway-server plugin -date: 2024-05-06 +date: 2024-05-07 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/health-gateway-server'] --- import kbnHealthGatewayServerObj from './kbn_health_gateway_server.devdocs.json'; diff --git a/api_docs/kbn_home_sample_data_card.mdx b/api_docs/kbn_home_sample_data_card.mdx index f3aca403306b1..43755d81745de 100644 --- a/api_docs/kbn_home_sample_data_card.mdx +++ b/api_docs/kbn_home_sample_data_card.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-home-sample-data-card title: "@kbn/home-sample-data-card" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/home-sample-data-card plugin -date: 2024-05-06 +date: 2024-05-07 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 ee8fb0e53101c..32d5eaaaa1bd1 100644 --- a/api_docs/kbn_home_sample_data_tab.mdx +++ b/api_docs/kbn_home_sample_data_tab.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-home-sample-data-tab title: "@kbn/home-sample-data-tab" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/home-sample-data-tab plugin -date: 2024-05-06 +date: 2024-05-07 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 970372c0a3fb4..217fb53ff7368 100644 --- a/api_docs/kbn_i18n.mdx +++ b/api_docs/kbn_i18n.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-i18n title: "@kbn/i18n" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/i18n plugin -date: 2024-05-06 +date: 2024-05-07 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/i18n'] --- import kbnI18nObj from './kbn_i18n.devdocs.json'; diff --git a/api_docs/kbn_i18n_react.mdx b/api_docs/kbn_i18n_react.mdx index 8b46090bd01fa..e6ad55496248d 100644 --- a/api_docs/kbn_i18n_react.mdx +++ b/api_docs/kbn_i18n_react.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-i18n-react title: "@kbn/i18n-react" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/i18n-react plugin -date: 2024-05-06 +date: 2024-05-07 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/i18n-react'] --- import kbnI18nReactObj from './kbn_i18n_react.devdocs.json'; diff --git a/api_docs/kbn_import_resolver.mdx b/api_docs/kbn_import_resolver.mdx index 734dec10d3ba8..e2743ce669437 100644 --- a/api_docs/kbn_import_resolver.mdx +++ b/api_docs/kbn_import_resolver.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-import-resolver title: "@kbn/import-resolver" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/import-resolver plugin -date: 2024-05-06 +date: 2024-05-07 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/import-resolver'] --- import kbnImportResolverObj from './kbn_import_resolver.devdocs.json'; diff --git a/api_docs/kbn_index_management.mdx b/api_docs/kbn_index_management.mdx index 8430e417516cb..8438f1095f70b 100644 --- a/api_docs/kbn_index_management.mdx +++ b/api_docs/kbn_index_management.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-index-management title: "@kbn/index-management" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/index-management plugin -date: 2024-05-06 +date: 2024-05-07 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/index-management'] --- import kbnIndexManagementObj from './kbn_index_management.devdocs.json'; diff --git a/api_docs/kbn_inference_integration_flyout.mdx b/api_docs/kbn_inference_integration_flyout.mdx index 7e495fb9f92ea..999af2b0296d1 100644 --- a/api_docs/kbn_inference_integration_flyout.mdx +++ b/api_docs/kbn_inference_integration_flyout.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-inference_integration_flyout title: "@kbn/inference_integration_flyout" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/inference_integration_flyout plugin -date: 2024-05-06 +date: 2024-05-07 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/inference_integration_flyout'] --- import kbnInferenceIntegrationFlyoutObj from './kbn_inference_integration_flyout.devdocs.json'; diff --git a/api_docs/kbn_infra_forge.mdx b/api_docs/kbn_infra_forge.mdx index 88130ef950632..b085079f88481 100644 --- a/api_docs/kbn_infra_forge.mdx +++ b/api_docs/kbn_infra_forge.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-infra-forge title: "@kbn/infra-forge" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/infra-forge plugin -date: 2024-05-06 +date: 2024-05-07 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/infra-forge'] --- import kbnInfraForgeObj from './kbn_infra_forge.devdocs.json'; diff --git a/api_docs/kbn_interpreter.mdx b/api_docs/kbn_interpreter.mdx index 8263dfae4a34a..a775986c7d53e 100644 --- a/api_docs/kbn_interpreter.mdx +++ b/api_docs/kbn_interpreter.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-interpreter title: "@kbn/interpreter" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/interpreter plugin -date: 2024-05-06 +date: 2024-05-07 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 518769edad85e..2b03e86f0830d 100644 --- a/api_docs/kbn_io_ts_utils.mdx +++ b/api_docs/kbn_io_ts_utils.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-io-ts-utils title: "@kbn/io-ts-utils" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/io-ts-utils plugin -date: 2024-05-06 +date: 2024-05-07 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/io-ts-utils'] --- import kbnIoTsUtilsObj from './kbn_io_ts_utils.devdocs.json'; diff --git a/api_docs/kbn_ipynb.mdx b/api_docs/kbn_ipynb.mdx index b7f985e7af673..7482626030ea6 100644 --- a/api_docs/kbn_ipynb.mdx +++ b/api_docs/kbn_ipynb.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-ipynb title: "@kbn/ipynb" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/ipynb plugin -date: 2024-05-06 +date: 2024-05-07 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/ipynb'] --- import kbnIpynbObj from './kbn_ipynb.devdocs.json'; diff --git a/api_docs/kbn_jest_serializers.mdx b/api_docs/kbn_jest_serializers.mdx index 9088e7207f757..c2195c032ec2e 100644 --- a/api_docs/kbn_jest_serializers.mdx +++ b/api_docs/kbn_jest_serializers.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-jest-serializers title: "@kbn/jest-serializers" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/jest-serializers plugin -date: 2024-05-06 +date: 2024-05-07 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 00138d84053a4..70bede53ceeed 100644 --- a/api_docs/kbn_journeys.mdx +++ b/api_docs/kbn_journeys.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-journeys title: "@kbn/journeys" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/journeys plugin -date: 2024-05-06 +date: 2024-05-07 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/journeys'] --- import kbnJourneysObj from './kbn_journeys.devdocs.json'; diff --git a/api_docs/kbn_json_ast.mdx b/api_docs/kbn_json_ast.mdx index 93097f4524e87..39db67150f5b6 100644 --- a/api_docs/kbn_json_ast.mdx +++ b/api_docs/kbn_json_ast.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-json-ast title: "@kbn/json-ast" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/json-ast plugin -date: 2024-05-06 +date: 2024-05-07 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/json-ast'] --- import kbnJsonAstObj from './kbn_json_ast.devdocs.json'; diff --git a/api_docs/kbn_kibana_manifest_schema.mdx b/api_docs/kbn_kibana_manifest_schema.mdx index 6780f396ad21e..f7129239854a8 100644 --- a/api_docs/kbn_kibana_manifest_schema.mdx +++ b/api_docs/kbn_kibana_manifest_schema.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-kibana-manifest-schema title: "@kbn/kibana-manifest-schema" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/kibana-manifest-schema plugin -date: 2024-05-06 +date: 2024-05-07 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/kibana-manifest-schema'] --- import kbnKibanaManifestSchemaObj from './kbn_kibana_manifest_schema.devdocs.json'; diff --git a/api_docs/kbn_language_documentation_popover.mdx b/api_docs/kbn_language_documentation_popover.mdx index c1a14f14e4ef5..4c32c332b5190 100644 --- a/api_docs/kbn_language_documentation_popover.mdx +++ b/api_docs/kbn_language_documentation_popover.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-language-documentation-popover title: "@kbn/language-documentation-popover" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/language-documentation-popover plugin -date: 2024-05-06 +date: 2024-05-07 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/language-documentation-popover'] --- import kbnLanguageDocumentationPopoverObj from './kbn_language_documentation_popover.devdocs.json'; diff --git a/api_docs/kbn_lens_embeddable_utils.mdx b/api_docs/kbn_lens_embeddable_utils.mdx index 8f58d209f90ae..007f047532bf6 100644 --- a/api_docs/kbn_lens_embeddable_utils.mdx +++ b/api_docs/kbn_lens_embeddable_utils.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-lens-embeddable-utils title: "@kbn/lens-embeddable-utils" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/lens-embeddable-utils plugin -date: 2024-05-06 +date: 2024-05-07 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/lens-embeddable-utils'] --- import kbnLensEmbeddableUtilsObj from './kbn_lens_embeddable_utils.devdocs.json'; diff --git a/api_docs/kbn_lens_formula_docs.mdx b/api_docs/kbn_lens_formula_docs.mdx index 883de660fdbe1..b48938bd65d6a 100644 --- a/api_docs/kbn_lens_formula_docs.mdx +++ b/api_docs/kbn_lens_formula_docs.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-lens-formula-docs title: "@kbn/lens-formula-docs" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/lens-formula-docs plugin -date: 2024-05-06 +date: 2024-05-07 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/lens-formula-docs'] --- import kbnLensFormulaDocsObj from './kbn_lens_formula_docs.devdocs.json'; diff --git a/api_docs/kbn_logging.mdx b/api_docs/kbn_logging.mdx index 257e1a56bc391..07863ac75898c 100644 --- a/api_docs/kbn_logging.mdx +++ b/api_docs/kbn_logging.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-logging title: "@kbn/logging" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/logging plugin -date: 2024-05-06 +date: 2024-05-07 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 f863e325272dd..521da338535ad 100644 --- a/api_docs/kbn_logging_mocks.mdx +++ b/api_docs/kbn_logging_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-logging-mocks title: "@kbn/logging-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/logging-mocks plugin -date: 2024-05-06 +date: 2024-05-07 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/logging-mocks'] --- import kbnLoggingMocksObj from './kbn_logging_mocks.devdocs.json'; diff --git a/api_docs/kbn_managed_content_badge.mdx b/api_docs/kbn_managed_content_badge.mdx index 68596564adb0e..edca248e8febf 100644 --- a/api_docs/kbn_managed_content_badge.mdx +++ b/api_docs/kbn_managed_content_badge.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-managed-content-badge title: "@kbn/managed-content-badge" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/managed-content-badge plugin -date: 2024-05-06 +date: 2024-05-07 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/managed-content-badge'] --- import kbnManagedContentBadgeObj from './kbn_managed_content_badge.devdocs.json'; diff --git a/api_docs/kbn_managed_vscode_config.mdx b/api_docs/kbn_managed_vscode_config.mdx index dd752dc01afa7..04a0809b83a8a 100644 --- a/api_docs/kbn_managed_vscode_config.mdx +++ b/api_docs/kbn_managed_vscode_config.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-managed-vscode-config title: "@kbn/managed-vscode-config" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/managed-vscode-config plugin -date: 2024-05-06 +date: 2024-05-07 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/managed-vscode-config'] --- import kbnManagedVscodeConfigObj from './kbn_managed_vscode_config.devdocs.json'; diff --git a/api_docs/kbn_management_cards_navigation.mdx b/api_docs/kbn_management_cards_navigation.mdx index e732d39b741e2..05b4f4de0765f 100644 --- a/api_docs/kbn_management_cards_navigation.mdx +++ b/api_docs/kbn_management_cards_navigation.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-management-cards-navigation title: "@kbn/management-cards-navigation" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/management-cards-navigation plugin -date: 2024-05-06 +date: 2024-05-07 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/management-cards-navigation'] --- import kbnManagementCardsNavigationObj from './kbn_management_cards_navigation.devdocs.json'; diff --git a/api_docs/kbn_management_settings_application.mdx b/api_docs/kbn_management_settings_application.mdx index b1a450ad7f8eb..a3174dfc9a58c 100644 --- a/api_docs/kbn_management_settings_application.mdx +++ b/api_docs/kbn_management_settings_application.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-management-settings-application title: "@kbn/management-settings-application" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/management-settings-application plugin -date: 2024-05-06 +date: 2024-05-07 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/management-settings-application'] --- import kbnManagementSettingsApplicationObj from './kbn_management_settings_application.devdocs.json'; diff --git a/api_docs/kbn_management_settings_components_field_category.mdx b/api_docs/kbn_management_settings_components_field_category.mdx index 6896e1cbdacb5..ee1634f9d9047 100644 --- a/api_docs/kbn_management_settings_components_field_category.mdx +++ b/api_docs/kbn_management_settings_components_field_category.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-management-settings-components-field-category title: "@kbn/management-settings-components-field-category" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/management-settings-components-field-category plugin -date: 2024-05-06 +date: 2024-05-07 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/management-settings-components-field-category'] --- import kbnManagementSettingsComponentsFieldCategoryObj from './kbn_management_settings_components_field_category.devdocs.json'; diff --git a/api_docs/kbn_management_settings_components_field_input.mdx b/api_docs/kbn_management_settings_components_field_input.mdx index 6ecdc484a9dbc..d3b17bee5d9af 100644 --- a/api_docs/kbn_management_settings_components_field_input.mdx +++ b/api_docs/kbn_management_settings_components_field_input.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-management-settings-components-field-input title: "@kbn/management-settings-components-field-input" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/management-settings-components-field-input plugin -date: 2024-05-06 +date: 2024-05-07 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/management-settings-components-field-input'] --- import kbnManagementSettingsComponentsFieldInputObj from './kbn_management_settings_components_field_input.devdocs.json'; diff --git a/api_docs/kbn_management_settings_components_field_row.mdx b/api_docs/kbn_management_settings_components_field_row.mdx index 42df626d29838..ebf7c1a15d28f 100644 --- a/api_docs/kbn_management_settings_components_field_row.mdx +++ b/api_docs/kbn_management_settings_components_field_row.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-management-settings-components-field-row title: "@kbn/management-settings-components-field-row" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/management-settings-components-field-row plugin -date: 2024-05-06 +date: 2024-05-07 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/management-settings-components-field-row'] --- import kbnManagementSettingsComponentsFieldRowObj from './kbn_management_settings_components_field_row.devdocs.json'; diff --git a/api_docs/kbn_management_settings_components_form.mdx b/api_docs/kbn_management_settings_components_form.mdx index 7327aa7e05bcd..924060f1d7883 100644 --- a/api_docs/kbn_management_settings_components_form.mdx +++ b/api_docs/kbn_management_settings_components_form.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-management-settings-components-form title: "@kbn/management-settings-components-form" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/management-settings-components-form plugin -date: 2024-05-06 +date: 2024-05-07 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/management-settings-components-form'] --- import kbnManagementSettingsComponentsFormObj from './kbn_management_settings_components_form.devdocs.json'; diff --git a/api_docs/kbn_management_settings_field_definition.mdx b/api_docs/kbn_management_settings_field_definition.mdx index dcf8f5fbc4fca..fd0247b754e2c 100644 --- a/api_docs/kbn_management_settings_field_definition.mdx +++ b/api_docs/kbn_management_settings_field_definition.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-management-settings-field-definition title: "@kbn/management-settings-field-definition" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/management-settings-field-definition plugin -date: 2024-05-06 +date: 2024-05-07 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/management-settings-field-definition'] --- import kbnManagementSettingsFieldDefinitionObj from './kbn_management_settings_field_definition.devdocs.json'; diff --git a/api_docs/kbn_management_settings_ids.mdx b/api_docs/kbn_management_settings_ids.mdx index 1ee9b8b3bb7e5..d634e0dd0b0b2 100644 --- a/api_docs/kbn_management_settings_ids.mdx +++ b/api_docs/kbn_management_settings_ids.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-management-settings-ids title: "@kbn/management-settings-ids" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/management-settings-ids plugin -date: 2024-05-06 +date: 2024-05-07 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/management-settings-ids'] --- import kbnManagementSettingsIdsObj from './kbn_management_settings_ids.devdocs.json'; diff --git a/api_docs/kbn_management_settings_section_registry.mdx b/api_docs/kbn_management_settings_section_registry.mdx index 4f590e67a27f9..eb94baf88647e 100644 --- a/api_docs/kbn_management_settings_section_registry.mdx +++ b/api_docs/kbn_management_settings_section_registry.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-management-settings-section-registry title: "@kbn/management-settings-section-registry" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/management-settings-section-registry plugin -date: 2024-05-06 +date: 2024-05-07 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/management-settings-section-registry'] --- import kbnManagementSettingsSectionRegistryObj from './kbn_management_settings_section_registry.devdocs.json'; diff --git a/api_docs/kbn_management_settings_types.mdx b/api_docs/kbn_management_settings_types.mdx index 6fb20cd7c43f1..7083722d17330 100644 --- a/api_docs/kbn_management_settings_types.mdx +++ b/api_docs/kbn_management_settings_types.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-management-settings-types title: "@kbn/management-settings-types" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/management-settings-types plugin -date: 2024-05-06 +date: 2024-05-07 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/management-settings-types'] --- import kbnManagementSettingsTypesObj from './kbn_management_settings_types.devdocs.json'; diff --git a/api_docs/kbn_management_settings_utilities.mdx b/api_docs/kbn_management_settings_utilities.mdx index 7b9a2033fe8da..3d0813557f2fe 100644 --- a/api_docs/kbn_management_settings_utilities.mdx +++ b/api_docs/kbn_management_settings_utilities.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-management-settings-utilities title: "@kbn/management-settings-utilities" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/management-settings-utilities plugin -date: 2024-05-06 +date: 2024-05-07 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/management-settings-utilities'] --- import kbnManagementSettingsUtilitiesObj from './kbn_management_settings_utilities.devdocs.json'; diff --git a/api_docs/kbn_management_storybook_config.mdx b/api_docs/kbn_management_storybook_config.mdx index dcb3a9f8dd6bf..d7911002d978d 100644 --- a/api_docs/kbn_management_storybook_config.mdx +++ b/api_docs/kbn_management_storybook_config.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-management-storybook-config title: "@kbn/management-storybook-config" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/management-storybook-config plugin -date: 2024-05-06 +date: 2024-05-07 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/management-storybook-config'] --- import kbnManagementStorybookConfigObj from './kbn_management_storybook_config.devdocs.json'; diff --git a/api_docs/kbn_mapbox_gl.mdx b/api_docs/kbn_mapbox_gl.mdx index 5edc0d8fe83dd..794daff86be13 100644 --- a/api_docs/kbn_mapbox_gl.mdx +++ b/api_docs/kbn_mapbox_gl.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-mapbox-gl title: "@kbn/mapbox-gl" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/mapbox-gl plugin -date: 2024-05-06 +date: 2024-05-07 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/mapbox-gl'] --- import kbnMapboxGlObj from './kbn_mapbox_gl.devdocs.json'; diff --git a/api_docs/kbn_maps_vector_tile_utils.mdx b/api_docs/kbn_maps_vector_tile_utils.mdx index 5bf64bb180c89..d8d7339cf5e78 100644 --- a/api_docs/kbn_maps_vector_tile_utils.mdx +++ b/api_docs/kbn_maps_vector_tile_utils.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-maps-vector-tile-utils title: "@kbn/maps-vector-tile-utils" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/maps-vector-tile-utils plugin -date: 2024-05-06 +date: 2024-05-07 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/maps-vector-tile-utils'] --- import kbnMapsVectorTileUtilsObj from './kbn_maps_vector_tile_utils.devdocs.json'; diff --git a/api_docs/kbn_ml_agg_utils.mdx b/api_docs/kbn_ml_agg_utils.mdx index 3dd840a222309..a932eb64c2e39 100644 --- a/api_docs/kbn_ml_agg_utils.mdx +++ b/api_docs/kbn_ml_agg_utils.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-ml-agg-utils title: "@kbn/ml-agg-utils" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/ml-agg-utils plugin -date: 2024-05-06 +date: 2024-05-07 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/ml-agg-utils'] --- import kbnMlAggUtilsObj from './kbn_ml_agg_utils.devdocs.json'; diff --git a/api_docs/kbn_ml_anomaly_utils.mdx b/api_docs/kbn_ml_anomaly_utils.mdx index 160a069e6ab6d..9c52d95815276 100644 --- a/api_docs/kbn_ml_anomaly_utils.mdx +++ b/api_docs/kbn_ml_anomaly_utils.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-ml-anomaly-utils title: "@kbn/ml-anomaly-utils" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/ml-anomaly-utils plugin -date: 2024-05-06 +date: 2024-05-07 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/ml-anomaly-utils'] --- import kbnMlAnomalyUtilsObj from './kbn_ml_anomaly_utils.devdocs.json'; diff --git a/api_docs/kbn_ml_cancellable_search.devdocs.json b/api_docs/kbn_ml_cancellable_search.devdocs.json index 499b6b7d30191..1f4d3468b63d8 100644 --- a/api_docs/kbn_ml_cancellable_search.devdocs.json +++ b/api_docs/kbn_ml_cancellable_search.devdocs.json @@ -37,9 +37,9 @@ }, ") => { runRequest: ", + { + "pluginId": "@kbn/react-hooks", + "scope": "common", + "docId": "kibKbnReactHooksPluginApi", + "section": "def-common.UseBooleanResult", + "text": "UseBooleanResult" + } + ], + "path": "packages/kbn-react-hooks/src/use_boolean/use_boolean.ts", + "deprecated": false, + "trackAdoption": false, + "children": [ + { + "parentPluginId": "@kbn/react-hooks", + "id": "def-common.useBoolean.$1", + "type": "boolean", + "tags": [], + "label": "initialValue", + "description": [], + "signature": [ + "boolean" + ], + "path": "packages/kbn-react-hooks/src/use_boolean/use_boolean.ts", + "deprecated": false, + "trackAdoption": false, + "isRequired": true + } + ], + "returnComment": [], + "initialIsOpen": false + } + ], + "interfaces": [ + { + "parentPluginId": "@kbn/react-hooks", + "id": "def-common.UseBooleanHandlers", + "type": "Interface", + "tags": [], + "label": "UseBooleanHandlers", + "description": [], + "path": "packages/kbn-react-hooks/src/use_boolean/use_boolean.ts", + "deprecated": false, + "trackAdoption": false, + "children": [ + { + "parentPluginId": "@kbn/react-hooks", + "id": "def-common.UseBooleanHandlers.on", + "type": "Function", + "tags": [], + "label": "on", + "description": [], + "signature": [ + "() => void" + ], + "path": "packages/kbn-react-hooks/src/use_boolean/use_boolean.ts", + "deprecated": false, + "trackAdoption": false, + "returnComment": [], + "children": [] + }, + { + "parentPluginId": "@kbn/react-hooks", + "id": "def-common.UseBooleanHandlers.off", + "type": "Function", + "tags": [], + "label": "off", + "description": [], + "signature": [ + "() => void" + ], + "path": "packages/kbn-react-hooks/src/use_boolean/use_boolean.ts", + "deprecated": false, + "trackAdoption": false, + "returnComment": [], + "children": [] + }, + { + "parentPluginId": "@kbn/react-hooks", + "id": "def-common.UseBooleanHandlers.toggle", + "type": "Function", + "tags": [], + "label": "toggle", + "description": [], + "signature": [ + "(nextValue?: any) => void" + ], + "path": "packages/kbn-react-hooks/src/use_boolean/use_boolean.ts", + "deprecated": false, + "trackAdoption": false, + "returnComment": [], + "children": [ + { + "parentPluginId": "@kbn/react-hooks", + "id": "def-common.UseBooleanHandlers.toggle.$1", + "type": "Any", + "tags": [], + "label": "nextValue", + "description": [], + "signature": [ + "any" + ], + "path": "node_modules/react-use/lib/useToggle.d.ts", + "deprecated": false, + "trackAdoption": false + } + ] + } + ], + "initialIsOpen": false + } + ], + "enums": [], + "misc": [ + { + "parentPluginId": "@kbn/react-hooks", + "id": "def-common.UseBooleanResult", + "type": "Type", + "tags": [], + "label": "UseBooleanResult", + "description": [], + "signature": [ + "[boolean, ", + { + "pluginId": "@kbn/react-hooks", + "scope": "common", + "docId": "kibKbnReactHooksPluginApi", + "section": "def-common.UseBooleanHandlers", + "text": "UseBooleanHandlers" + }, + "]" + ], + "path": "packages/kbn-react-hooks/src/use_boolean/use_boolean.ts", + "deprecated": false, + "trackAdoption": false, + "initialIsOpen": false + } + ], + "objects": [] + } +} \ No newline at end of file diff --git a/api_docs/kbn_react_hooks.mdx b/api_docs/kbn_react_hooks.mdx new file mode 100644 index 0000000000000..d26febe62c660 --- /dev/null +++ b/api_docs/kbn_react_hooks.mdx @@ -0,0 +1,36 @@ +--- +#### +#### This document is auto-generated and is meant to be viewed inside our experimental, new docs system. +#### Reach out in #docs-engineering for more info. +#### +id: kibKbnReactHooksPluginApi +slug: /kibana-dev-docs/api/kbn-react-hooks +title: "@kbn/react-hooks" +image: https://source.unsplash.com/400x175/?github +description: API docs for the @kbn/react-hooks plugin +date: 2024-05-07 +tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/react-hooks'] +--- +import kbnReactHooksObj from './kbn_react_hooks.devdocs.json'; + + + +Contact [@elastic/obs-ux-logs-team](https://github.com/orgs/elastic/teams/obs-ux-logs-team) for questions regarding this plugin. + +**Code health stats** + +| Public API count | Any count | Items lacking comments | Missing exports | +|-------------------|-----------|------------------------|-----------------| +| 8 | 0 | 7 | 0 | + +## Common + +### Functions + + +### Interfaces + + +### Consts, variables and types + + diff --git a/api_docs/kbn_react_kibana_context_common.mdx b/api_docs/kbn_react_kibana_context_common.mdx index f24d57fa16f7d..ad6b96c26a7f4 100644 --- a/api_docs/kbn_react_kibana_context_common.mdx +++ b/api_docs/kbn_react_kibana_context_common.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-react-kibana-context-common title: "@kbn/react-kibana-context-common" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/react-kibana-context-common plugin -date: 2024-05-06 +date: 2024-05-07 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/react-kibana-context-common'] --- import kbnReactKibanaContextCommonObj from './kbn_react_kibana_context_common.devdocs.json'; diff --git a/api_docs/kbn_react_kibana_context_render.mdx b/api_docs/kbn_react_kibana_context_render.mdx index e5534f5bfa600..f90b1fbc4fa63 100644 --- a/api_docs/kbn_react_kibana_context_render.mdx +++ b/api_docs/kbn_react_kibana_context_render.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-react-kibana-context-render title: "@kbn/react-kibana-context-render" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/react-kibana-context-render plugin -date: 2024-05-06 +date: 2024-05-07 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/react-kibana-context-render'] --- import kbnReactKibanaContextRenderObj from './kbn_react_kibana_context_render.devdocs.json'; diff --git a/api_docs/kbn_react_kibana_context_root.mdx b/api_docs/kbn_react_kibana_context_root.mdx index 174f54e32e6a0..3dea8690b9155 100644 --- a/api_docs/kbn_react_kibana_context_root.mdx +++ b/api_docs/kbn_react_kibana_context_root.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-react-kibana-context-root title: "@kbn/react-kibana-context-root" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/react-kibana-context-root plugin -date: 2024-05-06 +date: 2024-05-07 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/react-kibana-context-root'] --- import kbnReactKibanaContextRootObj from './kbn_react_kibana_context_root.devdocs.json'; diff --git a/api_docs/kbn_react_kibana_context_styled.mdx b/api_docs/kbn_react_kibana_context_styled.mdx index 450a675ccfa4a..9069f465ce801 100644 --- a/api_docs/kbn_react_kibana_context_styled.mdx +++ b/api_docs/kbn_react_kibana_context_styled.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-react-kibana-context-styled title: "@kbn/react-kibana-context-styled" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/react-kibana-context-styled plugin -date: 2024-05-06 +date: 2024-05-07 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/react-kibana-context-styled'] --- import kbnReactKibanaContextStyledObj from './kbn_react_kibana_context_styled.devdocs.json'; diff --git a/api_docs/kbn_react_kibana_context_theme.mdx b/api_docs/kbn_react_kibana_context_theme.mdx index b169e84e6f233..94f62672908d2 100644 --- a/api_docs/kbn_react_kibana_context_theme.mdx +++ b/api_docs/kbn_react_kibana_context_theme.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-react-kibana-context-theme title: "@kbn/react-kibana-context-theme" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/react-kibana-context-theme plugin -date: 2024-05-06 +date: 2024-05-07 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/react-kibana-context-theme'] --- import kbnReactKibanaContextThemeObj from './kbn_react_kibana_context_theme.devdocs.json'; diff --git a/api_docs/kbn_react_kibana_mount.mdx b/api_docs/kbn_react_kibana_mount.mdx index 75a71f27b38cb..a2ea40a6355c2 100644 --- a/api_docs/kbn_react_kibana_mount.mdx +++ b/api_docs/kbn_react_kibana_mount.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-react-kibana-mount title: "@kbn/react-kibana-mount" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/react-kibana-mount plugin -date: 2024-05-06 +date: 2024-05-07 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/react-kibana-mount'] --- import kbnReactKibanaMountObj from './kbn_react_kibana_mount.devdocs.json'; diff --git a/api_docs/kbn_repo_file_maps.mdx b/api_docs/kbn_repo_file_maps.mdx index ffe0ec4dbbfcf..98ba6cc49d148 100644 --- a/api_docs/kbn_repo_file_maps.mdx +++ b/api_docs/kbn_repo_file_maps.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-repo-file-maps title: "@kbn/repo-file-maps" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/repo-file-maps plugin -date: 2024-05-06 +date: 2024-05-07 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/repo-file-maps'] --- import kbnRepoFileMapsObj from './kbn_repo_file_maps.devdocs.json'; diff --git a/api_docs/kbn_repo_linter.mdx b/api_docs/kbn_repo_linter.mdx index 95a76726f31d9..0375c41d9ae29 100644 --- a/api_docs/kbn_repo_linter.mdx +++ b/api_docs/kbn_repo_linter.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-repo-linter title: "@kbn/repo-linter" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/repo-linter plugin -date: 2024-05-06 +date: 2024-05-07 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/repo-linter'] --- import kbnRepoLinterObj from './kbn_repo_linter.devdocs.json'; diff --git a/api_docs/kbn_repo_path.mdx b/api_docs/kbn_repo_path.mdx index a5816d13a81ce..7e4b1913c3f15 100644 --- a/api_docs/kbn_repo_path.mdx +++ b/api_docs/kbn_repo_path.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-repo-path title: "@kbn/repo-path" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/repo-path plugin -date: 2024-05-06 +date: 2024-05-07 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/repo-path'] --- import kbnRepoPathObj from './kbn_repo_path.devdocs.json'; diff --git a/api_docs/kbn_repo_source_classifier.mdx b/api_docs/kbn_repo_source_classifier.mdx index bb3d45f0dbf79..823e14a3dfdb6 100644 --- a/api_docs/kbn_repo_source_classifier.mdx +++ b/api_docs/kbn_repo_source_classifier.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-repo-source-classifier title: "@kbn/repo-source-classifier" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/repo-source-classifier plugin -date: 2024-05-06 +date: 2024-05-07 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/repo-source-classifier'] --- import kbnRepoSourceClassifierObj from './kbn_repo_source_classifier.devdocs.json'; diff --git a/api_docs/kbn_reporting_common.mdx b/api_docs/kbn_reporting_common.mdx index c471f1b69636d..74340eacdf4a4 100644 --- a/api_docs/kbn_reporting_common.mdx +++ b/api_docs/kbn_reporting_common.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-reporting-common title: "@kbn/reporting-common" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/reporting-common plugin -date: 2024-05-06 +date: 2024-05-07 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/reporting-common'] --- import kbnReportingCommonObj from './kbn_reporting_common.devdocs.json'; diff --git a/api_docs/kbn_reporting_csv_share_panel.mdx b/api_docs/kbn_reporting_csv_share_panel.mdx index 0362f4b8b4bbc..1bc51b4b0e863 100644 --- a/api_docs/kbn_reporting_csv_share_panel.mdx +++ b/api_docs/kbn_reporting_csv_share_panel.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-reporting-csv-share-panel title: "@kbn/reporting-csv-share-panel" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/reporting-csv-share-panel plugin -date: 2024-05-06 +date: 2024-05-07 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/reporting-csv-share-panel'] --- import kbnReportingCsvSharePanelObj from './kbn_reporting_csv_share_panel.devdocs.json'; diff --git a/api_docs/kbn_reporting_export_types_csv.mdx b/api_docs/kbn_reporting_export_types_csv.mdx index f089b5361a1b2..4de21e053b32b 100644 --- a/api_docs/kbn_reporting_export_types_csv.mdx +++ b/api_docs/kbn_reporting_export_types_csv.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-reporting-export-types-csv title: "@kbn/reporting-export-types-csv" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/reporting-export-types-csv plugin -date: 2024-05-06 +date: 2024-05-07 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/reporting-export-types-csv'] --- import kbnReportingExportTypesCsvObj from './kbn_reporting_export_types_csv.devdocs.json'; diff --git a/api_docs/kbn_reporting_export_types_csv_common.mdx b/api_docs/kbn_reporting_export_types_csv_common.mdx index 58fee25329c12..9885030fe6998 100644 --- a/api_docs/kbn_reporting_export_types_csv_common.mdx +++ b/api_docs/kbn_reporting_export_types_csv_common.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-reporting-export-types-csv-common title: "@kbn/reporting-export-types-csv-common" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/reporting-export-types-csv-common plugin -date: 2024-05-06 +date: 2024-05-07 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/reporting-export-types-csv-common'] --- import kbnReportingExportTypesCsvCommonObj from './kbn_reporting_export_types_csv_common.devdocs.json'; diff --git a/api_docs/kbn_reporting_export_types_pdf.mdx b/api_docs/kbn_reporting_export_types_pdf.mdx index ff60d5c2a6edb..7f8e80578ee9d 100644 --- a/api_docs/kbn_reporting_export_types_pdf.mdx +++ b/api_docs/kbn_reporting_export_types_pdf.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-reporting-export-types-pdf title: "@kbn/reporting-export-types-pdf" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/reporting-export-types-pdf plugin -date: 2024-05-06 +date: 2024-05-07 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/reporting-export-types-pdf'] --- import kbnReportingExportTypesPdfObj from './kbn_reporting_export_types_pdf.devdocs.json'; diff --git a/api_docs/kbn_reporting_export_types_pdf_common.mdx b/api_docs/kbn_reporting_export_types_pdf_common.mdx index 754e5df33ec6e..2efea333c74ca 100644 --- a/api_docs/kbn_reporting_export_types_pdf_common.mdx +++ b/api_docs/kbn_reporting_export_types_pdf_common.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-reporting-export-types-pdf-common title: "@kbn/reporting-export-types-pdf-common" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/reporting-export-types-pdf-common plugin -date: 2024-05-06 +date: 2024-05-07 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/reporting-export-types-pdf-common'] --- import kbnReportingExportTypesPdfCommonObj from './kbn_reporting_export_types_pdf_common.devdocs.json'; diff --git a/api_docs/kbn_reporting_export_types_png.mdx b/api_docs/kbn_reporting_export_types_png.mdx index b091989cb810b..f24cb9dab3eab 100644 --- a/api_docs/kbn_reporting_export_types_png.mdx +++ b/api_docs/kbn_reporting_export_types_png.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-reporting-export-types-png title: "@kbn/reporting-export-types-png" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/reporting-export-types-png plugin -date: 2024-05-06 +date: 2024-05-07 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/reporting-export-types-png'] --- import kbnReportingExportTypesPngObj from './kbn_reporting_export_types_png.devdocs.json'; diff --git a/api_docs/kbn_reporting_export_types_png_common.mdx b/api_docs/kbn_reporting_export_types_png_common.mdx index 4d565cc085b58..bfb253907b700 100644 --- a/api_docs/kbn_reporting_export_types_png_common.mdx +++ b/api_docs/kbn_reporting_export_types_png_common.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-reporting-export-types-png-common title: "@kbn/reporting-export-types-png-common" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/reporting-export-types-png-common plugin -date: 2024-05-06 +date: 2024-05-07 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/reporting-export-types-png-common'] --- import kbnReportingExportTypesPngCommonObj from './kbn_reporting_export_types_png_common.devdocs.json'; diff --git a/api_docs/kbn_reporting_mocks_server.mdx b/api_docs/kbn_reporting_mocks_server.mdx index 298d172e87f38..bc332f1fe7c52 100644 --- a/api_docs/kbn_reporting_mocks_server.mdx +++ b/api_docs/kbn_reporting_mocks_server.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-reporting-mocks-server title: "@kbn/reporting-mocks-server" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/reporting-mocks-server plugin -date: 2024-05-06 +date: 2024-05-07 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/reporting-mocks-server'] --- import kbnReportingMocksServerObj from './kbn_reporting_mocks_server.devdocs.json'; diff --git a/api_docs/kbn_reporting_public.mdx b/api_docs/kbn_reporting_public.mdx index defe2de3d0c4d..916ce1f4841b5 100644 --- a/api_docs/kbn_reporting_public.mdx +++ b/api_docs/kbn_reporting_public.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-reporting-public title: "@kbn/reporting-public" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/reporting-public plugin -date: 2024-05-06 +date: 2024-05-07 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/reporting-public'] --- import kbnReportingPublicObj from './kbn_reporting_public.devdocs.json'; diff --git a/api_docs/kbn_reporting_server.mdx b/api_docs/kbn_reporting_server.mdx index f47ed80994086..3118a8b2afca6 100644 --- a/api_docs/kbn_reporting_server.mdx +++ b/api_docs/kbn_reporting_server.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-reporting-server title: "@kbn/reporting-server" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/reporting-server plugin -date: 2024-05-06 +date: 2024-05-07 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/reporting-server'] --- import kbnReportingServerObj from './kbn_reporting_server.devdocs.json'; diff --git a/api_docs/kbn_resizable_layout.mdx b/api_docs/kbn_resizable_layout.mdx index f2b9c1620c87c..d6aadeda2c8ac 100644 --- a/api_docs/kbn_resizable_layout.mdx +++ b/api_docs/kbn_resizable_layout.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-resizable-layout title: "@kbn/resizable-layout" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/resizable-layout plugin -date: 2024-05-06 +date: 2024-05-07 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/resizable-layout'] --- import kbnResizableLayoutObj from './kbn_resizable_layout.devdocs.json'; diff --git a/api_docs/kbn_rison.mdx b/api_docs/kbn_rison.mdx index 36cd39ec0e337..464526a5d585e 100644 --- a/api_docs/kbn_rison.mdx +++ b/api_docs/kbn_rison.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-rison title: "@kbn/rison" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/rison plugin -date: 2024-05-06 +date: 2024-05-07 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/rison'] --- import kbnRisonObj from './kbn_rison.devdocs.json'; diff --git a/api_docs/kbn_router_to_openapispec.mdx b/api_docs/kbn_router_to_openapispec.mdx index d918585a73d6e..c9c179cc082a2 100644 --- a/api_docs/kbn_router_to_openapispec.mdx +++ b/api_docs/kbn_router_to_openapispec.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-router-to-openapispec title: "@kbn/router-to-openapispec" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/router-to-openapispec plugin -date: 2024-05-06 +date: 2024-05-07 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/router-to-openapispec'] --- import kbnRouterToOpenapispecObj from './kbn_router_to_openapispec.devdocs.json'; diff --git a/api_docs/kbn_router_utils.mdx b/api_docs/kbn_router_utils.mdx index 3939bc0d6c3cb..a5bed2ba74d1c 100644 --- a/api_docs/kbn_router_utils.mdx +++ b/api_docs/kbn_router_utils.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-router-utils title: "@kbn/router-utils" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/router-utils plugin -date: 2024-05-06 +date: 2024-05-07 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/router-utils'] --- import kbnRouterUtilsObj from './kbn_router_utils.devdocs.json'; diff --git a/api_docs/kbn_rrule.mdx b/api_docs/kbn_rrule.mdx index 175b8f83ddf12..84827fa2d7b2e 100644 --- a/api_docs/kbn_rrule.mdx +++ b/api_docs/kbn_rrule.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-rrule title: "@kbn/rrule" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/rrule plugin -date: 2024-05-06 +date: 2024-05-07 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/rrule'] --- import kbnRruleObj from './kbn_rrule.devdocs.json'; diff --git a/api_docs/kbn_rule_data_utils.mdx b/api_docs/kbn_rule_data_utils.mdx index 8e60accce1647..e42a4f1735fb5 100644 --- a/api_docs/kbn_rule_data_utils.mdx +++ b/api_docs/kbn_rule_data_utils.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-rule-data-utils title: "@kbn/rule-data-utils" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/rule-data-utils plugin -date: 2024-05-06 +date: 2024-05-07 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/rule-data-utils'] --- import kbnRuleDataUtilsObj from './kbn_rule_data_utils.devdocs.json'; diff --git a/api_docs/kbn_saved_objects_settings.mdx b/api_docs/kbn_saved_objects_settings.mdx index f62eda687fdb0..81309db618a09 100644 --- a/api_docs/kbn_saved_objects_settings.mdx +++ b/api_docs/kbn_saved_objects_settings.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-saved-objects-settings title: "@kbn/saved-objects-settings" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/saved-objects-settings plugin -date: 2024-05-06 +date: 2024-05-07 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/saved-objects-settings'] --- import kbnSavedObjectsSettingsObj from './kbn_saved_objects_settings.devdocs.json'; diff --git a/api_docs/kbn_search_api_panels.mdx b/api_docs/kbn_search_api_panels.mdx index 2c4ee4d736209..c8e3132345b6a 100644 --- a/api_docs/kbn_search_api_panels.mdx +++ b/api_docs/kbn_search_api_panels.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-search-api-panels title: "@kbn/search-api-panels" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/search-api-panels plugin -date: 2024-05-06 +date: 2024-05-07 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/search-api-panels'] --- import kbnSearchApiPanelsObj from './kbn_search_api_panels.devdocs.json'; diff --git a/api_docs/kbn_search_connectors.mdx b/api_docs/kbn_search_connectors.mdx index 9e847c53f837c..0ca394bfb1072 100644 --- a/api_docs/kbn_search_connectors.mdx +++ b/api_docs/kbn_search_connectors.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-search-connectors title: "@kbn/search-connectors" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/search-connectors plugin -date: 2024-05-06 +date: 2024-05-07 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/search-connectors'] --- import kbnSearchConnectorsObj from './kbn_search_connectors.devdocs.json'; diff --git a/api_docs/kbn_search_errors.devdocs.json b/api_docs/kbn_search_errors.devdocs.json index 897b63cf2bbcc..abb6c8f63c181 100644 --- a/api_docs/kbn_search_errors.devdocs.json +++ b/api_docs/kbn_search_errors.devdocs.json @@ -47,7 +47,14 @@ "label": "attributes", "description": [], "signature": [ - "IEsErrorAttributes | undefined" + { + "pluginId": "@kbn/search-types", + "scope": "common", + "docId": "kibKbnSearchTypesPluginApi", + "section": "def-common.IEsErrorAttributes", + "text": "IEsErrorAttributes" + }, + " | undefined" ], "path": "packages/kbn-search-errors/src/es_error.tsx", "deprecated": false, @@ -361,7 +368,15 @@ "section": "def-common.KibanaServerError", "text": "KibanaServerError" }, - "" + "<", + { + "pluginId": "@kbn/search-types", + "scope": "common", + "docId": "kibKbnSearchTypesPluginApi", + "section": "def-common.IEsErrorAttributes", + "text": "IEsErrorAttributes" + }, + ">" ], "path": "packages/kbn-search-errors/src/types.ts", "deprecated": false, diff --git a/api_docs/kbn_search_errors.mdx b/api_docs/kbn_search_errors.mdx index c96821b11542e..5eb3f550ed434 100644 --- a/api_docs/kbn_search_errors.mdx +++ b/api_docs/kbn_search_errors.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-search-errors title: "@kbn/search-errors" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/search-errors plugin -date: 2024-05-06 +date: 2024-05-07 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/search-errors'] --- import kbnSearchErrorsObj from './kbn_search_errors.devdocs.json'; diff --git a/api_docs/kbn_search_index_documents.mdx b/api_docs/kbn_search_index_documents.mdx index 63c7db66aabea..50169e907ffcd 100644 --- a/api_docs/kbn_search_index_documents.mdx +++ b/api_docs/kbn_search_index_documents.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-search-index-documents title: "@kbn/search-index-documents" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/search-index-documents plugin -date: 2024-05-06 +date: 2024-05-07 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/search-index-documents'] --- import kbnSearchIndexDocumentsObj from './kbn_search_index_documents.devdocs.json'; diff --git a/api_docs/kbn_search_response_warnings.mdx b/api_docs/kbn_search_response_warnings.mdx index 541579efc4fb8..8548eb53e2601 100644 --- a/api_docs/kbn_search_response_warnings.mdx +++ b/api_docs/kbn_search_response_warnings.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-search-response-warnings title: "@kbn/search-response-warnings" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/search-response-warnings plugin -date: 2024-05-06 +date: 2024-05-07 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/search-response-warnings'] --- import kbnSearchResponseWarningsObj from './kbn_search_response_warnings.devdocs.json'; diff --git a/api_docs/kbn_search_types.devdocs.json b/api_docs/kbn_search_types.devdocs.json new file mode 100644 index 0000000000000..2278e0ff9e98d --- /dev/null +++ b/api_docs/kbn_search_types.devdocs.json @@ -0,0 +1,1023 @@ +{ + "id": "@kbn/search-types", + "client": { + "classes": [], + "functions": [], + "interfaces": [], + "enums": [], + "misc": [], + "objects": [] + }, + "server": { + "classes": [], + "functions": [], + "interfaces": [], + "enums": [], + "misc": [], + "objects": [] + }, + "common": { + "classes": [], + "functions": [], + "interfaces": [ + { + "parentPluginId": "@kbn/search-types", + "id": "def-common.IEsErrorAttributes", + "type": "Interface", + "tags": [], + "label": "IEsErrorAttributes", + "description": [], + "path": "packages/kbn-search-types/src/types.ts", + "deprecated": false, + "trackAdoption": false, + "children": [ + { + "parentPluginId": "@kbn/search-types", + "id": "def-common.IEsErrorAttributes.error", + "type": "CompoundType", + "tags": [], + "label": "error", + "description": [], + "signature": [ + "ErrorCause", + " | undefined" + ], + "path": "packages/kbn-search-types/src/types.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/search-types", + "id": "def-common.IEsErrorAttributes.rawResponse", + "type": "Object", + "tags": [], + "label": "rawResponse", + "description": [], + "signature": [ + "SearchResponseBody", + "> | undefined" + ], + "path": "packages/kbn-search-types/src/types.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/search-types", + "id": "def-common.IEsErrorAttributes.requestParams", + "type": "Object", + "tags": [], + "label": "requestParams", + "description": [], + "signature": [ + { + "pluginId": "@kbn/search-types", + "scope": "common", + "docId": "kibKbnSearchTypesPluginApi", + "section": "def-common.SanitizedConnectionRequestParams", + "text": "SanitizedConnectionRequestParams" + }, + " | undefined" + ], + "path": "packages/kbn-search-types/src/types.ts", + "deprecated": false, + "trackAdoption": false + } + ], + "initialIsOpen": false + }, + { + "parentPluginId": "@kbn/search-types", + "id": "def-common.IEsSearchRequest", + "type": "Interface", + "tags": [], + "label": "IEsSearchRequest", + "description": [], + "signature": [ + { + "pluginId": "@kbn/search-types", + "scope": "common", + "docId": "kibKbnSearchTypesPluginApi", + "section": "def-common.IEsSearchRequest", + "text": "IEsSearchRequest" + }, + " extends ", + { + "pluginId": "@kbn/search-types", + "scope": "common", + "docId": "kibKbnSearchTypesPluginApi", + "section": "def-common.IKibanaSearchRequest", + "text": "IKibanaSearchRequest" + }, + "" + ], + "path": "packages/kbn-search-types/src/es_search_types.ts", + "deprecated": false, + "trackAdoption": false, + "children": [ + { + "parentPluginId": "@kbn/search-types", + "id": "def-common.IEsSearchRequest.indexType", + "type": "string", + "tags": [], + "label": "indexType", + "description": [], + "signature": [ + "string | undefined" + ], + "path": "packages/kbn-search-types/src/es_search_types.ts", + "deprecated": false, + "trackAdoption": false + } + ], + "initialIsOpen": false + }, + { + "parentPluginId": "@kbn/search-types", + "id": "def-common.IKibanaSearchRequest", + "type": "Interface", + "tags": [], + "label": "IKibanaSearchRequest", + "description": [], + "signature": [ + { + "pluginId": "@kbn/search-types", + "scope": "common", + "docId": "kibKbnSearchTypesPluginApi", + "section": "def-common.IKibanaSearchRequest", + "text": "IKibanaSearchRequest" + }, + "" + ], + "path": "packages/kbn-search-types/src/kibana_search_types.ts", + "deprecated": false, + "trackAdoption": false, + "children": [ + { + "parentPluginId": "@kbn/search-types", + "id": "def-common.IKibanaSearchRequest.id", + "type": "string", + "tags": [], + "label": "id", + "description": [ + "\nAn id can be used to uniquely identify this request." + ], + "signature": [ + "string | undefined" + ], + "path": "packages/kbn-search-types/src/kibana_search_types.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/search-types", + "id": "def-common.IKibanaSearchRequest.params", + "type": "Uncategorized", + "tags": [], + "label": "params", + "description": [], + "signature": [ + "Params | undefined" + ], + "path": "packages/kbn-search-types/src/kibana_search_types.ts", + "deprecated": false, + "trackAdoption": false + } + ], + "initialIsOpen": false + }, + { + "parentPluginId": "@kbn/search-types", + "id": "def-common.IKibanaSearchResponse", + "type": "Interface", + "tags": [], + "label": "IKibanaSearchResponse", + "description": [], + "signature": [ + { + "pluginId": "@kbn/search-types", + "scope": "common", + "docId": "kibKbnSearchTypesPluginApi", + "section": "def-common.IKibanaSearchResponse", + "text": "IKibanaSearchResponse" + }, + "" + ], + "path": "packages/kbn-search-types/src/kibana_search_types.ts", + "deprecated": false, + "trackAdoption": false, + "children": [ + { + "parentPluginId": "@kbn/search-types", + "id": "def-common.IKibanaSearchResponse.id", + "type": "string", + "tags": [], + "label": "id", + "description": [ + "\nSome responses may contain a unique id to identify the request this response came from." + ], + "signature": [ + "string | undefined" + ], + "path": "packages/kbn-search-types/src/kibana_search_types.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/search-types", + "id": "def-common.IKibanaSearchResponse.total", + "type": "number", + "tags": [], + "label": "total", + "description": [ + "\nIf relevant to the search strategy, return a total number\nthat represents how progress is indicated." + ], + "signature": [ + "number | undefined" + ], + "path": "packages/kbn-search-types/src/kibana_search_types.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/search-types", + "id": "def-common.IKibanaSearchResponse.loaded", + "type": "number", + "tags": [], + "label": "loaded", + "description": [ + "\nIf relevant to the search strategy, return a loaded number\nthat represents how progress is indicated." + ], + "signature": [ + "number | undefined" + ], + "path": "packages/kbn-search-types/src/kibana_search_types.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/search-types", + "id": "def-common.IKibanaSearchResponse.isRunning", + "type": "CompoundType", + "tags": [], + "label": "isRunning", + "description": [ + "\nIndicates whether search is still in flight" + ], + "signature": [ + "boolean | undefined" + ], + "path": "packages/kbn-search-types/src/kibana_search_types.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/search-types", + "id": "def-common.IKibanaSearchResponse.isPartial", + "type": "CompoundType", + "tags": [], + "label": "isPartial", + "description": [ + "\nIndicates whether the results returned are complete or partial" + ], + "signature": [ + "boolean | undefined" + ], + "path": "packages/kbn-search-types/src/kibana_search_types.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/search-types", + "id": "def-common.IKibanaSearchResponse.isRestored", + "type": "CompoundType", + "tags": [], + "label": "isRestored", + "description": [ + "\nIndicates whether the results returned are from the async-search index" + ], + "signature": [ + "boolean | undefined" + ], + "path": "packages/kbn-search-types/src/kibana_search_types.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/search-types", + "id": "def-common.IKibanaSearchResponse.isStored", + "type": "CompoundType", + "tags": [], + "label": "isStored", + "description": [ + "\nIndicates whether the search has been saved to a search-session object and long keepAlive was set" + ], + "signature": [ + "boolean | undefined" + ], + "path": "packages/kbn-search-types/src/kibana_search_types.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/search-types", + "id": "def-common.IKibanaSearchResponse.warning", + "type": "string", + "tags": [], + "label": "warning", + "description": [ + "\nOptional warnings returned from Elasticsearch (for example, deprecation warnings)" + ], + "signature": [ + "string | undefined" + ], + "path": "packages/kbn-search-types/src/kibana_search_types.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/search-types", + "id": "def-common.IKibanaSearchResponse.rawResponse", + "type": "Uncategorized", + "tags": [], + "label": "rawResponse", + "description": [ + "\nThe raw response returned by the internal search method (usually the raw ES response)" + ], + "signature": [ + "RawResponse" + ], + "path": "packages/kbn-search-types/src/kibana_search_types.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/search-types", + "id": "def-common.IKibanaSearchResponse.requestParams", + "type": "Object", + "tags": [], + "label": "requestParams", + "description": [ + "\nHTTP request parameters from elasticsearch transport client t" + ], + "signature": [ + { + "pluginId": "@kbn/search-types", + "scope": "common", + "docId": "kibKbnSearchTypesPluginApi", + "section": "def-common.SanitizedConnectionRequestParams", + "text": "SanitizedConnectionRequestParams" + }, + " | undefined" + ], + "path": "packages/kbn-search-types/src/kibana_search_types.ts", + "deprecated": false, + "trackAdoption": false + } + ], + "initialIsOpen": false + }, + { + "parentPluginId": "@kbn/search-types", + "id": "def-common.ISearchClient", + "type": "Interface", + "tags": [], + "label": "ISearchClient", + "description": [], + "path": "packages/kbn-search-types/src/types.ts", + "deprecated": false, + "trackAdoption": false, + "children": [ + { + "parentPluginId": "@kbn/search-types", + "id": "def-common.ISearchClient.search", + "type": "Function", + "tags": [], + "label": "search", + "description": [], + "signature": [ + " = ", + { + "pluginId": "@kbn/search-types", + "scope": "common", + "docId": "kibKbnSearchTypesPluginApi", + "section": "def-common.IEsSearchRequest", + "text": "IEsSearchRequest" + }, + "<", + { + "pluginId": "@kbn/search-types", + "scope": "common", + "docId": "kibKbnSearchTypesPluginApi", + "section": "def-common.ISearchRequestParams", + "text": "ISearchRequestParams" + }, + ">, SearchStrategyResponse extends ", + { + "pluginId": "@kbn/search-types", + "scope": "common", + "docId": "kibKbnSearchTypesPluginApi", + "section": "def-common.IKibanaSearchResponse", + "text": "IKibanaSearchResponse" + }, + " = ", + { + "pluginId": "@kbn/search-types", + "scope": "common", + "docId": "kibKbnSearchTypesPluginApi", + "section": "def-common.IEsSearchResponse", + "text": "IEsSearchResponse" + }, + ">(request: SearchStrategyRequest, options?: ", + { + "pluginId": "@kbn/search-types", + "scope": "common", + "docId": "kibKbnSearchTypesPluginApi", + "section": "def-common.ISearchOptions", + "text": "ISearchOptions" + }, + " | undefined) => ", + "Observable", + "" + ], + "path": "packages/kbn-search-types/src/types.ts", + "deprecated": false, + "trackAdoption": false, + "returnComment": [], + "children": [ + { + "parentPluginId": "@kbn/search-types", + "id": "def-common.ISearchClient.search.$1", + "type": "Uncategorized", + "tags": [], + "label": "request", + "description": [], + "signature": [ + "SearchStrategyRequest" + ], + "path": "packages/kbn-search-types/src/types.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/search-types", + "id": "def-common.ISearchClient.search.$2", + "type": "Object", + "tags": [], + "label": "options", + "description": [], + "signature": [ + { + "pluginId": "@kbn/search-types", + "scope": "common", + "docId": "kibKbnSearchTypesPluginApi", + "section": "def-common.ISearchOptions", + "text": "ISearchOptions" + }, + " | undefined" + ], + "path": "packages/kbn-search-types/src/types.ts", + "deprecated": false, + "trackAdoption": false + } + ] + }, + { + "parentPluginId": "@kbn/search-types", + "id": "def-common.ISearchClient.cancel", + "type": "Function", + "tags": [], + "label": "cancel", + "description": [ + "\nUsed to cancel an in-progress search request." + ], + "signature": [ + "(id: string, options?: ", + { + "pluginId": "@kbn/search-types", + "scope": "common", + "docId": "kibKbnSearchTypesPluginApi", + "section": "def-common.ISearchOptions", + "text": "ISearchOptions" + }, + " | undefined) => Promise" + ], + "path": "packages/kbn-search-types/src/types.ts", + "deprecated": false, + "trackAdoption": false, + "returnComment": [], + "children": [ + { + "parentPluginId": "@kbn/search-types", + "id": "def-common.ISearchClient.cancel.$1", + "type": "string", + "tags": [], + "label": "id", + "description": [], + "path": "packages/kbn-search-types/src/types.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/search-types", + "id": "def-common.ISearchClient.cancel.$2", + "type": "Object", + "tags": [], + "label": "options", + "description": [], + "signature": [ + { + "pluginId": "@kbn/search-types", + "scope": "common", + "docId": "kibKbnSearchTypesPluginApi", + "section": "def-common.ISearchOptions", + "text": "ISearchOptions" + }, + " | undefined" + ], + "path": "packages/kbn-search-types/src/types.ts", + "deprecated": false, + "trackAdoption": false + } + ] + }, + { + "parentPluginId": "@kbn/search-types", + "id": "def-common.ISearchClient.extend", + "type": "Function", + "tags": [], + "label": "extend", + "description": [ + "\nUsed to extend the TTL of an in-progress search request." + ], + "signature": [ + "(id: string, keepAlive: string, options?: ", + { + "pluginId": "@kbn/search-types", + "scope": "common", + "docId": "kibKbnSearchTypesPluginApi", + "section": "def-common.ISearchOptions", + "text": "ISearchOptions" + }, + " | undefined) => Promise" + ], + "path": "packages/kbn-search-types/src/types.ts", + "deprecated": false, + "trackAdoption": false, + "returnComment": [], + "children": [ + { + "parentPluginId": "@kbn/search-types", + "id": "def-common.ISearchClient.extend.$1", + "type": "string", + "tags": [], + "label": "id", + "description": [], + "path": "packages/kbn-search-types/src/types.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/search-types", + "id": "def-common.ISearchClient.extend.$2", + "type": "string", + "tags": [], + "label": "keepAlive", + "description": [], + "path": "packages/kbn-search-types/src/types.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/search-types", + "id": "def-common.ISearchClient.extend.$3", + "type": "Object", + "tags": [], + "label": "options", + "description": [], + "signature": [ + { + "pluginId": "@kbn/search-types", + "scope": "common", + "docId": "kibKbnSearchTypesPluginApi", + "section": "def-common.ISearchOptions", + "text": "ISearchOptions" + }, + " | undefined" + ], + "path": "packages/kbn-search-types/src/types.ts", + "deprecated": false, + "trackAdoption": false + } + ] + } + ], + "initialIsOpen": false + }, + { + "parentPluginId": "@kbn/search-types", + "id": "def-common.ISearchOptions", + "type": "Interface", + "tags": [], + "label": "ISearchOptions", + "description": [], + "path": "packages/kbn-search-types/src/types.ts", + "deprecated": false, + "trackAdoption": false, + "children": [ + { + "parentPluginId": "@kbn/search-types", + "id": "def-common.ISearchOptions.abortSignal", + "type": "Object", + "tags": [], + "label": "abortSignal", + "description": [ + "\nAn `AbortSignal` that allows the caller of `search` to abort a search request." + ], + "signature": [ + "AbortSignal | undefined" + ], + "path": "packages/kbn-search-types/src/types.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/search-types", + "id": "def-common.ISearchOptions.strategy", + "type": "string", + "tags": [], + "label": "strategy", + "description": [ + "\nUse this option to force using a specific server side search strategy. Leave empty to use the default strategy." + ], + "signature": [ + "string | undefined" + ], + "path": "packages/kbn-search-types/src/types.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/search-types", + "id": "def-common.ISearchOptions.legacyHitsTotal", + "type": "CompoundType", + "tags": [], + "label": "legacyHitsTotal", + "description": [ + "\nRequest the legacy format for the total number of hits. If sending `rest_total_hits_as_int` to\nsomething other than `true`, this should be set to `false`." + ], + "signature": [ + "boolean | undefined" + ], + "path": "packages/kbn-search-types/src/types.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/search-types", + "id": "def-common.ISearchOptions.sessionId", + "type": "string", + "tags": [], + "label": "sessionId", + "description": [ + "\nA session ID, grouping multiple search requests into a single session." + ], + "signature": [ + "string | undefined" + ], + "path": "packages/kbn-search-types/src/types.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/search-types", + "id": "def-common.ISearchOptions.isStored", + "type": "CompoundType", + "tags": [], + "label": "isStored", + "description": [ + "\nWhether the session is already saved (i.e. sent to background)" + ], + "signature": [ + "boolean | undefined" + ], + "path": "packages/kbn-search-types/src/types.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/search-types", + "id": "def-common.ISearchOptions.isSearchStored", + "type": "CompoundType", + "tags": [], + "label": "isSearchStored", + "description": [ + "\nWhether the search was successfully polled after session was saved. Search was added to a session saved object and keepAlive extended." + ], + "signature": [ + "boolean | undefined" + ], + "path": "packages/kbn-search-types/src/types.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/search-types", + "id": "def-common.ISearchOptions.isRestore", + "type": "CompoundType", + "tags": [], + "label": "isRestore", + "description": [ + "\nWhether the session is restored (i.e. search requests should re-use the stored search IDs,\nrather than starting from scratch)" + ], + "signature": [ + "boolean | undefined" + ], + "path": "packages/kbn-search-types/src/types.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/search-types", + "id": "def-common.ISearchOptions.retrieveResults", + "type": "CompoundType", + "tags": [], + "label": "retrieveResults", + "description": [ + "\nBy default, when polling, we don't retrieve the results of the search request (until it is complete). (For async\nsearch, this is the difference between calling _async_search/{id} and _async_search/status/{id}.) setting this to\n`true` will request the search results, regardless of whether or not the search is complete." + ], + "signature": [ + "boolean | undefined" + ], + "path": "packages/kbn-search-types/src/types.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/search-types", + "id": "def-common.ISearchOptions.executionContext", + "type": "Object", + "tags": [], + "label": "executionContext", + "description": [ + "\nRepresents a meta-information about a Kibana entity intitating a saerch request." + ], + "signature": [ + { + "pluginId": "@kbn/core-execution-context-common", + "scope": "common", + "docId": "kibKbnCoreExecutionContextCommonPluginApi", + "section": "def-common.KibanaExecutionContext", + "text": "KibanaExecutionContext" + }, + " | undefined" + ], + "path": "packages/kbn-search-types/src/types.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/search-types", + "id": "def-common.ISearchOptions.indexPattern", + "type": "Object", + "tags": [], + "label": "indexPattern", + "description": [ + "\nIndex pattern reference is used for better error messages" + ], + "signature": [ + { + "pluginId": "dataViews", + "scope": "common", + "docId": "kibDataViewsPluginApi", + "section": "def-common.DataView", + "text": "DataView" + }, + " | undefined" + ], + "path": "packages/kbn-search-types/src/types.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/search-types", + "id": "def-common.ISearchOptions.transport", + "type": "Object", + "tags": [], + "label": "transport", + "description": [ + "\nTransportRequestOptions, other than `signal`, to pass through to the ES client.\nTo pass an abort signal, use {@link ISearchOptions.abortSignal}" + ], + "signature": [ + "Omit<", + "TransportRequestOptions", + ", \"signal\"> | undefined" + ], + "path": "packages/kbn-search-types/src/types.ts", + "deprecated": false, + "trackAdoption": false + } + ], + "initialIsOpen": false + } + ], + "enums": [], + "misc": [ + { + "parentPluginId": "@kbn/search-types", + "id": "def-common.IEsSearchResponse", + "type": "Type", + "tags": [], + "label": "IEsSearchResponse", + "description": [], + "signature": [ + { + "pluginId": "@kbn/search-types", + "scope": "common", + "docId": "kibKbnSearchTypesPluginApi", + "section": "def-common.IKibanaSearchResponse", + "text": "IKibanaSearchResponse" + }, + "<", + "SearchResponse", + ">>" + ], + "path": "packages/kbn-search-types/src/es_search_types.ts", + "deprecated": false, + "trackAdoption": false, + "initialIsOpen": false + }, + { + "parentPluginId": "@kbn/search-types", + "id": "def-common.ISearchGeneric", + "type": "Type", + "tags": [], + "label": "ISearchGeneric", + "description": [], + "signature": [ + " = ", + { + "pluginId": "@kbn/search-types", + "scope": "common", + "docId": "kibKbnSearchTypesPluginApi", + "section": "def-common.IEsSearchRequest", + "text": "IEsSearchRequest" + }, + "<", + { + "pluginId": "@kbn/search-types", + "scope": "common", + "docId": "kibKbnSearchTypesPluginApi", + "section": "def-common.ISearchRequestParams", + "text": "ISearchRequestParams" + }, + ">, SearchStrategyResponse extends ", + { + "pluginId": "@kbn/search-types", + "scope": "common", + "docId": "kibKbnSearchTypesPluginApi", + "section": "def-common.IKibanaSearchResponse", + "text": "IKibanaSearchResponse" + }, + " = ", + { + "pluginId": "@kbn/search-types", + "scope": "common", + "docId": "kibKbnSearchTypesPluginApi", + "section": "def-common.IEsSearchResponse", + "text": "IEsSearchResponse" + }, + ">(request: SearchStrategyRequest, options?: ", + { + "pluginId": "@kbn/search-types", + "scope": "common", + "docId": "kibKbnSearchTypesPluginApi", + "section": "def-common.ISearchOptions", + "text": "ISearchOptions" + }, + " | undefined) => ", + "Observable", + "" + ], + "path": "packages/kbn-search-types/src/types.ts", + "deprecated": false, + "trackAdoption": false, + "returnComment": [], + "children": [ + { + "parentPluginId": "@kbn/search-types", + "id": "def-common.ISearchGeneric.$1", + "type": "Uncategorized", + "tags": [], + "label": "request", + "description": [], + "signature": [ + "SearchStrategyRequest" + ], + "path": "packages/kbn-search-types/src/types.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/search-types", + "id": "def-common.ISearchGeneric.$2", + "type": "Object", + "tags": [], + "label": "options", + "description": [], + "signature": [ + { + "pluginId": "@kbn/search-types", + "scope": "common", + "docId": "kibKbnSearchTypesPluginApi", + "section": "def-common.ISearchOptions", + "text": "ISearchOptions" + }, + " | undefined" + ], + "path": "packages/kbn-search-types/src/types.ts", + "deprecated": false, + "trackAdoption": false + } + ], + "initialIsOpen": false + }, + { + "parentPluginId": "@kbn/search-types", + "id": "def-common.ISearchOptionsSerializable", + "type": "Type", + "tags": [], + "label": "ISearchOptionsSerializable", + "description": [ + "\nSame as `ISearchOptions`, but contains only serializable fields, which can\nbe sent over the network." + ], + "signature": [ + "{ executionContext?: ", + { + "pluginId": "@kbn/core-execution-context-common", + "scope": "common", + "docId": "kibKbnCoreExecutionContextCommonPluginApi", + "section": "def-common.KibanaExecutionContext", + "text": "KibanaExecutionContext" + }, + " | undefined; isStored?: boolean | undefined; isRestore?: boolean | undefined; sessionId?: string | undefined; strategy?: string | undefined; legacyHitsTotal?: boolean | undefined; isSearchStored?: boolean | undefined; retrieveResults?: boolean | undefined; }" + ], + "path": "packages/kbn-search-types/src/types.ts", + "deprecated": false, + "trackAdoption": false, + "initialIsOpen": false + }, + { + "parentPluginId": "@kbn/search-types", + "id": "def-common.ISearchRequestParams", + "type": "Type", + "tags": [], + "label": "ISearchRequestParams", + "description": [], + "signature": [ + "{ trackTotalHits?: boolean | undefined; } & ", + "SearchRequest" + ], + "path": "packages/kbn-search-types/src/es_search_types.ts", + "deprecated": false, + "trackAdoption": false, + "initialIsOpen": false + }, + { + "parentPluginId": "@kbn/search-types", + "id": "def-common.SanitizedConnectionRequestParams", + "type": "Type", + "tags": [], + "label": "SanitizedConnectionRequestParams", + "description": [], + "signature": [ + "{ path: string; method: string; querystring?: string | undefined; }" + ], + "path": "packages/kbn-search-types/src/types.ts", + "deprecated": false, + "trackAdoption": false, + "initialIsOpen": false + } + ], + "objects": [] + } +} \ No newline at end of file diff --git a/api_docs/kbn_search_types.mdx b/api_docs/kbn_search_types.mdx new file mode 100644 index 0000000000000..48f8bffab99b3 --- /dev/null +++ b/api_docs/kbn_search_types.mdx @@ -0,0 +1,33 @@ +--- +#### +#### This document is auto-generated and is meant to be viewed inside our experimental, new docs system. +#### Reach out in #docs-engineering for more info. +#### +id: kibKbnSearchTypesPluginApi +slug: /kibana-dev-docs/api/kbn-search-types +title: "@kbn/search-types" +image: https://source.unsplash.com/400x175/?github +description: API docs for the @kbn/search-types plugin +date: 2024-05-07 +tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/search-types'] +--- +import kbnSearchTypesObj from './kbn_search_types.devdocs.json'; + + + +Contact [@elastic/kibana-data-discovery](https://github.com/orgs/elastic/teams/kibana-data-discovery) for questions regarding this plugin. + +**Code health stats** + +| Public API count | Any count | Items lacking comments | Missing exports | +|-------------------|-----------|------------------------|-----------------| +| 50 | 0 | 25 | 0 | + +## Common + +### Interfaces + + +### Consts, variables and types + + diff --git a/api_docs/kbn_security_hardening.mdx b/api_docs/kbn_security_hardening.mdx index 3d7fa23500d08..7e76ad875b6c5 100644 --- a/api_docs/kbn_security_hardening.mdx +++ b/api_docs/kbn_security_hardening.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-security-hardening title: "@kbn/security-hardening" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/security-hardening plugin -date: 2024-05-06 +date: 2024-05-07 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/security-hardening'] --- import kbnSecurityHardeningObj from './kbn_security_hardening.devdocs.json'; diff --git a/api_docs/kbn_security_plugin_types_common.mdx b/api_docs/kbn_security_plugin_types_common.mdx index 49d71376966f4..5afeea0349d87 100644 --- a/api_docs/kbn_security_plugin_types_common.mdx +++ b/api_docs/kbn_security_plugin_types_common.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-security-plugin-types-common title: "@kbn/security-plugin-types-common" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/security-plugin-types-common plugin -date: 2024-05-06 +date: 2024-05-07 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/security-plugin-types-common'] --- import kbnSecurityPluginTypesCommonObj from './kbn_security_plugin_types_common.devdocs.json'; diff --git a/api_docs/kbn_security_plugin_types_public.mdx b/api_docs/kbn_security_plugin_types_public.mdx index c1c4f1febc74c..63e8b979e24be 100644 --- a/api_docs/kbn_security_plugin_types_public.mdx +++ b/api_docs/kbn_security_plugin_types_public.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-security-plugin-types-public title: "@kbn/security-plugin-types-public" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/security-plugin-types-public plugin -date: 2024-05-06 +date: 2024-05-07 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/security-plugin-types-public'] --- import kbnSecurityPluginTypesPublicObj from './kbn_security_plugin_types_public.devdocs.json'; diff --git a/api_docs/kbn_security_plugin_types_server.mdx b/api_docs/kbn_security_plugin_types_server.mdx index 44259ba44f358..339a98b8bf81c 100644 --- a/api_docs/kbn_security_plugin_types_server.mdx +++ b/api_docs/kbn_security_plugin_types_server.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-security-plugin-types-server title: "@kbn/security-plugin-types-server" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/security-plugin-types-server plugin -date: 2024-05-06 +date: 2024-05-07 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/security-plugin-types-server'] --- import kbnSecurityPluginTypesServerObj from './kbn_security_plugin_types_server.devdocs.json'; diff --git a/api_docs/kbn_security_solution_features.mdx b/api_docs/kbn_security_solution_features.mdx index 068c67ade5634..ac0c92f25cdec 100644 --- a/api_docs/kbn_security_solution_features.mdx +++ b/api_docs/kbn_security_solution_features.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-security-solution-features title: "@kbn/security-solution-features" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/security-solution-features plugin -date: 2024-05-06 +date: 2024-05-07 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/security-solution-features'] --- import kbnSecuritySolutionFeaturesObj from './kbn_security_solution_features.devdocs.json'; diff --git a/api_docs/kbn_security_solution_navigation.mdx b/api_docs/kbn_security_solution_navigation.mdx index daa048aea5428..1302db6211250 100644 --- a/api_docs/kbn_security_solution_navigation.mdx +++ b/api_docs/kbn_security_solution_navigation.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-security-solution-navigation title: "@kbn/security-solution-navigation" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/security-solution-navigation plugin -date: 2024-05-06 +date: 2024-05-07 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/security-solution-navigation'] --- import kbnSecuritySolutionNavigationObj from './kbn_security_solution_navigation.devdocs.json'; diff --git a/api_docs/kbn_security_solution_side_nav.mdx b/api_docs/kbn_security_solution_side_nav.mdx index 783888be45d79..3766dfb8693d2 100644 --- a/api_docs/kbn_security_solution_side_nav.mdx +++ b/api_docs/kbn_security_solution_side_nav.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-security-solution-side-nav title: "@kbn/security-solution-side-nav" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/security-solution-side-nav plugin -date: 2024-05-06 +date: 2024-05-07 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/security-solution-side-nav'] --- import kbnSecuritySolutionSideNavObj from './kbn_security_solution_side_nav.devdocs.json'; diff --git a/api_docs/kbn_security_solution_storybook_config.mdx b/api_docs/kbn_security_solution_storybook_config.mdx index 3d32c87bdfbde..6b2659f5d49cb 100644 --- a/api_docs/kbn_security_solution_storybook_config.mdx +++ b/api_docs/kbn_security_solution_storybook_config.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-security-solution-storybook-config title: "@kbn/security-solution-storybook-config" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/security-solution-storybook-config plugin -date: 2024-05-06 +date: 2024-05-07 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/security-solution-storybook-config'] --- import kbnSecuritySolutionStorybookConfigObj from './kbn_security_solution_storybook_config.devdocs.json'; diff --git a/api_docs/kbn_securitysolution_autocomplete.mdx b/api_docs/kbn_securitysolution_autocomplete.mdx index a03ceb372a78a..641fd5bbc79c2 100644 --- a/api_docs/kbn_securitysolution_autocomplete.mdx +++ b/api_docs/kbn_securitysolution_autocomplete.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-securitysolution-autocomplete title: "@kbn/securitysolution-autocomplete" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/securitysolution-autocomplete plugin -date: 2024-05-06 +date: 2024-05-07 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/securitysolution-autocomplete'] --- import kbnSecuritysolutionAutocompleteObj from './kbn_securitysolution_autocomplete.devdocs.json'; diff --git a/api_docs/kbn_securitysolution_data_table.mdx b/api_docs/kbn_securitysolution_data_table.mdx index d8e20ebb22902..f95ccacea611a 100644 --- a/api_docs/kbn_securitysolution_data_table.mdx +++ b/api_docs/kbn_securitysolution_data_table.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-securitysolution-data-table title: "@kbn/securitysolution-data-table" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/securitysolution-data-table plugin -date: 2024-05-06 +date: 2024-05-07 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/securitysolution-data-table'] --- import kbnSecuritysolutionDataTableObj from './kbn_securitysolution_data_table.devdocs.json'; diff --git a/api_docs/kbn_securitysolution_ecs.mdx b/api_docs/kbn_securitysolution_ecs.mdx index 3f746498799c3..df312406fd172 100644 --- a/api_docs/kbn_securitysolution_ecs.mdx +++ b/api_docs/kbn_securitysolution_ecs.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-securitysolution-ecs title: "@kbn/securitysolution-ecs" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/securitysolution-ecs plugin -date: 2024-05-06 +date: 2024-05-07 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/securitysolution-ecs'] --- import kbnSecuritysolutionEcsObj from './kbn_securitysolution_ecs.devdocs.json'; diff --git a/api_docs/kbn_securitysolution_es_utils.mdx b/api_docs/kbn_securitysolution_es_utils.mdx index 1ed62a1f7112d..bd9e26e320bb6 100644 --- a/api_docs/kbn_securitysolution_es_utils.mdx +++ b/api_docs/kbn_securitysolution_es_utils.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-securitysolution-es-utils title: "@kbn/securitysolution-es-utils" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/securitysolution-es-utils plugin -date: 2024-05-06 +date: 2024-05-07 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 e561cd9db72cf..6b778079b9fe9 100644 --- a/api_docs/kbn_securitysolution_exception_list_components.mdx +++ b/api_docs/kbn_securitysolution_exception_list_components.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-securitysolution-exception-list-components title: "@kbn/securitysolution-exception-list-components" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/securitysolution-exception-list-components plugin -date: 2024-05-06 +date: 2024-05-07 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/securitysolution-exception-list-components'] --- import kbnSecuritysolutionExceptionListComponentsObj from './kbn_securitysolution_exception_list_components.devdocs.json'; diff --git a/api_docs/kbn_securitysolution_grouping.mdx b/api_docs/kbn_securitysolution_grouping.mdx index 163d845782706..6a538d1f2cb57 100644 --- a/api_docs/kbn_securitysolution_grouping.mdx +++ b/api_docs/kbn_securitysolution_grouping.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-securitysolution-grouping title: "@kbn/securitysolution-grouping" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/securitysolution-grouping plugin -date: 2024-05-06 +date: 2024-05-07 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/securitysolution-grouping'] --- import kbnSecuritysolutionGroupingObj from './kbn_securitysolution_grouping.devdocs.json'; diff --git a/api_docs/kbn_securitysolution_hook_utils.mdx b/api_docs/kbn_securitysolution_hook_utils.mdx index 016e7d81c05bf..cc61238ade4fd 100644 --- a/api_docs/kbn_securitysolution_hook_utils.mdx +++ b/api_docs/kbn_securitysolution_hook_utils.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-securitysolution-hook-utils title: "@kbn/securitysolution-hook-utils" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/securitysolution-hook-utils plugin -date: 2024-05-06 +date: 2024-05-07 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 2ccdbd4b131e9..85e4dc7904f79 100644 --- a/api_docs/kbn_securitysolution_io_ts_alerting_types.mdx +++ b/api_docs/kbn_securitysolution_io_ts_alerting_types.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-securitysolution-io-ts-alerting-types title: "@kbn/securitysolution-io-ts-alerting-types" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/securitysolution-io-ts-alerting-types plugin -date: 2024-05-06 +date: 2024-05-07 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 cbb650bea9e51..1024019d1cf43 100644 --- a/api_docs/kbn_securitysolution_io_ts_list_types.mdx +++ b/api_docs/kbn_securitysolution_io_ts_list_types.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-securitysolution-io-ts-list-types title: "@kbn/securitysolution-io-ts-list-types" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/securitysolution-io-ts-list-types plugin -date: 2024-05-06 +date: 2024-05-07 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 90a1dc6991f53..4e9695976d7ca 100644 --- a/api_docs/kbn_securitysolution_io_ts_types.mdx +++ b/api_docs/kbn_securitysolution_io_ts_types.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-securitysolution-io-ts-types title: "@kbn/securitysolution-io-ts-types" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/securitysolution-io-ts-types plugin -date: 2024-05-06 +date: 2024-05-07 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 6f428437c4cf1..32b5789ea83b0 100644 --- a/api_docs/kbn_securitysolution_io_ts_utils.mdx +++ b/api_docs/kbn_securitysolution_io_ts_utils.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-securitysolution-io-ts-utils title: "@kbn/securitysolution-io-ts-utils" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/securitysolution-io-ts-utils plugin -date: 2024-05-06 +date: 2024-05-07 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 b54e020c37452..07a6a94cf971c 100644 --- a/api_docs/kbn_securitysolution_list_api.mdx +++ b/api_docs/kbn_securitysolution_list_api.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-securitysolution-list-api title: "@kbn/securitysolution-list-api" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/securitysolution-list-api plugin -date: 2024-05-06 +date: 2024-05-07 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 65b5f90c5ab8f..5e1539e30ca02 100644 --- a/api_docs/kbn_securitysolution_list_constants.mdx +++ b/api_docs/kbn_securitysolution_list_constants.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-securitysolution-list-constants title: "@kbn/securitysolution-list-constants" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/securitysolution-list-constants plugin -date: 2024-05-06 +date: 2024-05-07 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 702615e07593b..060c725a25bc3 100644 --- a/api_docs/kbn_securitysolution_list_hooks.mdx +++ b/api_docs/kbn_securitysolution_list_hooks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-securitysolution-list-hooks title: "@kbn/securitysolution-list-hooks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/securitysolution-list-hooks plugin -date: 2024-05-06 +date: 2024-05-07 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 4f6bceea8271a..03ddadac37d1a 100644 --- a/api_docs/kbn_securitysolution_list_utils.mdx +++ b/api_docs/kbn_securitysolution_list_utils.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-securitysolution-list-utils title: "@kbn/securitysolution-list-utils" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/securitysolution-list-utils plugin -date: 2024-05-06 +date: 2024-05-07 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 29209165370b5..ffd714fde546a 100644 --- a/api_docs/kbn_securitysolution_rules.mdx +++ b/api_docs/kbn_securitysolution_rules.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-securitysolution-rules title: "@kbn/securitysolution-rules" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/securitysolution-rules plugin -date: 2024-05-06 +date: 2024-05-07 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 b743b238d1ade..b199411056cbc 100644 --- a/api_docs/kbn_securitysolution_t_grid.mdx +++ b/api_docs/kbn_securitysolution_t_grid.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-securitysolution-t-grid title: "@kbn/securitysolution-t-grid" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/securitysolution-t-grid plugin -date: 2024-05-06 +date: 2024-05-07 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 66cb46d1658be..435859641dfb9 100644 --- a/api_docs/kbn_securitysolution_utils.mdx +++ b/api_docs/kbn_securitysolution_utils.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-securitysolution-utils title: "@kbn/securitysolution-utils" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/securitysolution-utils plugin -date: 2024-05-06 +date: 2024-05-07 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 f96786e523057..37a167ac7950e 100644 --- a/api_docs/kbn_server_http_tools.mdx +++ b/api_docs/kbn_server_http_tools.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-server-http-tools title: "@kbn/server-http-tools" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/server-http-tools plugin -date: 2024-05-06 +date: 2024-05-07 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 112957c994e09..ab2e32279b308 100644 --- a/api_docs/kbn_server_route_repository.mdx +++ b/api_docs/kbn_server_route_repository.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-server-route-repository title: "@kbn/server-route-repository" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/server-route-repository plugin -date: 2024-05-06 +date: 2024-05-07 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/server-route-repository'] --- import kbnServerRouteRepositoryObj from './kbn_server_route_repository.devdocs.json'; diff --git a/api_docs/kbn_serverless_common_settings.mdx b/api_docs/kbn_serverless_common_settings.mdx index d7c30cf15b82f..a5a51b3895e85 100644 --- a/api_docs/kbn_serverless_common_settings.mdx +++ b/api_docs/kbn_serverless_common_settings.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-serverless-common-settings title: "@kbn/serverless-common-settings" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/serverless-common-settings plugin -date: 2024-05-06 +date: 2024-05-07 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/serverless-common-settings'] --- import kbnServerlessCommonSettingsObj from './kbn_serverless_common_settings.devdocs.json'; diff --git a/api_docs/kbn_serverless_observability_settings.mdx b/api_docs/kbn_serverless_observability_settings.mdx index 4df9389cc6988..67e289f36d643 100644 --- a/api_docs/kbn_serverless_observability_settings.mdx +++ b/api_docs/kbn_serverless_observability_settings.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-serverless-observability-settings title: "@kbn/serverless-observability-settings" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/serverless-observability-settings plugin -date: 2024-05-06 +date: 2024-05-07 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/serverless-observability-settings'] --- import kbnServerlessObservabilitySettingsObj from './kbn_serverless_observability_settings.devdocs.json'; diff --git a/api_docs/kbn_serverless_project_switcher.mdx b/api_docs/kbn_serverless_project_switcher.mdx index 281a0e42da914..843e02c840a4c 100644 --- a/api_docs/kbn_serverless_project_switcher.mdx +++ b/api_docs/kbn_serverless_project_switcher.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-serverless-project-switcher title: "@kbn/serverless-project-switcher" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/serverless-project-switcher plugin -date: 2024-05-06 +date: 2024-05-07 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/serverless-project-switcher'] --- import kbnServerlessProjectSwitcherObj from './kbn_serverless_project_switcher.devdocs.json'; diff --git a/api_docs/kbn_serverless_search_settings.mdx b/api_docs/kbn_serverless_search_settings.mdx index e417886944f27..a191f67451594 100644 --- a/api_docs/kbn_serverless_search_settings.mdx +++ b/api_docs/kbn_serverless_search_settings.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-serverless-search-settings title: "@kbn/serverless-search-settings" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/serverless-search-settings plugin -date: 2024-05-06 +date: 2024-05-07 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/serverless-search-settings'] --- import kbnServerlessSearchSettingsObj from './kbn_serverless_search_settings.devdocs.json'; diff --git a/api_docs/kbn_serverless_security_settings.mdx b/api_docs/kbn_serverless_security_settings.mdx index 3f1156d752e47..22d77cca319b9 100644 --- a/api_docs/kbn_serverless_security_settings.mdx +++ b/api_docs/kbn_serverless_security_settings.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-serverless-security-settings title: "@kbn/serverless-security-settings" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/serverless-security-settings plugin -date: 2024-05-06 +date: 2024-05-07 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/serverless-security-settings'] --- import kbnServerlessSecuritySettingsObj from './kbn_serverless_security_settings.devdocs.json'; diff --git a/api_docs/kbn_serverless_storybook_config.mdx b/api_docs/kbn_serverless_storybook_config.mdx index 13ed420268c47..c14cb5b455815 100644 --- a/api_docs/kbn_serverless_storybook_config.mdx +++ b/api_docs/kbn_serverless_storybook_config.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-serverless-storybook-config title: "@kbn/serverless-storybook-config" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/serverless-storybook-config plugin -date: 2024-05-06 +date: 2024-05-07 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/serverless-storybook-config'] --- import kbnServerlessStorybookConfigObj from './kbn_serverless_storybook_config.devdocs.json'; diff --git a/api_docs/kbn_shared_svg.mdx b/api_docs/kbn_shared_svg.mdx index bc42fc22a8e6d..c5e929535005f 100644 --- a/api_docs/kbn_shared_svg.mdx +++ b/api_docs/kbn_shared_svg.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-shared-svg title: "@kbn/shared-svg" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/shared-svg plugin -date: 2024-05-06 +date: 2024-05-07 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/shared-svg'] --- import kbnSharedSvgObj from './kbn_shared_svg.devdocs.json'; diff --git a/api_docs/kbn_shared_ux_avatar_solution.mdx b/api_docs/kbn_shared_ux_avatar_solution.mdx index 6ab5d1864ed93..744e7354ef7d9 100644 --- a/api_docs/kbn_shared_ux_avatar_solution.mdx +++ b/api_docs/kbn_shared_ux_avatar_solution.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-shared-ux-avatar-solution title: "@kbn/shared-ux-avatar-solution" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/shared-ux-avatar-solution plugin -date: 2024-05-06 +date: 2024-05-07 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/shared-ux-avatar-solution'] --- import kbnSharedUxAvatarSolutionObj from './kbn_shared_ux_avatar_solution.devdocs.json'; diff --git a/api_docs/kbn_shared_ux_button_exit_full_screen.mdx b/api_docs/kbn_shared_ux_button_exit_full_screen.mdx index 87356bb823eab..9d912fb9fbcf9 100644 --- a/api_docs/kbn_shared_ux_button_exit_full_screen.mdx +++ b/api_docs/kbn_shared_ux_button_exit_full_screen.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-shared-ux-button-exit-full-screen title: "@kbn/shared-ux-button-exit-full-screen" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/shared-ux-button-exit-full-screen plugin -date: 2024-05-06 +date: 2024-05-07 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/shared-ux-button-exit-full-screen'] --- import kbnSharedUxButtonExitFullScreenObj from './kbn_shared_ux_button_exit_full_screen.devdocs.json'; diff --git a/api_docs/kbn_shared_ux_button_toolbar.mdx b/api_docs/kbn_shared_ux_button_toolbar.mdx index 91f2fdd7f17e7..3efcfe40c82d3 100644 --- a/api_docs/kbn_shared_ux_button_toolbar.mdx +++ b/api_docs/kbn_shared_ux_button_toolbar.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-shared-ux-button-toolbar title: "@kbn/shared-ux-button-toolbar" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/shared-ux-button-toolbar plugin -date: 2024-05-06 +date: 2024-05-07 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 87a6d7f6e65bb..3422e38df9cff 100644 --- a/api_docs/kbn_shared_ux_card_no_data.mdx +++ b/api_docs/kbn_shared_ux_card_no_data.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-shared-ux-card-no-data title: "@kbn/shared-ux-card-no-data" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/shared-ux-card-no-data plugin -date: 2024-05-06 +date: 2024-05-07 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 7571a19febfd2..5cd79c606ae1d 100644 --- a/api_docs/kbn_shared_ux_card_no_data_mocks.mdx +++ b/api_docs/kbn_shared_ux_card_no_data_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-shared-ux-card-no-data-mocks title: "@kbn/shared-ux-card-no-data-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/shared-ux-card-no-data-mocks plugin -date: 2024-05-06 +date: 2024-05-07 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/shared-ux-card-no-data-mocks'] --- import kbnSharedUxCardNoDataMocksObj from './kbn_shared_ux_card_no_data_mocks.devdocs.json'; diff --git a/api_docs/kbn_shared_ux_chrome_navigation.mdx b/api_docs/kbn_shared_ux_chrome_navigation.mdx index 9811c017721f6..50ea9e344adb7 100644 --- a/api_docs/kbn_shared_ux_chrome_navigation.mdx +++ b/api_docs/kbn_shared_ux_chrome_navigation.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-shared-ux-chrome-navigation title: "@kbn/shared-ux-chrome-navigation" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/shared-ux-chrome-navigation plugin -date: 2024-05-06 +date: 2024-05-07 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/shared-ux-chrome-navigation'] --- import kbnSharedUxChromeNavigationObj from './kbn_shared_ux_chrome_navigation.devdocs.json'; diff --git a/api_docs/kbn_shared_ux_error_boundary.mdx b/api_docs/kbn_shared_ux_error_boundary.mdx index d7e68caaac563..b48672c6b00a2 100644 --- a/api_docs/kbn_shared_ux_error_boundary.mdx +++ b/api_docs/kbn_shared_ux_error_boundary.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-shared-ux-error-boundary title: "@kbn/shared-ux-error-boundary" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/shared-ux-error-boundary plugin -date: 2024-05-06 +date: 2024-05-07 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/shared-ux-error-boundary'] --- import kbnSharedUxErrorBoundaryObj from './kbn_shared_ux_error_boundary.devdocs.json'; diff --git a/api_docs/kbn_shared_ux_file_context.mdx b/api_docs/kbn_shared_ux_file_context.mdx index c60a3ade7e927..3ac94054af166 100644 --- a/api_docs/kbn_shared_ux_file_context.mdx +++ b/api_docs/kbn_shared_ux_file_context.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-shared-ux-file-context title: "@kbn/shared-ux-file-context" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/shared-ux-file-context plugin -date: 2024-05-06 +date: 2024-05-07 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/shared-ux-file-context'] --- import kbnSharedUxFileContextObj from './kbn_shared_ux_file_context.devdocs.json'; diff --git a/api_docs/kbn_shared_ux_file_image.mdx b/api_docs/kbn_shared_ux_file_image.mdx index 639cc762b3f53..ae12ba9e73f59 100644 --- a/api_docs/kbn_shared_ux_file_image.mdx +++ b/api_docs/kbn_shared_ux_file_image.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-shared-ux-file-image title: "@kbn/shared-ux-file-image" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/shared-ux-file-image plugin -date: 2024-05-06 +date: 2024-05-07 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/shared-ux-file-image'] --- import kbnSharedUxFileImageObj from './kbn_shared_ux_file_image.devdocs.json'; diff --git a/api_docs/kbn_shared_ux_file_image_mocks.mdx b/api_docs/kbn_shared_ux_file_image_mocks.mdx index 119124a4dfe1b..a93bee1149bed 100644 --- a/api_docs/kbn_shared_ux_file_image_mocks.mdx +++ b/api_docs/kbn_shared_ux_file_image_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-shared-ux-file-image-mocks title: "@kbn/shared-ux-file-image-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/shared-ux-file-image-mocks plugin -date: 2024-05-06 +date: 2024-05-07 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/shared-ux-file-image-mocks'] --- import kbnSharedUxFileImageMocksObj from './kbn_shared_ux_file_image_mocks.devdocs.json'; diff --git a/api_docs/kbn_shared_ux_file_mocks.mdx b/api_docs/kbn_shared_ux_file_mocks.mdx index bacf2d75b5730..de8282fc50e4e 100644 --- a/api_docs/kbn_shared_ux_file_mocks.mdx +++ b/api_docs/kbn_shared_ux_file_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-shared-ux-file-mocks title: "@kbn/shared-ux-file-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/shared-ux-file-mocks plugin -date: 2024-05-06 +date: 2024-05-07 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/shared-ux-file-mocks'] --- import kbnSharedUxFileMocksObj from './kbn_shared_ux_file_mocks.devdocs.json'; diff --git a/api_docs/kbn_shared_ux_file_picker.mdx b/api_docs/kbn_shared_ux_file_picker.mdx index 551c9699a968d..15c02ace7a9d8 100644 --- a/api_docs/kbn_shared_ux_file_picker.mdx +++ b/api_docs/kbn_shared_ux_file_picker.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-shared-ux-file-picker title: "@kbn/shared-ux-file-picker" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/shared-ux-file-picker plugin -date: 2024-05-06 +date: 2024-05-07 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/shared-ux-file-picker'] --- import kbnSharedUxFilePickerObj from './kbn_shared_ux_file_picker.devdocs.json'; diff --git a/api_docs/kbn_shared_ux_file_types.mdx b/api_docs/kbn_shared_ux_file_types.mdx index df627f8e3bdce..9629ca3c2323b 100644 --- a/api_docs/kbn_shared_ux_file_types.mdx +++ b/api_docs/kbn_shared_ux_file_types.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-shared-ux-file-types title: "@kbn/shared-ux-file-types" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/shared-ux-file-types plugin -date: 2024-05-06 +date: 2024-05-07 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/shared-ux-file-types'] --- import kbnSharedUxFileTypesObj from './kbn_shared_ux_file_types.devdocs.json'; diff --git a/api_docs/kbn_shared_ux_file_upload.mdx b/api_docs/kbn_shared_ux_file_upload.mdx index 0cb7b0db7edea..a3b54f849fd06 100644 --- a/api_docs/kbn_shared_ux_file_upload.mdx +++ b/api_docs/kbn_shared_ux_file_upload.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-shared-ux-file-upload title: "@kbn/shared-ux-file-upload" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/shared-ux-file-upload plugin -date: 2024-05-06 +date: 2024-05-07 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/shared-ux-file-upload'] --- import kbnSharedUxFileUploadObj from './kbn_shared_ux_file_upload.devdocs.json'; diff --git a/api_docs/kbn_shared_ux_file_util.mdx b/api_docs/kbn_shared_ux_file_util.mdx index 82297325b69be..652cc70868fd7 100644 --- a/api_docs/kbn_shared_ux_file_util.mdx +++ b/api_docs/kbn_shared_ux_file_util.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-shared-ux-file-util title: "@kbn/shared-ux-file-util" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/shared-ux-file-util plugin -date: 2024-05-06 +date: 2024-05-07 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/shared-ux-file-util'] --- import kbnSharedUxFileUtilObj from './kbn_shared_ux_file_util.devdocs.json'; diff --git a/api_docs/kbn_shared_ux_link_redirect_app.mdx b/api_docs/kbn_shared_ux_link_redirect_app.mdx index cb3b77dc4b256..a4b997552a862 100644 --- a/api_docs/kbn_shared_ux_link_redirect_app.mdx +++ b/api_docs/kbn_shared_ux_link_redirect_app.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-shared-ux-link-redirect-app title: "@kbn/shared-ux-link-redirect-app" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/shared-ux-link-redirect-app plugin -date: 2024-05-06 +date: 2024-05-07 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/shared-ux-link-redirect-app'] --- import kbnSharedUxLinkRedirectAppObj from './kbn_shared_ux_link_redirect_app.devdocs.json'; diff --git a/api_docs/kbn_shared_ux_link_redirect_app_mocks.mdx b/api_docs/kbn_shared_ux_link_redirect_app_mocks.mdx index 7b0619cb275fe..5ac1515b51acc 100644 --- a/api_docs/kbn_shared_ux_link_redirect_app_mocks.mdx +++ b/api_docs/kbn_shared_ux_link_redirect_app_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-shared-ux-link-redirect-app-mocks title: "@kbn/shared-ux-link-redirect-app-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/shared-ux-link-redirect-app-mocks plugin -date: 2024-05-06 +date: 2024-05-07 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/shared-ux-link-redirect-app-mocks'] --- import kbnSharedUxLinkRedirectAppMocksObj from './kbn_shared_ux_link_redirect_app_mocks.devdocs.json'; diff --git a/api_docs/kbn_shared_ux_markdown.mdx b/api_docs/kbn_shared_ux_markdown.mdx index cbb812b2712d4..8ea762feb49b5 100644 --- a/api_docs/kbn_shared_ux_markdown.mdx +++ b/api_docs/kbn_shared_ux_markdown.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-shared-ux-markdown title: "@kbn/shared-ux-markdown" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/shared-ux-markdown plugin -date: 2024-05-06 +date: 2024-05-07 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/shared-ux-markdown'] --- import kbnSharedUxMarkdownObj from './kbn_shared_ux_markdown.devdocs.json'; diff --git a/api_docs/kbn_shared_ux_markdown_mocks.mdx b/api_docs/kbn_shared_ux_markdown_mocks.mdx index 05ffbd8d22550..c9f9c1a82c9c1 100644 --- a/api_docs/kbn_shared_ux_markdown_mocks.mdx +++ b/api_docs/kbn_shared_ux_markdown_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-shared-ux-markdown-mocks title: "@kbn/shared-ux-markdown-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/shared-ux-markdown-mocks plugin -date: 2024-05-06 +date: 2024-05-07 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/shared-ux-markdown-mocks'] --- import kbnSharedUxMarkdownMocksObj from './kbn_shared_ux_markdown_mocks.devdocs.json'; diff --git a/api_docs/kbn_shared_ux_page_analytics_no_data.mdx b/api_docs/kbn_shared_ux_page_analytics_no_data.mdx index 772fde1949d18..faeae7ab7c82d 100644 --- a/api_docs/kbn_shared_ux_page_analytics_no_data.mdx +++ b/api_docs/kbn_shared_ux_page_analytics_no_data.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-shared-ux-page-analytics-no-data title: "@kbn/shared-ux-page-analytics-no-data" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/shared-ux-page-analytics-no-data plugin -date: 2024-05-06 +date: 2024-05-07 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 e7af896663c9c..caed77829bd3b 100644 --- a/api_docs/kbn_shared_ux_page_analytics_no_data_mocks.mdx +++ b/api_docs/kbn_shared_ux_page_analytics_no_data_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-shared-ux-page-analytics-no-data-mocks title: "@kbn/shared-ux-page-analytics-no-data-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/shared-ux-page-analytics-no-data-mocks plugin -date: 2024-05-06 +date: 2024-05-07 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 2a468a20741a4..6c41aa2999ef7 100644 --- a/api_docs/kbn_shared_ux_page_kibana_no_data.mdx +++ b/api_docs/kbn_shared_ux_page_kibana_no_data.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-shared-ux-page-kibana-no-data title: "@kbn/shared-ux-page-kibana-no-data" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/shared-ux-page-kibana-no-data plugin -date: 2024-05-06 +date: 2024-05-07 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 106f4b5cd24bc..f968e0c134af7 100644 --- a/api_docs/kbn_shared_ux_page_kibana_no_data_mocks.mdx +++ b/api_docs/kbn_shared_ux_page_kibana_no_data_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-shared-ux-page-kibana-no-data-mocks title: "@kbn/shared-ux-page-kibana-no-data-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/shared-ux-page-kibana-no-data-mocks plugin -date: 2024-05-06 +date: 2024-05-07 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 f2fa8127b6ba0..c864bd17ca645 100644 --- a/api_docs/kbn_shared_ux_page_kibana_template.mdx +++ b/api_docs/kbn_shared_ux_page_kibana_template.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-shared-ux-page-kibana-template title: "@kbn/shared-ux-page-kibana-template" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/shared-ux-page-kibana-template plugin -date: 2024-05-06 +date: 2024-05-07 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 b223773aa1cf2..b812ad076221b 100644 --- a/api_docs/kbn_shared_ux_page_kibana_template_mocks.mdx +++ b/api_docs/kbn_shared_ux_page_kibana_template_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-shared-ux-page-kibana-template-mocks title: "@kbn/shared-ux-page-kibana-template-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/shared-ux-page-kibana-template-mocks plugin -date: 2024-05-06 +date: 2024-05-07 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 cc80f28e370a2..cffc580407a2d 100644 --- a/api_docs/kbn_shared_ux_page_no_data.mdx +++ b/api_docs/kbn_shared_ux_page_no_data.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-shared-ux-page-no-data title: "@kbn/shared-ux-page-no-data" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/shared-ux-page-no-data plugin -date: 2024-05-06 +date: 2024-05-07 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 34516124b57ea..6739b1bc84258 100644 --- a/api_docs/kbn_shared_ux_page_no_data_config.mdx +++ b/api_docs/kbn_shared_ux_page_no_data_config.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-shared-ux-page-no-data-config title: "@kbn/shared-ux-page-no-data-config" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/shared-ux-page-no-data-config plugin -date: 2024-05-06 +date: 2024-05-07 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 7c2259fe1c33e..fca0931e7daa6 100644 --- a/api_docs/kbn_shared_ux_page_no_data_config_mocks.mdx +++ b/api_docs/kbn_shared_ux_page_no_data_config_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-shared-ux-page-no-data-config-mocks title: "@kbn/shared-ux-page-no-data-config-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/shared-ux-page-no-data-config-mocks plugin -date: 2024-05-06 +date: 2024-05-07 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 6bd20d5ae7532..a9f98d95008f1 100644 --- a/api_docs/kbn_shared_ux_page_no_data_mocks.mdx +++ b/api_docs/kbn_shared_ux_page_no_data_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-shared-ux-page-no-data-mocks title: "@kbn/shared-ux-page-no-data-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/shared-ux-page-no-data-mocks plugin -date: 2024-05-06 +date: 2024-05-07 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 115edc896826e..1be70f1b98749 100644 --- a/api_docs/kbn_shared_ux_page_solution_nav.mdx +++ b/api_docs/kbn_shared_ux_page_solution_nav.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-shared-ux-page-solution-nav title: "@kbn/shared-ux-page-solution-nav" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/shared-ux-page-solution-nav plugin -date: 2024-05-06 +date: 2024-05-07 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 66fd33b9acc90..7f6c7bc5eaf6e 100644 --- a/api_docs/kbn_shared_ux_prompt_no_data_views.mdx +++ b/api_docs/kbn_shared_ux_prompt_no_data_views.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-shared-ux-prompt-no-data-views title: "@kbn/shared-ux-prompt-no-data-views" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/shared-ux-prompt-no-data-views plugin -date: 2024-05-06 +date: 2024-05-07 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 8dc682bcd1b43..54f602363bfb2 100644 --- a/api_docs/kbn_shared_ux_prompt_no_data_views_mocks.mdx +++ b/api_docs/kbn_shared_ux_prompt_no_data_views_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-shared-ux-prompt-no-data-views-mocks title: "@kbn/shared-ux-prompt-no-data-views-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/shared-ux-prompt-no-data-views-mocks plugin -date: 2024-05-06 +date: 2024-05-07 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/shared-ux-prompt-no-data-views-mocks'] --- import kbnSharedUxPromptNoDataViewsMocksObj from './kbn_shared_ux_prompt_no_data_views_mocks.devdocs.json'; diff --git a/api_docs/kbn_shared_ux_prompt_not_found.mdx b/api_docs/kbn_shared_ux_prompt_not_found.mdx index 3dc6716aaf1ed..a956538538b65 100644 --- a/api_docs/kbn_shared_ux_prompt_not_found.mdx +++ b/api_docs/kbn_shared_ux_prompt_not_found.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-shared-ux-prompt-not-found title: "@kbn/shared-ux-prompt-not-found" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/shared-ux-prompt-not-found plugin -date: 2024-05-06 +date: 2024-05-07 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/shared-ux-prompt-not-found'] --- import kbnSharedUxPromptNotFoundObj from './kbn_shared_ux_prompt_not_found.devdocs.json'; diff --git a/api_docs/kbn_shared_ux_router.mdx b/api_docs/kbn_shared_ux_router.mdx index ffa4bba20dcf0..01760d99894b7 100644 --- a/api_docs/kbn_shared_ux_router.mdx +++ b/api_docs/kbn_shared_ux_router.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-shared-ux-router title: "@kbn/shared-ux-router" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/shared-ux-router plugin -date: 2024-05-06 +date: 2024-05-07 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 c19cfb1926dbf..6e04c7604e574 100644 --- a/api_docs/kbn_shared_ux_router_mocks.mdx +++ b/api_docs/kbn_shared_ux_router_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-shared-ux-router-mocks title: "@kbn/shared-ux-router-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/shared-ux-router-mocks plugin -date: 2024-05-06 +date: 2024-05-07 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 08608827b8461..d30dc474b1f8d 100644 --- a/api_docs/kbn_shared_ux_storybook_config.mdx +++ b/api_docs/kbn_shared_ux_storybook_config.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-shared-ux-storybook-config title: "@kbn/shared-ux-storybook-config" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/shared-ux-storybook-config plugin -date: 2024-05-06 +date: 2024-05-07 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 e6f95b825e6b3..5bd95ffe04e8d 100644 --- a/api_docs/kbn_shared_ux_storybook_mock.mdx +++ b/api_docs/kbn_shared_ux_storybook_mock.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-shared-ux-storybook-mock title: "@kbn/shared-ux-storybook-mock" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/shared-ux-storybook-mock plugin -date: 2024-05-06 +date: 2024-05-07 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/shared-ux-storybook-mock'] --- import kbnSharedUxStorybookMockObj from './kbn_shared_ux_storybook_mock.devdocs.json'; diff --git a/api_docs/kbn_shared_ux_tabbed_modal.mdx b/api_docs/kbn_shared_ux_tabbed_modal.mdx index c426891cd4c26..8656d78746289 100644 --- a/api_docs/kbn_shared_ux_tabbed_modal.mdx +++ b/api_docs/kbn_shared_ux_tabbed_modal.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-shared-ux-tabbed-modal title: "@kbn/shared-ux-tabbed-modal" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/shared-ux-tabbed-modal plugin -date: 2024-05-06 +date: 2024-05-07 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/shared-ux-tabbed-modal'] --- import kbnSharedUxTabbedModalObj from './kbn_shared_ux_tabbed_modal.devdocs.json'; diff --git a/api_docs/kbn_shared_ux_utility.mdx b/api_docs/kbn_shared_ux_utility.mdx index 0b8123acb6cb8..46f11055f5450 100644 --- a/api_docs/kbn_shared_ux_utility.mdx +++ b/api_docs/kbn_shared_ux_utility.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-shared-ux-utility title: "@kbn/shared-ux-utility" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/shared-ux-utility plugin -date: 2024-05-06 +date: 2024-05-07 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/shared-ux-utility'] --- import kbnSharedUxUtilityObj from './kbn_shared_ux_utility.devdocs.json'; diff --git a/api_docs/kbn_slo_schema.mdx b/api_docs/kbn_slo_schema.mdx index aedf3ea9ff6a8..bc09568d7794f 100644 --- a/api_docs/kbn_slo_schema.mdx +++ b/api_docs/kbn_slo_schema.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-slo-schema title: "@kbn/slo-schema" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/slo-schema plugin -date: 2024-05-06 +date: 2024-05-07 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/slo-schema'] --- import kbnSloSchemaObj from './kbn_slo_schema.devdocs.json'; diff --git a/api_docs/kbn_solution_nav_es.mdx b/api_docs/kbn_solution_nav_es.mdx index abb2769a08a12..ffdd80a5095b9 100644 --- a/api_docs/kbn_solution_nav_es.mdx +++ b/api_docs/kbn_solution_nav_es.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-solution-nav-es title: "@kbn/solution-nav-es" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/solution-nav-es plugin -date: 2024-05-06 +date: 2024-05-07 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/solution-nav-es'] --- import kbnSolutionNavEsObj from './kbn_solution_nav_es.devdocs.json'; diff --git a/api_docs/kbn_solution_nav_oblt.mdx b/api_docs/kbn_solution_nav_oblt.mdx index 3f5966e9ee40b..c55e9aade46ca 100644 --- a/api_docs/kbn_solution_nav_oblt.mdx +++ b/api_docs/kbn_solution_nav_oblt.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-solution-nav-oblt title: "@kbn/solution-nav-oblt" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/solution-nav-oblt plugin -date: 2024-05-06 +date: 2024-05-07 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/solution-nav-oblt'] --- import kbnSolutionNavObltObj from './kbn_solution_nav_oblt.devdocs.json'; diff --git a/api_docs/kbn_some_dev_log.mdx b/api_docs/kbn_some_dev_log.mdx index 896e53ceabddd..16405d6506ec7 100644 --- a/api_docs/kbn_some_dev_log.mdx +++ b/api_docs/kbn_some_dev_log.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-some-dev-log title: "@kbn/some-dev-log" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/some-dev-log plugin -date: 2024-05-06 +date: 2024-05-07 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/some-dev-log'] --- import kbnSomeDevLogObj from './kbn_some_dev_log.devdocs.json'; diff --git a/api_docs/kbn_sort_predicates.mdx b/api_docs/kbn_sort_predicates.mdx index f8a45f420beca..949f02026184f 100644 --- a/api_docs/kbn_sort_predicates.mdx +++ b/api_docs/kbn_sort_predicates.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-sort-predicates title: "@kbn/sort-predicates" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/sort-predicates plugin -date: 2024-05-06 +date: 2024-05-07 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/sort-predicates'] --- import kbnSortPredicatesObj from './kbn_sort_predicates.devdocs.json'; diff --git a/api_docs/kbn_std.mdx b/api_docs/kbn_std.mdx index 1bf2c41f424cd..0028af6458444 100644 --- a/api_docs/kbn_std.mdx +++ b/api_docs/kbn_std.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-std title: "@kbn/std" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/std plugin -date: 2024-05-06 +date: 2024-05-07 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 e33614be845fb..30567572c8d5e 100644 --- a/api_docs/kbn_stdio_dev_helpers.mdx +++ b/api_docs/kbn_stdio_dev_helpers.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-stdio-dev-helpers title: "@kbn/stdio-dev-helpers" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/stdio-dev-helpers plugin -date: 2024-05-06 +date: 2024-05-07 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 fb5b530fbab75..3ff597004c22a 100644 --- a/api_docs/kbn_storybook.mdx +++ b/api_docs/kbn_storybook.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-storybook title: "@kbn/storybook" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/storybook plugin -date: 2024-05-06 +date: 2024-05-07 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 5a31e3ce140f5..4a590cd971ab7 100644 --- a/api_docs/kbn_telemetry_tools.mdx +++ b/api_docs/kbn_telemetry_tools.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-telemetry-tools title: "@kbn/telemetry-tools" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/telemetry-tools plugin -date: 2024-05-06 +date: 2024-05-07 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 badabe4828828..b754fc7266609 100644 --- a/api_docs/kbn_test.mdx +++ b/api_docs/kbn_test.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-test title: "@kbn/test" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/test plugin -date: 2024-05-06 +date: 2024-05-07 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/test'] --- import kbnTestObj from './kbn_test.devdocs.json'; diff --git a/api_docs/kbn_test_eui_helpers.devdocs.json b/api_docs/kbn_test_eui_helpers.devdocs.json index bb3fc948f8585..aab4d099fcc9a 100644 --- a/api_docs/kbn_test_eui_helpers.devdocs.json +++ b/api_docs/kbn_test_eui_helpers.devdocs.json @@ -18,6 +18,174 @@ }, "common": { "classes": [ + { + "parentPluginId": "@kbn/test-eui-helpers", + "id": "def-common.EuiButtonGroupTestHarness", + "type": "Class", + "tags": [], + "label": "EuiButtonGroupTestHarness", + "description": [], + "path": "packages/kbn-test-eui-helpers/src/rtl_helpers.tsx", + "deprecated": false, + "trackAdoption": false, + "children": [ + { + "parentPluginId": "@kbn/test-eui-helpers", + "id": "def-common.EuiButtonGroupTestHarness.testId", + "type": "string", + "tags": [], + "label": "#testId", + "description": [], + "path": "packages/kbn-test-eui-helpers/src/rtl_helpers.tsx", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/test-eui-helpers", + "id": "def-common.EuiButtonGroupTestHarness.buttonGroup", + "type": "Object", + "tags": [], + "label": "#buttonGroup", + "description": [ + "\nReturns button group or throws" + ], + "signature": [ + "HTMLElement" + ], + "path": "packages/kbn-test-eui-helpers/src/rtl_helpers.tsx", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/test-eui-helpers", + "id": "def-common.EuiButtonGroupTestHarness.Unnamed", + "type": "Function", + "tags": [], + "label": "Constructor", + "description": [], + "signature": [ + "any" + ], + "path": "packages/kbn-test-eui-helpers/src/rtl_helpers.tsx", + "deprecated": false, + "trackAdoption": false, + "children": [ + { + "parentPluginId": "@kbn/test-eui-helpers", + "id": "def-common.EuiButtonGroupTestHarness.Unnamed.$1", + "type": "string", + "tags": [], + "label": "testId", + "description": [], + "signature": [ + "string" + ], + "path": "packages/kbn-test-eui-helpers/src/rtl_helpers.tsx", + "deprecated": false, + "trackAdoption": false, + "isRequired": true + } + ], + "returnComment": [] + }, + { + "parentPluginId": "@kbn/test-eui-helpers", + "id": "def-common.EuiButtonGroupTestHarness.testId", + "type": "string", + "tags": [], + "label": "testId", + "description": [ + "\nReturns `data-test-subj` of button group" + ], + "path": "packages/kbn-test-eui-helpers/src/rtl_helpers.tsx", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/test-eui-helpers", + "id": "def-common.EuiButtonGroupTestHarness.self", + "type": "CompoundType", + "tags": [], + "label": "self", + "description": [ + "\nReturns button group if found, otherwise `null`" + ], + "signature": [ + "HTMLElement | null" + ], + "path": "packages/kbn-test-eui-helpers/src/rtl_helpers.tsx", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/test-eui-helpers", + "id": "def-common.EuiButtonGroupTestHarness.options", + "type": "Array", + "tags": [], + "label": "options", + "description": [ + "\nReturns all options of button groups" + ], + "signature": [ + "HTMLElement[]" + ], + "path": "packages/kbn-test-eui-helpers/src/rtl_helpers.tsx", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/test-eui-helpers", + "id": "def-common.EuiButtonGroupTestHarness.selected", + "type": "Object", + "tags": [], + "label": "selected", + "description": [ + "\nReturns selected value of button group" + ], + "signature": [ + "HTMLElement" + ], + "path": "packages/kbn-test-eui-helpers/src/rtl_helpers.tsx", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/test-eui-helpers", + "id": "def-common.EuiButtonGroupTestHarness.select", + "type": "Function", + "tags": [], + "label": "select", + "description": [ + "\nSelect option from group" + ], + "signature": [ + "(optionName: string | RegExp) => void" + ], + "path": "packages/kbn-test-eui-helpers/src/rtl_helpers.tsx", + "deprecated": false, + "trackAdoption": false, + "children": [ + { + "parentPluginId": "@kbn/test-eui-helpers", + "id": "def-common.EuiButtonGroupTestHarness.select.$1", + "type": "CompoundType", + "tags": [], + "label": "optionName", + "description": [], + "signature": [ + "string | RegExp" + ], + "path": "packages/kbn-test-eui-helpers/src/rtl_helpers.tsx", + "deprecated": false, + "trackAdoption": false, + "isRequired": true + } + ], + "returnComment": [] + } + ], + "initialIsOpen": false + }, { "parentPluginId": "@kbn/test-eui-helpers", "id": "def-common.EuiSuperDatePickerTestHarness", diff --git a/api_docs/kbn_test_eui_helpers.mdx b/api_docs/kbn_test_eui_helpers.mdx index 30ba40d52aa01..a6e0f69e31cb9 100644 --- a/api_docs/kbn_test_eui_helpers.mdx +++ b/api_docs/kbn_test_eui_helpers.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-test-eui-helpers title: "@kbn/test-eui-helpers" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/test-eui-helpers plugin -date: 2024-05-06 +date: 2024-05-07 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/test-eui-helpers'] --- import kbnTestEuiHelpersObj from './kbn_test_eui_helpers.devdocs.json'; @@ -21,7 +21,7 @@ Contact [@elastic/kibana-visualizations](https://github.com/orgs/elastic/teams/k | Public API count | Any count | Items lacking comments | Missing exports | |-------------------|-----------|------------------------|-----------------| -| 14 | 0 | 8 | 0 | +| 25 | 0 | 13 | 0 | ## Common diff --git a/api_docs/kbn_test_jest_helpers.mdx b/api_docs/kbn_test_jest_helpers.mdx index 00db5b3dcbe50..ea9322d8ac157 100644 --- a/api_docs/kbn_test_jest_helpers.mdx +++ b/api_docs/kbn_test_jest_helpers.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-test-jest-helpers title: "@kbn/test-jest-helpers" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/test-jest-helpers plugin -date: 2024-05-06 +date: 2024-05-07 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 3714d1b9283f3..6ba8f71013034 100644 --- a/api_docs/kbn_test_subj_selector.mdx +++ b/api_docs/kbn_test_subj_selector.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-test-subj-selector title: "@kbn/test-subj-selector" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/test-subj-selector plugin -date: 2024-05-06 +date: 2024-05-07 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/test-subj-selector'] --- import kbnTestSubjSelectorObj from './kbn_test_subj_selector.devdocs.json'; diff --git a/api_docs/kbn_text_based_editor.mdx b/api_docs/kbn_text_based_editor.mdx index bfeae4d9e14dc..0f15b4bede9d4 100644 --- a/api_docs/kbn_text_based_editor.mdx +++ b/api_docs/kbn_text_based_editor.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-text-based-editor title: "@kbn/text-based-editor" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/text-based-editor plugin -date: 2024-05-06 +date: 2024-05-07 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/text-based-editor'] --- import kbnTextBasedEditorObj from './kbn_text_based_editor.devdocs.json'; diff --git a/api_docs/kbn_timerange.mdx b/api_docs/kbn_timerange.mdx index 7d648c2f006c2..f02719f0ef05f 100644 --- a/api_docs/kbn_timerange.mdx +++ b/api_docs/kbn_timerange.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-timerange title: "@kbn/timerange" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/timerange plugin -date: 2024-05-06 +date: 2024-05-07 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/timerange'] --- import kbnTimerangeObj from './kbn_timerange.devdocs.json'; diff --git a/api_docs/kbn_tooling_log.mdx b/api_docs/kbn_tooling_log.mdx index cf27eb718e2c8..8a9c68e540b3c 100644 --- a/api_docs/kbn_tooling_log.mdx +++ b/api_docs/kbn_tooling_log.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-tooling-log title: "@kbn/tooling-log" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/tooling-log plugin -date: 2024-05-06 +date: 2024-05-07 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/tooling-log'] --- import kbnToolingLogObj from './kbn_tooling_log.devdocs.json'; diff --git a/api_docs/kbn_triggers_actions_ui_types.mdx b/api_docs/kbn_triggers_actions_ui_types.mdx index 3dea65f6bbc48..aff7155cf6241 100644 --- a/api_docs/kbn_triggers_actions_ui_types.mdx +++ b/api_docs/kbn_triggers_actions_ui_types.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-triggers-actions-ui-types title: "@kbn/triggers-actions-ui-types" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/triggers-actions-ui-types plugin -date: 2024-05-06 +date: 2024-05-07 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/triggers-actions-ui-types'] --- import kbnTriggersActionsUiTypesObj from './kbn_triggers_actions_ui_types.devdocs.json'; diff --git a/api_docs/kbn_ts_projects.mdx b/api_docs/kbn_ts_projects.mdx index b3cb159a722c3..5d2403bf7c360 100644 --- a/api_docs/kbn_ts_projects.mdx +++ b/api_docs/kbn_ts_projects.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-ts-projects title: "@kbn/ts-projects" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/ts-projects plugin -date: 2024-05-06 +date: 2024-05-07 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/ts-projects'] --- import kbnTsProjectsObj from './kbn_ts_projects.devdocs.json'; diff --git a/api_docs/kbn_typed_react_router_config.mdx b/api_docs/kbn_typed_react_router_config.mdx index 5b1db67995190..1779f7edd81d1 100644 --- a/api_docs/kbn_typed_react_router_config.mdx +++ b/api_docs/kbn_typed_react_router_config.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-typed-react-router-config title: "@kbn/typed-react-router-config" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/typed-react-router-config plugin -date: 2024-05-06 +date: 2024-05-07 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/typed-react-router-config'] --- import kbnTypedReactRouterConfigObj from './kbn_typed_react_router_config.devdocs.json'; diff --git a/api_docs/kbn_ui_actions_browser.mdx b/api_docs/kbn_ui_actions_browser.mdx index 048e69442256f..58a24631f8daa 100644 --- a/api_docs/kbn_ui_actions_browser.mdx +++ b/api_docs/kbn_ui_actions_browser.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-ui-actions-browser title: "@kbn/ui-actions-browser" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/ui-actions-browser plugin -date: 2024-05-06 +date: 2024-05-07 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/ui-actions-browser'] --- import kbnUiActionsBrowserObj from './kbn_ui_actions_browser.devdocs.json'; diff --git a/api_docs/kbn_ui_shared_deps_src.mdx b/api_docs/kbn_ui_shared_deps_src.mdx index d53a09c4fe863..0c00262e0aea1 100644 --- a/api_docs/kbn_ui_shared_deps_src.mdx +++ b/api_docs/kbn_ui_shared_deps_src.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-ui-shared-deps-src title: "@kbn/ui-shared-deps-src" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/ui-shared-deps-src plugin -date: 2024-05-06 +date: 2024-05-07 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/ui-shared-deps-src'] --- import kbnUiSharedDepsSrcObj from './kbn_ui_shared_deps_src.devdocs.json'; diff --git a/api_docs/kbn_ui_theme.mdx b/api_docs/kbn_ui_theme.mdx index a3c7dd6a78d83..c990c29d013eb 100644 --- a/api_docs/kbn_ui_theme.mdx +++ b/api_docs/kbn_ui_theme.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-ui-theme title: "@kbn/ui-theme" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/ui-theme plugin -date: 2024-05-06 +date: 2024-05-07 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/ui-theme'] --- import kbnUiThemeObj from './kbn_ui_theme.devdocs.json'; diff --git a/api_docs/kbn_unified_data_table.devdocs.json b/api_docs/kbn_unified_data_table.devdocs.json index d3915e18bc932..087c4916b5b9c 100644 --- a/api_docs/kbn_unified_data_table.devdocs.json +++ b/api_docs/kbn_unified_data_table.devdocs.json @@ -1127,60 +1127,12 @@ "\nFunction to add a filter in the grid cell or document flyout" ], "signature": [ - "(mapping: string | ", - "FieldMapping", - " | undefined, value: unknown, mode: \"+\" | \"-\") => void" + "DocViewFilterFn", + " | undefined" ], "path": "packages/kbn-unified-data-table/src/components/data_table.tsx", "deprecated": false, - "trackAdoption": false, - "returnComment": [], - "children": [ - { - "parentPluginId": "@kbn/unified-data-table", - "id": "def-common.UnifiedDataTableProps.onFilter.$1", - "type": "CompoundType", - "tags": [], - "label": "mapping", - "description": [], - "signature": [ - "string | ", - "FieldMapping", - " | undefined" - ], - "path": "packages/kbn-unified-doc-viewer/src/services/types.ts", - "deprecated": false, - "trackAdoption": false - }, - { - "parentPluginId": "@kbn/unified-data-table", - "id": "def-common.UnifiedDataTableProps.onFilter.$2", - "type": "Unknown", - "tags": [], - "label": "value", - "description": [], - "signature": [ - "unknown" - ], - "path": "packages/kbn-unified-doc-viewer/src/services/types.ts", - "deprecated": false, - "trackAdoption": false - }, - { - "parentPluginId": "@kbn/unified-data-table", - "id": "def-common.UnifiedDataTableProps.onFilter.$3", - "type": "CompoundType", - "tags": [], - "label": "mode", - "description": [], - "signature": [ - "\"+\" | \"-\"" - ], - "path": "packages/kbn-unified-doc-viewer/src/services/types.ts", - "deprecated": false, - "trackAdoption": false - } - ] + "trackAdoption": false }, { "parentPluginId": "@kbn/unified-data-table", diff --git a/api_docs/kbn_unified_data_table.mdx b/api_docs/kbn_unified_data_table.mdx index dd14edd8258f9..f98d0089826d7 100644 --- a/api_docs/kbn_unified_data_table.mdx +++ b/api_docs/kbn_unified_data_table.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-unified-data-table title: "@kbn/unified-data-table" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/unified-data-table plugin -date: 2024-05-06 +date: 2024-05-07 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/unified-data-table'] --- import kbnUnifiedDataTableObj from './kbn_unified_data_table.devdocs.json'; @@ -21,7 +21,7 @@ Contact [@elastic/kibana-data-discovery](https://github.com/orgs/elastic/teams/k | Public API count | Any count | Items lacking comments | Missing exports | |-------------------|-----------|------------------------|-----------------| -| 152 | 0 | 83 | 2 | +| 149 | 0 | 80 | 2 | ## Common diff --git a/api_docs/kbn_unified_doc_viewer.mdx b/api_docs/kbn_unified_doc_viewer.mdx index 87eb1cbd5279d..9cf47290f0857 100644 --- a/api_docs/kbn_unified_doc_viewer.mdx +++ b/api_docs/kbn_unified_doc_viewer.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-unified-doc-viewer title: "@kbn/unified-doc-viewer" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/unified-doc-viewer plugin -date: 2024-05-06 +date: 2024-05-07 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/unified-doc-viewer'] --- import kbnUnifiedDocViewerObj from './kbn_unified_doc_viewer.devdocs.json'; @@ -21,7 +21,7 @@ Contact [@elastic/kibana-data-discovery](https://github.com/orgs/elastic/teams/k | Public API count | Any count | Items lacking comments | Missing exports | |-------------------|-----------|------------------------|-----------------| -| 18 | 0 | 17 | 6 | +| 18 | 0 | 17 | 5 | ## Common diff --git a/api_docs/kbn_unified_field_list.mdx b/api_docs/kbn_unified_field_list.mdx index 5dd0e676a7c6d..d214ce32cc9c6 100644 --- a/api_docs/kbn_unified_field_list.mdx +++ b/api_docs/kbn_unified_field_list.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-unified-field-list title: "@kbn/unified-field-list" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/unified-field-list plugin -date: 2024-05-06 +date: 2024-05-07 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/unified-field-list'] --- import kbnUnifiedFieldListObj from './kbn_unified_field_list.devdocs.json'; diff --git a/api_docs/kbn_unsaved_changes_badge.mdx b/api_docs/kbn_unsaved_changes_badge.mdx index 2a7f1cb9b5c41..f37aeca449611 100644 --- a/api_docs/kbn_unsaved_changes_badge.mdx +++ b/api_docs/kbn_unsaved_changes_badge.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-unsaved-changes-badge title: "@kbn/unsaved-changes-badge" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/unsaved-changes-badge plugin -date: 2024-05-06 +date: 2024-05-07 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/unsaved-changes-badge'] --- import kbnUnsavedChangesBadgeObj from './kbn_unsaved_changes_badge.devdocs.json'; diff --git a/api_docs/kbn_use_tracked_promise.mdx b/api_docs/kbn_use_tracked_promise.mdx index 61e4a9716c7e7..9e7234224bf44 100644 --- a/api_docs/kbn_use_tracked_promise.mdx +++ b/api_docs/kbn_use_tracked_promise.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-use-tracked-promise title: "@kbn/use-tracked-promise" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/use-tracked-promise plugin -date: 2024-05-06 +date: 2024-05-07 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/use-tracked-promise'] --- import kbnUseTrackedPromiseObj from './kbn_use_tracked_promise.devdocs.json'; diff --git a/api_docs/kbn_user_profile_components.mdx b/api_docs/kbn_user_profile_components.mdx index eb6e690321488..ae12b7eb537f0 100644 --- a/api_docs/kbn_user_profile_components.mdx +++ b/api_docs/kbn_user_profile_components.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-user-profile-components title: "@kbn/user-profile-components" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/user-profile-components plugin -date: 2024-05-06 +date: 2024-05-07 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 a2df23f4db6d3..540aebf8a97a5 100644 --- a/api_docs/kbn_utility_types.mdx +++ b/api_docs/kbn_utility_types.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-utility-types title: "@kbn/utility-types" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/utility-types plugin -date: 2024-05-06 +date: 2024-05-07 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 0d30158e019b2..66fa4bc2ce871 100644 --- a/api_docs/kbn_utility_types_jest.mdx +++ b/api_docs/kbn_utility_types_jest.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-utility-types-jest title: "@kbn/utility-types-jest" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/utility-types-jest plugin -date: 2024-05-06 +date: 2024-05-07 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 39f354634d429..7190ff432ac1d 100644 --- a/api_docs/kbn_utils.mdx +++ b/api_docs/kbn_utils.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-utils title: "@kbn/utils" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/utils plugin -date: 2024-05-06 +date: 2024-05-07 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/utils'] --- import kbnUtilsObj from './kbn_utils.devdocs.json'; diff --git a/api_docs/kbn_visualization_ui_components.mdx b/api_docs/kbn_visualization_ui_components.mdx index 95cf99433e25f..35ed6c05c0836 100644 --- a/api_docs/kbn_visualization_ui_components.mdx +++ b/api_docs/kbn_visualization_ui_components.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-visualization-ui-components title: "@kbn/visualization-ui-components" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/visualization-ui-components plugin -date: 2024-05-06 +date: 2024-05-07 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/visualization-ui-components'] --- import kbnVisualizationUiComponentsObj from './kbn_visualization_ui_components.devdocs.json'; diff --git a/api_docs/kbn_visualization_utils.mdx b/api_docs/kbn_visualization_utils.mdx index a859962a2dd5f..e49d818026c38 100644 --- a/api_docs/kbn_visualization_utils.mdx +++ b/api_docs/kbn_visualization_utils.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-visualization-utils title: "@kbn/visualization-utils" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/visualization-utils plugin -date: 2024-05-06 +date: 2024-05-07 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/visualization-utils'] --- import kbnVisualizationUtilsObj from './kbn_visualization_utils.devdocs.json'; diff --git a/api_docs/kbn_xstate_utils.mdx b/api_docs/kbn_xstate_utils.mdx index f1bcf51dd1649..70c36db92992b 100644 --- a/api_docs/kbn_xstate_utils.mdx +++ b/api_docs/kbn_xstate_utils.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-xstate-utils title: "@kbn/xstate-utils" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/xstate-utils plugin -date: 2024-05-06 +date: 2024-05-07 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/xstate-utils'] --- import kbnXstateUtilsObj from './kbn_xstate_utils.devdocs.json'; diff --git a/api_docs/kbn_yarn_lock_validator.mdx b/api_docs/kbn_yarn_lock_validator.mdx index 1e45366b9ccfe..f368499e09543 100644 --- a/api_docs/kbn_yarn_lock_validator.mdx +++ b/api_docs/kbn_yarn_lock_validator.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-yarn-lock-validator title: "@kbn/yarn-lock-validator" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/yarn-lock-validator plugin -date: 2024-05-06 +date: 2024-05-07 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/yarn-lock-validator'] --- import kbnYarnLockValidatorObj from './kbn_yarn_lock_validator.devdocs.json'; diff --git a/api_docs/kbn_zod_helpers.mdx b/api_docs/kbn_zod_helpers.mdx index 40309dc42a145..ccec2efed99da 100644 --- a/api_docs/kbn_zod_helpers.mdx +++ b/api_docs/kbn_zod_helpers.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-zod-helpers title: "@kbn/zod-helpers" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/zod-helpers plugin -date: 2024-05-06 +date: 2024-05-07 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/zod-helpers'] --- import kbnZodHelpersObj from './kbn_zod_helpers.devdocs.json'; diff --git a/api_docs/kibana_overview.mdx b/api_docs/kibana_overview.mdx index 165aa681bf96a..f6f3836adf6bb 100644 --- a/api_docs/kibana_overview.mdx +++ b/api_docs/kibana_overview.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kibanaOverview title: "kibanaOverview" image: https://source.unsplash.com/400x175/?github description: API docs for the kibanaOverview plugin -date: 2024-05-06 +date: 2024-05-07 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'kibanaOverview'] --- import kibanaOverviewObj from './kibana_overview.devdocs.json'; diff --git a/api_docs/kibana_react.devdocs.json b/api_docs/kibana_react.devdocs.json index 52281269feeee..7ecaec8ae26f6 100644 --- a/api_docs/kibana_react.devdocs.json +++ b/api_docs/kibana_react.devdocs.json @@ -539,58 +539,6 @@ "plugin": "ingestPipelines", "path": "x-pack/plugins/ingest_pipelines/public/shared_imports.ts" }, - { - "plugin": "osquery", - "path": "x-pack/plugins/osquery/public/shared_components/osquery_results/osquery_result_wrapper.tsx" - }, - { - "plugin": "osquery", - "path": "x-pack/plugins/osquery/public/shared_components/osquery_results/osquery_result_wrapper.tsx" - }, - { - "plugin": "osquery", - "path": "x-pack/plugins/osquery/public/shared_components/osquery_results/osquery_result_wrapper.tsx" - }, - { - "plugin": "osquery", - "path": "x-pack/plugins/osquery/public/shared_imports.ts" - }, - { - "plugin": "osquery", - "path": "x-pack/plugins/osquery/public/shared_components/osquery_results/osquery_results.tsx" - }, - { - "plugin": "osquery", - "path": "x-pack/plugins/osquery/public/shared_components/osquery_results/osquery_results.tsx" - }, - { - "plugin": "osquery", - "path": "x-pack/plugins/osquery/public/shared_components/osquery_results/osquery_results.tsx" - }, - { - "plugin": "osquery", - "path": "x-pack/plugins/osquery/public/shared_components/services_wrapper.tsx" - }, - { - "plugin": "osquery", - "path": "x-pack/plugins/osquery/public/shared_components/services_wrapper.tsx" - }, - { - "plugin": "osquery", - "path": "x-pack/plugins/osquery/public/shared_components/services_wrapper.tsx" - }, - { - "plugin": "osquery", - "path": "x-pack/plugins/osquery/public/application.tsx" - }, - { - "plugin": "osquery", - "path": "x-pack/plugins/osquery/public/application.tsx" - }, - { - "plugin": "osquery", - "path": "x-pack/plugins/osquery/public/application.tsx" - }, { "plugin": "infra", "path": "x-pack/plugins/observability_solution/infra/public/apps/common_providers.tsx" @@ -670,18 +618,6 @@ { "plugin": "observabilityOnboarding", "path": "x-pack/plugins/observability_solution/observability_onboarding/public/application/app.tsx" - }, - { - "plugin": "filesManagement", - "path": "src/plugins/files_management/public/mount_management_section.tsx" - }, - { - "plugin": "filesManagement", - "path": "src/plugins/files_management/public/mount_management_section.tsx" - }, - { - "plugin": "filesManagement", - "path": "src/plugins/files_management/public/mount_management_section.tsx" } ], "children": [ @@ -1140,62 +1076,6 @@ "deprecated": true, "trackAdoption": false, "references": [ - { - "plugin": "data", - "path": "src/plugins/data/public/search/session/sessions_mgmt/components/actions/delete_button.tsx" - }, - { - "plugin": "data", - "path": "src/plugins/data/public/search/session/sessions_mgmt/components/actions/delete_button.tsx" - }, - { - "plugin": "data", - "path": "src/plugins/data/public/search/session/sessions_mgmt/components/actions/extend_button.tsx" - }, - { - "plugin": "data", - "path": "src/plugins/data/public/search/session/sessions_mgmt/components/actions/extend_button.tsx" - }, - { - "plugin": "data", - "path": "src/plugins/data/public/search/session/sessions_mgmt/components/actions/inspect_button.tsx" - }, - { - "plugin": "data", - "path": "src/plugins/data/public/search/session/sessions_mgmt/components/actions/inspect_button.tsx" - }, - { - "plugin": "data", - "path": "src/plugins/data/public/search/session/sessions_mgmt/components/actions/rename_button.tsx" - }, - { - "plugin": "data", - "path": "src/plugins/data/public/search/session/sessions_mgmt/components/actions/rename_button.tsx" - }, - { - "plugin": "data", - "path": "src/plugins/data/public/search/search_interceptor/search_interceptor.ts" - }, - { - "plugin": "data", - "path": "src/plugins/data/public/search/search_interceptor/search_interceptor.ts" - }, - { - "plugin": "data", - "path": "src/plugins/data/public/search/search_interceptor/search_interceptor.ts" - }, - { - "plugin": "data", - "path": "src/plugins/data/public/search/search_interceptor/search_interceptor.ts" - }, - { - "plugin": "timelines", - "path": "x-pack/plugins/timelines/public/components/hover_actions/actions/add_to_timeline.tsx" - }, - { - "plugin": "timelines", - "path": "x-pack/plugins/timelines/public/components/hover_actions/actions/add_to_timeline.tsx" - }, { "plugin": "observabilityShared", "path": "x-pack/plugins/observability_solution/observability_shared/public/components/header_menu/header_menu_portal.tsx" @@ -1204,26 +1084,6 @@ "plugin": "observabilityShared", "path": "x-pack/plugins/observability_solution/observability_shared/public/components/header_menu/header_menu_portal.tsx" }, - { - "plugin": "cloudSecurityPosture", - "path": "x-pack/plugins/cloud_security_posture/public/components/take_action.tsx" - }, - { - "plugin": "cloudSecurityPosture", - "path": "x-pack/plugins/cloud_security_posture/public/components/take_action.tsx" - }, - { - "plugin": "cloudSecurityPosture", - "path": "x-pack/plugins/cloud_security_posture/public/components/take_action.tsx" - }, - { - "plugin": "cloudSecurityPosture", - "path": "x-pack/plugins/cloud_security_posture/public/components/take_action.tsx" - }, - { - "plugin": "cloudSecurityPosture", - "path": "x-pack/plugins/cloud_security_posture/public/components/take_action.tsx" - }, { "plugin": "console", "path": "src/plugins/console/public/shared_imports.ts" diff --git a/api_docs/kibana_react.mdx b/api_docs/kibana_react.mdx index 15c98f393e363..fd5ae16e93647 100644 --- a/api_docs/kibana_react.mdx +++ b/api_docs/kibana_react.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kibanaReact title: "kibanaReact" image: https://source.unsplash.com/400x175/?github description: API docs for the kibanaReact plugin -date: 2024-05-06 +date: 2024-05-07 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 0e79720dd9a39..d833ed1b4753d 100644 --- a/api_docs/kibana_utils.mdx +++ b/api_docs/kibana_utils.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kibanaUtils title: "kibanaUtils" image: https://source.unsplash.com/400x175/?github description: API docs for the kibanaUtils plugin -date: 2024-05-06 +date: 2024-05-07 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 556bdadb5bccc..1507d84cf0776 100644 --- a/api_docs/kubernetes_security.mdx +++ b/api_docs/kubernetes_security.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kubernetesSecurity title: "kubernetesSecurity" image: https://source.unsplash.com/400x175/?github description: API docs for the kubernetesSecurity plugin -date: 2024-05-06 +date: 2024-05-07 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 4729800a40c59..046cee9bacbbc 100644 --- a/api_docs/lens.mdx +++ b/api_docs/lens.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/lens title: "lens" image: https://source.unsplash.com/400x175/?github description: API docs for the lens plugin -date: 2024-05-06 +date: 2024-05-07 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 79d72eeaaf4a3..d8477b45a31ae 100644 --- a/api_docs/license_api_guard.mdx +++ b/api_docs/license_api_guard.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/licenseApiGuard title: "licenseApiGuard" image: https://source.unsplash.com/400x175/?github description: API docs for the licenseApiGuard plugin -date: 2024-05-06 +date: 2024-05-07 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 a07fb610d5c7e..992e108882ccd 100644 --- a/api_docs/license_management.mdx +++ b/api_docs/license_management.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/licenseManagement title: "licenseManagement" image: https://source.unsplash.com/400x175/?github description: API docs for the licenseManagement plugin -date: 2024-05-06 +date: 2024-05-07 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 9d8fdd627f3a8..c754936160d91 100644 --- a/api_docs/licensing.mdx +++ b/api_docs/licensing.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/licensing title: "licensing" image: https://source.unsplash.com/400x175/?github description: API docs for the licensing plugin -date: 2024-05-06 +date: 2024-05-07 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'licensing'] --- import licensingObj from './licensing.devdocs.json'; diff --git a/api_docs/links.devdocs.json b/api_docs/links.devdocs.json index d052432919c25..55d1053815fad 100644 --- a/api_docs/links.devdocs.json +++ b/api_docs/links.devdocs.json @@ -473,7 +473,13 @@ "text": "FinderAttributes" }, ">,", - "IProvidesPanelPlacementSettings", + { + "pluginId": "dashboard", + "scope": "public", + "docId": "kibDashboardPluginApi", + "section": "def-public.IProvidesLegacyPanelPlacementSettings", + "text": "IProvidesLegacyPanelPlacementSettings" + }, "<", "LinksInput", ", unknown>" @@ -649,10 +655,10 @@ }, { "parentPluginId": "links", - "id": "def-public.LinksFactoryDefinition.getPanelPlacementSettings", + "id": "def-public.LinksFactoryDefinition.getLegacyPanelPlacementSettings", "type": "Function", "tags": [], - "label": "getPanelPlacementSettings", + "label": "getLegacyPanelPlacementSettings", "description": [], "signature": [ "(input: ", @@ -673,7 +679,7 @@ "children": [ { "parentPluginId": "links", - "id": "def-public.LinksFactoryDefinition.getPanelPlacementSettings.$1", + "id": "def-public.LinksFactoryDefinition.getLegacyPanelPlacementSettings.$1", "type": "CompoundType", "tags": [], "label": "input", @@ -688,7 +694,7 @@ }, { "parentPluginId": "links", - "id": "def-public.LinksFactoryDefinition.getPanelPlacementSettings.$2", + "id": "def-public.LinksFactoryDefinition.getLegacyPanelPlacementSettings.$2", "type": "Unknown", "tags": [], "label": "attributes", diff --git a/api_docs/links.mdx b/api_docs/links.mdx index 035400db3cad7..397b3dd856db7 100644 --- a/api_docs/links.mdx +++ b/api_docs/links.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/links title: "links" image: https://source.unsplash.com/400x175/?github description: API docs for the links plugin -date: 2024-05-06 +date: 2024-05-07 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'links'] --- import linksObj from './links.devdocs.json'; diff --git a/api_docs/lists.mdx b/api_docs/lists.mdx index c12dd0d9d8171..d232568385698 100644 --- a/api_docs/lists.mdx +++ b/api_docs/lists.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/lists title: "lists" image: https://source.unsplash.com/400x175/?github description: API docs for the lists plugin -date: 2024-05-06 +date: 2024-05-07 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'lists'] --- import listsObj from './lists.devdocs.json'; diff --git a/api_docs/logs_explorer.mdx b/api_docs/logs_explorer.mdx index da8e8c7c9f023..2eaacecfeb321 100644 --- a/api_docs/logs_explorer.mdx +++ b/api_docs/logs_explorer.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/logsExplorer title: "logsExplorer" image: https://source.unsplash.com/400x175/?github description: API docs for the logsExplorer plugin -date: 2024-05-06 +date: 2024-05-07 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'logsExplorer'] --- import logsExplorerObj from './logs_explorer.devdocs.json'; diff --git a/api_docs/logs_shared.mdx b/api_docs/logs_shared.mdx index eb51764c9c05b..bdf0476decc5c 100644 --- a/api_docs/logs_shared.mdx +++ b/api_docs/logs_shared.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/logsShared title: "logsShared" image: https://source.unsplash.com/400x175/?github description: API docs for the logsShared plugin -date: 2024-05-06 +date: 2024-05-07 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'logsShared'] --- import logsSharedObj from './logs_shared.devdocs.json'; diff --git a/api_docs/management.mdx b/api_docs/management.mdx index cd357b6b4d059..da966e66eb854 100644 --- a/api_docs/management.mdx +++ b/api_docs/management.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/management title: "management" image: https://source.unsplash.com/400x175/?github description: API docs for the management plugin -date: 2024-05-06 +date: 2024-05-07 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 d288965633242..d43c59cf94f9a 100644 --- a/api_docs/maps.mdx +++ b/api_docs/maps.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/maps title: "maps" image: https://source.unsplash.com/400x175/?github description: API docs for the maps plugin -date: 2024-05-06 +date: 2024-05-07 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 00dd51c2a4b09..24dca7a498348 100644 --- a/api_docs/maps_ems.mdx +++ b/api_docs/maps_ems.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/mapsEms title: "mapsEms" image: https://source.unsplash.com/400x175/?github description: API docs for the mapsEms plugin -date: 2024-05-06 +date: 2024-05-07 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'mapsEms'] --- import mapsEmsObj from './maps_ems.devdocs.json'; diff --git a/api_docs/metrics_data_access.mdx b/api_docs/metrics_data_access.mdx index 49a2fe7eda0f4..82666d05729e4 100644 --- a/api_docs/metrics_data_access.mdx +++ b/api_docs/metrics_data_access.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/metricsDataAccess title: "metricsDataAccess" image: https://source.unsplash.com/400x175/?github description: API docs for the metricsDataAccess plugin -date: 2024-05-06 +date: 2024-05-07 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'metricsDataAccess'] --- import metricsDataAccessObj from './metrics_data_access.devdocs.json'; diff --git a/api_docs/ml.mdx b/api_docs/ml.mdx index efdaa699d2236..edaa5ccffd7c5 100644 --- a/api_docs/ml.mdx +++ b/api_docs/ml.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/ml title: "ml" image: https://source.unsplash.com/400x175/?github description: API docs for the ml plugin -date: 2024-05-06 +date: 2024-05-07 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'ml'] --- import mlObj from './ml.devdocs.json'; diff --git a/api_docs/mock_idp_plugin.mdx b/api_docs/mock_idp_plugin.mdx index b0526f7f56915..b2b2c0b9be4d3 100644 --- a/api_docs/mock_idp_plugin.mdx +++ b/api_docs/mock_idp_plugin.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/mockIdpPlugin title: "mockIdpPlugin" image: https://source.unsplash.com/400x175/?github description: API docs for the mockIdpPlugin plugin -date: 2024-05-06 +date: 2024-05-07 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'mockIdpPlugin'] --- import mockIdpPluginObj from './mock_idp_plugin.devdocs.json'; diff --git a/api_docs/monitoring.mdx b/api_docs/monitoring.mdx index be718bae937f9..41a2027b427b4 100644 --- a/api_docs/monitoring.mdx +++ b/api_docs/monitoring.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/monitoring title: "monitoring" image: https://source.unsplash.com/400x175/?github description: API docs for the monitoring plugin -date: 2024-05-06 +date: 2024-05-07 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 b4f1b36105dec..76267b13568a9 100644 --- a/api_docs/monitoring_collection.mdx +++ b/api_docs/monitoring_collection.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/monitoringCollection title: "monitoringCollection" image: https://source.unsplash.com/400x175/?github description: API docs for the monitoringCollection plugin -date: 2024-05-06 +date: 2024-05-07 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 bec6f84993f29..6d31d405e2676 100644 --- a/api_docs/navigation.mdx +++ b/api_docs/navigation.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/navigation title: "navigation" image: https://source.unsplash.com/400x175/?github description: API docs for the navigation plugin -date: 2024-05-06 +date: 2024-05-07 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 3057f8271de25..d062507b38d09 100644 --- a/api_docs/newsfeed.mdx +++ b/api_docs/newsfeed.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/newsfeed title: "newsfeed" image: https://source.unsplash.com/400x175/?github description: API docs for the newsfeed plugin -date: 2024-05-06 +date: 2024-05-07 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'newsfeed'] --- import newsfeedObj from './newsfeed.devdocs.json'; diff --git a/api_docs/no_data_page.mdx b/api_docs/no_data_page.mdx index 4fbc8daaeb4e7..c07fd5b69a264 100644 --- a/api_docs/no_data_page.mdx +++ b/api_docs/no_data_page.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/noDataPage title: "noDataPage" image: https://source.unsplash.com/400x175/?github description: API docs for the noDataPage plugin -date: 2024-05-06 +date: 2024-05-07 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'noDataPage'] --- import noDataPageObj from './no_data_page.devdocs.json'; diff --git a/api_docs/notifications.mdx b/api_docs/notifications.mdx index 4d6b7a14b8f07..6d3c1602695d0 100644 --- a/api_docs/notifications.mdx +++ b/api_docs/notifications.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/notifications title: "notifications" image: https://source.unsplash.com/400x175/?github description: API docs for the notifications plugin -date: 2024-05-06 +date: 2024-05-07 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'notifications'] --- import notificationsObj from './notifications.devdocs.json'; diff --git a/api_docs/observability.mdx b/api_docs/observability.mdx index 3eadecb33d01d..66b1efa3f377c 100644 --- a/api_docs/observability.mdx +++ b/api_docs/observability.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/observability title: "observability" image: https://source.unsplash.com/400x175/?github description: API docs for the observability plugin -date: 2024-05-06 +date: 2024-05-07 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'observability'] --- import observabilityObj from './observability.devdocs.json'; diff --git a/api_docs/observability_a_i_assistant.devdocs.json b/api_docs/observability_a_i_assistant.devdocs.json index ae9c0d2cd624e..c486b0a6cfbe9 100644 --- a/api_docs/observability_a_i_assistant.devdocs.json +++ b/api_docs/observability_a_i_assistant.devdocs.json @@ -1266,7 +1266,7 @@ "section": "def-common.Message", "text": "Message" }, - "[]; persist: boolean; signal: AbortSignal; responseLanguage: string; }) => ", + "[]; persist: boolean; disableFunctions: boolean; signal: AbortSignal; responseLanguage: string; }) => ", "Observable", "<", { @@ -1368,6 +1368,17 @@ "deprecated": false, "trackAdoption": false }, + { + "parentPluginId": "observabilityAIAssistant", + "id": "def-public.ObservabilityAIAssistantChatService.complete.$1.disableFunctions", + "type": "boolean", + "tags": [], + "label": "disableFunctions", + "description": [], + "path": "x-pack/plugins/observability_solution/observability_ai_assistant/public/types.ts", + "deprecated": false, + "trackAdoption": false + }, { "parentPluginId": "observabilityAIAssistant", "id": "def-public.ObservabilityAIAssistantChatService.complete.$1.signal", @@ -2120,7 +2131,9 @@ "StringC", "; responseLanguage: ", "StringC", - "; instructions: ", + "; disableFunctions: ", + "Type", + "; instructions: ", "ArrayC", "<", "UnionC", @@ -2168,7 +2181,7 @@ "section": "def-common.Message", "text": "Message" }, - "[]; connectorId: string; persist: boolean; } & { conversationId?: string | undefined; title?: string | undefined; responseLanguage?: string | undefined; instructions?: (string | { doc_id: string; text: string; })[] | undefined; }; } & { body?: { actions?: ({ name: string; description: string; } & { parameters?: any; })[] | undefined; } | undefined; query?: { format?: \"default\" | \"openai\" | undefined; } | undefined; }; }) => Promise<", + "[]; connectorId: string; persist: boolean; } & { conversationId?: string | undefined; title?: string | undefined; responseLanguage?: string | undefined; disableFunctions?: boolean | undefined; instructions?: (string | { doc_id: string; text: string; })[] | undefined; }; } & { body?: { actions?: ({ name: string; description: string; } & { parameters?: any; })[] | undefined; } | undefined; query?: { format?: \"default\" | \"openai\" | undefined; } | undefined; }; }) => Promise<", "Readable", ">; } & ", "ObservabilityAIAssistantRouteCreateOptions", @@ -2212,7 +2225,9 @@ "StringC", "; responseLanguage: ", "StringC", - "; instructions: ", + "; disableFunctions: ", + "Type", + "; instructions: ", "ArrayC", "<", "UnionC", @@ -2246,7 +2261,7 @@ "section": "def-common.Message", "text": "Message" }, - "[]; connectorId: string; persist: boolean; } & { conversationId?: string | undefined; title?: string | undefined; responseLanguage?: string | undefined; instructions?: (string | { doc_id: string; text: string; })[] | undefined; }; } & { body: { screenContexts: ", + "[]; connectorId: string; persist: boolean; } & { conversationId?: string | undefined; title?: string | undefined; responseLanguage?: string | undefined; disableFunctions?: boolean | undefined; instructions?: (string | { doc_id: string; text: string; })[] | undefined; }; } & { body: { screenContexts: ", "ObservabilityAIAssistantScreenContextRequest", "[]; }; }; }) => Promise<", "Readable", @@ -2744,7 +2759,9 @@ "StringC", "; responseLanguage: ", "StringC", - "; instructions: ", + "; disableFunctions: ", + "Type", + "; instructions: ", "ArrayC", "<", "UnionC", @@ -2792,7 +2809,7 @@ "section": "def-common.Message", "text": "Message" }, - "[]; connectorId: string; persist: boolean; } & { conversationId?: string | undefined; title?: string | undefined; responseLanguage?: string | undefined; instructions?: (string | { doc_id: string; text: string; })[] | undefined; }; } & { body?: { actions?: ({ name: string; description: string; } & { parameters?: any; })[] | undefined; } | undefined; query?: { format?: \"default\" | \"openai\" | undefined; } | undefined; }; }) => Promise<", + "[]; connectorId: string; persist: boolean; } & { conversationId?: string | undefined; title?: string | undefined; responseLanguage?: string | undefined; disableFunctions?: boolean | undefined; instructions?: (string | { doc_id: string; text: string; })[] | undefined; }; } & { body?: { actions?: ({ name: string; description: string; } & { parameters?: any; })[] | undefined; } | undefined; query?: { format?: \"default\" | \"openai\" | undefined; } | undefined; }; }) => Promise<", "Readable", ">; } & ", "ObservabilityAIAssistantRouteCreateOptions", @@ -2836,7 +2853,9 @@ "StringC", "; responseLanguage: ", "StringC", - "; instructions: ", + "; disableFunctions: ", + "Type", + "; instructions: ", "ArrayC", "<", "UnionC", @@ -2870,7 +2889,7 @@ "section": "def-common.Message", "text": "Message" }, - "[]; connectorId: string; persist: boolean; } & { conversationId?: string | undefined; title?: string | undefined; responseLanguage?: string | undefined; instructions?: (string | { doc_id: string; text: string; })[] | undefined; }; } & { body: { screenContexts: ", + "[]; connectorId: string; persist: boolean; } & { conversationId?: string | undefined; title?: string | undefined; responseLanguage?: string | undefined; disableFunctions?: boolean | undefined; instructions?: (string | { doc_id: string; text: string; })[] | undefined; }; } & { body: { screenContexts: ", "ObservabilityAIAssistantScreenContextRequest", "[]; }; }; }) => Promise<", "Readable", @@ -3956,7 +3975,9 @@ "StringC", "; responseLanguage: ", "StringC", - "; instructions: ", + "; disableFunctions: ", + "Type", + "; instructions: ", "ArrayC", "<", "UnionC", @@ -4004,7 +4025,7 @@ "section": "def-common.Message", "text": "Message" }, - "[]; connectorId: string; persist: boolean; } & { conversationId?: string | undefined; title?: string | undefined; responseLanguage?: string | undefined; instructions?: (string | { doc_id: string; text: string; })[] | undefined; }; } & { body?: { actions?: ({ name: string; description: string; } & { parameters?: any; })[] | undefined; } | undefined; query?: { format?: \"default\" | \"openai\" | undefined; } | undefined; }; }) => Promise<", + "[]; connectorId: string; persist: boolean; } & { conversationId?: string | undefined; title?: string | undefined; responseLanguage?: string | undefined; disableFunctions?: boolean | undefined; instructions?: (string | { doc_id: string; text: string; })[] | undefined; }; } & { body?: { actions?: ({ name: string; description: string; } & { parameters?: any; })[] | undefined; } | undefined; query?: { format?: \"default\" | \"openai\" | undefined; } | undefined; }; }) => Promise<", "Readable", ">; } & ", "ObservabilityAIAssistantRouteCreateOptions", @@ -4048,7 +4069,9 @@ "StringC", "; responseLanguage: ", "StringC", - "; instructions: ", + "; disableFunctions: ", + "Type", + "; instructions: ", "ArrayC", "<", "UnionC", @@ -4082,7 +4105,7 @@ "section": "def-common.Message", "text": "Message" }, - "[]; connectorId: string; persist: boolean; } & { conversationId?: string | undefined; title?: string | undefined; responseLanguage?: string | undefined; instructions?: (string | { doc_id: string; text: string; })[] | undefined; }; } & { body: { screenContexts: ", + "[]; connectorId: string; persist: boolean; } & { conversationId?: string | undefined; title?: string | undefined; responseLanguage?: string | undefined; disableFunctions?: boolean | undefined; instructions?: (string | { doc_id: string; text: string; })[] | undefined; }; } & { body: { screenContexts: ", "ObservabilityAIAssistantScreenContextRequest", "[]; }; }; }) => Promise<", "Readable", @@ -4682,7 +4705,9 @@ "StringC", "; responseLanguage: ", "StringC", - "; instructions: ", + "; disableFunctions: ", + "Type", + "; instructions: ", "ArrayC", "<", "UnionC", @@ -4730,7 +4755,7 @@ "section": "def-common.Message", "text": "Message" }, - "[]; connectorId: string; persist: boolean; } & { conversationId?: string | undefined; title?: string | undefined; responseLanguage?: string | undefined; instructions?: (string | { doc_id: string; text: string; })[] | undefined; }; } & { body?: { actions?: ({ name: string; description: string; } & { parameters?: any; })[] | undefined; } | undefined; query?: { format?: \"default\" | \"openai\" | undefined; } | undefined; }; }) => Promise<", + "[]; connectorId: string; persist: boolean; } & { conversationId?: string | undefined; title?: string | undefined; responseLanguage?: string | undefined; disableFunctions?: boolean | undefined; instructions?: (string | { doc_id: string; text: string; })[] | undefined; }; } & { body?: { actions?: ({ name: string; description: string; } & { parameters?: any; })[] | undefined; } | undefined; query?: { format?: \"default\" | \"openai\" | undefined; } | undefined; }; }) => Promise<", "Readable", ">; } & ", "ObservabilityAIAssistantRouteCreateOptions", @@ -4774,7 +4799,9 @@ "StringC", "; responseLanguage: ", "StringC", - "; instructions: ", + "; disableFunctions: ", + "Type", + "; instructions: ", "ArrayC", "<", "UnionC", @@ -4808,7 +4835,7 @@ "section": "def-common.Message", "text": "Message" }, - "[]; connectorId: string; persist: boolean; } & { conversationId?: string | undefined; title?: string | undefined; responseLanguage?: string | undefined; instructions?: (string | { doc_id: string; text: string; })[] | undefined; }; } & { body: { screenContexts: ", + "[]; connectorId: string; persist: boolean; } & { conversationId?: string | undefined; title?: string | undefined; responseLanguage?: string | undefined; disableFunctions?: boolean | undefined; instructions?: (string | { doc_id: string; text: string; })[] | undefined; }; } & { body: { screenContexts: ", "ObservabilityAIAssistantScreenContextRequest", "[]; }; }; }) => Promise<", "Readable", @@ -5334,7 +5361,7 @@ "section": "def-public.ObservabilityAIAssistantChatService", "text": "ObservabilityAIAssistantChatService" }, - "; persist: boolean; onConversationUpdate?: ((event: ", + "; persist: boolean; disableFunctions?: boolean | undefined; onConversationUpdate?: ((event: ", { "pluginId": "observabilityAIAssistant", "scope": "common", @@ -6068,7 +6095,9 @@ "StringC", "; responseLanguage: ", "StringC", - "; instructions: ", + "; disableFunctions: ", + "Type", + "; instructions: ", "ArrayC", "<", "UnionC", @@ -6116,7 +6145,7 @@ "section": "def-common.Message", "text": "Message" }, - "[]; connectorId: string; persist: boolean; } & { conversationId?: string | undefined; title?: string | undefined; responseLanguage?: string | undefined; instructions?: (string | { doc_id: string; text: string; })[] | undefined; }; } & { body?: { actions?: ({ name: string; description: string; } & { parameters?: any; })[] | undefined; } | undefined; query?: { format?: \"default\" | \"openai\" | undefined; } | undefined; }; }) => Promise<", + "[]; connectorId: string; persist: boolean; } & { conversationId?: string | undefined; title?: string | undefined; responseLanguage?: string | undefined; disableFunctions?: boolean | undefined; instructions?: (string | { doc_id: string; text: string; })[] | undefined; }; } & { body?: { actions?: ({ name: string; description: string; } & { parameters?: any; })[] | undefined; } | undefined; query?: { format?: \"default\" | \"openai\" | undefined; } | undefined; }; }) => Promise<", "Readable", ">; } & ", "ObservabilityAIAssistantRouteCreateOptions", @@ -6160,7 +6189,9 @@ "StringC", "; responseLanguage: ", "StringC", - "; instructions: ", + "; disableFunctions: ", + "Type", + "; instructions: ", "ArrayC", "<", "UnionC", @@ -6194,7 +6225,7 @@ "section": "def-common.Message", "text": "Message" }, - "[]; connectorId: string; persist: boolean; } & { conversationId?: string | undefined; title?: string | undefined; responseLanguage?: string | undefined; instructions?: (string | { doc_id: string; text: string; })[] | undefined; }; } & { body: { screenContexts: ", + "[]; connectorId: string; persist: boolean; } & { conversationId?: string | undefined; title?: string | undefined; responseLanguage?: string | undefined; disableFunctions?: boolean | undefined; instructions?: (string | { doc_id: string; text: string; })[] | undefined; }; } & { body: { screenContexts: ", "ObservabilityAIAssistantScreenContextRequest", "[]; }; }; }) => Promise<", "Readable", diff --git a/api_docs/observability_a_i_assistant.mdx b/api_docs/observability_a_i_assistant.mdx index 51ad5cce7aea8..57ef4d4bbc0da 100644 --- a/api_docs/observability_a_i_assistant.mdx +++ b/api_docs/observability_a_i_assistant.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/observabilityAIAssistant title: "observabilityAIAssistant" image: https://source.unsplash.com/400x175/?github description: API docs for the observabilityAIAssistant plugin -date: 2024-05-06 +date: 2024-05-07 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'observabilityAIAssistant'] --- import observabilityAIAssistantObj from './observability_a_i_assistant.devdocs.json'; @@ -21,7 +21,7 @@ Contact [@elastic/obs-ai-assistant](https://github.com/orgs/elastic/teams/obs-ai | Public API count | Any count | Items lacking comments | Missing exports | |-------------------|-----------|------------------------|-----------------| -| 252 | 1 | 250 | 26 | +| 253 | 1 | 251 | 26 | ## Client diff --git a/api_docs/observability_a_i_assistant_app.mdx b/api_docs/observability_a_i_assistant_app.mdx index 77849a62edf5a..a3dd697e64e2d 100644 --- a/api_docs/observability_a_i_assistant_app.mdx +++ b/api_docs/observability_a_i_assistant_app.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/observabilityAIAssistantApp title: "observabilityAIAssistantApp" image: https://source.unsplash.com/400x175/?github description: API docs for the observabilityAIAssistantApp plugin -date: 2024-05-06 +date: 2024-05-07 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'observabilityAIAssistantApp'] --- import observabilityAIAssistantAppObj from './observability_a_i_assistant_app.devdocs.json'; diff --git a/api_docs/observability_ai_assistant_management.mdx b/api_docs/observability_ai_assistant_management.mdx index e2eb7f9bfed06..e465044da0b54 100644 --- a/api_docs/observability_ai_assistant_management.mdx +++ b/api_docs/observability_ai_assistant_management.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/observabilityAiAssistantManagement title: "observabilityAiAssistantManagement" image: https://source.unsplash.com/400x175/?github description: API docs for the observabilityAiAssistantManagement plugin -date: 2024-05-06 +date: 2024-05-07 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'observabilityAiAssistantManagement'] --- import observabilityAiAssistantManagementObj from './observability_ai_assistant_management.devdocs.json'; diff --git a/api_docs/observability_logs_explorer.mdx b/api_docs/observability_logs_explorer.mdx index 91e078dbc9c3a..b46e53712ade4 100644 --- a/api_docs/observability_logs_explorer.mdx +++ b/api_docs/observability_logs_explorer.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/observabilityLogsExplorer title: "observabilityLogsExplorer" image: https://source.unsplash.com/400x175/?github description: API docs for the observabilityLogsExplorer plugin -date: 2024-05-06 +date: 2024-05-07 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'observabilityLogsExplorer'] --- import observabilityLogsExplorerObj from './observability_logs_explorer.devdocs.json'; diff --git a/api_docs/observability_onboarding.mdx b/api_docs/observability_onboarding.mdx index 6bc4e23235107..14ee93cf35cb3 100644 --- a/api_docs/observability_onboarding.mdx +++ b/api_docs/observability_onboarding.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/observabilityOnboarding title: "observabilityOnboarding" image: https://source.unsplash.com/400x175/?github description: API docs for the observabilityOnboarding plugin -date: 2024-05-06 +date: 2024-05-07 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'observabilityOnboarding'] --- import observabilityOnboardingObj from './observability_onboarding.devdocs.json'; diff --git a/api_docs/observability_shared.mdx b/api_docs/observability_shared.mdx index 2f440cacd5428..6abe52b5fdfe6 100644 --- a/api_docs/observability_shared.mdx +++ b/api_docs/observability_shared.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/observabilityShared title: "observabilityShared" image: https://source.unsplash.com/400x175/?github description: API docs for the observabilityShared plugin -date: 2024-05-06 +date: 2024-05-07 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'observabilityShared'] --- import observabilitySharedObj from './observability_shared.devdocs.json'; diff --git a/api_docs/osquery.mdx b/api_docs/osquery.mdx index 76f00f03e253b..ecaa6803dfdb2 100644 --- a/api_docs/osquery.mdx +++ b/api_docs/osquery.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/osquery title: "osquery" image: https://source.unsplash.com/400x175/?github description: API docs for the osquery plugin -date: 2024-05-06 +date: 2024-05-07 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'osquery'] --- import osqueryObj from './osquery.devdocs.json'; diff --git a/api_docs/painless_lab.mdx b/api_docs/painless_lab.mdx index 04394a7ccf208..acd87b4ee5482 100644 --- a/api_docs/painless_lab.mdx +++ b/api_docs/painless_lab.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/painlessLab title: "painlessLab" image: https://source.unsplash.com/400x175/?github description: API docs for the painlessLab plugin -date: 2024-05-06 +date: 2024-05-07 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'painlessLab'] --- import painlessLabObj from './painless_lab.devdocs.json'; diff --git a/api_docs/plugin_directory.mdx b/api_docs/plugin_directory.mdx index a139a7a79ac17..4fe422ca9cfcf 100644 --- a/api_docs/plugin_directory.mdx +++ b/api_docs/plugin_directory.mdx @@ -7,7 +7,7 @@ id: kibDevDocsPluginDirectory slug: /kibana-dev-docs/api-meta/plugin-api-directory title: Directory description: Directory of public APIs available through plugins or packages. -date: 2024-05-06 +date: 2024-05-07 tags: ['contributor', 'dev', 'apidocs', 'kibana'] --- @@ -15,13 +15,13 @@ tags: ['contributor', 'dev', 'apidocs', 'kibana'] | Count | Plugins or Packages with a
public API | Number of teams | |--------------|----------|------------------------| -| 792 | 680 | 42 | +| 794 | 682 | 42 | ### Public API health stats | API Count | Any Count | Missing comments | Missing exports | |--------------|----------|-----------------|--------| -| 48128 | 241 | 36690 | 1850 | +| 48111 | 241 | 36699 | 1850 | ## Plugin Directory @@ -55,9 +55,9 @@ tags: ['contributor', 'dev', 'apidocs', 'kibana'] | crossClusterReplication | [@elastic/kibana-management](https://github.com/orgs/elastic/teams/kibana-management) | - | 0 | 0 | 0 | 0 | | customBranding | [@elastic/appex-sharedux](https://github.com/orgs/elastic/teams/appex-sharedux) | Enables customization of Kibana | 0 | 0 | 0 | 0 | | | [@elastic/fleet](https://github.com/orgs/elastic/teams/fleet) | Add custom data integrations so they can be displayed in the Fleet integrations app | 271 | 0 | 252 | 1 | -| | [@elastic/kibana-presentation](https://github.com/orgs/elastic/teams/kibana-presentation) | Adds the Dashboard app to Kibana | 112 | 0 | 109 | 12 | +| | [@elastic/kibana-presentation](https://github.com/orgs/elastic/teams/kibana-presentation) | Adds the Dashboard app to Kibana | 116 | 0 | 113 | 13 | | | [@elastic/kibana-presentation](https://github.com/orgs/elastic/teams/kibana-presentation) | - | 54 | 0 | 51 | 0 | -| | [@elastic/kibana-visualizations](https://github.com/orgs/elastic/teams/kibana-visualizations) | Data services are useful for searching and querying data from Elasticsearch. Helpful utilities include: a re-usable react query bar, KQL autocomplete, async search, Data Views (Index Patterns) and field formatters. | 3290 | 31 | 2621 | 23 | +| | [@elastic/kibana-visualizations](https://github.com/orgs/elastic/teams/kibana-visualizations) | Data services are useful for searching and querying data from Elasticsearch. Helpful utilities include: a re-usable react query bar, KQL autocomplete, async search, Data Views (Index Patterns) and field formatters. | 3186 | 31 | 2575 | 23 | | | [@elastic/kibana-data-discovery](https://github.com/orgs/elastic/teams/kibana-data-discovery) | This plugin provides the ability to create data views via a modal flyout inside Kibana apps | 35 | 0 | 25 | 5 | | | [@elastic/kibana-data-discovery](https://github.com/orgs/elastic/teams/kibana-data-discovery) | Reusable data view field editor across Kibana | 72 | 0 | 33 | 0 | | | [@elastic/kibana-data-discovery](https://github.com/orgs/elastic/teams/kibana-data-discovery) | Data view management app | 2 | 0 | 2 | 0 | @@ -142,7 +142,7 @@ tags: ['contributor', 'dev', 'apidocs', 'kibana'] | | [@elastic/appex-sharedux](https://github.com/orgs/elastic/teams/appex-sharedux) | - | 3 | 0 | 3 | 0 | | | [@elastic/appex-sharedux](https://github.com/orgs/elastic/teams/appex-sharedux) | - | 2 | 0 | 2 | 1 | | | [@elastic/obs-ux-management-team](https://github.com/orgs/elastic/teams/obs-ux-management-team) | - | 679 | 2 | 670 | 15 | -| | [@elastic/obs-ai-assistant](https://github.com/orgs/elastic/teams/obs-ai-assistant) | - | 252 | 1 | 250 | 26 | +| | [@elastic/obs-ai-assistant](https://github.com/orgs/elastic/teams/obs-ai-assistant) | - | 253 | 1 | 251 | 26 | | | [@elastic/obs-ai-assistant](https://github.com/orgs/elastic/teams/obs-ai-assistant) | - | 2 | 0 | 2 | 0 | | | [@elastic/obs-ai-assistant](https://github.com/orgs/elastic/teams/obs-ai-assistant) | - | 2 | 0 | 2 | 0 | | | [@elastic/obs-ux-logs-team](https://github.com/orgs/elastic/teams/obs-ux-logs-team) | This plugin exposes and registers observability log consumption features. | 21 | 0 | 21 | 1 | @@ -180,7 +180,7 @@ tags: ['contributor', 'dev', 'apidocs', 'kibana'] | | [@elastic/enterprise-search-frontend](https://github.com/orgs/elastic/teams/enterprise-search-frontend) | Serverless customizations for search. | 6 | 0 | 6 | 0 | | | [@elastic/kibana-cloud-security-posture](https://github.com/orgs/elastic/teams/kibana-cloud-security-posture) | - | 134 | 0 | 134 | 8 | | | [@elastic/appex-sharedux](https://github.com/orgs/elastic/teams/appex-sharedux) | Adds URL Service and sharing capabilities to Kibana | 136 | 0 | 77 | 11 | -| | [@elastic/obs-ux-management-team](https://github.com/orgs/elastic/teams/obs-ux-management-team) | - | 62 | 0 | 62 | 1 | +| | [@elastic/obs-ux-management-team](https://github.com/orgs/elastic/teams/obs-ux-management-team) | - | 63 | 0 | 63 | 1 | | | [@elastic/kibana-management](https://github.com/orgs/elastic/teams/kibana-management) | - | 22 | 1 | 22 | 1 | | | [@elastic/kibana-security](https://github.com/orgs/elastic/teams/kibana-security) | This plugin provides the Spaces feature, which allows saved objects to be organized into meaningful categories. | 257 | 0 | 66 | 0 | | | [@elastic/response-ops](https://github.com/orgs/elastic/teams/response-ops) | - | 25 | 0 | 25 | 3 | @@ -193,7 +193,7 @@ tags: ['contributor', 'dev', 'apidocs', 'kibana'] | | [@elastic/kibana-core](https://github.com/orgs/elastic/teams/kibana-core) | - | 6 | 0 | 0 | 0 | | | [@elastic/kibana-esql](https://github.com/orgs/elastic/teams/kibana-esql) | - | 28 | 0 | 10 | 0 | | | [@elastic/security-threat-hunting-investigations](https://github.com/orgs/elastic/teams/security-threat-hunting-investigations) | Elastic threat intelligence helps you see if you are open to or have been subject to current or historical known threats | 30 | 0 | 14 | 4 | -| | [@elastic/security-threat-hunting-investigations](https://github.com/orgs/elastic/teams/security-threat-hunting-investigations) | - | 240 | 1 | 196 | 17 | +| | [@elastic/security-threat-hunting-investigations](https://github.com/orgs/elastic/teams/security-threat-hunting-investigations) | - | 242 | 1 | 198 | 17 | | | [@elastic/ml-ui](https://github.com/orgs/elastic/teams/ml-ui) | This plugin provides access to the transforms features provided by Elastic. Transforms enable you to convert existing Elasticsearch indices into summarized indices, which provide opportunities for new insights and analytics. | 4 | 0 | 4 | 1 | | translations | [@elastic/kibana-localization](https://github.com/orgs/elastic/teams/kibana-localization) | - | 0 | 0 | 0 | 0 | | | [@elastic/response-ops](https://github.com/orgs/elastic/teams/response-ops) | - | 593 | 1 | 567 | 58 | @@ -342,9 +342,9 @@ tags: ['contributor', 'dev', 'apidocs', 'kibana'] | | [@elastic/kibana-core](https://github.com/orgs/elastic/teams/kibana-core) | - | 22 | 0 | 7 | 0 | | | [@elastic/kibana-core](https://github.com/orgs/elastic/teams/kibana-core) | - | 9 | 0 | 9 | 3 | | | [@elastic/kibana-core](https://github.com/orgs/elastic/teams/kibana-core) | - | 7 | 0 | 7 | 0 | -| | [@elastic/kibana-core](https://github.com/orgs/elastic/teams/kibana-core) | - | 50 | 7 | 50 | 6 | +| | [@elastic/kibana-core](https://github.com/orgs/elastic/teams/kibana-core) | - | 48 | 7 | 48 | 6 | | | [@elastic/kibana-core](https://github.com/orgs/elastic/teams/kibana-core) | - | 13 | 0 | 13 | 1 | -| | [@elastic/kibana-core](https://github.com/orgs/elastic/teams/kibana-core) | - | 481 | 2 | 191 | 0 | +| | [@elastic/kibana-core](https://github.com/orgs/elastic/teams/kibana-core) | - | 483 | 2 | 193 | 0 | | | [@elastic/kibana-core](https://github.com/orgs/elastic/teams/kibana-core) | - | 91 | 0 | 78 | 10 | | | [@elastic/kibana-core](https://github.com/orgs/elastic/teams/kibana-core) | - | 44 | 0 | 43 | 0 | | | [@elastic/kibana-core](https://github.com/orgs/elastic/teams/kibana-core) | - | 4 | 0 | 2 | 0 | @@ -490,7 +490,7 @@ tags: ['contributor', 'dev', 'apidocs', 'kibana'] | | [@elastic/kibana-core](https://github.com/orgs/elastic/teams/kibana-core) | - | 26 | 0 | 26 | 1 | | | [@elastic/kibana-operations](https://github.com/orgs/elastic/teams/kibana-operations) | - | 2 | 0 | 1 | 0 | | | [@elastic/kibana-esql](https://github.com/orgs/elastic/teams/kibana-esql) | - | 63 | 1 | 63 | 6 | -| | [@elastic/kibana-esql](https://github.com/orgs/elastic/teams/kibana-esql) | - | 23 | 0 | 21 | 0 | +| | [@elastic/kibana-esql](https://github.com/orgs/elastic/teams/kibana-esql) | - | 36 | 0 | 34 | 0 | | | [@elastic/kibana-esql](https://github.com/orgs/elastic/teams/kibana-esql) | - | 194 | 0 | 184 | 8 | | | [@elastic/kibana-visualizations](https://github.com/orgs/elastic/teams/kibana-visualizations) | - | 39 | 0 | 39 | 0 | | | [@elastic/kibana-visualizations](https://github.com/orgs/elastic/teams/kibana-visualizations) | - | 52 | 0 | 52 | 1 | @@ -591,6 +591,7 @@ tags: ['contributor', 'dev', 'apidocs', 'kibana'] | | [@elastic/obs-ux-infra_services-team](https://github.com/orgs/elastic/teams/obs-ux-infra_services-team) | - | 168 | 0 | 55 | 0 | | | [@elastic/kibana-visualizations](https://github.com/orgs/elastic/teams/kibana-visualizations) | - | 13 | 0 | 7 | 0 | | | [@elastic/kibana-data-discovery](https://github.com/orgs/elastic/teams/kibana-data-discovery) | - | 22 | 0 | 9 | 0 | +| | [@elastic/obs-ux-logs-team](https://github.com/orgs/elastic/teams/obs-ux-logs-team) | - | 8 | 0 | 7 | 0 | | | [@elastic/appex-sharedux](https://github.com/orgs/elastic/teams/appex-sharedux) | - | 8 | 0 | 2 | 0 | | | [@elastic/appex-sharedux](https://github.com/orgs/elastic/teams/appex-sharedux) | - | 3 | 0 | 1 | 0 | | | [@elastic/appex-sharedux](https://github.com/orgs/elastic/teams/appex-sharedux) | - | 10 | 0 | 4 | 0 | @@ -624,6 +625,7 @@ tags: ['contributor', 'dev', 'apidocs', 'kibana'] | | [@elastic/kibana-data-discovery](https://github.com/orgs/elastic/teams/kibana-data-discovery) | - | 18 | 1 | 17 | 1 | | | [@elastic/enterprise-search-frontend](https://github.com/orgs/elastic/teams/enterprise-search-frontend) | - | 25 | 0 | 25 | 0 | | | [@elastic/kibana-data-discovery](https://github.com/orgs/elastic/teams/kibana-data-discovery) | - | 20 | 0 | 18 | 1 | +| | [@elastic/kibana-data-discovery](https://github.com/orgs/elastic/teams/kibana-data-discovery) | - | 50 | 0 | 25 | 0 | | | [@elastic/kibana-security](https://github.com/orgs/elastic/teams/kibana-security) | - | 7 | 0 | 7 | 0 | | | [@elastic/kibana-security](https://github.com/orgs/elastic/teams/kibana-security) | - | 84 | 0 | 37 | 0 | | | [@elastic/kibana-security](https://github.com/orgs/elastic/teams/kibana-security) | - | 39 | 0 | 14 | 0 | @@ -708,7 +710,7 @@ tags: ['contributor', 'dev', 'apidocs', 'kibana'] | | [@elastic/kibana-operations](https://github.com/orgs/elastic/teams/kibana-operations) | - | 41 | 2 | 21 | 0 | | | [@elastic/kibana-core](https://github.com/orgs/elastic/teams/kibana-core) | - | 7 | 0 | 5 | 1 | | | [@elastic/kibana-operations](https://github.com/orgs/elastic/teams/kibana-operations) | - | 313 | 4 | 265 | 12 | -| | [@elastic/kibana-visualizations](https://github.com/orgs/elastic/teams/kibana-visualizations) | - | 14 | 0 | 8 | 0 | +| | [@elastic/kibana-visualizations](https://github.com/orgs/elastic/teams/kibana-visualizations) | - | 25 | 0 | 13 | 0 | | | [@elastic/kibana-operations](https://github.com/orgs/elastic/teams/kibana-operations) | - | 133 | 5 | 103 | 2 | | | [@elastic/kibana-operations](https://github.com/orgs/elastic/teams/kibana-operations) | - | 2 | 0 | 1 | 0 | | | [@elastic/kibana-esql](https://github.com/orgs/elastic/teams/kibana-esql) | - | 32 | 0 | 13 | 0 | @@ -720,8 +722,8 @@ tags: ['contributor', 'dev', 'apidocs', 'kibana'] | | [@elastic/appex-sharedux](https://github.com/orgs/elastic/teams/appex-sharedux) | - | 42 | 0 | 28 | 0 | | | [@elastic/kibana-operations](https://github.com/orgs/elastic/teams/kibana-operations) | - | 56 | 0 | 47 | 0 | | | [@elastic/kibana-operations](https://github.com/orgs/elastic/teams/kibana-operations) | - | 9 | 0 | 8 | 0 | -| | [@elastic/kibana-data-discovery](https://github.com/orgs/elastic/teams/kibana-data-discovery) | Contains functionality for the unified data table which can be integrated into apps | 152 | 0 | 83 | 2 | -| | [@elastic/kibana-data-discovery](https://github.com/orgs/elastic/teams/kibana-data-discovery) | - | 18 | 0 | 17 | 6 | +| | [@elastic/kibana-data-discovery](https://github.com/orgs/elastic/teams/kibana-data-discovery) | Contains functionality for the unified data table which can be integrated into apps | 149 | 0 | 80 | 2 | +| | [@elastic/kibana-data-discovery](https://github.com/orgs/elastic/teams/kibana-data-discovery) | - | 18 | 0 | 17 | 5 | | | [@elastic/kibana-data-discovery](https://github.com/orgs/elastic/teams/kibana-data-discovery) | Contains functionality for the field list and field stats which can be integrated into apps | 293 | 0 | 269 | 10 | | | [@elastic/kibana-data-discovery](https://github.com/orgs/elastic/teams/kibana-data-discovery) | - | 13 | 0 | 9 | 0 | | | [@elastic/obs-ux-logs-team](https://github.com/orgs/elastic/teams/obs-ux-logs-team) | - | 3 | 0 | 2 | 1 | diff --git a/api_docs/presentation_panel.mdx b/api_docs/presentation_panel.mdx index efdf8d65ace9d..063b9cf5e2b71 100644 --- a/api_docs/presentation_panel.mdx +++ b/api_docs/presentation_panel.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/presentationPanel title: "presentationPanel" image: https://source.unsplash.com/400x175/?github description: API docs for the presentationPanel plugin -date: 2024-05-06 +date: 2024-05-07 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'presentationPanel'] --- import presentationPanelObj from './presentation_panel.devdocs.json'; diff --git a/api_docs/presentation_util.mdx b/api_docs/presentation_util.mdx index eac63ccd835f7..a6a52059416e8 100644 --- a/api_docs/presentation_util.mdx +++ b/api_docs/presentation_util.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/presentationUtil title: "presentationUtil" image: https://source.unsplash.com/400x175/?github description: API docs for the presentationUtil plugin -date: 2024-05-06 +date: 2024-05-07 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 faca5e50bfcca..3f82a29534996 100644 --- a/api_docs/profiling.mdx +++ b/api_docs/profiling.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/profiling title: "profiling" image: https://source.unsplash.com/400x175/?github description: API docs for the profiling plugin -date: 2024-05-06 +date: 2024-05-07 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'profiling'] --- import profilingObj from './profiling.devdocs.json'; diff --git a/api_docs/profiling_data_access.mdx b/api_docs/profiling_data_access.mdx index 0a7fc6d41e0cf..df964c2871156 100644 --- a/api_docs/profiling_data_access.mdx +++ b/api_docs/profiling_data_access.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/profilingDataAccess title: "profilingDataAccess" image: https://source.unsplash.com/400x175/?github description: API docs for the profilingDataAccess plugin -date: 2024-05-06 +date: 2024-05-07 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'profilingDataAccess'] --- import profilingDataAccessObj from './profiling_data_access.devdocs.json'; diff --git a/api_docs/remote_clusters.mdx b/api_docs/remote_clusters.mdx index f5ec485de9125..f5df410601e03 100644 --- a/api_docs/remote_clusters.mdx +++ b/api_docs/remote_clusters.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/remoteClusters title: "remoteClusters" image: https://source.unsplash.com/400x175/?github description: API docs for the remoteClusters plugin -date: 2024-05-06 +date: 2024-05-07 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 42cfb4679b5a9..ab221e6bfec7f 100644 --- a/api_docs/reporting.mdx +++ b/api_docs/reporting.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/reporting title: "reporting" image: https://source.unsplash.com/400x175/?github description: API docs for the reporting plugin -date: 2024-05-06 +date: 2024-05-07 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 43627a3b533be..27289bf32ec69 100644 --- a/api_docs/rollup.mdx +++ b/api_docs/rollup.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/rollup title: "rollup" image: https://source.unsplash.com/400x175/?github description: API docs for the rollup plugin -date: 2024-05-06 +date: 2024-05-07 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'rollup'] --- import rollupObj from './rollup.devdocs.json'; diff --git a/api_docs/rule_registry.devdocs.json b/api_docs/rule_registry.devdocs.json index ea8018275ab54..d5f57b730b6a1 100644 --- a/api_docs/rule_registry.devdocs.json +++ b/api_docs/rule_registry.devdocs.json @@ -5239,9 +5239,9 @@ }, " extends ", { - "pluginId": "data", + "pluginId": "@kbn/search-types", "scope": "common", - "docId": "kibDataSearchPluginApi", + "docId": "kibKbnSearchTypesPluginApi", "section": "def-common.IEsSearchResponse", "text": "IEsSearchResponse" }, @@ -5336,17 +5336,17 @@ "description": [], "signature": [ { - "pluginId": "data", + "pluginId": "@kbn/search-types", "scope": "common", - "docId": "kibDataSearchPluginApi", + "docId": "kibKbnSearchTypesPluginApi", "section": "def-common.IEsSearchRequest", "text": "IEsSearchRequest" }, "<", { - "pluginId": "data", + "pluginId": "@kbn/search-types", "scope": "common", - "docId": "kibDataSearchPluginApi", + "docId": "kibKbnSearchTypesPluginApi", "section": "def-common.ISearchRequestParams", "text": "ISearchRequestParams" }, diff --git a/api_docs/rule_registry.mdx b/api_docs/rule_registry.mdx index 86901614cbdaa..56bf12a9d113e 100644 --- a/api_docs/rule_registry.mdx +++ b/api_docs/rule_registry.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/ruleRegistry title: "ruleRegistry" image: https://source.unsplash.com/400x175/?github description: API docs for the ruleRegistry plugin -date: 2024-05-06 +date: 2024-05-07 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 051fb1734a681..cac00818b4148 100644 --- a/api_docs/runtime_fields.mdx +++ b/api_docs/runtime_fields.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/runtimeFields title: "runtimeFields" image: https://source.unsplash.com/400x175/?github description: API docs for the runtimeFields plugin -date: 2024-05-06 +date: 2024-05-07 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 36e1fa909947c..984a23721fe15 100644 --- a/api_docs/saved_objects.mdx +++ b/api_docs/saved_objects.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/savedObjects title: "savedObjects" image: https://source.unsplash.com/400x175/?github description: API docs for the savedObjects plugin -date: 2024-05-06 +date: 2024-05-07 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 b3c8ae4a7d12b..93a1044b25199 100644 --- a/api_docs/saved_objects_finder.mdx +++ b/api_docs/saved_objects_finder.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/savedObjectsFinder title: "savedObjectsFinder" image: https://source.unsplash.com/400x175/?github description: API docs for the savedObjectsFinder plugin -date: 2024-05-06 +date: 2024-05-07 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 979571044c8c0..deb861b0fc118 100644 --- a/api_docs/saved_objects_management.mdx +++ b/api_docs/saved_objects_management.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/savedObjectsManagement title: "savedObjectsManagement" image: https://source.unsplash.com/400x175/?github description: API docs for the savedObjectsManagement plugin -date: 2024-05-06 +date: 2024-05-07 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 600c95448e9b8..39e7778ff56bb 100644 --- a/api_docs/saved_objects_tagging.mdx +++ b/api_docs/saved_objects_tagging.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/savedObjectsTagging title: "savedObjectsTagging" image: https://source.unsplash.com/400x175/?github description: API docs for the savedObjectsTagging plugin -date: 2024-05-06 +date: 2024-05-07 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 e16d7ec8a47fa..405e8e22d1da8 100644 --- a/api_docs/saved_objects_tagging_oss.mdx +++ b/api_docs/saved_objects_tagging_oss.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/savedObjectsTaggingOss title: "savedObjectsTaggingOss" image: https://source.unsplash.com/400x175/?github description: API docs for the savedObjectsTaggingOss plugin -date: 2024-05-06 +date: 2024-05-07 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'savedObjectsTaggingOss'] --- import savedObjectsTaggingOssObj from './saved_objects_tagging_oss.devdocs.json'; diff --git a/api_docs/saved_search.devdocs.json b/api_docs/saved_search.devdocs.json index a02e0482b5f0b..8898805e7cbbb 100644 --- a/api_docs/saved_search.devdocs.json +++ b/api_docs/saved_search.devdocs.json @@ -1233,9 +1233,9 @@ "Observable", "<", { - "pluginId": "data", + "pluginId": "@kbn/search-types", "scope": "common", - "docId": "kibDataSearchPluginApi", + "docId": "kibKbnSearchTypesPluginApi", "section": "def-common.IKibanaSearchResponse", "text": "IKibanaSearchResponse" }, diff --git a/api_docs/saved_search.mdx b/api_docs/saved_search.mdx index 94b2e7497cfa2..db2f0c595705f 100644 --- a/api_docs/saved_search.mdx +++ b/api_docs/saved_search.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/savedSearch title: "savedSearch" image: https://source.unsplash.com/400x175/?github description: API docs for the savedSearch plugin -date: 2024-05-06 +date: 2024-05-07 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 575004c4152cd..fa3d7f94c17a6 100644 --- a/api_docs/screenshot_mode.mdx +++ b/api_docs/screenshot_mode.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/screenshotMode title: "screenshotMode" image: https://source.unsplash.com/400x175/?github description: API docs for the screenshotMode plugin -date: 2024-05-06 +date: 2024-05-07 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 1e160cd2c822a..24062313dc252 100644 --- a/api_docs/screenshotting.mdx +++ b/api_docs/screenshotting.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/screenshotting title: "screenshotting" image: https://source.unsplash.com/400x175/?github description: API docs for the screenshotting plugin -date: 2024-05-06 +date: 2024-05-07 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'screenshotting'] --- import screenshottingObj from './screenshotting.devdocs.json'; diff --git a/api_docs/search_connectors.mdx b/api_docs/search_connectors.mdx index 0920c4796cc0a..cc39a5ab07dd5 100644 --- a/api_docs/search_connectors.mdx +++ b/api_docs/search_connectors.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/searchConnectors title: "searchConnectors" image: https://source.unsplash.com/400x175/?github description: API docs for the searchConnectors plugin -date: 2024-05-06 +date: 2024-05-07 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'searchConnectors'] --- import searchConnectorsObj from './search_connectors.devdocs.json'; diff --git a/api_docs/search_notebooks.mdx b/api_docs/search_notebooks.mdx index 33c0305bf4d83..da7c51f45377b 100644 --- a/api_docs/search_notebooks.mdx +++ b/api_docs/search_notebooks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/searchNotebooks title: "searchNotebooks" image: https://source.unsplash.com/400x175/?github description: API docs for the searchNotebooks plugin -date: 2024-05-06 +date: 2024-05-07 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'searchNotebooks'] --- import searchNotebooksObj from './search_notebooks.devdocs.json'; diff --git a/api_docs/search_playground.mdx b/api_docs/search_playground.mdx index 2dcabacd4f1c4..092eef3bfc1b2 100644 --- a/api_docs/search_playground.mdx +++ b/api_docs/search_playground.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/searchPlayground title: "searchPlayground" image: https://source.unsplash.com/400x175/?github description: API docs for the searchPlayground plugin -date: 2024-05-06 +date: 2024-05-07 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'searchPlayground'] --- import searchPlaygroundObj from './search_playground.devdocs.json'; diff --git a/api_docs/security.mdx b/api_docs/security.mdx index 8c2e6e5b8a93a..ce89204dc52e2 100644 --- a/api_docs/security.mdx +++ b/api_docs/security.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/security title: "security" image: https://source.unsplash.com/400x175/?github description: API docs for the security plugin -date: 2024-05-06 +date: 2024-05-07 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 1306a9339f83b..08b96ce0a8429 100644 --- a/api_docs/security_solution.mdx +++ b/api_docs/security_solution.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/securitySolution title: "securitySolution" image: https://source.unsplash.com/400x175/?github description: API docs for the securitySolution plugin -date: 2024-05-06 +date: 2024-05-07 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'securitySolution'] --- import securitySolutionObj from './security_solution.devdocs.json'; diff --git a/api_docs/security_solution_ess.mdx b/api_docs/security_solution_ess.mdx index 82259b84e3002..f59da08d73538 100644 --- a/api_docs/security_solution_ess.mdx +++ b/api_docs/security_solution_ess.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/securitySolutionEss title: "securitySolutionEss" image: https://source.unsplash.com/400x175/?github description: API docs for the securitySolutionEss plugin -date: 2024-05-06 +date: 2024-05-07 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'securitySolutionEss'] --- import securitySolutionEssObj from './security_solution_ess.devdocs.json'; diff --git a/api_docs/security_solution_serverless.mdx b/api_docs/security_solution_serverless.mdx index 362ee997d6636..c14277be9ef2d 100644 --- a/api_docs/security_solution_serverless.mdx +++ b/api_docs/security_solution_serverless.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/securitySolutionServerless title: "securitySolutionServerless" image: https://source.unsplash.com/400x175/?github description: API docs for the securitySolutionServerless plugin -date: 2024-05-06 +date: 2024-05-07 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'securitySolutionServerless'] --- import securitySolutionServerlessObj from './security_solution_serverless.devdocs.json'; diff --git a/api_docs/serverless.mdx b/api_docs/serverless.mdx index 970c960b1395e..0d34ac524e71d 100644 --- a/api_docs/serverless.mdx +++ b/api_docs/serverless.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/serverless title: "serverless" image: https://source.unsplash.com/400x175/?github description: API docs for the serverless plugin -date: 2024-05-06 +date: 2024-05-07 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'serverless'] --- import serverlessObj from './serverless.devdocs.json'; diff --git a/api_docs/serverless_observability.mdx b/api_docs/serverless_observability.mdx index 1e0ce15aa1a1e..7e488cd888441 100644 --- a/api_docs/serverless_observability.mdx +++ b/api_docs/serverless_observability.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/serverlessObservability title: "serverlessObservability" image: https://source.unsplash.com/400x175/?github description: API docs for the serverlessObservability plugin -date: 2024-05-06 +date: 2024-05-07 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'serverlessObservability'] --- import serverlessObservabilityObj from './serverless_observability.devdocs.json'; diff --git a/api_docs/serverless_search.mdx b/api_docs/serverless_search.mdx index 60b8375d50808..0b4ca7fe94517 100644 --- a/api_docs/serverless_search.mdx +++ b/api_docs/serverless_search.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/serverlessSearch title: "serverlessSearch" image: https://source.unsplash.com/400x175/?github description: API docs for the serverlessSearch plugin -date: 2024-05-06 +date: 2024-05-07 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'serverlessSearch'] --- import serverlessSearchObj from './serverless_search.devdocs.json'; diff --git a/api_docs/session_view.mdx b/api_docs/session_view.mdx index 7e91dc6372916..a39633343914d 100644 --- a/api_docs/session_view.mdx +++ b/api_docs/session_view.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/sessionView title: "sessionView" image: https://source.unsplash.com/400x175/?github description: API docs for the sessionView plugin -date: 2024-05-06 +date: 2024-05-07 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 0eaa3e1ae4a50..8e7cd6bc73892 100644 --- a/api_docs/share.mdx +++ b/api_docs/share.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/share title: "share" image: https://source.unsplash.com/400x175/?github description: API docs for the share plugin -date: 2024-05-06 +date: 2024-05-07 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'share'] --- import shareObj from './share.devdocs.json'; diff --git a/api_docs/slo.devdocs.json b/api_docs/slo.devdocs.json index d72df3a83365e..8cd578a4bcd01 100644 --- a/api_docs/slo.devdocs.json +++ b/api_docs/slo.devdocs.json @@ -493,6 +493,26 @@ "deprecated": false, "trackAdoption": false }, + { + "parentPluginId": "slo", + "id": "def-public.SloPublicPluginsStart.dashboard", + "type": "Object", + "tags": [], + "label": "dashboard", + "description": [], + "signature": [ + { + "pluginId": "dashboard", + "scope": "public", + "docId": "kibDashboardPluginApi", + "section": "def-public.DashboardStart", + "text": "DashboardStart" + } + ], + "path": "x-pack/plugins/observability_solution/slo/public/types.ts", + "deprecated": false, + "trackAdoption": false + }, { "parentPluginId": "slo", "id": "def-public.SloPublicPluginsStart.dataViewEditor", diff --git a/api_docs/slo.mdx b/api_docs/slo.mdx index bda2a73d4f91c..b9af365750fff 100644 --- a/api_docs/slo.mdx +++ b/api_docs/slo.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/slo title: "slo" image: https://source.unsplash.com/400x175/?github description: API docs for the slo plugin -date: 2024-05-06 +date: 2024-05-07 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'slo'] --- import sloObj from './slo.devdocs.json'; @@ -21,7 +21,7 @@ Contact [@elastic/obs-ux-management-team](https://github.com/orgs/elastic/teams/ | Public API count | Any count | Items lacking comments | Missing exports | |-------------------|-----------|------------------------|-----------------| -| 62 | 0 | 62 | 1 | +| 63 | 0 | 63 | 1 | ## Client diff --git a/api_docs/snapshot_restore.mdx b/api_docs/snapshot_restore.mdx index 6d0b105813bb1..1a198ffddd57f 100644 --- a/api_docs/snapshot_restore.mdx +++ b/api_docs/snapshot_restore.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/snapshotRestore title: "snapshotRestore" image: https://source.unsplash.com/400x175/?github description: API docs for the snapshotRestore plugin -date: 2024-05-06 +date: 2024-05-07 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 d272249856b51..dc4ccd6b61d7d 100644 --- a/api_docs/spaces.mdx +++ b/api_docs/spaces.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/spaces title: "spaces" image: https://source.unsplash.com/400x175/?github description: API docs for the spaces plugin -date: 2024-05-06 +date: 2024-05-07 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 be7f7d2f70e80..398c602108f66 100644 --- a/api_docs/stack_alerts.mdx +++ b/api_docs/stack_alerts.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/stackAlerts title: "stackAlerts" image: https://source.unsplash.com/400x175/?github description: API docs for the stackAlerts plugin -date: 2024-05-06 +date: 2024-05-07 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 8696438346477..b780bc73f8036 100644 --- a/api_docs/stack_connectors.mdx +++ b/api_docs/stack_connectors.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/stackConnectors title: "stackConnectors" image: https://source.unsplash.com/400x175/?github description: API docs for the stackConnectors plugin -date: 2024-05-06 +date: 2024-05-07 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 8517d37d6bb1c..2fc876ce18268 100644 --- a/api_docs/task_manager.mdx +++ b/api_docs/task_manager.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/taskManager title: "taskManager" image: https://source.unsplash.com/400x175/?github description: API docs for the taskManager plugin -date: 2024-05-06 +date: 2024-05-07 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'taskManager'] --- import taskManagerObj from './task_manager.devdocs.json'; diff --git a/api_docs/telemetry.devdocs.json b/api_docs/telemetry.devdocs.json index 0f8df405a433a..20738f47f4682 100644 --- a/api_docs/telemetry.devdocs.json +++ b/api_docs/telemetry.devdocs.json @@ -630,7 +630,7 @@ "When the data comes from a matching index-pattern, the name of the pattern" ], "signature": [ - "\"search\" | \"logstash\" | \"alerts\" | \"apm\" | \"metricbeat\" | \"enterprise-search\" | \"app-search\" | \"magento2\" | \"magento\" | \"shopify\" | \"wordpress\" | \"drupal\" | \"joomla\" | \"sharepoint\" | \"squarespace\" | \"sitecore\" | \"weebly\" | \"acquia\" | \"filebeat\" | \"functionbeat\" | \"heartbeat\" | \"fluentd\" | \"telegraf\" | \"prometheusbeat\" | \"fluentbit\" | \"nginx\" | \"apache\" | \"endgame\" | \"logs-endpoint\" | \"metrics-endpoint\" | \"siem-signals\" | \"auditbeat\" | \"winlogbeat\" | \"packetbeat\" | \"tomcat\" | \"artifactory\" | \"aruba\" | \"barracuda\" | \"bluecoat\" | \"arcsight\" | \"checkpoint\" | \"cisco\" | \"citrix\" | \"cyberark\" | \"cylance\" | \"fireeye\" | \"fortinet\" | \"infoblox\" | \"kaspersky\" | \"mcafee\" | \"paloaltonetworks\" | \"rsa\" | \"snort\" | \"sonicwall\" | \"sophos\" | \"squid\" | \"symantec\" | \"tippingpoint\" | \"trendmicro\" | \"tripwire\" | \"zscaler\" | \"zeek\" | \"sigma_doc\" | \"ecs-corelight\" | \"suricata\" | \"wazuh\" | \"meow\" | \"host_risk_score\" | \"user_risk_score\" | undefined" + "\"search\" | \"logstash\" | \"alerts\" | \"apm\" | \"metricbeat\" | \"enterprise-search\" | \"app-search\" | \"magento2\" | \"magento\" | \"shopify\" | \"wordpress\" | \"drupal\" | \"joomla\" | \"sharepoint\" | \"squarespace\" | \"sitecore\" | \"weebly\" | \"acquia\" | \"filebeat\" | \"generic-filebeat\" | \"generic-metricbeat\" | \"functionbeat\" | \"generic-functionbeat\" | \"heartbeat\" | \"generic-heartbeat\" | \"generic-logstash\" | \"fluentd\" | \"telegraf\" | \"prometheusbeat\" | \"fluentbit\" | \"nginx\" | \"apache\" | \"generic-logs\" | \"endgame\" | \"logs-endpoint\" | \"metrics-endpoint\" | \"siem-signals\" | \"auditbeat\" | \"winlogbeat\" | \"packetbeat\" | \"tomcat\" | \"artifactory\" | \"aruba\" | \"barracuda\" | \"bluecoat\" | \"arcsight\" | \"checkpoint\" | \"cisco\" | \"citrix\" | \"cyberark\" | \"cylance\" | \"fireeye\" | \"fortinet\" | \"infoblox\" | \"kaspersky\" | \"mcafee\" | \"paloaltonetworks\" | \"rsa\" | \"snort\" | \"sonicwall\" | \"sophos\" | \"squid\" | \"symantec\" | \"tippingpoint\" | \"trendmicro\" | \"tripwire\" | \"zscaler\" | \"zeek\" | \"sigma_doc\" | \"ecs-corelight\" | \"suricata\" | \"wazuh\" | \"meow\" | \"host_risk_score\" | \"user_risk_score\" | undefined" ], "path": "src/plugins/telemetry/server/telemetry_collection/get_data_telemetry/get_data_telemetry.ts", "deprecated": false, diff --git a/api_docs/telemetry.mdx b/api_docs/telemetry.mdx index ec2bca106690c..e32b438a32f33 100644 --- a/api_docs/telemetry.mdx +++ b/api_docs/telemetry.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/telemetry title: "telemetry" image: https://source.unsplash.com/400x175/?github description: API docs for the telemetry plugin -date: 2024-05-06 +date: 2024-05-07 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 e89fdfd7e3680..5bb462f5ee062 100644 --- a/api_docs/telemetry_collection_manager.mdx +++ b/api_docs/telemetry_collection_manager.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/telemetryCollectionManager title: "telemetryCollectionManager" image: https://source.unsplash.com/400x175/?github description: API docs for the telemetryCollectionManager plugin -date: 2024-05-06 +date: 2024-05-07 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 ac6b6b40e0bfa..d5c1bf80a808d 100644 --- a/api_docs/telemetry_collection_xpack.mdx +++ b/api_docs/telemetry_collection_xpack.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/telemetryCollectionXpack title: "telemetryCollectionXpack" image: https://source.unsplash.com/400x175/?github description: API docs for the telemetryCollectionXpack plugin -date: 2024-05-06 +date: 2024-05-07 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 b080c2a499419..1f5d2e0609375 100644 --- a/api_docs/telemetry_management_section.mdx +++ b/api_docs/telemetry_management_section.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/telemetryManagementSection title: "telemetryManagementSection" image: https://source.unsplash.com/400x175/?github description: API docs for the telemetryManagementSection plugin -date: 2024-05-06 +date: 2024-05-07 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'telemetryManagementSection'] --- import telemetryManagementSectionObj from './telemetry_management_section.devdocs.json'; diff --git a/api_docs/text_based_languages.mdx b/api_docs/text_based_languages.mdx index c07fb591f400d..df475489c6d1d 100644 --- a/api_docs/text_based_languages.mdx +++ b/api_docs/text_based_languages.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/textBasedLanguages title: "textBasedLanguages" image: https://source.unsplash.com/400x175/?github description: API docs for the textBasedLanguages plugin -date: 2024-05-06 +date: 2024-05-07 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'textBasedLanguages'] --- import textBasedLanguagesObj from './text_based_languages.devdocs.json'; diff --git a/api_docs/threat_intelligence.mdx b/api_docs/threat_intelligence.mdx index 006cc0d46feb6..cacc0d9cbd906 100644 --- a/api_docs/threat_intelligence.mdx +++ b/api_docs/threat_intelligence.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/threatIntelligence title: "threatIntelligence" image: https://source.unsplash.com/400x175/?github description: API docs for the threatIntelligence plugin -date: 2024-05-06 +date: 2024-05-07 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'threatIntelligence'] --- import threatIntelligenceObj from './threat_intelligence.devdocs.json'; diff --git a/api_docs/timelines.devdocs.json b/api_docs/timelines.devdocs.json index 45985f6614a8e..c4025785898db 100644 --- a/api_docs/timelines.devdocs.json +++ b/api_docs/timelines.devdocs.json @@ -999,6 +999,44 @@ "path": "x-pack/plugins/timelines/public/components/hover_actions/actions/add_to_timeline.tsx", "deprecated": false, "trackAdoption": false + }, + { + "parentPluginId": "timelines", + "id": "def-public.AddToTimelineButtonProps.startServices", + "type": "Object", + "tags": [], + "label": "startServices", + "description": [], + "signature": [ + "{ i18n: ", + { + "pluginId": "@kbn/core-i18n-browser", + "scope": "common", + "docId": "kibKbnCoreI18nBrowserPluginApi", + "section": "def-common.I18nStart", + "text": "I18nStart" + }, + "; analytics: ", + { + "pluginId": "@kbn/core-analytics-browser", + "scope": "common", + "docId": "kibKbnCoreAnalyticsBrowserPluginApi", + "section": "def-common.AnalyticsServiceStart", + "text": "AnalyticsServiceStart" + }, + "; theme: ", + { + "pluginId": "@kbn/core-theme-browser", + "scope": "common", + "docId": "kibKbnCoreThemeBrowserPluginApi", + "section": "def-common.ThemeServiceSetup", + "text": "ThemeServiceSetup" + }, + "; }" + ], + "path": "x-pack/plugins/timelines/public/components/hover_actions/actions/add_to_timeline.tsx", + "deprecated": false, + "trackAdoption": false } ], "initialIsOpen": false @@ -1122,6 +1160,45 @@ } ], "initialIsOpen": false + }, + { + "parentPluginId": "timelines", + "id": "def-public.TimelinesStartServices", + "type": "Type", + "tags": [], + "label": "TimelinesStartServices", + "description": [], + "signature": [ + "{ i18n: ", + { + "pluginId": "@kbn/core-i18n-browser", + "scope": "common", + "docId": "kibKbnCoreI18nBrowserPluginApi", + "section": "def-common.I18nStart", + "text": "I18nStart" + }, + "; analytics: ", + { + "pluginId": "@kbn/core-analytics-browser", + "scope": "common", + "docId": "kibKbnCoreAnalyticsBrowserPluginApi", + "section": "def-common.AnalyticsServiceStart", + "text": "AnalyticsServiceStart" + }, + "; theme: ", + { + "pluginId": "@kbn/core-theme-browser", + "scope": "common", + "docId": "kibKbnCoreThemeBrowserPluginApi", + "section": "def-common.ThemeServiceSetup", + "text": "ThemeServiceSetup" + }, + "; }" + ], + "path": "x-pack/plugins/timelines/public/index.ts", + "deprecated": false, + "trackAdoption": false, + "initialIsOpen": false } ], "objects": [], @@ -2513,9 +2590,9 @@ }, " extends ", { - "pluginId": "data", + "pluginId": "@kbn/search-types", "scope": "common", - "docId": "kibDataSearchPluginApi", + "docId": "kibKbnSearchTypesPluginApi", "section": "def-common.IEsSearchResponse", "text": "IEsSearchResponse" }, @@ -3069,9 +3146,9 @@ }, " extends ", { - "pluginId": "data", + "pluginId": "@kbn/search-types", "scope": "common", - "docId": "kibDataSearchPluginApi", + "docId": "kibKbnSearchTypesPluginApi", "section": "def-common.IEsSearchResponse", "text": "IEsSearchResponse" }, @@ -3278,9 +3355,9 @@ }, " extends ", { - "pluginId": "data", + "pluginId": "@kbn/search-types", "scope": "common", - "docId": "kibDataSearchPluginApi", + "docId": "kibKbnSearchTypesPluginApi", "section": "def-common.IEsSearchResponse", "text": "IEsSearchResponse" }, @@ -3394,9 +3471,9 @@ }, " extends ", { - "pluginId": "data", + "pluginId": "@kbn/search-types", "scope": "common", - "docId": "kibDataSearchPluginApi", + "docId": "kibKbnSearchTypesPluginApi", "section": "def-common.IEsSearchResponse", "text": "IEsSearchResponse" }, @@ -3544,9 +3621,9 @@ }, " extends ", { - "pluginId": "data", + "pluginId": "@kbn/search-types", "scope": "common", - "docId": "kibDataSearchPluginApi", + "docId": "kibKbnSearchTypesPluginApi", "section": "def-common.IEsSearchResponse", "text": "IEsSearchResponse" }, diff --git a/api_docs/timelines.mdx b/api_docs/timelines.mdx index ccca8a43de1e7..329a5f23bb0f5 100644 --- a/api_docs/timelines.mdx +++ b/api_docs/timelines.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/timelines title: "timelines" image: https://source.unsplash.com/400x175/?github description: API docs for the timelines plugin -date: 2024-05-06 +date: 2024-05-07 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'timelines'] --- import timelinesObj from './timelines.devdocs.json'; @@ -21,7 +21,7 @@ Contact [@elastic/security-threat-hunting-investigations](https://github.com/org | Public API count | Any count | Items lacking comments | Missing exports | |-------------------|-----------|------------------------|-----------------| -| 240 | 1 | 196 | 17 | +| 242 | 1 | 198 | 17 | ## Client diff --git a/api_docs/transform.mdx b/api_docs/transform.mdx index a25f16dd619a9..e3aa5f939d5a6 100644 --- a/api_docs/transform.mdx +++ b/api_docs/transform.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/transform title: "transform" image: https://source.unsplash.com/400x175/?github description: API docs for the transform plugin -date: 2024-05-06 +date: 2024-05-07 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 eca2964533658..848f94d5674f4 100644 --- a/api_docs/triggers_actions_ui.mdx +++ b/api_docs/triggers_actions_ui.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/triggersActionsUi title: "triggersActionsUi" image: https://source.unsplash.com/400x175/?github description: API docs for the triggersActionsUi plugin -date: 2024-05-06 +date: 2024-05-07 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 5058cdffd4ac4..ecd4e86a80293 100644 --- a/api_docs/ui_actions.mdx +++ b/api_docs/ui_actions.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/uiActions title: "uiActions" image: https://source.unsplash.com/400x175/?github description: API docs for the uiActions plugin -date: 2024-05-06 +date: 2024-05-07 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 8af03c38f004a..f740435d1095d 100644 --- a/api_docs/ui_actions_enhanced.mdx +++ b/api_docs/ui_actions_enhanced.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/uiActionsEnhanced title: "uiActionsEnhanced" image: https://source.unsplash.com/400x175/?github description: API docs for the uiActionsEnhanced plugin -date: 2024-05-06 +date: 2024-05-07 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'uiActionsEnhanced'] --- import uiActionsEnhancedObj from './ui_actions_enhanced.devdocs.json'; diff --git a/api_docs/unified_doc_viewer.mdx b/api_docs/unified_doc_viewer.mdx index fac5210d56421..fc7852338b714 100644 --- a/api_docs/unified_doc_viewer.mdx +++ b/api_docs/unified_doc_viewer.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/unifiedDocViewer title: "unifiedDocViewer" image: https://source.unsplash.com/400x175/?github description: API docs for the unifiedDocViewer plugin -date: 2024-05-06 +date: 2024-05-07 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'unifiedDocViewer'] --- import unifiedDocViewerObj from './unified_doc_viewer.devdocs.json'; diff --git a/api_docs/unified_histogram.mdx b/api_docs/unified_histogram.mdx index aee168c5df40a..98a006a8491e8 100644 --- a/api_docs/unified_histogram.mdx +++ b/api_docs/unified_histogram.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/unifiedHistogram title: "unifiedHistogram" image: https://source.unsplash.com/400x175/?github description: API docs for the unifiedHistogram plugin -date: 2024-05-06 +date: 2024-05-07 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'unifiedHistogram'] --- import unifiedHistogramObj from './unified_histogram.devdocs.json'; diff --git a/api_docs/unified_search.devdocs.json b/api_docs/unified_search.devdocs.json index d89079af5b706..e3d2077b12292 100644 --- a/api_docs/unified_search.devdocs.json +++ b/api_docs/unified_search.devdocs.json @@ -2681,7 +2681,7 @@ "UnifiedSearchServerPluginSetupDependencies", ") => { autocomplete: { getAutocompleteSettings: () => { terminateAfter: number; timeout: number; }; getInitializerContextConfig: () => { legacy: { globalConfig$: ", "Observable", - " moment.Duration; humanize: { (argWithSuffix?: boolean | undefined, argThresholds?: moment.argThresholdOpts | undefined): string; (argThresholds?: moment.argThresholdOpts | undefined): string; }; abs: () => moment.Duration; as: (units: moment.unitOfTime.Base) => number; get: (units: moment.unitOfTime.Base) => number; milliseconds: () => number; asMilliseconds: () => number; seconds: () => number; asSeconds: () => number; minutes: () => number; asMinutes: () => number; hours: () => number; asHours: () => number; days: () => number; asDays: () => number; weeks: () => number; asWeeks: () => number; months: () => number; asMonths: () => number; years: () => number; asYears: () => number; add: (inp?: moment.DurationInputArg1, unit?: moment.unitOfTime.DurationConstructor | undefined) => moment.Duration; subtract: (inp?: moment.DurationInputArg1, unit?: moment.unitOfTime.DurationConstructor | undefined) => moment.Duration; locale: { (): string; (locale: moment.LocaleSpecifier): moment.Duration; }; localeData: () => moment.Locale; toISOString: () => string; toJSON: () => string; isValid: () => boolean; lang: { (locale: moment.LocaleSpecifier): moment.Moment; (): moment.Locale; }; toIsoString: () => string; format: moment.Format; }>; readonly shardTimeout: Readonly<{ clone: () => moment.Duration; humanize: { (argWithSuffix?: boolean | undefined, argThresholds?: moment.argThresholdOpts | undefined): string; (argThresholds?: moment.argThresholdOpts | undefined): string; }; abs: () => moment.Duration; as: (units: moment.unitOfTime.Base) => number; get: (units: moment.unitOfTime.Base) => number; milliseconds: () => number; asMilliseconds: () => number; seconds: () => number; asSeconds: () => number; minutes: () => number; asMinutes: () => number; hours: () => number; asHours: () => number; days: () => number; asDays: () => number; weeks: () => number; asWeeks: () => number; months: () => number; asMonths: () => number; years: () => number; asYears: () => number; add: (inp?: moment.DurationInputArg1, unit?: moment.unitOfTime.DurationConstructor | undefined) => moment.Duration; subtract: (inp?: moment.DurationInputArg1, unit?: moment.unitOfTime.DurationConstructor | undefined) => moment.Duration; locale: { (): string; (locale: moment.LocaleSpecifier): moment.Duration; }; localeData: () => moment.Locale; toISOString: () => string; toJSON: () => string; isValid: () => boolean; lang: { (locale: moment.LocaleSpecifier): moment.Moment; (): moment.Locale; }; toIsoString: () => string; format: moment.Format; }>; readonly pingTimeout: Readonly<{ clone: () => moment.Duration; humanize: { (argWithSuffix?: boolean | undefined, argThresholds?: moment.argThresholdOpts | undefined): string; (argThresholds?: moment.argThresholdOpts | undefined): string; }; abs: () => moment.Duration; as: (units: moment.unitOfTime.Base) => number; get: (units: moment.unitOfTime.Base) => number; milliseconds: () => number; asMilliseconds: () => number; seconds: () => number; asSeconds: () => number; minutes: () => number; asMinutes: () => number; hours: () => number; asHours: () => number; days: () => number; asDays: () => number; weeks: () => number; asWeeks: () => number; months: () => number; asMonths: () => number; years: () => number; asYears: () => number; add: (inp?: moment.DurationInputArg1, unit?: moment.unitOfTime.DurationConstructor | undefined) => moment.Duration; subtract: (inp?: moment.DurationInputArg1, unit?: moment.unitOfTime.DurationConstructor | undefined) => moment.Duration; locale: { (): string; (locale: moment.LocaleSpecifier): moment.Duration; }; localeData: () => moment.Locale; toISOString: () => string; toJSON: () => string; isValid: () => boolean; lang: { (locale: moment.LocaleSpecifier): moment.Moment; (): moment.Locale; }; toIsoString: () => string; format: moment.Format; }>; }>; path: Readonly<{ readonly data: string; }>; savedObjects: Readonly<{ readonly maxImportPayloadBytes: Readonly<{ isGreaterThan: (other: ", + " moment.Duration; humanize: { (argWithSuffix?: boolean | undefined, argThresholds?: moment.argThresholdOpts | undefined): string; (argThresholds?: moment.argThresholdOpts | undefined): string; }; abs: () => moment.Duration; as: (units: moment.unitOfTime.Base) => number; get: (units: moment.unitOfTime.Base) => number; milliseconds: () => number; asMilliseconds: () => number; seconds: () => number; asSeconds: () => number; minutes: () => number; asMinutes: () => number; hours: () => number; asHours: () => number; days: () => number; asDays: () => number; weeks: () => number; asWeeks: () => number; months: () => number; asMonths: () => number; years: () => number; asYears: () => number; add: (inp?: moment.DurationInputArg1, unit?: moment.unitOfTime.DurationConstructor | undefined) => moment.Duration; subtract: (inp?: moment.DurationInputArg1, unit?: moment.unitOfTime.DurationConstructor | undefined) => moment.Duration; locale: { (): string; (locale: moment.LocaleSpecifier): moment.Duration; }; localeData: () => moment.Locale; toISOString: () => string; toJSON: () => string; isValid: () => boolean; lang: { (locale: moment.LocaleSpecifier): moment.Moment; (): moment.Locale; }; toIsoString: () => string; format: moment.Format; }>; readonly requestTimeout: Readonly<{ clone: () => moment.Duration; humanize: { (argWithSuffix?: boolean | undefined, argThresholds?: moment.argThresholdOpts | undefined): string; (argThresholds?: moment.argThresholdOpts | undefined): string; }; abs: () => moment.Duration; as: (units: moment.unitOfTime.Base) => number; get: (units: moment.unitOfTime.Base) => number; milliseconds: () => number; asMilliseconds: () => number; seconds: () => number; asSeconds: () => number; minutes: () => number; asMinutes: () => number; hours: () => number; asHours: () => number; days: () => number; asDays: () => number; weeks: () => number; asWeeks: () => number; months: () => number; asMonths: () => number; years: () => number; asYears: () => number; add: (inp?: moment.DurationInputArg1, unit?: moment.unitOfTime.DurationConstructor | undefined) => moment.Duration; subtract: (inp?: moment.DurationInputArg1, unit?: moment.unitOfTime.DurationConstructor | undefined) => moment.Duration; locale: { (): string; (locale: moment.LocaleSpecifier): moment.Duration; }; localeData: () => moment.Locale; toISOString: () => string; toJSON: () => string; isValid: () => boolean; lang: { (locale: moment.LocaleSpecifier): moment.Moment; (): moment.Locale; }; toIsoString: () => string; format: moment.Format; }>; readonly pingTimeout: Readonly<{ clone: () => moment.Duration; humanize: { (argWithSuffix?: boolean | undefined, argThresholds?: moment.argThresholdOpts | undefined): string; (argThresholds?: moment.argThresholdOpts | undefined): string; }; abs: () => moment.Duration; as: (units: moment.unitOfTime.Base) => number; get: (units: moment.unitOfTime.Base) => number; milliseconds: () => number; asMilliseconds: () => number; seconds: () => number; asSeconds: () => number; minutes: () => number; asMinutes: () => number; hours: () => number; asHours: () => number; days: () => number; asDays: () => number; weeks: () => number; asWeeks: () => number; months: () => number; asMonths: () => number; years: () => number; asYears: () => number; add: (inp?: moment.DurationInputArg1, unit?: moment.unitOfTime.DurationConstructor | undefined) => moment.Duration; subtract: (inp?: moment.DurationInputArg1, unit?: moment.unitOfTime.DurationConstructor | undefined) => moment.Duration; locale: { (): string; (locale: moment.LocaleSpecifier): moment.Duration; }; localeData: () => moment.Locale; toISOString: () => string; toJSON: () => string; isValid: () => boolean; lang: { (locale: moment.LocaleSpecifier): moment.Moment; (): moment.Locale; }; toIsoString: () => string; format: moment.Format; }>; }>; path: Readonly<{ readonly data: string; }>; savedObjects: Readonly<{ readonly maxImportPayloadBytes: Readonly<{ isGreaterThan: (other: ", { "pluginId": "@kbn/config-schema", "scope": "common", @@ -2707,7 +2707,7 @@ }, ") => boolean; getValueInBytes: () => number; toString: (returnUnit?: ", "ByteSizeValueUnit", - " | undefined) => string; }>; }>; }>>; get: () => Readonly<{ elasticsearch: Readonly<{ readonly requestTimeout: Readonly<{ clone: () => moment.Duration; humanize: { (argWithSuffix?: boolean | undefined, argThresholds?: moment.argThresholdOpts | undefined): string; (argThresholds?: moment.argThresholdOpts | undefined): string; }; abs: () => moment.Duration; as: (units: moment.unitOfTime.Base) => number; get: (units: moment.unitOfTime.Base) => number; milliseconds: () => number; asMilliseconds: () => number; seconds: () => number; asSeconds: () => number; minutes: () => number; asMinutes: () => number; hours: () => number; asHours: () => number; days: () => number; asDays: () => number; weeks: () => number; asWeeks: () => number; months: () => number; asMonths: () => number; years: () => number; asYears: () => number; add: (inp?: moment.DurationInputArg1, unit?: moment.unitOfTime.DurationConstructor | undefined) => moment.Duration; subtract: (inp?: moment.DurationInputArg1, unit?: moment.unitOfTime.DurationConstructor | undefined) => moment.Duration; locale: { (): string; (locale: moment.LocaleSpecifier): moment.Duration; }; localeData: () => moment.Locale; toISOString: () => string; toJSON: () => string; isValid: () => boolean; lang: { (locale: moment.LocaleSpecifier): moment.Moment; (): moment.Locale; }; toIsoString: () => string; format: moment.Format; }>; readonly shardTimeout: Readonly<{ clone: () => moment.Duration; humanize: { (argWithSuffix?: boolean | undefined, argThresholds?: moment.argThresholdOpts | undefined): string; (argThresholds?: moment.argThresholdOpts | undefined): string; }; abs: () => moment.Duration; as: (units: moment.unitOfTime.Base) => number; get: (units: moment.unitOfTime.Base) => number; milliseconds: () => number; asMilliseconds: () => number; seconds: () => number; asSeconds: () => number; minutes: () => number; asMinutes: () => number; hours: () => number; asHours: () => number; days: () => number; asDays: () => number; weeks: () => number; asWeeks: () => number; months: () => number; asMonths: () => number; years: () => number; asYears: () => number; add: (inp?: moment.DurationInputArg1, unit?: moment.unitOfTime.DurationConstructor | undefined) => moment.Duration; subtract: (inp?: moment.DurationInputArg1, unit?: moment.unitOfTime.DurationConstructor | undefined) => moment.Duration; locale: { (): string; (locale: moment.LocaleSpecifier): moment.Duration; }; localeData: () => moment.Locale; toISOString: () => string; toJSON: () => string; isValid: () => boolean; lang: { (locale: moment.LocaleSpecifier): moment.Moment; (): moment.Locale; }; toIsoString: () => string; format: moment.Format; }>; readonly pingTimeout: Readonly<{ clone: () => moment.Duration; humanize: { (argWithSuffix?: boolean | undefined, argThresholds?: moment.argThresholdOpts | undefined): string; (argThresholds?: moment.argThresholdOpts | undefined): string; }; abs: () => moment.Duration; as: (units: moment.unitOfTime.Base) => number; get: (units: moment.unitOfTime.Base) => number; milliseconds: () => number; asMilliseconds: () => number; seconds: () => number; asSeconds: () => number; minutes: () => number; asMinutes: () => number; hours: () => number; asHours: () => number; days: () => number; asDays: () => number; weeks: () => number; asWeeks: () => number; months: () => number; asMonths: () => number; years: () => number; asYears: () => number; add: (inp?: moment.DurationInputArg1, unit?: moment.unitOfTime.DurationConstructor | undefined) => moment.Duration; subtract: (inp?: moment.DurationInputArg1, unit?: moment.unitOfTime.DurationConstructor | undefined) => moment.Duration; locale: { (): string; (locale: moment.LocaleSpecifier): moment.Duration; }; localeData: () => moment.Locale; toISOString: () => string; toJSON: () => string; isValid: () => boolean; lang: { (locale: moment.LocaleSpecifier): moment.Moment; (): moment.Locale; }; toIsoString: () => string; format: moment.Format; }>; }>; path: Readonly<{ readonly data: string; }>; savedObjects: Readonly<{ readonly maxImportPayloadBytes: Readonly<{ isGreaterThan: (other: ", + " | undefined) => string; }>; }>; }>>; get: () => Readonly<{ elasticsearch: Readonly<{ readonly shardTimeout: Readonly<{ clone: () => moment.Duration; humanize: { (argWithSuffix?: boolean | undefined, argThresholds?: moment.argThresholdOpts | undefined): string; (argThresholds?: moment.argThresholdOpts | undefined): string; }; abs: () => moment.Duration; as: (units: moment.unitOfTime.Base) => number; get: (units: moment.unitOfTime.Base) => number; milliseconds: () => number; asMilliseconds: () => number; seconds: () => number; asSeconds: () => number; minutes: () => number; asMinutes: () => number; hours: () => number; asHours: () => number; days: () => number; asDays: () => number; weeks: () => number; asWeeks: () => number; months: () => number; asMonths: () => number; years: () => number; asYears: () => number; add: (inp?: moment.DurationInputArg1, unit?: moment.unitOfTime.DurationConstructor | undefined) => moment.Duration; subtract: (inp?: moment.DurationInputArg1, unit?: moment.unitOfTime.DurationConstructor | undefined) => moment.Duration; locale: { (): string; (locale: moment.LocaleSpecifier): moment.Duration; }; localeData: () => moment.Locale; toISOString: () => string; toJSON: () => string; isValid: () => boolean; lang: { (locale: moment.LocaleSpecifier): moment.Moment; (): moment.Locale; }; toIsoString: () => string; format: moment.Format; }>; readonly requestTimeout: Readonly<{ clone: () => moment.Duration; humanize: { (argWithSuffix?: boolean | undefined, argThresholds?: moment.argThresholdOpts | undefined): string; (argThresholds?: moment.argThresholdOpts | undefined): string; }; abs: () => moment.Duration; as: (units: moment.unitOfTime.Base) => number; get: (units: moment.unitOfTime.Base) => number; milliseconds: () => number; asMilliseconds: () => number; seconds: () => number; asSeconds: () => number; minutes: () => number; asMinutes: () => number; hours: () => number; asHours: () => number; days: () => number; asDays: () => number; weeks: () => number; asWeeks: () => number; months: () => number; asMonths: () => number; years: () => number; asYears: () => number; add: (inp?: moment.DurationInputArg1, unit?: moment.unitOfTime.DurationConstructor | undefined) => moment.Duration; subtract: (inp?: moment.DurationInputArg1, unit?: moment.unitOfTime.DurationConstructor | undefined) => moment.Duration; locale: { (): string; (locale: moment.LocaleSpecifier): moment.Duration; }; localeData: () => moment.Locale; toISOString: () => string; toJSON: () => string; isValid: () => boolean; lang: { (locale: moment.LocaleSpecifier): moment.Moment; (): moment.Locale; }; toIsoString: () => string; format: moment.Format; }>; readonly pingTimeout: Readonly<{ clone: () => moment.Duration; humanize: { (argWithSuffix?: boolean | undefined, argThresholds?: moment.argThresholdOpts | undefined): string; (argThresholds?: moment.argThresholdOpts | undefined): string; }; abs: () => moment.Duration; as: (units: moment.unitOfTime.Base) => number; get: (units: moment.unitOfTime.Base) => number; milliseconds: () => number; asMilliseconds: () => number; seconds: () => number; asSeconds: () => number; minutes: () => number; asMinutes: () => number; hours: () => number; asHours: () => number; days: () => number; asDays: () => number; weeks: () => number; asWeeks: () => number; months: () => number; asMonths: () => number; years: () => number; asYears: () => number; add: (inp?: moment.DurationInputArg1, unit?: moment.unitOfTime.DurationConstructor | undefined) => moment.Duration; subtract: (inp?: moment.DurationInputArg1, unit?: moment.unitOfTime.DurationConstructor | undefined) => moment.Duration; locale: { (): string; (locale: moment.LocaleSpecifier): moment.Duration; }; localeData: () => moment.Locale; toISOString: () => string; toJSON: () => string; isValid: () => boolean; lang: { (locale: moment.LocaleSpecifier): moment.Moment; (): moment.Locale; }; toIsoString: () => string; format: moment.Format; }>; }>; path: Readonly<{ readonly data: string; }>; savedObjects: Readonly<{ readonly maxImportPayloadBytes: Readonly<{ isGreaterThan: (other: ", { "pluginId": "@kbn/config-schema", "scope": "common", @@ -2914,7 +2914,7 @@ "signature": [ "{ getAutocompleteSettings: () => { terminateAfter: number; timeout: number; }; getInitializerContextConfig: () => { legacy: { globalConfig$: ", "Observable", - " moment.Duration; humanize: { (argWithSuffix?: boolean | undefined, argThresholds?: moment.argThresholdOpts | undefined): string; (argThresholds?: moment.argThresholdOpts | undefined): string; }; abs: () => moment.Duration; as: (units: moment.unitOfTime.Base) => number; get: (units: moment.unitOfTime.Base) => number; milliseconds: () => number; asMilliseconds: () => number; seconds: () => number; asSeconds: () => number; minutes: () => number; asMinutes: () => number; hours: () => number; asHours: () => number; days: () => number; asDays: () => number; weeks: () => number; asWeeks: () => number; months: () => number; asMonths: () => number; years: () => number; asYears: () => number; add: (inp?: moment.DurationInputArg1, unit?: moment.unitOfTime.DurationConstructor | undefined) => moment.Duration; subtract: (inp?: moment.DurationInputArg1, unit?: moment.unitOfTime.DurationConstructor | undefined) => moment.Duration; locale: { (): string; (locale: moment.LocaleSpecifier): moment.Duration; }; localeData: () => moment.Locale; toISOString: () => string; toJSON: () => string; isValid: () => boolean; lang: { (locale: moment.LocaleSpecifier): moment.Moment; (): moment.Locale; }; toIsoString: () => string; format: moment.Format; }>; readonly shardTimeout: Readonly<{ clone: () => moment.Duration; humanize: { (argWithSuffix?: boolean | undefined, argThresholds?: moment.argThresholdOpts | undefined): string; (argThresholds?: moment.argThresholdOpts | undefined): string; }; abs: () => moment.Duration; as: (units: moment.unitOfTime.Base) => number; get: (units: moment.unitOfTime.Base) => number; milliseconds: () => number; asMilliseconds: () => number; seconds: () => number; asSeconds: () => number; minutes: () => number; asMinutes: () => number; hours: () => number; asHours: () => number; days: () => number; asDays: () => number; weeks: () => number; asWeeks: () => number; months: () => number; asMonths: () => number; years: () => number; asYears: () => number; add: (inp?: moment.DurationInputArg1, unit?: moment.unitOfTime.DurationConstructor | undefined) => moment.Duration; subtract: (inp?: moment.DurationInputArg1, unit?: moment.unitOfTime.DurationConstructor | undefined) => moment.Duration; locale: { (): string; (locale: moment.LocaleSpecifier): moment.Duration; }; localeData: () => moment.Locale; toISOString: () => string; toJSON: () => string; isValid: () => boolean; lang: { (locale: moment.LocaleSpecifier): moment.Moment; (): moment.Locale; }; toIsoString: () => string; format: moment.Format; }>; readonly pingTimeout: Readonly<{ clone: () => moment.Duration; humanize: { (argWithSuffix?: boolean | undefined, argThresholds?: moment.argThresholdOpts | undefined): string; (argThresholds?: moment.argThresholdOpts | undefined): string; }; abs: () => moment.Duration; as: (units: moment.unitOfTime.Base) => number; get: (units: moment.unitOfTime.Base) => number; milliseconds: () => number; asMilliseconds: () => number; seconds: () => number; asSeconds: () => number; minutes: () => number; asMinutes: () => number; hours: () => number; asHours: () => number; days: () => number; asDays: () => number; weeks: () => number; asWeeks: () => number; months: () => number; asMonths: () => number; years: () => number; asYears: () => number; add: (inp?: moment.DurationInputArg1, unit?: moment.unitOfTime.DurationConstructor | undefined) => moment.Duration; subtract: (inp?: moment.DurationInputArg1, unit?: moment.unitOfTime.DurationConstructor | undefined) => moment.Duration; locale: { (): string; (locale: moment.LocaleSpecifier): moment.Duration; }; localeData: () => moment.Locale; toISOString: () => string; toJSON: () => string; isValid: () => boolean; lang: { (locale: moment.LocaleSpecifier): moment.Moment; (): moment.Locale; }; toIsoString: () => string; format: moment.Format; }>; }>; path: Readonly<{ readonly data: string; }>; savedObjects: Readonly<{ readonly maxImportPayloadBytes: Readonly<{ isGreaterThan: (other: ", + " moment.Duration; humanize: { (argWithSuffix?: boolean | undefined, argThresholds?: moment.argThresholdOpts | undefined): string; (argThresholds?: moment.argThresholdOpts | undefined): string; }; abs: () => moment.Duration; as: (units: moment.unitOfTime.Base) => number; get: (units: moment.unitOfTime.Base) => number; milliseconds: () => number; asMilliseconds: () => number; seconds: () => number; asSeconds: () => number; minutes: () => number; asMinutes: () => number; hours: () => number; asHours: () => number; days: () => number; asDays: () => number; weeks: () => number; asWeeks: () => number; months: () => number; asMonths: () => number; years: () => number; asYears: () => number; add: (inp?: moment.DurationInputArg1, unit?: moment.unitOfTime.DurationConstructor | undefined) => moment.Duration; subtract: (inp?: moment.DurationInputArg1, unit?: moment.unitOfTime.DurationConstructor | undefined) => moment.Duration; locale: { (): string; (locale: moment.LocaleSpecifier): moment.Duration; }; localeData: () => moment.Locale; toISOString: () => string; toJSON: () => string; isValid: () => boolean; lang: { (locale: moment.LocaleSpecifier): moment.Moment; (): moment.Locale; }; toIsoString: () => string; format: moment.Format; }>; readonly requestTimeout: Readonly<{ clone: () => moment.Duration; humanize: { (argWithSuffix?: boolean | undefined, argThresholds?: moment.argThresholdOpts | undefined): string; (argThresholds?: moment.argThresholdOpts | undefined): string; }; abs: () => moment.Duration; as: (units: moment.unitOfTime.Base) => number; get: (units: moment.unitOfTime.Base) => number; milliseconds: () => number; asMilliseconds: () => number; seconds: () => number; asSeconds: () => number; minutes: () => number; asMinutes: () => number; hours: () => number; asHours: () => number; days: () => number; asDays: () => number; weeks: () => number; asWeeks: () => number; months: () => number; asMonths: () => number; years: () => number; asYears: () => number; add: (inp?: moment.DurationInputArg1, unit?: moment.unitOfTime.DurationConstructor | undefined) => moment.Duration; subtract: (inp?: moment.DurationInputArg1, unit?: moment.unitOfTime.DurationConstructor | undefined) => moment.Duration; locale: { (): string; (locale: moment.LocaleSpecifier): moment.Duration; }; localeData: () => moment.Locale; toISOString: () => string; toJSON: () => string; isValid: () => boolean; lang: { (locale: moment.LocaleSpecifier): moment.Moment; (): moment.Locale; }; toIsoString: () => string; format: moment.Format; }>; readonly pingTimeout: Readonly<{ clone: () => moment.Duration; humanize: { (argWithSuffix?: boolean | undefined, argThresholds?: moment.argThresholdOpts | undefined): string; (argThresholds?: moment.argThresholdOpts | undefined): string; }; abs: () => moment.Duration; as: (units: moment.unitOfTime.Base) => number; get: (units: moment.unitOfTime.Base) => number; milliseconds: () => number; asMilliseconds: () => number; seconds: () => number; asSeconds: () => number; minutes: () => number; asMinutes: () => number; hours: () => number; asHours: () => number; days: () => number; asDays: () => number; weeks: () => number; asWeeks: () => number; months: () => number; asMonths: () => number; years: () => number; asYears: () => number; add: (inp?: moment.DurationInputArg1, unit?: moment.unitOfTime.DurationConstructor | undefined) => moment.Duration; subtract: (inp?: moment.DurationInputArg1, unit?: moment.unitOfTime.DurationConstructor | undefined) => moment.Duration; locale: { (): string; (locale: moment.LocaleSpecifier): moment.Duration; }; localeData: () => moment.Locale; toISOString: () => string; toJSON: () => string; isValid: () => boolean; lang: { (locale: moment.LocaleSpecifier): moment.Moment; (): moment.Locale; }; toIsoString: () => string; format: moment.Format; }>; }>; path: Readonly<{ readonly data: string; }>; savedObjects: Readonly<{ readonly maxImportPayloadBytes: Readonly<{ isGreaterThan: (other: ", { "pluginId": "@kbn/config-schema", "scope": "common", @@ -2940,7 +2940,7 @@ }, ") => boolean; getValueInBytes: () => number; toString: (returnUnit?: ", "ByteSizeValueUnit", - " | undefined) => string; }>; }>; }>>; get: () => Readonly<{ elasticsearch: Readonly<{ readonly requestTimeout: Readonly<{ clone: () => moment.Duration; humanize: { (argWithSuffix?: boolean | undefined, argThresholds?: moment.argThresholdOpts | undefined): string; (argThresholds?: moment.argThresholdOpts | undefined): string; }; abs: () => moment.Duration; as: (units: moment.unitOfTime.Base) => number; get: (units: moment.unitOfTime.Base) => number; milliseconds: () => number; asMilliseconds: () => number; seconds: () => number; asSeconds: () => number; minutes: () => number; asMinutes: () => number; hours: () => number; asHours: () => number; days: () => number; asDays: () => number; weeks: () => number; asWeeks: () => number; months: () => number; asMonths: () => number; years: () => number; asYears: () => number; add: (inp?: moment.DurationInputArg1, unit?: moment.unitOfTime.DurationConstructor | undefined) => moment.Duration; subtract: (inp?: moment.DurationInputArg1, unit?: moment.unitOfTime.DurationConstructor | undefined) => moment.Duration; locale: { (): string; (locale: moment.LocaleSpecifier): moment.Duration; }; localeData: () => moment.Locale; toISOString: () => string; toJSON: () => string; isValid: () => boolean; lang: { (locale: moment.LocaleSpecifier): moment.Moment; (): moment.Locale; }; toIsoString: () => string; format: moment.Format; }>; readonly shardTimeout: Readonly<{ clone: () => moment.Duration; humanize: { (argWithSuffix?: boolean | undefined, argThresholds?: moment.argThresholdOpts | undefined): string; (argThresholds?: moment.argThresholdOpts | undefined): string; }; abs: () => moment.Duration; as: (units: moment.unitOfTime.Base) => number; get: (units: moment.unitOfTime.Base) => number; milliseconds: () => number; asMilliseconds: () => number; seconds: () => number; asSeconds: () => number; minutes: () => number; asMinutes: () => number; hours: () => number; asHours: () => number; days: () => number; asDays: () => number; weeks: () => number; asWeeks: () => number; months: () => number; asMonths: () => number; years: () => number; asYears: () => number; add: (inp?: moment.DurationInputArg1, unit?: moment.unitOfTime.DurationConstructor | undefined) => moment.Duration; subtract: (inp?: moment.DurationInputArg1, unit?: moment.unitOfTime.DurationConstructor | undefined) => moment.Duration; locale: { (): string; (locale: moment.LocaleSpecifier): moment.Duration; }; localeData: () => moment.Locale; toISOString: () => string; toJSON: () => string; isValid: () => boolean; lang: { (locale: moment.LocaleSpecifier): moment.Moment; (): moment.Locale; }; toIsoString: () => string; format: moment.Format; }>; readonly pingTimeout: Readonly<{ clone: () => moment.Duration; humanize: { (argWithSuffix?: boolean | undefined, argThresholds?: moment.argThresholdOpts | undefined): string; (argThresholds?: moment.argThresholdOpts | undefined): string; }; abs: () => moment.Duration; as: (units: moment.unitOfTime.Base) => number; get: (units: moment.unitOfTime.Base) => number; milliseconds: () => number; asMilliseconds: () => number; seconds: () => number; asSeconds: () => number; minutes: () => number; asMinutes: () => number; hours: () => number; asHours: () => number; days: () => number; asDays: () => number; weeks: () => number; asWeeks: () => number; months: () => number; asMonths: () => number; years: () => number; asYears: () => number; add: (inp?: moment.DurationInputArg1, unit?: moment.unitOfTime.DurationConstructor | undefined) => moment.Duration; subtract: (inp?: moment.DurationInputArg1, unit?: moment.unitOfTime.DurationConstructor | undefined) => moment.Duration; locale: { (): string; (locale: moment.LocaleSpecifier): moment.Duration; }; localeData: () => moment.Locale; toISOString: () => string; toJSON: () => string; isValid: () => boolean; lang: { (locale: moment.LocaleSpecifier): moment.Moment; (): moment.Locale; }; toIsoString: () => string; format: moment.Format; }>; }>; path: Readonly<{ readonly data: string; }>; savedObjects: Readonly<{ readonly maxImportPayloadBytes: Readonly<{ isGreaterThan: (other: ", + " | undefined) => string; }>; }>; }>>; get: () => Readonly<{ elasticsearch: Readonly<{ readonly shardTimeout: Readonly<{ clone: () => moment.Duration; humanize: { (argWithSuffix?: boolean | undefined, argThresholds?: moment.argThresholdOpts | undefined): string; (argThresholds?: moment.argThresholdOpts | undefined): string; }; abs: () => moment.Duration; as: (units: moment.unitOfTime.Base) => number; get: (units: moment.unitOfTime.Base) => number; milliseconds: () => number; asMilliseconds: () => number; seconds: () => number; asSeconds: () => number; minutes: () => number; asMinutes: () => number; hours: () => number; asHours: () => number; days: () => number; asDays: () => number; weeks: () => number; asWeeks: () => number; months: () => number; asMonths: () => number; years: () => number; asYears: () => number; add: (inp?: moment.DurationInputArg1, unit?: moment.unitOfTime.DurationConstructor | undefined) => moment.Duration; subtract: (inp?: moment.DurationInputArg1, unit?: moment.unitOfTime.DurationConstructor | undefined) => moment.Duration; locale: { (): string; (locale: moment.LocaleSpecifier): moment.Duration; }; localeData: () => moment.Locale; toISOString: () => string; toJSON: () => string; isValid: () => boolean; lang: { (locale: moment.LocaleSpecifier): moment.Moment; (): moment.Locale; }; toIsoString: () => string; format: moment.Format; }>; readonly requestTimeout: Readonly<{ clone: () => moment.Duration; humanize: { (argWithSuffix?: boolean | undefined, argThresholds?: moment.argThresholdOpts | undefined): string; (argThresholds?: moment.argThresholdOpts | undefined): string; }; abs: () => moment.Duration; as: (units: moment.unitOfTime.Base) => number; get: (units: moment.unitOfTime.Base) => number; milliseconds: () => number; asMilliseconds: () => number; seconds: () => number; asSeconds: () => number; minutes: () => number; asMinutes: () => number; hours: () => number; asHours: () => number; days: () => number; asDays: () => number; weeks: () => number; asWeeks: () => number; months: () => number; asMonths: () => number; years: () => number; asYears: () => number; add: (inp?: moment.DurationInputArg1, unit?: moment.unitOfTime.DurationConstructor | undefined) => moment.Duration; subtract: (inp?: moment.DurationInputArg1, unit?: moment.unitOfTime.DurationConstructor | undefined) => moment.Duration; locale: { (): string; (locale: moment.LocaleSpecifier): moment.Duration; }; localeData: () => moment.Locale; toISOString: () => string; toJSON: () => string; isValid: () => boolean; lang: { (locale: moment.LocaleSpecifier): moment.Moment; (): moment.Locale; }; toIsoString: () => string; format: moment.Format; }>; readonly pingTimeout: Readonly<{ clone: () => moment.Duration; humanize: { (argWithSuffix?: boolean | undefined, argThresholds?: moment.argThresholdOpts | undefined): string; (argThresholds?: moment.argThresholdOpts | undefined): string; }; abs: () => moment.Duration; as: (units: moment.unitOfTime.Base) => number; get: (units: moment.unitOfTime.Base) => number; milliseconds: () => number; asMilliseconds: () => number; seconds: () => number; asSeconds: () => number; minutes: () => number; asMinutes: () => number; hours: () => number; asHours: () => number; days: () => number; asDays: () => number; weeks: () => number; asWeeks: () => number; months: () => number; asMonths: () => number; years: () => number; asYears: () => number; add: (inp?: moment.DurationInputArg1, unit?: moment.unitOfTime.DurationConstructor | undefined) => moment.Duration; subtract: (inp?: moment.DurationInputArg1, unit?: moment.unitOfTime.DurationConstructor | undefined) => moment.Duration; locale: { (): string; (locale: moment.LocaleSpecifier): moment.Duration; }; localeData: () => moment.Locale; toISOString: () => string; toJSON: () => string; isValid: () => boolean; lang: { (locale: moment.LocaleSpecifier): moment.Moment; (): moment.Locale; }; toIsoString: () => string; format: moment.Format; }>; }>; path: Readonly<{ readonly data: string; }>; savedObjects: Readonly<{ readonly maxImportPayloadBytes: Readonly<{ isGreaterThan: (other: ", { "pluginId": "@kbn/config-schema", "scope": "common", diff --git a/api_docs/unified_search.mdx b/api_docs/unified_search.mdx index 2f41980b34bc9..8e3fe86d3c060 100644 --- a/api_docs/unified_search.mdx +++ b/api_docs/unified_search.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/unifiedSearch title: "unifiedSearch" image: https://source.unsplash.com/400x175/?github description: API docs for the unifiedSearch plugin -date: 2024-05-06 +date: 2024-05-07 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 eba497a6952ed..a183f9d955251 100644 --- a/api_docs/unified_search_autocomplete.mdx +++ b/api_docs/unified_search_autocomplete.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/unifiedSearch-autocomplete title: "unifiedSearch.autocomplete" image: https://source.unsplash.com/400x175/?github description: API docs for the unifiedSearch.autocomplete plugin -date: 2024-05-06 +date: 2024-05-07 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'unifiedSearch.autocomplete'] --- import unifiedSearchAutocompleteObj from './unified_search_autocomplete.devdocs.json'; diff --git a/api_docs/uptime.mdx b/api_docs/uptime.mdx index a198aaaba4126..a72811ee6f272 100644 --- a/api_docs/uptime.mdx +++ b/api_docs/uptime.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/uptime title: "uptime" image: https://source.unsplash.com/400x175/?github description: API docs for the uptime plugin -date: 2024-05-06 +date: 2024-05-07 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'uptime'] --- import uptimeObj from './uptime.devdocs.json'; diff --git a/api_docs/url_forwarding.mdx b/api_docs/url_forwarding.mdx index 31832260e2fd4..53bd29a071eb0 100644 --- a/api_docs/url_forwarding.mdx +++ b/api_docs/url_forwarding.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/urlForwarding title: "urlForwarding" image: https://source.unsplash.com/400x175/?github description: API docs for the urlForwarding plugin -date: 2024-05-06 +date: 2024-05-07 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 f1b96d3999c81..0ba7760f02d7b 100644 --- a/api_docs/usage_collection.mdx +++ b/api_docs/usage_collection.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/usageCollection title: "usageCollection" image: https://source.unsplash.com/400x175/?github description: API docs for the usageCollection plugin -date: 2024-05-06 +date: 2024-05-07 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 a71e9fba20a0b..6a6471e55881b 100644 --- a/api_docs/ux.mdx +++ b/api_docs/ux.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/ux title: "ux" image: https://source.unsplash.com/400x175/?github description: API docs for the ux plugin -date: 2024-05-06 +date: 2024-05-07 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 387b70e192f95..38a57a2cda4eb 100644 --- a/api_docs/vis_default_editor.mdx +++ b/api_docs/vis_default_editor.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/visDefaultEditor title: "visDefaultEditor" image: https://source.unsplash.com/400x175/?github description: API docs for the visDefaultEditor plugin -date: 2024-05-06 +date: 2024-05-07 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 748556e3faa42..f913b1c15e04e 100644 --- a/api_docs/vis_type_gauge.mdx +++ b/api_docs/vis_type_gauge.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/visTypeGauge title: "visTypeGauge" image: https://source.unsplash.com/400x175/?github description: API docs for the visTypeGauge plugin -date: 2024-05-06 +date: 2024-05-07 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 f20c0c981a92c..6dc7562445401 100644 --- a/api_docs/vis_type_heatmap.mdx +++ b/api_docs/vis_type_heatmap.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/visTypeHeatmap title: "visTypeHeatmap" image: https://source.unsplash.com/400x175/?github description: API docs for the visTypeHeatmap plugin -date: 2024-05-06 +date: 2024-05-07 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 acb29d8e7e4fa..04c1f0360d917 100644 --- a/api_docs/vis_type_pie.mdx +++ b/api_docs/vis_type_pie.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/visTypePie title: "visTypePie" image: https://source.unsplash.com/400x175/?github description: API docs for the visTypePie plugin -date: 2024-05-06 +date: 2024-05-07 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 684e3aaecc5c7..7ed5f1478f808 100644 --- a/api_docs/vis_type_table.mdx +++ b/api_docs/vis_type_table.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/visTypeTable title: "visTypeTable" image: https://source.unsplash.com/400x175/?github description: API docs for the visTypeTable plugin -date: 2024-05-06 +date: 2024-05-07 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 81b6cde81544e..6be95d9806641 100644 --- a/api_docs/vis_type_timelion.mdx +++ b/api_docs/vis_type_timelion.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/visTypeTimelion title: "visTypeTimelion" image: https://source.unsplash.com/400x175/?github description: API docs for the visTypeTimelion plugin -date: 2024-05-06 +date: 2024-05-07 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 4bfb0ef160d17..1649e43a3ae9b 100644 --- a/api_docs/vis_type_timeseries.mdx +++ b/api_docs/vis_type_timeseries.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/visTypeTimeseries title: "visTypeTimeseries" image: https://source.unsplash.com/400x175/?github description: API docs for the visTypeTimeseries plugin -date: 2024-05-06 +date: 2024-05-07 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 1952c98e82926..a3dc522271ef7 100644 --- a/api_docs/vis_type_vega.mdx +++ b/api_docs/vis_type_vega.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/visTypeVega title: "visTypeVega" image: https://source.unsplash.com/400x175/?github description: API docs for the visTypeVega plugin -date: 2024-05-06 +date: 2024-05-07 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 3644910866695..4416a05f81b20 100644 --- a/api_docs/vis_type_vislib.mdx +++ b/api_docs/vis_type_vislib.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/visTypeVislib title: "visTypeVislib" image: https://source.unsplash.com/400x175/?github description: API docs for the visTypeVislib plugin -date: 2024-05-06 +date: 2024-05-07 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 0a7694215ef86..e09fee372091f 100644 --- a/api_docs/vis_type_xy.mdx +++ b/api_docs/vis_type_xy.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/visTypeXy title: "visTypeXy" image: https://source.unsplash.com/400x175/?github description: API docs for the visTypeXy plugin -date: 2024-05-06 +date: 2024-05-07 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 5b5f03ac16d6d..2ca1fc860febe 100644 --- a/api_docs/visualizations.mdx +++ b/api_docs/visualizations.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/visualizations title: "visualizations" image: https://source.unsplash.com/400x175/?github description: API docs for the visualizations plugin -date: 2024-05-06 +date: 2024-05-07 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'visualizations'] --- import visualizationsObj from './visualizations.devdocs.json'; From 3c1abc71df91939d6b09b412ac22b1645fb48cdf Mon Sep 17 00:00:00 2001 From: elena-shostak <165678770+elena-shostak@users.noreply.github.com> Date: Tue, 7 May 2024 09:43:56 +0200 Subject: [PATCH 06/86] [User Profile] Updated functional svl test (#181731) ## Summary - Updated functional svl test for user profiles to use saml auth instead of basic. - Updated readme `Run tests on MKI` section ### Checklist - [x] [Flaky Test Runner](https://ci-stats.kibana.dev/trigger_flaky_test_runner/1) was used on any tests changed ([Report](https://buildkite.com/elastic/kibana-flaky-test-suite-runner/builds/5814)) __Fixes: https://github.com/elastic/kibana/issues/176334__ --------- Co-authored-by: Kibana Machine <42973632+kibanamachine@users.noreply.github.com> --- .../page_objects/user_profile_page.ts | 8 ++++ x-pack/test_serverless/README.md | 38 +++++++++++++++++- .../user_profiles/user_profiles.ts | 39 +++++++++++-------- 3 files changed, 68 insertions(+), 17 deletions(-) diff --git a/x-pack/test/functional/page_objects/user_profile_page.ts b/x-pack/test/functional/page_objects/user_profile_page.ts index 3380c10e20677..d777d1c2ffcda 100644 --- a/x-pack/test/functional/page_objects/user_profile_page.ts +++ b/x-pack/test/functional/page_objects/user_profile_page.ts @@ -60,6 +60,14 @@ export function UserProfilePageProvider({ getService }: FtrProviderContext) { return await find.byCssSelector('.euiKeyPadMenu'); }, + async getProfileEmail() { + return await testSubjects.getVisibleText('email'); + }, + + async getProfileFullname() { + return await testSubjects.getVisibleText('full_name'); + }, + async setFullNameInputField(newFullName: string) { return await testSubjects.setValue('userProfileFullName', newFullName); }, diff --git a/x-pack/test_serverless/README.md b/x-pack/test_serverless/README.md index 4a111d23d3790..6fb7551859e5b 100644 --- a/x-pack/test_serverless/README.md +++ b/x-pack/test_serverless/README.md @@ -209,9 +209,45 @@ node scripts/functional_test_runner.js --config test_serverless/api_integration/ ## Run tests on MKI There is no need to start servers locally, you just need to create MKI project and copy urls for Elasticsearch and Kibana. Make sure to update urls with username/password and port 443 for Elasticsearch. FTR has no control over MKI and can't update your projects so make sure your `config.ts` does not specify any custom arguments for Kibana or Elasticsearch. Otherwise, it will be ignored. You can run the tests from the `x-pack` directory: ``` -TEST_CLOUD=1 TEST_ES_URL="https://elastic:PASSWORD@ES_HOSTNAME:443" TEST_KIBANA_URL="https://elastic:PASSWORD@KIBANA_HOSTNAME" node scripts/functional_test_runner --config test_serverless/api_integration/test_suites/search/config.ts --exclude-tag=skipMKI +TEST_CLOUD=1 TEST_CLOUD_HOST_NAME="CLOUD_HOST_NAME" TEST_ES_URL="https://elastic:PASSWORD@ES_HOSTNAME:443" TEST_KIBANA_URL="https://elastic:PASSWORD@KIBANA_HOSTNAME" node scripts/functional_test_runner --config test_serverless/api_integration/test_suites/search/config.ts --exclude-tag=skipMKI ``` +Steps to follow to run on QA environment: +- Go to `CLOUD_HOST_NAME` and create a project. +- Go to `CLOUD_HOST_NAME/account/keys` and create Cloud specific API Key. +- We need the key from step 2 to obtain basic auth credentials for ES and Kibana. + Make a POST request to the following endpoint. + ``` + POST CLOUD_HOST_NAME/api/v1/serverless/projects///_reset-internal-credentials + Authorization: ApiKey + Content-Type: application/json + ``` + + In response you should get credentials. + ``` + { + "password": "testing-internal_pwd", + "username": "testing-internal" + } + ``` + We would use these credentials for `TEST_ES_URL="https://USERNAME:PASSWORD@ES_HOSTNAME:443"` and `TEST_KIBANA_URL="https://USERNAME:PASSWORD@KIBANA_HOSTNAME"` +- Now we need to create a user with the roles we want to test. Go to members page - `CLOUD_HOST_NAME/account/members` and click `[Invite member]`. + - Select the access level you want to grant and your project type. For example, to create a user with viewer role, toggle `[Instanse access]`, select project (should correspond to your project type, i.e Security), select `Viewer` role. + - Create `.ftr/role_users.json` in the root of Kibana repo. Add record for created user. + ``` + { + "viewer": { + "password": "xxxx", + "email": "email_of_the_elastic_cloud_account" + } + } + ``` +- Now run the tests from the `x-pack` directory +``` +TEST_CLOUD=1 TEST_CLOUD_HOST_NAME="CLOUD_HOST_NAME" TEST_ES_URL="https://testing-internal:testing-internal_pwd@ES_HOSTNAME:443" TEST_KIBANA_URL="https://testing-internal:testing-internal_pwd@KIBANA_HOSTNAME:443" node scripts/functional_test_runner.js --config test_serverless/functional/test_suites/security/common_configs/config.group1.ts --exclude-tag=skipMKI +``` + + ## Skipping tests for MKI run The tests that are listed in the the regular `config.ts` generally should work in both Kibana CI and MKI. However some tests might not work properly against MKI projects by design. Tag the tests with `skipMKI` to be excluded for MKI run. It works only for the `describe` block: diff --git a/x-pack/test_serverless/functional/test_suites/common/platform_security/user_profiles/user_profiles.ts b/x-pack/test_serverless/functional/test_suites/common/platform_security/user_profiles/user_profiles.ts index 2045f172d3db0..c9c61d5d3a6a9 100644 --- a/x-pack/test_serverless/functional/test_suites/common/platform_security/user_profiles/user_profiles.ts +++ b/x-pack/test_serverless/functional/test_suites/common/platform_security/user_profiles/user_profiles.ts @@ -8,37 +8,44 @@ import expect from '@kbn/expect'; import { FtrProviderContext } from '../../../../ftr_provider_context'; -export default function ({ getPageObjects }: FtrProviderContext) { +const VIEWER_ROLE = 'viewer'; + +export default function ({ getPageObjects, getService }: FtrProviderContext) { + const testSubjects = getService('testSubjects'); const pageObjects = getPageObjects(['svlCommonPage', 'common', 'userProfiles']); + const svlUserManager = getService('svlUserManager'); describe('User Profile Page', async () => { before(async () => { - // TODO: migrate to SAML role when profile page displays the data - await pageObjects.svlCommonPage.login(); + await pageObjects.svlCommonPage.loginWithRole(VIEWER_ROLE); }); after(async () => { await pageObjects.svlCommonPage.forceLogout(); }); - describe('Theme', async () => { - it('should change theme based on the User Profile Theme control', async () => { + describe('User details', async () => { + it('should display correct user details', async () => { await pageObjects.common.navigateToApp('security_account'); - const themeKeyPadMenu = await pageObjects.userProfiles.getThemeKeypadMenu(); - expect(themeKeyPadMenu).not.to.be(null); + const userData = await svlUserManager.getUserData(VIEWER_ROLE); + + const actualFullname = await pageObjects.userProfiles.getProfileFullname(); + const actualEmail = await pageObjects.userProfiles.getProfileEmail(); + + expect(actualFullname).to.be(userData.fullname); + expect(actualEmail).to.be(userData.email); + }); - await pageObjects.userProfiles.changeUserProfileTheme('Dark'); - const darkModeTag = await pageObjects.userProfiles.getThemeTag(); - expect(darkModeTag).to.be('v8dark'); + it('should not have edit actions', async () => { + const fullNameInputField = await testSubjects.findAll('userProfileFullName'); - await pageObjects.userProfiles.changeUserProfileTheme('Light'); - const lightModeTag = await pageObjects.userProfiles.getThemeTag(); - expect(lightModeTag).to.be('v8light'); + const emailInputField = await testSubjects.findAll('userProfileEmail'); + const changePasswordButton = await testSubjects.findAll('openChangePasswordForm'); - await pageObjects.userProfiles.changeUserProfileTheme('Space default'); - const spaceDefaultModeTag = await pageObjects.userProfiles.getThemeTag(); - expect(spaceDefaultModeTag).to.be('v8light'); + expect(fullNameInputField).to.have.length(0); + expect(emailInputField).to.have.length(0); + expect(changePasswordButton).to.have.length(0); }); }); }); From dcf6e83aeaed3c45cbca24ae75a4acf37ad8468c Mon Sep 17 00:00:00 2001 From: Maryam Saeidi Date: Tue, 7 May 2024 10:11:28 +0200 Subject: [PATCH 07/86] [Alert table] Fix Triggered column timezone and format (#182653) Partially implements #182650 ## Summary This PR fixes START_TIME timezone and format [similar to what we have in the stack management](https://github.com/elastic/kibana/blob/main/x-pack/plugins/triggers_actions_ui/public/application/sections/alerts_table/cells/render_cell_value.tsx#L124,L125) ([comment](https://github.com/elastic/sdh-kibana/issues/4653#issuecomment-2093845148)) |Before|After| |---|---| |![image](https://github.com/elastic/kibana/assets/12370520/94c3b321-2c80-4333-bbbd-0fad6692302b)|![image](https://github.com/elastic/kibana/assets/12370520/23d2ac9d-db2b-423c-82e2-be3753b0954c)| There are more questions to be answered in #182650, but for now, I've added this fix to have something consistent with the stack management alerts table. --- .../public/components/alerts_table/common/render_cell_value.tsx | 2 ++ 1 file changed, 2 insertions(+) diff --git a/x-pack/plugins/observability_solution/observability/public/components/alerts_table/common/render_cell_value.tsx b/x-pack/plugins/observability_solution/observability/public/components/alerts_table/common/render_cell_value.tsx index 5ab79c6dfa141..22289706784e7 100644 --- a/x-pack/plugins/observability_solution/observability/public/components/alerts_table/common/render_cell_value.tsx +++ b/x-pack/plugins/observability_solution/observability/public/components/alerts_table/common/render_cell_value.tsx @@ -19,6 +19,7 @@ import { ALERT_EVALUATION_VALUES, ALERT_RULE_NAME, ALERT_RULE_CATEGORY, + ALERT_START, } from '@kbn/rule-data-utils'; import { isEmpty } from 'lodash'; import type { TimelineNonEcsData } from '@kbn/timelines-plugin/common'; @@ -95,6 +96,7 @@ export const getRenderCellValue = ({ } return ; case TIMESTAMP: + case ALERT_START: return ; case ALERT_DURATION: return asDuration(Number(value)); From aec4efb63e853fcf605d3c33a40baf066361f995 Mon Sep 17 00:00:00 2001 From: Tomasz Ciecierski Date: Tue, 7 May 2024 10:15:07 +0200 Subject: [PATCH 08/86] [EDR Workflows] Add enabled to Osquery plugin config. (#182644) --- x-pack/plugins/osquery/common/config.ts | 1 + 1 file changed, 1 insertion(+) diff --git a/x-pack/plugins/osquery/common/config.ts b/x-pack/plugins/osquery/common/config.ts index de4e884e9b040..200ee76da9800 100644 --- a/x-pack/plugins/osquery/common/config.ts +++ b/x-pack/plugins/osquery/common/config.ts @@ -10,6 +10,7 @@ import { schema } from '@kbn/config-schema'; export const ConfigSchema = schema.object({ actionEnabled: schema.boolean({ defaultValue: false }), + enabled: schema.boolean({ defaultValue: true }), }); export type ConfigType = TypeOf; From a8a6003c406099ada70e16ded665eea0778b99f5 Mon Sep 17 00:00:00 2001 From: Mark Hopkin Date: Tue, 7 May 2024 09:18:34 +0100 Subject: [PATCH 09/86] [Entity Analytics] Do not display -0.00 for criticality contributions less than -0.01 (#182356) Closes #182224 If an asset criticality contribution score was below -0.01 e.g 0.0000001 then we would display it as -0.0.0 Skipping release notes as this feature was introduced in 8.14 and I'm back-porting. Before: Screenshot 2024-05-02 at 13 13 36 After: Screenshot 2024-05-02 at 13 13 56 --------- Co-authored-by: Kibana Machine <42973632+kibanamachine@users.noreply.github.com> --- .../tabs/risk_inputs/risk_inputs.test.tsx | 62 +++++++++++++++++++ .../tabs/risk_inputs/risk_inputs_tab.tsx | 18 +++++- 2 files changed, 78 insertions(+), 2 deletions(-) diff --git a/x-pack/plugins/security_solution/public/entity_analytics/components/entity_details_flyout/tabs/risk_inputs/risk_inputs.test.tsx b/x-pack/plugins/security_solution/public/entity_analytics/components/entity_details_flyout/tabs/risk_inputs/risk_inputs.test.tsx index a1e3807c80fc5..6b632a8269365 100644 --- a/x-pack/plugins/security_solution/public/entity_analytics/components/entity_details_flyout/tabs/risk_inputs/risk_inputs.test.tsx +++ b/x-pack/plugins/security_solution/public/entity_analytics/components/entity_details_flyout/tabs/risk_inputs/risk_inputs.test.tsx @@ -49,6 +49,12 @@ const riskScore = { }, }; +const riskScoreWithAssetCriticalityContribution = (contribution: number) => { + const score = JSON.parse(JSON.stringify(riskScore)); + score.user.risk.category_2_score = contribution; + return score; +}; + describe('RiskInputsTab', () => { beforeEach(() => { jest.clearAllMocks(); @@ -117,6 +123,62 @@ describe('RiskInputsTab', () => { expect(queryByTestId('risk-input-contexts-title')).toBeInTheDocument(); }); + it('Displays 0.00 for the asset criticality contribution if the contribution value is less than -0.01', () => { + mockUseUiSetting.mockReturnValue([true]); + + mockUseRiskScore.mockReturnValue({ + loading: false, + error: false, + data: [riskScoreWithAssetCriticalityContribution(-0.0000001)], + }); + + const { getByTestId } = render( + + + + ); + const contextsTable = getByTestId('risk-input-contexts-table'); + expect(contextsTable).not.toHaveTextContent('-0.00'); + expect(contextsTable).toHaveTextContent('0.00'); + }); + + it('Displays 0.00 for the asset criticality contribution if the contribution value is less than 0.01', () => { + mockUseUiSetting.mockReturnValue([true]); + + mockUseRiskScore.mockReturnValue({ + loading: false, + error: false, + data: [riskScoreWithAssetCriticalityContribution(0.0000001)], + }); + + const { getByTestId } = render( + + + + ); + const contextsTable = getByTestId('risk-input-contexts-table'); + expect(contextsTable).not.toHaveTextContent('+0.00'); + expect(contextsTable).toHaveTextContent('0.00'); + }); + + it('Adds a plus to positive asset criticality contribution scores', () => { + mockUseUiSetting.mockReturnValue([true]); + + mockUseRiskScore.mockReturnValue({ + loading: false, + error: false, + data: [riskScoreWithAssetCriticalityContribution(2.22)], + }); + + const { getByTestId } = render( + + + + ); + + expect(getByTestId('risk-input-contexts-table')).toHaveTextContent('+2.22'); + }); + it('shows extra alerts contribution message', () => { const alerts = times( (number) => ({ diff --git a/x-pack/plugins/security_solution/public/entity_analytics/components/entity_details_flyout/tabs/risk_inputs/risk_inputs_tab.tsx b/x-pack/plugins/security_solution/public/entity_analytics/components/entity_details_flyout/tabs/risk_inputs/risk_inputs_tab.tsx index bcf83d2cd9ad3..80b425bec15bb 100644 --- a/x-pack/plugins/security_solution/public/entity_analytics/components/entity_details_flyout/tabs/risk_inputs/risk_inputs_tab.tsx +++ b/x-pack/plugins/security_solution/public/entity_analytics/components/entity_details_flyout/tabs/risk_inputs/risk_inputs_tab.tsx @@ -14,6 +14,7 @@ import { useUiSetting$ } from '@kbn/kibana-react-plugin/public'; import { ALERT_RULE_NAME } from '@kbn/rule-data-utils'; import { get } from 'lodash/fp'; +import { formatRiskScore } from '../../../../common'; import type { InputAlert, UseRiskContributingAlertsResult, @@ -242,6 +243,7 @@ const ContextsSection: React.FC<{ = ({ riskScore, aler ); }; -const formatContribution = (value: number) => - value > 0 ? `+${value.toFixed(2)}` : value.toFixed(2); +const formatContribution = (value: number): string => { + const fixedValue = formatRiskScore(value); + + // prevent +0.00 for values like 0.0001 + if (fixedValue === '0.00') { + return fixedValue; + } + + if (value > 0) { + return `+${fixedValue}`; + } + + return fixedValue; +}; From 1e80b0114eebf668357dcb6a6fccc5c3297eeb8c Mon Sep 17 00:00:00 2001 From: Jean-Louis Leysens Date: Tue, 7 May 2024 10:28:33 +0200 Subject: [PATCH 10/86] [HTTP/OAS] Added response schemas for `/api/status` (#181277) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit ## Summary Part https://github.com/elastic/kibana/issues/180056. Adds new response schemas to the `/api/status` endpoint for the purposes of OAS generation. ## How to test 1. Start ES 2. Add `server.oas.enabled: true` to `kibana.dev.yml` 3. Start Kibana `yarn start --no-base-path` 4. `curl -s -uelastic:changeme http://localhost:5601/api/oas\?pathStartsWith\=/api/status | jq`
output ```json { "openapi": "3.0.0", "info": { "title": "Kibana HTTP APIs", "version": "0.0.0" }, "servers": [ { "url": "http://localhost:5601" } ], "paths": { "/api/status": { "get": { "summary": "Get Kibana's current status.", "responses": { "200": { "description": "Get Kibana's current status.", "content": { "application/json; Elastic-Api-Version=2023-10-31": { "schema": { "description": "Kibana's operational status. A minimal response is sent for unauthorized users.", "anyOf": [ { "$ref": "#/components/schemas/core.status.response" }, { "$ref": "#/components/schemas/core.status.redactedResponse" } ] } } } }, "503": { "description": "Get Kibana's current status.", "content": { "application/json; Elastic-Api-Version=2023-10-31": { "schema": { "description": "Kibana's operational status. A minimal response is sent for unauthorized users.", "anyOf": [ { "$ref": "#/components/schemas/core.status.response" }, { "$ref": "#/components/schemas/core.status.redactedResponse" } ] } } } } }, "parameters": [ { "in": "header", "name": "elastic-api-version", "description": "The version of the API to use", "schema": { "type": "string", "enum": [ "2023-10-31" ], "default": "2023-10-31" } }, { "name": "v7format", "in": "query", "required": false, "schema": { "type": "boolean" }, "description": "Set to \"true\" to get the response in v7 format." }, { "name": "v8format", "in": "query", "required": false, "schema": { "type": "boolean" }, "description": "Set to \"true\" to get the response in v8 format." } ], "operationId": "/api/status#0" } } }, "components": { "schemas": { "core.status.response": { "description": "Kibana's operational status as well as a detailed breakdown of plugin statuses indication of various loads (like event loop utilization and network traffic) at time of request.", "type": "object", "properties": { "name": { "description": "Kibana instance name.", "type": "string" }, "uuid": { "description": "Unique, generated Kibana instance UUID. This UUID should persist even if the Kibana process restarts.", "type": "string" }, "version": { "type": "object", "properties": { "number": { "description": "A semantic version number.", "type": "string" }, "build_hash": { "description": "A unique hash value representing the git commit of this Kibana build.", "type": "string" }, "build_number": { "description": "A monotonically increasing number, each subsequent build will have a higher number.", "type": "number" }, "build_snapshot": { "description": "Whether this build is a snapshot build.", "type": "boolean" }, "build_flavor": { "description": "The build flavour determines configuration and behavior of Kibana. On premise users will almost always run the \"traditional\" flavour, while other flavours are reserved for Elastic-specific use cases.", "anyOf": [ { "enum": [ "serverless" ], "type": "string" }, { "enum": [ "traditional" ], "type": "string" } ] }, "build_date": { "description": "The date and time of this build.", "type": "string" } }, "additionalProperties": false, "required": [ "number", "build_hash", "build_number", "build_snapshot", "build_flavor", "build_date" ] }, "status": { "type": "object", "properties": { "overall": { "type": "object", "properties": { "level": { "description": "Service status levels as human and machine readable values.", "anyOf": [ { "enum": [ "available" ], "type": "string" }, { "enum": [ "degraded" ], "type": "string" }, { "enum": [ "unavailable" ], "type": "string" }, { "enum": [ "critical" ], "type": "string" } ] }, "summary": { "description": "A human readable summary of the service status.", "type": "string" }, "detail": { "description": "Human readable detail of the service status.", "type": "string" }, "documentationUrl": { "description": "A URL to further documentation regarding this service.", "type": "string" }, "meta": { "description": "An unstructured set of extra metadata about this service.", "type": "object", "additionalProperties": {} } }, "additionalProperties": false, "required": [ "level", "summary", "meta" ] }, "core": { "description": "Statuses of core Kibana services.", "type": "object", "properties": { "elasticsearch": { "type": "object", "properties": { "level": { "description": "Service status levels as human and machine readable values.", "anyOf": [ { "enum": [ "available" ], "type": "string" }, { "enum": [ "degraded" ], "type": "string" }, { "enum": [ "unavailable" ], "type": "string" }, { "enum": [ "critical" ], "type": "string" } ] }, "summary": { "description": "A human readable summary of the service status.", "type": "string" }, "detail": { "description": "Human readable detail of the service status.", "type": "string" }, "documentationUrl": { "description": "A URL to further documentation regarding this service.", "type": "string" }, "meta": { "description": "An unstructured set of extra metadata about this service.", "type": "object", "additionalProperties": {} } }, "additionalProperties": false, "required": [ "level", "summary", "meta" ] }, "savedObjects": { "type": "object", "properties": { "level": { "description": "Service status levels as human and machine readable values.", "anyOf": [ { "enum": [ "available" ], "type": "string" }, { "enum": [ "degraded" ], "type": "string" }, { "enum": [ "unavailable" ], "type": "string" }, { "enum": [ "critical" ], "type": "string" } ] }, "summary": { "description": "A human readable summary of the service status.", "type": "string" }, "detail": { "description": "Human readable detail of the service status.", "type": "string" }, "documentationUrl": { "description": "A URL to further documentation regarding this service.", "type": "string" }, "meta": { "description": "An unstructured set of extra metadata about this service.", "type": "object", "additionalProperties": {} } }, "additionalProperties": false, "required": [ "level", "summary", "meta" ] } }, "additionalProperties": false, "required": [ "elasticsearch", "savedObjects" ] }, "plugins": { "description": "A dynamic mapping of plugin ID to plugin status.", "type": "object", "additionalProperties": { "type": "object", "properties": { "level": { "description": "Service status levels as human and machine readable values.", "anyOf": [ { "enum": [ "available" ], "type": "string" }, { "enum": [ "degraded" ], "type": "string" }, { "enum": [ "unavailable" ], "type": "string" }, { "enum": [ "critical" ], "type": "string" } ] }, "summary": { "description": "A human readable summary of the service status.", "type": "string" }, "detail": { "description": "Human readable detail of the service status.", "type": "string" }, "documentationUrl": { "description": "A URL to further documentation regarding this service.", "type": "string" }, "meta": { "description": "An unstructured set of extra metadata about this service.", "type": "object", "additionalProperties": {} } }, "additionalProperties": false, "required": [ "level", "summary", "meta" ] } } }, "additionalProperties": false, "required": [ "overall", "core", "plugins" ] }, "metrics": { "description": "Metric groups collected by Kibana.", "type": "object", "properties": { "elasticsearch_client": { "description": "Current network metrics of Kibana's Elasticsearch client.", "type": "object", "properties": { "totalActiveSockets": { "description": "Count of network sockets currently in use.", "type": "number" }, "totalIdleSockets": { "description": "Count of network sockets currently idle.", "type": "number" }, "totalQueuedRequests": { "description": "Count of requests not yet assigned to sockets.", "type": "number" } }, "additionalProperties": false, "required": [ "totalActiveSockets", "totalIdleSockets", "totalQueuedRequests" ] }, "last_updated": { "description": "The time metrics were collected.", "type": "string" }, "collection_interval_in_millis": { "description": "The interval at which metrics should be collected.", "type": "number" } }, "additionalProperties": false, "required": [ "elasticsearch_client", "last_updated", "collection_interval_in_millis" ] } }, "additionalProperties": false, "required": [ "name", "uuid", "version", "status", "metrics" ] }, "core.status.redactedResponse": { "description": "A minimal representation of Kibana's operational status.", "type": "object", "properties": { "status": { "type": "object", "properties": { "overall": { "type": "object", "properties": { "level": { "description": "Service status levels as human and machine readable values.", "anyOf": [ { "enum": [ "available" ], "type": "string" }, { "enum": [ "degraded" ], "type": "string" }, { "enum": [ "unavailable" ], "type": "string" }, { "enum": [ "critical" ], "type": "string" } ] } }, "additionalProperties": false, "required": [ "level" ] } }, "additionalProperties": false, "required": [ "overall" ] } }, "additionalProperties": false, "required": [ "status" ] } }, "securitySchemes": { "basicAuth": { "type": "http", "scheme": "basic" }, "apiKeyAuth": { "type": "apiKey", "in": "header", "name": "Authorization" } } }, "security": [ { "basicAuth": [] } ] } ```
Related to https://github.com/elastic/kibana/pull/181622 ## Notes * Tip from @lcawl : "If you want to see Bump previews of your files too, I’ve been doing it via the preview command per https://docs.bump.sh/help/continuous-integration/cli/#bump-preview-file" --- .../http/core-http-server/src/router/route.ts | 2 +- .../src/routes/status.ts | 66 ++++--- .../src/routes/status_preboot.ts | 4 +- .../src/routes/status_response_schemas.ts | 180 ++++++++++++++++++ packages/kbn-config-schema/index.ts | 2 + .../kbn-config-schema/src/oas_meta_fields.ts | 1 + .../src/types/any_type.test.ts | 8 + .../kbn-config-schema/src/types/any_type.ts | 3 +- .../__snapshots__/generate_oas.test.ts.snap | 131 ++++++++++++- .../src/generate_oas.test.ts | 65 ++++++- .../src/generate_oas.test.util.ts | 27 ++- .../post_process_mutations/index.ts | 8 +- .../post_process_mutations/mutations/index.ts | 9 +- .../post_process_mutations/mutations/utils.ts | 4 + .../src/process_router.ts | 1 + .../src/process_versioned_router.test.ts | 3 - .../src/process_versioned_router.ts | 2 +- .../kbn-router-to-openapispec/src/util.ts | 1 + .../connector_types.test.ts.snap | 42 ++++ ...s_upgrade_and_rollback_checks.test.ts.snap | 49 +++++ 20 files changed, 559 insertions(+), 49 deletions(-) create mode 100644 packages/core/status/core-status-server-internal/src/routes/status_response_schemas.ts diff --git a/packages/core/http/core-http-server/src/router/route.ts b/packages/core/http/core-http-server/src/router/route.ts index 2bbe26e1ea47a..bb3e59cfcd00b 100644 --- a/packages/core/http/core-http-server/src/router/route.ts +++ b/packages/core/http/core-http-server/src/router/route.ts @@ -160,7 +160,7 @@ export interface RouteConfigOptions { idleSocket?: number; }; - /** Human-friendly description of this endpoint */ + /** A short, human-friendly description of this endpoint */ description?: string; } diff --git a/packages/core/status/core-status-server-internal/src/routes/status.ts b/packages/core/status/core-status-server-internal/src/routes/status.ts index 1faa623467b58..5557a4d60aaef 100644 --- a/packages/core/status/core-status-server-internal/src/routes/status.ts +++ b/packages/core/status/core-status-server-internal/src/routes/status.ts @@ -13,14 +13,10 @@ import type { PluginName } from '@kbn/core-base-common'; import type { IRouter } from '@kbn/core-http-server'; import type { MetricsServiceSetup } from '@kbn/core-metrics-server'; import type { CoreIncrementUsageCounter } from '@kbn/core-usage-data-server'; -import type { StatusResponse } from '@kbn/core-status-common-internal'; -import { - type ServiceStatus, - type ServiceStatusLevel, - type CoreStatus, - ServiceStatusLevels, -} from '@kbn/core-status-common'; +import { type ServiceStatus, type CoreStatus, ServiceStatusLevels } from '@kbn/core-status-common'; +import { StatusResponse } from '@kbn/core-status-common-internal'; import { calculateLegacyStatus, type LegacyStatusInfo } from '../legacy_status'; +import { statusResponse, type RedactedStatusHttpBody } from './status_response_schemas'; const SNAPSHOT_POSTFIX = /-SNAPSHOT$/; @@ -53,14 +49,6 @@ interface StatusHttpBody extends Omit { status: StatusInfo | LegacyStatusInfo; } -export interface RedactedStatusHttpBody { - status: { - overall: { - level: ServiceStatusLevel; - }; - }; -} - const SERVICE_UNAVAILABLE_NOT_REPORTED: ServiceStatus = { level: ServiceStatusLevels.unavailable, summary: 'Status not yet reported', @@ -100,21 +88,43 @@ export const registerStatusRoute = ({ // ROUTE_TAG_ACCEPT_JWT from '@kbn/security-plugin/server' that cannot be imported here directly. tags: ['api', 'security:acceptJWT'], access: 'public', // needs to be public to allow access from "system" users like k8s readiness probes. + description: `Get Kibana's current status.`, }, validate: { - query: schema.object( - { - v7format: schema.maybe(schema.boolean()), - v8format: schema.maybe(schema.boolean()), - }, - { - validate: ({ v7format, v8format }) => { - if (typeof v7format === 'boolean' && typeof v8format === 'boolean') { - return `provide only one format option: v7format or v8format`; - } + request: { + query: schema.object( + { + v7format: schema.maybe( + schema.boolean({ + meta: { description: 'Set to "true" to get the response in v7 format.' }, + }) + ), + v8format: schema.maybe( + schema.boolean({ + meta: { description: 'Set to "true" to get the response in v8 format.' }, + }) + ), }, - } - ), + { + validate: ({ v7format, v8format }) => { + if (typeof v7format === 'boolean' && typeof v8format === 'boolean') { + return `provide only one format option: v7format or v8format`; + } + }, + meta: { + description: `Return status in a specific format. If both v7 and v8 are requested the request will be rejected.`, + }, + } + ), + }, + response: { + 200: { + body: statusResponse, + }, + 503: { + body: statusResponse, + }, + }, }, }, async (context, req, res) => { @@ -217,7 +227,7 @@ const getRedactedStatusResponse = ({ const body: RedactedStatusHttpBody = { status: { overall: { - level: coreOverall.level, + level: coreOverall.level.toString(), }, }, }; diff --git a/packages/core/status/core-status-server-internal/src/routes/status_preboot.ts b/packages/core/status/core-status-server-internal/src/routes/status_preboot.ts index 88adf8c418506..91ec970217526 100644 --- a/packages/core/status/core-status-server-internal/src/routes/status_preboot.ts +++ b/packages/core/status/core-status-server-internal/src/routes/status_preboot.ts @@ -8,7 +8,7 @@ import type { IRouter } from '@kbn/core-http-server'; import { ServiceStatusLevels } from '@kbn/core-status-common'; -import type { RedactedStatusHttpBody } from './status'; +import type { RedactedStatusHttpBody } from './status_response_schemas'; export const registerPrebootStatusRoute = ({ router }: { router: IRouter }) => { router.get( @@ -25,7 +25,7 @@ export const registerPrebootStatusRoute = ({ router }: { router: IRouter }) => { const body: RedactedStatusHttpBody = { status: { overall: { - level: ServiceStatusLevels.unavailable, + level: ServiceStatusLevels.unavailable.toString(), }, }, }; diff --git a/packages/core/status/core-status-server-internal/src/routes/status_response_schemas.ts b/packages/core/status/core-status-server-internal/src/routes/status_response_schemas.ts new file mode 100644 index 0000000000000..36671f2089bb2 --- /dev/null +++ b/packages/core/status/core-status-server-internal/src/routes/status_response_schemas.ts @@ -0,0 +1,180 @@ +/* + * Copyright 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 { schema, type Type, type TypeOf } from '@kbn/config-schema'; +import type { BuildFlavor } from '@kbn/config'; +import type { ServiceStatusLevelId, ServiceStatus } from '@kbn/core-status-common'; + +import type { + StatusResponse, + StatusInfoCoreStatus, + ServerMetrics, + StatusInfo, + ServerVersion, +} from '@kbn/core-status-common-internal'; + +const serviceStatusLevelId: () => Type = () => + schema.oneOf( + [ + schema.literal('available'), + schema.literal('degraded'), + schema.literal('unavailable'), + schema.literal('critical'), + ], + { meta: { description: 'Service status levels as human and machine readable values.' } } + ); + +const statusInfoServiceStatus: () => Type< + Omit & { level: ServiceStatusLevelId } +> = () => + schema.object({ + level: serviceStatusLevelId(), + summary: schema.string({ + meta: { description: 'A human readable summary of the service status.' }, + }), + detail: schema.maybe( + schema.string({ meta: { description: 'Human readable detail of the service status.' } }) + ), + documentationUrl: schema.maybe( + schema.string({ + meta: { description: 'A URL to further documentation regarding this service.' }, + }) + ), + meta: schema.recordOf(schema.string(), schema.any(), { + meta: { description: 'An unstructured set of extra metadata about this service.' }, + }), + }); + +const statusInfoCoreStatus: () => Type = () => + schema.object( + { + elasticsearch: statusInfoServiceStatus(), + savedObjects: statusInfoServiceStatus(), + }, + { meta: { description: 'Statuses of core Kibana services.' } } + ); + +/** Only include a subset of fields for OAS documentation, for now */ +const serverMetrics: () => Type> = () => + schema.object( + { + elasticsearch_client: schema.object( + { + totalActiveSockets: schema.number({ + meta: { description: 'Count of network sockets currently in use.' }, + }), + totalIdleSockets: schema.number({ + meta: { description: 'Count of network sockets currently idle.' }, + }), + totalQueuedRequests: schema.number({ + meta: { description: 'Count of requests not yet assigned to sockets.' }, + }), + }, + { meta: { description: `Current network metrics of Kibana's Elasticsearch client.` } } + ), + last_updated: schema.string({ meta: { description: 'The time metrics were collected.' } }), + collection_interval_in_millis: schema.number({ + meta: { description: 'The interval at which metrics should be collected.' }, + }), + }, + { + meta: { + description: 'Metric groups collected by Kibana.', + }, + } + ); + +const buildFlavour: () => Type = () => + schema.oneOf([schema.literal('serverless'), schema.literal('traditional')], { + meta: { + description: + 'The build flavour determines configuration and behavior of Kibana. On premise users will almost always run the "traditional" flavour, while other flavours are reserved for Elastic-specific use cases.', + }, + }); + +const serverVersion: () => Type = () => + schema.object({ + number: schema.string({ + meta: { description: 'A semantic version number.' }, + }), + build_hash: schema.string({ + meta: { + description: 'A unique hash value representing the git commit of this Kibana build.', + }, + }), + build_number: schema.number({ + meta: { + description: + 'A monotonically increasing number, each subsequent build will have a higher number.', + }, + }), + build_snapshot: schema.boolean({ + meta: { description: 'Whether this build is a snapshot build.' }, + }), + build_flavor: buildFlavour(), + build_date: schema.string({ meta: { description: 'The date and time of this build.' } }), + }); + +const statusInfo: () => Type = () => + schema.object({ + overall: statusInfoServiceStatus(), + core: statusInfoCoreStatus(), + plugins: schema.recordOf(schema.string(), statusInfoServiceStatus(), { + meta: { description: 'A dynamic mapping of plugin ID to plugin status.' }, + }), + }); + +/** Excluding metrics for brevity, for now */ +const fullStatusResponse: () => Type> = () => + schema.object( + { + name: schema.string({ meta: { description: 'Kibana instance name.' } }), + uuid: schema.string({ + meta: { + description: + 'Unique, generated Kibana instance UUID. This UUID should persist even if the Kibana process restarts.', + }, + }), + version: serverVersion(), + status: statusInfo(), + metrics: serverMetrics(), + }, + { + meta: { + id: 'core.status.response', + description: `Kibana's operational status as well as a detailed breakdown of plugin statuses indication of various loads (like event loop utilization and network traffic) at time of request.`, + }, + } + ); + +const redactedStatusResponse = () => + schema.object( + { + status: schema.object({ + overall: schema.object({ + level: serviceStatusLevelId(), + }), + }), + }, + { + meta: { + id: 'core.status.redactedResponse', + description: `A minimal representation of Kibana's operational status.`, + }, + } + ); + +/** Lazily load this schema */ +export const statusResponse = () => + schema.oneOf([fullStatusResponse(), redactedStatusResponse()], { + meta: { + description: `Kibana's operational status. A minimal response is sent for unauthorized users.`, + }, + }); + +export type RedactedStatusHttpBody = TypeOf; diff --git a/packages/kbn-config-schema/index.ts b/packages/kbn-config-schema/index.ts index c5b46932463db..0ab1fd640d7af 100644 --- a/packages/kbn-config-schema/index.ts +++ b/packages/kbn-config-schema/index.ts @@ -244,6 +244,7 @@ export const schema = { export type Schema = typeof schema; import { + META_FIELD_X_OAS_ANY, META_FIELD_X_OAS_REF_ID, META_FIELD_X_OAS_OPTIONAL, META_FIELD_X_OAS_DEPRECATED, @@ -253,6 +254,7 @@ import { } from './src/oas_meta_fields'; export const metaFields = Object.freeze({ + META_FIELD_X_OAS_ANY, META_FIELD_X_OAS_REF_ID, META_FIELD_X_OAS_OPTIONAL, META_FIELD_X_OAS_DEPRECATED, diff --git a/packages/kbn-config-schema/src/oas_meta_fields.ts b/packages/kbn-config-schema/src/oas_meta_fields.ts index ad04f9b30ef16..814bb32e7ea41 100644 --- a/packages/kbn-config-schema/src/oas_meta_fields.ts +++ b/packages/kbn-config-schema/src/oas_meta_fields.ts @@ -17,3 +17,4 @@ export const META_FIELD_X_OAS_GET_ADDITIONAL_PROPERTIES = 'x-oas-get-additional-properties' as const; export const META_FIELD_X_OAS_REF_ID = 'x-oas-ref-id' as const; export const META_FIELD_X_OAS_DEPRECATED = 'x-oas-deprecated' as const; +export const META_FIELD_X_OAS_ANY = 'x-oas-any-type' as const; diff --git a/packages/kbn-config-schema/src/types/any_type.test.ts b/packages/kbn-config-schema/src/types/any_type.test.ts index ab04ee631e051..5fada37e45c83 100644 --- a/packages/kbn-config-schema/src/types/any_type.test.ts +++ b/packages/kbn-config-schema/src/types/any_type.test.ts @@ -6,7 +6,9 @@ * Side Public License, v 1. */ +import { get } from 'lodash'; import { schema } from '../..'; +import { META_FIELD_X_OAS_ANY } from '../oas_meta_fields'; test('works for any value', () => { expect(schema.any().validate(true)).toBe(true); @@ -30,6 +32,12 @@ test('includes namespace in failure', () => { ); }); +test('meta', () => { + expect(get(schema.any().getSchema().describe(), 'metas[0]')).toEqual({ + [META_FIELD_X_OAS_ANY]: true, + }); +}); + describe('#defaultValue', () => { test('returns default when undefined', () => { expect(schema.any({ defaultValue: true }).validate(undefined)).toBe(true); diff --git a/packages/kbn-config-schema/src/types/any_type.ts b/packages/kbn-config-schema/src/types/any_type.ts index e62ac85ea87af..5b7b355d9965d 100644 --- a/packages/kbn-config-schema/src/types/any_type.ts +++ b/packages/kbn-config-schema/src/types/any_type.ts @@ -8,11 +8,12 @@ import typeDetect from 'type-detect'; import { internals } from '../internals'; +import { META_FIELD_X_OAS_ANY } from '../oas_meta_fields'; import { Type, TypeOptions } from './type'; export class AnyType extends Type { constructor(options?: TypeOptions) { - super(internals.any(), options); + super(internals.any().meta({ [META_FIELD_X_OAS_ANY]: true }), options); } protected handleError(type: string, { value }: Record) { diff --git a/packages/kbn-router-to-openapispec/src/__snapshots__/generate_oas.test.ts.snap b/packages/kbn-router-to-openapispec/src/__snapshots__/generate_oas.test.ts.snap index f24ac58ae3db1..6caf6b33de642 100644 --- a/packages/kbn-router-to-openapispec/src/__snapshots__/generate_oas.test.ts.snap +++ b/packages/kbn-router-to-openapispec/src/__snapshots__/generate_oas.test.ts.snap @@ -34,6 +34,7 @@ Object { "operationId": "/foo/{id}#0", "parameters": Array [ Object { + "description": "The version of the API to use", "in": "header", "name": "elastic-api-version", "schema": Object { @@ -91,6 +92,7 @@ Object { "description": "No description", }, }, + "summary": "", }, }, }, @@ -137,6 +139,7 @@ Object { "operationId": "/bar#0", "parameters": Array [ Object { + "description": "The version of the API to use", "in": "header", "name": "elastic-api-version", "schema": Object { @@ -157,6 +160,7 @@ Object { "properties": Object { "deprecatedFoo": Object { "deprecated": true, + "description": "deprecated foo", "type": "string", }, "foo": Object { @@ -191,13 +195,14 @@ Object { "application/json; Elastic-Api-Version=oas-test-version-1": Object { "schema": Object { "additionalProperties": false, + "description": "fooResponse", "properties": Object { - "fooResponse": Object { + "fooResponseWithDescription": Object { "type": "string", }, }, "required": Array [ - "fooResponse", + "fooResponseWithDescription", ], "type": "object", }, @@ -209,9 +214,9 @@ Object { }, }, }, - "description": "No description", }, }, + "summary": "versioned route", }, }, "/foo/{id}": Object { @@ -219,6 +224,7 @@ Object { "operationId": "/foo/{id}#0", "parameters": Array [ Object { + "description": "The version of the API to use", "in": "header", "name": "elastic-api-version", "schema": Object { @@ -230,7 +236,7 @@ Object { }, }, Object { - "description": undefined, + "description": "id", "in": "path", "name": "id", "required": true, @@ -240,7 +246,7 @@ Object { }, }, Object { - "description": undefined, + "description": "page", "in": "query", "name": "page", "required": false, @@ -258,6 +264,7 @@ Object { "schema": Object { "additionalProperties": false, "properties": Object { + "any": Object {}, "booleanDefault": Object { "default": true, "description": "defaults to to true", @@ -322,6 +329,7 @@ Object { "map", "record", "union", + "any", ], "type": "object", }, @@ -339,9 +347,122 @@ Object { }, }, }, + "description": "route", + }, + }, + "summary": "route", + }, + }, + }, + "security": Array [ + Object { + "basicAuth": Array [], + }, + ], + "servers": Array [ + Object { + "url": "https://test.oas", + }, + ], + "tags": undefined, +} +`; + +exports[`generateOpenApiDocument unknown schema/validation produces the expected output 1`] = ` +Object { + "components": Object { + "schemas": Object {}, + "securitySchemes": Object { + "apiKeyAuth": Object { + "in": "header", + "name": "Authorization", + "type": "apiKey", + }, + "basicAuth": Object { + "scheme": "basic", + "type": "http", + }, + }, + }, + "externalDocs": undefined, + "info": Object { + "description": undefined, + "title": "test", + "version": "99.99.99", + }, + "openapi": "3.0.0", + "paths": Object { + "/foo/{id}": Object { + "get": Object { + "operationId": "/foo/{id}#0", + "parameters": Array [ + Object { + "description": "The version of the API to use", + "in": "header", + "name": "elastic-api-version", + "schema": Object { + "default": "2023-10-31", + "enum": Array [ + "2023-10-31", + ], + "type": "string", + }, + }, + ], + "requestBody": Object { + "content": Object { + "application/json; Elastic-Api-Version=2023-10-31": Object { + "schema": Object {}, + }, + }, + }, + "responses": Object { + "200": Object { + "content": Object { + "application/json; Elastic-Api-Version=2023-10-31": Object { + "schema": Object {}, + }, + }, "description": "No description", }, }, + "summary": "", + }, + }, + "/test": Object { + "get": Object { + "operationId": "/test#0", + "parameters": Array [ + Object { + "description": "The version of the API to use", + "in": "header", + "name": "elastic-api-version", + "schema": Object { + "default": "123", + "enum": Array [ + "123", + ], + "type": "string", + }, + }, + ], + "requestBody": Object { + "content": Object { + "application/json; Elastic-Api-Version=123": Object { + "schema": Object {}, + }, + }, + }, + "responses": Object { + "200": Object { + "content": Object { + "application/json; Elastic-Api-Version=123": Object { + "schema": Object {}, + }, + }, + }, + }, + "summary": "", }, }, }, diff --git a/packages/kbn-router-to-openapispec/src/generate_oas.test.ts b/packages/kbn-router-to-openapispec/src/generate_oas.test.ts index 5942779931167..4ccc02f31c355 100644 --- a/packages/kbn-router-to-openapispec/src/generate_oas.test.ts +++ b/packages/kbn-router-to-openapispec/src/generate_oas.test.ts @@ -8,7 +8,7 @@ import { generateOpenApiDocument } from './generate_oas'; import { schema } from '@kbn/config-schema'; -import { createTestRouters, createRouter } from './generate_oas.test.util'; +import { createTestRouters, createRouter, createVersionedRouter } from './generate_oas.test.util'; describe('generateOpenApiDocument', () => { describe('@kbn/config-schema', () => { @@ -71,4 +71,67 @@ describe('generateOpenApiDocument', () => { ).toMatchSnapshot(); }); }); + + describe('unknown schema/validation', () => { + it('produces the expected output', () => { + expect( + generateOpenApiDocument( + { + routers: [ + createRouter({ + routes: [ + { + isVersioned: false, + path: '/foo/{id}', + method: 'get', + validationSchemas: { + request: { + params: () => ({ value: {} }), // custom validation fn + body: () => ({ value: {} }), + }, + response: { + [200]: { + body: () => undefined as any, // unknown schema + }, + }, + }, + options: { tags: ['foo'] }, + handler: jest.fn(), + }, + ], + }), + ], + versionedRouters: [ + createVersionedRouter({ + routes: [ + { + method: 'get', + path: '/test', + options: { access: 'public' }, + handlers: [ + { + fn: jest.fn(), + options: { + validate: { + request: { body: () => ({ value: {} }) }, + response: { 200: { body: (() => {}) as any } }, + }, + version: '123', + }, + }, + ], + }, + ], + }), + ], + }, + { + title: 'test', + baseUrl: 'https://test.oas', + version: '99.99.99', + } + ) + ).toMatchSnapshot(); + }); + }); }); diff --git a/packages/kbn-router-to-openapispec/src/generate_oas.test.util.ts b/packages/kbn-router-to-openapispec/src/generate_oas.test.util.ts index 3cab332a9f3f5..9e9b688ed878e 100644 --- a/packages/kbn-router-to-openapispec/src/generate_oas.test.util.ts +++ b/packages/kbn-router-to-openapispec/src/generate_oas.test.util.ts @@ -32,6 +32,7 @@ export const testSchema = schema.object({ scheme: ['prototest'], defaultValue: () => 'prototest://something', }), + any: schema.any({ meta: { description: 'any type' } }), }); type RouterMeta = ReturnType[number]; @@ -52,10 +53,18 @@ const getRouterDefaults = () => ({ isVersioned: false, path: '/foo/{id}', method: 'get', + options: { + tags: ['foo'], + description: 'route', + }, validationSchemas: { request: { - params: schema.object({ id: schema.string({ maxLength: 36 }) }), - query: schema.object({ page: schema.number({ max: 999, min: 1, defaultValue: 1 }) }), + params: schema.object({ + id: schema.string({ maxLength: 36, meta: { description: 'id' } }), + }), + query: schema.object({ + page: schema.number({ max: 999, min: 1, defaultValue: 1, meta: { description: 'page' } }), + }), body: testSchema, }, response: { @@ -65,7 +74,6 @@ const getRouterDefaults = () => ({ unsafe: { body: true }, }, }, - options: { tags: ['foo'] }, handler: jest.fn(), }); @@ -73,6 +81,7 @@ const getVersionedRouterDefaults = () => ({ method: 'get', path: '/bar', options: { + description: 'versioned route', access: 'public', }, handlers: [ @@ -83,11 +92,19 @@ const getVersionedRouterDefaults = () => ({ request: { body: schema.object({ foo: schema.string(), - deprecatedFoo: schema.maybe(schema.string({ meta: { deprecated: true } })), + deprecatedFoo: schema.maybe( + schema.string({ meta: { description: 'deprecated foo', deprecated: true } }) + ), }), }, response: { - [200]: { body: () => schema.object({ fooResponse: schema.string() }) }, + [200]: { + body: () => + schema.object( + { fooResponseWithDescription: schema.string() }, + { meta: { description: 'fooResponse' } } + ), + }, }, }, version: 'oas-test-version-1', diff --git a/packages/kbn-router-to-openapispec/src/oas_converter/kbn_config_schema/post_process_mutations/index.ts b/packages/kbn-router-to-openapispec/src/oas_converter/kbn_config_schema/post_process_mutations/index.ts index 494745403208c..b58fbdf80de63 100644 --- a/packages/kbn-router-to-openapispec/src/oas_converter/kbn_config_schema/post_process_mutations/index.ts +++ b/packages/kbn-router-to-openapispec/src/oas_converter/kbn_config_schema/post_process_mutations/index.ts @@ -9,6 +9,7 @@ import type { OpenAPIV3 } from 'openapi-types'; import * as mutations from './mutations'; import type { IContext } from './context'; +import { isAnyType } from './mutations/utils'; interface PostProcessMutationsArgs { schema: OpenAPIV3.SchemaObject; @@ -23,7 +24,12 @@ export const postProcessMutations = ({ ctx, schema }: PostProcessMutationsArgs) const arrayContainers: Array = ['allOf', 'oneOf', 'anyOf']; const walkSchema = (ctx: IContext, schema: OpenAPIV3.SchemaObject): void => { - mutations.processAny(schema); + if (isAnyType(schema)) { + mutations.processAnyType(schema); + return; + } + + mutations.processAllTypes(schema); /* At runtime 'type' can be broader than 'NonArraySchemaObjectType', so we set it to 'string' */ const type: undefined | string = schema.type; if (type === 'array') { diff --git a/packages/kbn-router-to-openapispec/src/oas_converter/kbn_config_schema/post_process_mutations/mutations/index.ts b/packages/kbn-router-to-openapispec/src/oas_converter/kbn_config_schema/post_process_mutations/mutations/index.ts index 6accce6bec1a8..02dd08b928a54 100644 --- a/packages/kbn-router-to-openapispec/src/oas_converter/kbn_config_schema/post_process_mutations/mutations/index.ts +++ b/packages/kbn-router-to-openapispec/src/oas_converter/kbn_config_schema/post_process_mutations/mutations/index.ts @@ -65,9 +65,16 @@ export const processMap = (ctx: IContext, schema: OpenAPIV3.SchemaObject): void } }; -export const processAny = (schema: OpenAPIV3.SchemaObject): void => { +export const processAllTypes = (schema: OpenAPIV3.SchemaObject): void => { processDeprecated(schema); stripBadDefault(schema); }; +export const processAnyType = (schema: OpenAPIV3.SchemaObject): void => { + // Map schema to an empty object: `{}` + for (const key of Object.keys(schema)) { + deleteField(schema as Record, key); + } +}; + export { processObject } from './object'; diff --git a/packages/kbn-router-to-openapispec/src/oas_converter/kbn_config_schema/post_process_mutations/mutations/utils.ts b/packages/kbn-router-to-openapispec/src/oas_converter/kbn_config_schema/post_process_mutations/mutations/utils.ts index eacc005936a28..dd1d2e03e5fc2 100644 --- a/packages/kbn-router-to-openapispec/src/oas_converter/kbn_config_schema/post_process_mutations/mutations/utils.ts +++ b/packages/kbn-router-to-openapispec/src/oas_converter/kbn_config_schema/post_process_mutations/mutations/utils.ts @@ -38,3 +38,7 @@ export const processDeprecated = (schema: OpenAPIV3.SchemaObject): void => { export const deleteField = (schema: Record, field: string): void => { delete schema[field]; }; + +export const isAnyType = (schema: OpenAPIV3.SchemaObject): boolean => { + return metaFields.META_FIELD_X_OAS_ANY in schema; +}; diff --git a/packages/kbn-router-to-openapispec/src/process_router.ts b/packages/kbn-router-to-openapispec/src/process_router.ts index fdfe54c3dcb2e..cabb424db196c 100644 --- a/packages/kbn-router-to-openapispec/src/process_router.ts +++ b/packages/kbn-router-to-openapispec/src/process_router.ts @@ -61,6 +61,7 @@ export const processRouter = ( const path: OpenAPIV3.PathItemObject = { [route.method]: { + summary: route.options.description ?? '', requestBody: !!validationSchemas?.body ? { content: { diff --git a/packages/kbn-router-to-openapispec/src/process_versioned_router.test.ts b/packages/kbn-router-to-openapispec/src/process_versioned_router.test.ts index 9d3739134b6d9..7f7d76e654129 100644 --- a/packages/kbn-router-to-openapispec/src/process_versioned_router.test.ts +++ b/packages/kbn-router-to-openapispec/src/process_versioned_router.test.ts @@ -105,7 +105,6 @@ describe('extractVersionedResponses', () => { test('handles full response config as expected', () => { expect(extractVersionedResponses(route, oasConverter)).toEqual({ 200: { - description: 'No description', content: { 'application/test+json; Elastic-Api-Version=2023-10-31': { schema: { @@ -130,7 +129,6 @@ describe('extractVersionedResponses', () => { }, }, 404: { - description: 'No description', content: { 'application/test2+json; Elastic-Api-Version=2023-10-31': { schema: { @@ -145,7 +143,6 @@ describe('extractVersionedResponses', () => { }, }, 500: { - description: 'No description', content: { 'application/test2+json; Elastic-Api-Version=2024-12-31': { schema: { diff --git a/packages/kbn-router-to-openapispec/src/process_versioned_router.ts b/packages/kbn-router-to-openapispec/src/process_versioned_router.ts index 262eb5b04b335..c792e71600557 100644 --- a/packages/kbn-router-to-openapispec/src/process_versioned_router.ts +++ b/packages/kbn-router-to-openapispec/src/process_versioned_router.ts @@ -69,6 +69,7 @@ export const processVersionedRouter = ( ); const path: OpenAPIV3.PathItemObject = { [route.method]: { + summary: route.options.description ?? '', requestBody: hasBody ? { content: extractVersionedRequestBody(route, converter), @@ -122,7 +123,6 @@ export const extractVersionedResponses = ( const schema = converter.convert(maybeSchema); acc[statusCode] = { ...acc[statusCode], - description: route.options.description ?? 'No description', content: { ...((acc[statusCode] ?? {}) as OpenAPIV3.ResponseObject).content, [getVersionedContentTypeString( diff --git a/packages/kbn-router-to-openapispec/src/util.ts b/packages/kbn-router-to-openapispec/src/util.ts index 188d56d9f0b65..7a7c2cf21ebac 100644 --- a/packages/kbn-router-to-openapispec/src/util.ts +++ b/packages/kbn-router-to-openapispec/src/util.ts @@ -50,6 +50,7 @@ export const getVersionedHeaderParam = ( ): OpenAPIV3.ParameterObject => ({ in: 'header', name: 'elastic-api-version', + description: 'The version of the API to use', schema: { type: 'string', enum: versions, diff --git a/x-pack/plugins/actions/server/integration_tests/__snapshots__/connector_types.test.ts.snap b/x-pack/plugins/actions/server/integration_tests/__snapshots__/connector_types.test.ts.snap index e16eb6d24a12e..b41e9ef70df78 100644 --- a/x-pack/plugins/actions/server/integration_tests/__snapshots__/connector_types.test.ts.snap +++ b/x-pack/plugins/actions/server/integration_tests/__snapshots__/connector_types.test.ts.snap @@ -52,6 +52,9 @@ Object { "presence": "optional", }, "metas": Array [ + Object { + "x-oas-any-type": true, + }, Object { "x-oas-optional": true, }, @@ -167,6 +170,9 @@ Object { "presence": "optional", }, "metas": Array [ + Object { + "x-oas-any-type": true, + }, Object { "x-oas-optional": true, }, @@ -287,6 +293,9 @@ Object { "presence": "optional", }, "metas": Array [ + Object { + "x-oas-any-type": true, + }, Object { "x-oas-optional": true, }, @@ -471,6 +480,9 @@ Object { "presence": "optional", }, "metas": Array [ + Object { + "x-oas-any-type": true, + }, Object { "x-oas-optional": true, }, @@ -759,6 +771,11 @@ Object { "flags": Object { "error": [Function], }, + "metas": Array [ + Object { + "x-oas-any-type": true, + }, + ], "type": "any", }, }, @@ -3076,6 +3093,11 @@ Object { "flags": Object { "error": [Function], }, + "metas": Array [ + Object { + "x-oas-any-type": true, + }, + ], "type": "any", }, }, @@ -3719,6 +3741,11 @@ Object { "flags": Object { "error": [Function], }, + "metas": Array [ + Object { + "x-oas-any-type": true, + }, + ], "type": "any", }, }, @@ -4187,6 +4214,11 @@ Object { "flags": Object { "error": [Function], }, + "metas": Array [ + Object { + "x-oas-any-type": true, + }, + ], "type": "any", }, }, @@ -4234,6 +4266,11 @@ Object { "flags": Object { "error": [Function], }, + "metas": Array [ + Object { + "x-oas-any-type": true, + }, + ], "type": "any", }, }, @@ -5744,6 +5781,11 @@ Object { "flags": Object { "error": [Function], }, + "metas": Array [ + Object { + "x-oas-any-type": true, + }, + ], "type": "any", }, }, diff --git a/x-pack/plugins/alerting/server/integration_tests/__snapshots__/serverless_upgrade_and_rollback_checks.test.ts.snap b/x-pack/plugins/alerting/server/integration_tests/__snapshots__/serverless_upgrade_and_rollback_checks.test.ts.snap index 7de7801c9fc9b..518c2b406db74 100644 --- a/x-pack/plugins/alerting/server/integration_tests/__snapshots__/serverless_upgrade_and_rollback_checks.test.ts.snap +++ b/x-pack/plugins/alerting/server/integration_tests/__snapshots__/serverless_upgrade_and_rollback_checks.test.ts.snap @@ -898,6 +898,9 @@ Object { "presence": "optional", }, "metas": Array [ + Object { + "x-oas-any-type": true, + }, Object { "x-oas-optional": true, }, @@ -1116,6 +1119,9 @@ Object { "presence": "optional", }, "metas": Array [ + Object { + "x-oas-any-type": true, + }, Object { "x-oas-optional": true, }, @@ -1944,6 +1950,11 @@ Object { "flags": Object { "error": [Function], }, + "metas": Array [ + Object { + "x-oas-any-type": true, + }, + ], "type": "any", }, }, @@ -2227,6 +2238,11 @@ Object { "flags": Object { "error": [Function], }, + "metas": Array [ + Object { + "x-oas-any-type": true, + }, + ], "type": "any", }, }, @@ -2508,6 +2524,11 @@ Object { "flags": Object { "error": [Function], }, + "metas": Array [ + Object { + "x-oas-any-type": true, + }, + ], "type": "any", }, }, @@ -3452,6 +3473,11 @@ Object { "flags": Object { "error": [Function], }, + "metas": Array [ + Object { + "x-oas-any-type": true, + }, + ], "type": "any", }, }, @@ -3495,6 +3521,11 @@ Object { "flags": Object { "error": [Function], }, + "metas": Array [ + Object { + "x-oas-any-type": true, + }, + ], "type": "any", }, }, @@ -3762,6 +3793,9 @@ Object { "presence": "optional", }, "metas": Array [ + Object { + "x-oas-any-type": true, + }, Object { "x-oas-optional": true, }, @@ -3972,6 +4006,9 @@ Object { "presence": "optional", }, "metas": Array [ + Object { + "x-oas-any-type": true, + }, Object { "x-oas-optional": true, }, @@ -4132,6 +4169,9 @@ Object { "presence": "optional", }, "metas": Array [ + Object { + "x-oas-any-type": true, + }, Object { "x-oas-optional": true, }, @@ -4443,6 +4483,9 @@ Object { "presence": "optional", }, "metas": Array [ + Object { + "x-oas-any-type": true, + }, Object { "x-oas-optional": true, }, @@ -5052,6 +5095,9 @@ Object { "presence": "optional", }, "metas": Array [ + Object { + "x-oas-any-type": true, + }, Object { "x-oas-optional": true, }, @@ -5363,6 +5409,9 @@ Object { "presence": "optional", }, "metas": Array [ + Object { + "x-oas-any-type": true, + }, Object { "x-oas-optional": true, }, From f17953a0977508506f8252b86a0e8212b9cb04c4 Mon Sep 17 00:00:00 2001 From: Elastic Machine Date: Tue, 7 May 2024 09:56:20 +0100 Subject: [PATCH 11/86] [main] Sync bundled packages with Package Storage (#182758) Automated by https://buildkite.com/elastic/package-storage-infra-kibana-discover-release-branches/builds/662 --- fleet_packages.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/fleet_packages.json b/fleet_packages.json index 15a653900f8b4..9f0b28f9da0a6 100644 --- a/fleet_packages.json +++ b/fleet_packages.json @@ -56,6 +56,6 @@ }, { "name": "security_detection_engine", - "version": "8.13.5" + "version": "8.13.6" } ] \ No newline at end of file From 8a3ce75f457f616a7f9bceb906539935f6c2297e Mon Sep 17 00:00:00 2001 From: Bena Kansara <69037875+benakansara@users.noreply.github.com> Date: Tue, 7 May 2024 12:05:15 +0200 Subject: [PATCH 12/86] [Alert details page] [Latency threshold] Fix recovered alert annotation (#182752) Fixes https://github.com/elastic/kibana/issues/180712 ### Recovered alert Screenshot 2024-05-07 at 10 46 37 ### Active alert Screenshot 2024-05-07 at 10 47 45 --- .../alert_active_time_range_annotation.tsx | 2 +- .../components/alert_threshold_time_range_rect.tsx | 4 +--- .../alert_details_app_section/latency_chart.tsx | 13 +++++++++---- 3 files changed, 11 insertions(+), 8 deletions(-) diff --git a/x-pack/packages/observability/alert_details/src/components/alert_active_time_range_annotation.tsx b/x-pack/packages/observability/alert_details/src/components/alert_active_time_range_annotation.tsx index 9f1beb3c77669..e35e38b6d7db3 100644 --- a/x-pack/packages/observability/alert_details/src/components/alert_active_time_range_annotation.tsx +++ b/x-pack/packages/observability/alert_details/src/components/alert_active_time_range_annotation.tsx @@ -37,7 +37,7 @@ export function AlertActiveTimeRangeAnnotation({ alertStart, alertEnd, color, id details: RECT_ANNOTATION_TITLE, }, ]} - style={{ fill: color, opacity: 0.1 }} + style={{ fill: color, opacity: 1 }} /> ); } diff --git a/x-pack/packages/observability/alert_details/src/components/alert_threshold_time_range_rect.tsx b/x-pack/packages/observability/alert_details/src/components/alert_threshold_time_range_rect.tsx index 52c2a803afae1..8294c4ee04098 100644 --- a/x-pack/packages/observability/alert_details/src/components/alert_threshold_time_range_rect.tsx +++ b/x-pack/packages/observability/alert_details/src/components/alert_threshold_time_range_rect.tsx @@ -10,7 +10,6 @@ import { RectAnnotation } from '@elastic/charts'; import { i18n } from '@kbn/i18n'; interface Props { - alertStarted: number; color: string; id: string; threshold: number; @@ -23,7 +22,7 @@ const RECT_ANNOTATION_TITLE = i18n.translate( } ); -export function AlertThresholdTimeRangeRect({ alertStarted, color, id, threshold }: Props) { +export function AlertThresholdTimeRangeRect({ color, id, threshold }: Props) { return ( , , From 72bf25dba6be92c9eb4ef78b45e1abe5baf77717 Mon Sep 17 00:00:00 2001 From: Victor Martinez Date: Tue, 7 May 2024 12:16:18 +0200 Subject: [PATCH 13/86] github-action: use pull_request_target to access the secrets (#182773) Use `pull_request_target` to access the GitHub secrets to destroy the oblt-test-env created previously. It's secured enough; it does not run any changes from any PR but does some other automation --- .github/workflows/undeploy-my-kibana.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/undeploy-my-kibana.yml b/.github/workflows/undeploy-my-kibana.yml index a288702cbb537..778ab4c73e302 100644 --- a/.github/workflows/undeploy-my-kibana.yml +++ b/.github/workflows/undeploy-my-kibana.yml @@ -10,7 +10,7 @@ name: undeploy-my-kibana on: - pull_request: + pull_request_target: types: [closed] permissions: From 45f49b0d06b3368b33f79843deed5ed746df4685 Mon Sep 17 00:00:00 2001 From: jennypavlova Date: Tue, 7 May 2024 12:34:34 +0200 Subject: [PATCH 14/86] [Infra] Dashboards: Change the `NEW` icon with the beta badge (#182784) Closes #182703 ## Summary This PR changes the badge next to the new dashboards tab from `NEW` to the technical preview icon/tooltip ![image](https://github.com/elastic/kibana/assets/14139027/bb77cb82-72d6-481e-bfb8-889bca4341f8) ## Testing - Enable the dashboards feature from advanced settings image - Select a host and check the dashboards tab title (should look like the APM tab title and use the same badge) - Infra: - ![image](https://github.com/elastic/kibana/assets/14139027/11a62236-8255-4508-a733-9e7e7ca1d49e) - APM: - ![image](https://github.com/elastic/kibana/assets/14139027/c689a40c-e5bc-42f4-9eed-2ccfaf288850) --- .../asset_details_tabs.tsx | 20 ++++++++++++++----- 1 file changed, 15 insertions(+), 5 deletions(-) diff --git a/x-pack/plugins/observability_solution/infra/public/common/asset_details_config/asset_details_tabs.tsx b/x-pack/plugins/observability_solution/infra/public/common/asset_details_config/asset_details_tabs.tsx index bcc876295973f..d43ab65832271 100644 --- a/x-pack/plugins/observability_solution/infra/public/common/asset_details_config/asset_details_tabs.tsx +++ b/x-pack/plugins/observability_solution/infra/public/common/asset_details_config/asset_details_tabs.tsx @@ -5,7 +5,7 @@ * 2.0. */ -import { EuiBadge } from '@elastic/eui'; +import { EuiBetaBadge } from '@elastic/eui'; import { i18n } from '@kbn/i18n'; import React from 'react'; import { ContentTabIds, type Tab } from '../../components/asset_details/types'; @@ -65,11 +65,21 @@ export const commonFlyoutTabs: Tab[] = [ defaultMessage: 'Dashboards', }), append: ( - - {i18n.translate('xpack.infra.customDashboards.newLabel', { - defaultMessage: 'NEW', + + tooltipContent={i18n.translate( + 'xpack.infra.customDashboards.technicalPreviewBadgeDescription', + { + defaultMessage: + 'This functionality is in technical preview and may be changed or removed completely in a future release. Elastic will work to fix any issues, but features in technical preview are not subject to the support SLA of official GA features.', + } + )} + iconType="beaker" + size="s" + style={{ verticalAlign: 'middle' }} + /> ), }, ]; From 3c2f82e8432fead4b4934beb8f9e94eaaf406e32 Mon Sep 17 00:00:00 2001 From: Dario Gieselaar Date: Tue, 7 May 2024 12:52:18 +0200 Subject: [PATCH 15/86] [Obs AI Assistant] Improve function error handling (#182378) Fixes some issues w/ (function) error handling: - Use JSON.stringify on error to make sure sanitization process on request objects kicks in - Remove the `meta` key for Elasticsearch client errors which contains a lot of useless information - Make sure the LLM gets a "function limit exceeded" error message in time Co-authored-by: Kibana Machine <42973632+kibanamachine@users.noreply.github.com> --- .../common/conversation_complete.ts | 10 +++- .../public/service/complete.ts | 6 +-- .../utils/create_function_response_error.ts | 13 ++++-- .../server/service/client/index.test.ts | 1 + .../server/service/client/index.ts | 1 + .../catch_function_not_found_error.ts | 30 ++++++++++++ .../client/operators/continue_conversation.ts | 29 +++++++++--- ...ate_server_side_function_response_error.ts | 46 +++++++++++++++++++ 8 files changed, 120 insertions(+), 16 deletions(-) rename x-pack/plugins/observability_solution/observability_ai_assistant/{common => public}/utils/create_function_response_error.ts (57%) create mode 100644 x-pack/plugins/observability_solution/observability_ai_assistant/server/service/client/operators/catch_function_not_found_error.ts create mode 100644 x-pack/plugins/observability_solution/observability_ai_assistant/server/service/util/create_server_side_function_response_error.ts diff --git a/x-pack/plugins/observability_solution/observability_ai_assistant/common/conversation_complete.ts b/x-pack/plugins/observability_solution/observability_ai_assistant/common/conversation_complete.ts index cc0a487331e61..c1bd72e285c72 100644 --- a/x-pack/plugins/observability_solution/observability_ai_assistant/common/conversation_complete.ts +++ b/x-pack/plugins/observability_solution/observability_ai_assistant/common/conversation_complete.ts @@ -129,12 +129,18 @@ interface ErrorMetaAttributes { tokenLimit?: number; tokenCount?: number; }; - [ChatCompletionErrorCode.FunctionNotFoundError]: {}; + [ChatCompletionErrorCode.FunctionNotFoundError]: { + name: string; + }; [ChatCompletionErrorCode.FunctionLimitExceededError]: {}; } export class ChatCompletionError extends Error { - constructor(public code: T, message: string, public meta?: ErrorMetaAttributes[T]) { + constructor( + public code: T, + message: string, + public meta: ErrorMetaAttributes[T] = {} as ErrorMetaAttributes[T] + ) { super(message); } } diff --git a/x-pack/plugins/observability_solution/observability_ai_assistant/public/service/complete.ts b/x-pack/plugins/observability_solution/observability_ai_assistant/public/service/complete.ts index 8a36561f971a8..8d9efd033bad7 100644 --- a/x-pack/plugins/observability_solution/observability_ai_assistant/public/service/complete.ts +++ b/x-pack/plugins/observability_solution/observability_ai_assistant/public/service/complete.ts @@ -29,11 +29,11 @@ import { type StreamingChatResponseEventWithoutError, } from '../../common'; import { ObservabilityAIAssistantScreenContext } from '../../common/types'; -import { createFunctionResponseError } from '../../common/utils/create_function_response_error'; import { createFunctionResponseMessage } from '../../common/utils/create_function_response_message'; import { throwSerializedChatCompletionErrors } from '../../common/utils/throw_serialized_chat_completion_errors'; import type { ObservabilityAIAssistantAPIClientRequestParamsOf } from '../api'; import { ObservabilityAIAssistantChatService } from '../types'; +import { createPublicFunctionResponseError } from '../utils/create_function_response_error'; export function complete( { @@ -154,7 +154,7 @@ export function complete( } if (!requestedAction) { - const errorMessage = createFunctionResponseError({ + const errorMessage = createPublicFunctionResponseError({ name: functionCall.name, error: new Error(`Requested action ${functionCall.name} was not found`), }); @@ -211,7 +211,7 @@ export function complete( }); }) .catch((error) => { - return createFunctionResponseError({ + return createPublicFunctionResponseError({ name: functionCall.name, error, }); diff --git a/x-pack/plugins/observability_solution/observability_ai_assistant/common/utils/create_function_response_error.ts b/x-pack/plugins/observability_solution/observability_ai_assistant/public/utils/create_function_response_error.ts similarity index 57% rename from x-pack/plugins/observability_solution/observability_ai_assistant/common/utils/create_function_response_error.ts rename to x-pack/plugins/observability_solution/observability_ai_assistant/public/utils/create_function_response_error.ts index bfb4021894273..de6aa8d336063 100644 --- a/x-pack/plugins/observability_solution/observability_ai_assistant/common/utils/create_function_response_error.ts +++ b/x-pack/plugins/observability_solution/observability_ai_assistant/public/utils/create_function_response_error.ts @@ -4,10 +4,11 @@ * 2.0; you may not use this file except in compliance with the Elastic License * 2.0. */ +import { createFunctionResponseMessage } from '../../common/utils/create_function_response_message'; -import { createFunctionResponseMessage } from './create_function_response_message'; - -export function createFunctionResponseError({ +// this one does not check for ES errors, they don't get to the browser +// and we prevent importing Node.js-only code +export function createPublicFunctionResponseError({ name, error, message, @@ -16,11 +17,15 @@ export function createFunctionResponseError({ error: Error; message?: string; }) { + const sanitizedError: Record = JSON.parse( + 'toJSON' in error && typeof error.toJSON === 'function' ? error.toJSON() : JSON.stringify(error) + ); + return createFunctionResponseMessage({ name, content: { error: { - ...error, + ...sanitizedError, name: error.name, message: error.message, cause: error.cause, diff --git a/x-pack/plugins/observability_solution/observability_ai_assistant/server/service/client/index.test.ts b/x-pack/plugins/observability_solution/observability_ai_assistant/server/service/client/index.test.ts index 7bd31f0ef7689..ed5f9a9ee044d 100644 --- a/x-pack/plugins/observability_solution/observability_ai_assistant/server/service/client/index.test.ts +++ b/x-pack/plugins/observability_solution/observability_ai_assistant/server/service/client/index.test.ts @@ -688,6 +688,7 @@ describe('Observability AI Assistant client', () => { code: ChatCompletionErrorCode.InternalError, message: 'Connection unexpectedly closed', stack: expect.any(String), + meta: {}, }, type: StreamingChatResponseEventType.ChatCompletionError, }); diff --git a/x-pack/plugins/observability_solution/observability_ai_assistant/server/service/client/index.ts b/x-pack/plugins/observability_solution/observability_ai_assistant/server/service/client/index.ts index 2bb71ba2ad592..0dc38698faa89 100644 --- a/x-pack/plugins/observability_solution/observability_ai_assistant/server/service/client/index.ts +++ b/x-pack/plugins/observability_solution/observability_ai_assistant/server/service/client/index.ts @@ -284,6 +284,7 @@ export class ObservabilityAIAssistantClient { knowledgeBaseInstructions, requestInstructions, signal, + logger: this.dependencies.logger, disableFunctions, }) ); diff --git a/x-pack/plugins/observability_solution/observability_ai_assistant/server/service/client/operators/catch_function_not_found_error.ts b/x-pack/plugins/observability_solution/observability_ai_assistant/server/service/client/operators/catch_function_not_found_error.ts new file mode 100644 index 0000000000000..251bd3e67e20a --- /dev/null +++ b/x-pack/plugins/observability_solution/observability_ai_assistant/server/service/client/operators/catch_function_not_found_error.ts @@ -0,0 +1,30 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import { catchError, of, OperatorFunction, throwError } from 'rxjs'; +import { + createFunctionLimitExceededError, + isFunctionNotFoundError, + MessageAddEvent, +} from '../../../../common/conversation_complete'; +import { createServerSideFunctionResponseError } from '../../util/create_server_side_function_response_error'; + +export function catchFunctionNotFoundError(): OperatorFunction { + return catchError((error) => { + if (isFunctionNotFoundError(error)) { + const functionLimitExceededError = createFunctionLimitExceededError(); + return of( + createServerSideFunctionResponseError({ + name: error.meta.name, + error: functionLimitExceededError, + }) + ); + } + + return throwError(() => error); + }); +} diff --git a/x-pack/plugins/observability_solution/observability_ai_assistant/server/service/client/operators/continue_conversation.ts b/x-pack/plugins/observability_solution/observability_ai_assistant/server/service/client/operators/continue_conversation.ts index 8d27a946556a7..0f75bbceb4a35 100644 --- a/x-pack/plugins/observability_solution/observability_ai_assistant/server/service/client/operators/continue_conversation.ts +++ b/x-pack/plugins/observability_solution/observability_ai_assistant/server/service/client/operators/continue_conversation.ts @@ -5,6 +5,7 @@ * 2.0. */ +import { Logger } from '@kbn/logging'; import { decode, encode } from 'gpt-tokenizer'; import { pick, take } from 'lodash'; import { @@ -12,6 +13,7 @@ import { concat, EMPTY, from, + identity, isObservable, Observable, of, @@ -27,14 +29,15 @@ import { } from '../../../../common/conversation_complete'; import { FunctionVisibility } from '../../../../common/functions/types'; import { UserInstruction } from '../../../../common/types'; -import { createFunctionResponseError } from '../../../../common/utils/create_function_response_error'; import { createFunctionResponseMessage } from '../../../../common/utils/create_function_response_message'; import { emitWithConcatenatedMessage } from '../../../../common/utils/emit_with_concatenated_message'; import { withoutTokenCountEvents } from '../../../../common/utils/without_token_count_events'; import type { ChatFunctionClient } from '../../chat_function_client'; import type { ChatFunctionWithoutConnector } from '../../types'; +import { createServerSideFunctionResponseError } from '../../util/create_server_side_function_response_error'; import { getSystemMessageFromInstructions } from '../../util/get_system_message_from_instructions'; import { replaceSystemMessage } from '../../util/replace_system_message'; +import { catchFunctionNotFoundError } from './catch_function_not_found_error'; import { extractMessages } from './extract_messages'; import { hideTokenCountEvents } from './hide_token_count_events'; @@ -47,6 +50,7 @@ function executeFunctionAndCatchError({ messages, chat, signal, + logger, }: { name: string; args: string | undefined; @@ -54,6 +58,7 @@ function executeFunctionAndCatchError({ messages: Message[]; chat: ChatFunctionWithoutConnector; signal: AbortSignal; + logger: Logger; }): Observable { // hide token count events from functions to prevent them from // having to deal with it as well @@ -72,12 +77,13 @@ function executeFunctionAndCatchError({ return executeFunctionResponse$.pipe( catchError((error) => { + logger.error(`Encountered error running function ${name}: ${JSON.stringify(error)}`); // We want to catch the error only when a promise occurs // if it occurs in the Observable, we cannot easily recover // from it because the function may have already emitted // values which could lead to an invalid conversation state, // so in that case we let the stream fail. - return of(createFunctionResponseError({ name, error })); + return of(createServerSideFunctionResponseError({ name, error })); }), switchMap((response) => { if (isObservable(response)) { @@ -150,6 +156,7 @@ export function continueConversation({ functionCallsLeft, requestInstructions, knowledgeBaseInstructions, + logger, disableFunctions, }: { messages: Message[]; @@ -159,12 +166,15 @@ export function continueConversation({ functionCallsLeft: number; requestInstructions: Array; knowledgeBaseInstructions: UserInstruction[]; + logger: Logger; disableFunctions: boolean; }): Observable { let nextFunctionCallsLeft = functionCallsLeft; + const functionLimitExceeded = functionCallsLeft <= 0; + const definitions = getFunctionDefinitions({ - functionLimitExceeded: functionCallsLeft <= 0, + functionLimitExceeded, functionClient, disableFunctions, }); @@ -196,7 +206,10 @@ export function continueConversation({ return chat(operationName, { messages: messagesWithUpdatedSystemMessage, functions: definitions, - }).pipe(emitWithConcatenatedMessage()); + }).pipe( + emitWithConcatenatedMessage(), + functionLimitExceeded ? catchFunctionNotFoundError() : identity + ); } const functionCallName = lastMessage.function_call?.name; @@ -218,7 +231,7 @@ export function continueConversation({ if (currentFunctionCallsLeft === 0) { // create a function call response error so the LLM knows it needs to stop calling functions return of( - createFunctionResponseError({ + createServerSideFunctionResponseError({ name: functionCallName, error: createFunctionLimitExceededError(), }) @@ -241,7 +254,7 @@ export function continueConversation({ } catch (error) { // return a function response error for the LLM to handle return of( - createFunctionResponseError({ + createServerSideFunctionResponseError({ name: functionCallName, error, }) @@ -254,7 +267,7 @@ export function continueConversation({ if (!functionClient.hasFunction(functionCallName)) { // tell the LLM the function was not found return of( - createFunctionResponseError({ + createServerSideFunctionResponseError({ name: functionCallName, error: createFunctionNotFoundError(functionCallName), }) @@ -268,6 +281,7 @@ export function continueConversation({ functionClient, messages: messagesWithUpdatedSystemMessage, signal, + logger, }); } @@ -292,6 +306,7 @@ export function continueConversation({ signal, knowledgeBaseInstructions, requestInstructions, + logger, disableFunctions, }); }) diff --git a/x-pack/plugins/observability_solution/observability_ai_assistant/server/service/util/create_server_side_function_response_error.ts b/x-pack/plugins/observability_solution/observability_ai_assistant/server/service/util/create_server_side_function_response_error.ts new file mode 100644 index 0000000000000..820aee7d6c137 --- /dev/null +++ b/x-pack/plugins/observability_solution/observability_ai_assistant/server/service/util/create_server_side_function_response_error.ts @@ -0,0 +1,46 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import { errors } from '@elastic/elasticsearch'; +import { createFunctionResponseMessage } from '../../../common/utils/create_function_response_message'; + +export function createServerSideFunctionResponseError({ + name, + error, + message, +}: { + name: string; + error: Error; + message?: string; +}) { + const isElasticsearchError = error instanceof errors.ElasticsearchClientError; + + const sanitizedError: Record = JSON.parse( + 'toJSON' in error && typeof error.toJSON === 'function' ? error.toJSON() : JSON.stringify(error) + ); + + if (isElasticsearchError) { + // remove meta key which is huge and noisy + delete sanitizedError.meta; + } + + return createFunctionResponseMessage({ + name, + content: { + error: { + ...sanitizedError, + name: error.name, + message: error.message, + cause: error.cause, + }, + message: message || error.message, + }, + data: { + stack: error.stack, + }, + }); +} From 40a16413572140b857e52dc45b206558ee0f1c9c Mon Sep 17 00:00:00 2001 From: Larry Gregory Date: Tue, 7 May 2024 07:30:42 -0400 Subject: [PATCH 16/86] Migrate from listr to listr2 (#182683) ## Summary Migrates CLI tasks from `listr` to `listr2`. The former hasn't been updated in a long time, and the community has moved on to `listr2`. --------- Co-authored-by: kibanamachine <42973632+kibanamachine@users.noreply.github.com> --- package.json | 3 +- .../src/cli/run_telemetry_check.ts | 36 +- .../src/cli/run_telemetry_extract.ts | 12 +- renovate.json | 18 + src/dev/i18n/tasks/check_compatibility.ts | 3 +- src/dev/i18n/tasks/check_configs.ts | 5 +- .../tasks/extract_default_translations.ts | 8 +- .../tasks/extract_untracked_translations.ts | 11 +- src/dev/i18n/tasks/merge_configs.ts | 5 +- src/dev/i18n/types.ts | 16 + src/dev/run_i18n_check.ts | 33 +- src/dev/run_i18n_extract.ts | 20 +- src/dev/run_i18n_integrate.ts | 17 +- .../apm/scripts/precommit.js | 2 +- yarn.lock | 316 +++++++----------- 15 files changed, 243 insertions(+), 262 deletions(-) create mode 100644 src/dev/i18n/types.ts diff --git a/package.json b/package.json index 1f73374cd2d63..30095b1c5d591 100644 --- a/package.json +++ b/package.json @@ -1463,7 +1463,6 @@ "@types/json5": "^2.2.0", "@types/jsonwebtoken": "^9.0.0", "@types/license-checker": "15.0.0", - "@types/listr": "^0.14.0", "@types/loader-utils": "^2.0.3", "@types/lodash": "^4.14.159", "@types/lru-cache": "^5.1.0", @@ -1641,7 +1640,7 @@ "json5": "^2.2.3", "jsondiffpatch": "0.4.1", "license-checker": "^25.0.1", - "listr": "^0.14.1", + "listr2": "^8.2.1", "lmdb": "^2.9.2", "loader-utils": "^2.0.4", "marge": "^1.0.1", diff --git a/packages/kbn-telemetry-tools/src/cli/run_telemetry_check.ts b/packages/kbn-telemetry-tools/src/cli/run_telemetry_check.ts index ed5a7ff8b8135..3f11b61d1e4be 100644 --- a/packages/kbn-telemetry-tools/src/cli/run_telemetry_check.ts +++ b/packages/kbn-telemetry-tools/src/cli/run_telemetry_check.ts @@ -6,7 +6,7 @@ * Side Public License, v 1. */ -import Listr from 'listr'; +import { Listr } from 'listr2'; import chalk from 'chalk'; import { createFailError } from '@kbn/dev-cli-errors'; import { run } from '@kbn/dev-cli-runner'; @@ -48,22 +48,22 @@ export function runTelemetryCheck() { ); } - const list = new Listr( + const list = new Listr( [ { title: 'Checking .telemetryrc.json files', - task: () => new Listr(parseConfigsTask(), { exitOnError: true }), + task: (context, task) => task.newListr(parseConfigsTask(), { exitOnError: true }), }, { title: 'Extracting Collectors', - task: (context) => - new Listr(extractCollectorsTask(context, path), { exitOnError: true }), + task: (context, task) => + task.newListr(extractCollectorsTask(context, path), { exitOnError: true }), }, { enabled: () => typeof path !== 'undefined', title: 'Checking collectors in --path are not excluded', - task: ({ roots }: TaskContext) => { - const totalCollections = roots.reduce((acc, root) => { + task: (context) => { + const totalCollections = context.roots.reduce((acc, root) => { return acc + (root.parsedCollections?.length || 0); }, 0); const collectorsInPath = Array.isArray(path) ? path.length : 1; @@ -77,39 +77,41 @@ export function runTelemetryCheck() { }, { title: 'Checking Compatible collector.schema with collector.fetch type', - task: (context) => new Listr(checkCompatibleTypesTask(context), { exitOnError: true }), + task: (context, task) => + task.newListr(checkCompatibleTypesTask(context), { exitOnError: true }), }, { enabled: (_) => fix || !ignoreStoredJson, title: 'Checking Matching collector.schema against stored json files', - task: (context) => - new Listr(checkMatchingSchemasTask(context, !fix), { exitOnError: true }), + task: (context, task) => + task.newListr(checkMatchingSchemasTask(context, !fix), { exitOnError: true }), }, { enabled: (_) => fix, - skip: ({ roots }: TaskContext) => { - const noDiffs = roots.every( + skip: (context) => { + const noDiffs = context.roots.every( ({ esMappingDiffs }) => !esMappingDiffs || !esMappingDiffs.length ); return noDiffs && 'No changes needed.'; }, title: 'Generating new telemetry mappings', - task: (context) => new Listr(generateSchemasTask(context), { exitOnError: true }), + task: (context, task) => + task.newListr(generateSchemasTask(context), { exitOnError: true }), }, { enabled: (_) => fix, - skip: ({ roots }: TaskContext) => { - const noDiffs = roots.every( + skip: (context) => { + const noDiffs = context.roots.every( ({ esMappingDiffs }) => !esMappingDiffs || !esMappingDiffs.length ); return noDiffs && 'No changes needed.'; }, title: 'Updating telemetry mapping files', - task: (context) => new Listr(writeToFileTask(context), { exitOnError: true }), + task: (context, task) => task.newListr(writeToFileTask(context), { exitOnError: true }), }, ], { - renderer: process.env.CI ? 'verbose' : 'default', + renderer: process.env.CI ? 'verbose' : ('default' as any), } ); diff --git a/packages/kbn-telemetry-tools/src/cli/run_telemetry_extract.ts b/packages/kbn-telemetry-tools/src/cli/run_telemetry_extract.ts index 22790ab6a0578..b55833f86c290 100644 --- a/packages/kbn-telemetry-tools/src/cli/run_telemetry_extract.ts +++ b/packages/kbn-telemetry-tools/src/cli/run_telemetry_extract.ts @@ -6,7 +6,7 @@ * Side Public License, v 1. */ -import Listr from 'listr'; +import { Listr } from 'listr2'; import { run } from '@kbn/dev-cli-runner'; import { @@ -25,19 +25,21 @@ export function runTelemetryExtract() { [ { title: 'Parsing .telemetryrc.json files', - task: () => new Listr(parseConfigsTask(), { exitOnError: true }), + task: (context, task) => task.newListr(parseConfigsTask(), { exitOnError: true }), }, { title: 'Extracting Telemetry Collectors', - task: (context) => new Listr(extractCollectorsTask(context), { exitOnError: true }), + task: (context, task) => + task.newListr(extractCollectorsTask(context), { exitOnError: true }), }, { title: 'Generating Schema files', - task: (context) => new Listr(generateSchemasTask(context), { exitOnError: true }), + task: (context, task) => + task.newListr(generateSchemasTask(context), { exitOnError: true }), }, { title: 'Writing to file', - task: (context) => new Listr(writeToFileTask(context), { exitOnError: true }), + task: (context, task) => task.newListr(writeToFileTask(context), { exitOnError: true }), }, ], { diff --git a/renovate.json b/renovate.json index 87cf0e3034773..d07ce08ffa07d 100644 --- a/renovate.json +++ b/renovate.json @@ -234,6 +234,24 @@ ], "enabled": true }, + { + "groupName": "CLI tooling", + "matchPackageNames": [ + "listr2" + ], + "reviewers": [ + "team:kibana-operations" + ], + "matchBaseBranches": [ + "main" + ], + "labels": [ + "Team:Operations", + "backport:all-open", + "release_note:skip" + ], + "enabled": true + }, { "groupName": "vega related modules", "matchPackageNames": [ diff --git a/src/dev/i18n/tasks/check_compatibility.ts b/src/dev/i18n/tasks/check_compatibility.ts index b6b94a5aba666..10970dc92f551 100644 --- a/src/dev/i18n/tasks/check_compatibility.ts +++ b/src/dev/i18n/tasks/check_compatibility.ts @@ -8,6 +8,7 @@ import { ToolingLog } from '@kbn/tooling-log'; import { integrateLocaleFiles, I18nConfig } from '..'; +import { I18nCheckTaskContext } from '../types'; export interface I18nFlags { fix: boolean; @@ -20,7 +21,7 @@ export interface I18nFlags { export function checkCompatibility(config: I18nConfig, flags: I18nFlags, log: ToolingLog) { const { fix, ignoreIncompatible, ignoreUnused, ignoreMalformed, ignoreMissing } = flags; return config.translations.map((translationsPath) => ({ - task: async ({ messages }: { messages: Map }) => { + task: async ({ messages }: I18nCheckTaskContext) => { // If `fix` is set we should try apply all possible fixes and override translations file. await integrateLocaleFiles(messages, { dryRun: !fix, diff --git a/src/dev/i18n/tasks/check_configs.ts b/src/dev/i18n/tasks/check_configs.ts index 091f1fa806a14..66d5e8fd44500 100644 --- a/src/dev/i18n/tasks/check_configs.ts +++ b/src/dev/i18n/tasks/check_configs.ts @@ -8,7 +8,8 @@ import { resolve, join } from 'path'; import { I18N_RC } from '../constants'; -import { ErrorReporter, checkConfigNamespacePrefix, arrayify } from '..'; +import { checkConfigNamespacePrefix, arrayify } from '..'; +import { I18nCheckTaskContext } from '../types'; export function checkConfigs(additionalConfigPaths: string | string[] = []) { const root = join(__dirname, '../../../../'); @@ -18,7 +19,7 @@ export function checkConfigs(additionalConfigPaths: string | string[] = []) { const configPaths = [kibanaRC, xpackRC, ...arrayify(additionalConfigPaths)]; return configPaths.map((configPath) => ({ - task: async (context: { reporter: ErrorReporter }) => { + task: async (context: I18nCheckTaskContext) => { try { await checkConfigNamespacePrefix(configPath); } catch (err) { diff --git a/src/dev/i18n/tasks/extract_default_translations.ts b/src/dev/i18n/tasks/extract_default_translations.ts index 57de2148d5ff4..512c3bc91dbfb 100644 --- a/src/dev/i18n/tasks/extract_default_translations.ts +++ b/src/dev/i18n/tasks/extract_default_translations.ts @@ -8,7 +8,8 @@ import chalk from 'chalk'; import { createFailError } from '@kbn/dev-cli-errors'; -import { ErrorReporter, extractMessagesFromPathToMap, filterConfigPaths, I18nConfig } from '..'; +import { extractMessagesFromPathToMap, filterConfigPaths, I18nConfig } from '..'; +import { I18nCheckTaskContext } from '../types'; export function extractDefaultMessages(config: I18nConfig, inputPaths: string[]) { const filteredPaths = filterConfigPaths(inputPaths, config) as string[]; @@ -20,10 +21,7 @@ export function extractDefaultMessages(config: I18nConfig, inputPaths: string[]) ); } return filteredPaths.map((filteredPath) => ({ - task: async (context: { - messages: Map; - reporter: ErrorReporter; - }) => { + task: async (context: I18nCheckTaskContext) => { const { messages, reporter } = context; const initialErrorsNumber = reporter.errors.length; diff --git a/src/dev/i18n/tasks/extract_untracked_translations.ts b/src/dev/i18n/tasks/extract_untracked_translations.ts index e2ea89661d519..9bc4c27f4a4a0 100644 --- a/src/dev/i18n/tasks/extract_untracked_translations.ts +++ b/src/dev/i18n/tasks/extract_untracked_translations.ts @@ -10,6 +10,7 @@ import { createFailError } from '@kbn/dev-cli-errors'; import { matchEntriesWithExctractors } from '../extract_default_translations'; import { I18nConfig } from '../config'; import { normalizePath, readFileAsync, ErrorReporter } from '../utils'; +import { I18nCheckTaskContext } from '../types'; function filterEntries(entries: string[], exclude: string[]) { return entries.filter((entry: string) => @@ -24,7 +25,7 @@ export async function extractUntrackedMessagesTask({ }: { path?: string | string[]; config: I18nConfig; - reporter: any; + reporter: ErrorReporter; }) { const inputPaths = Array.isArray(path) ? path : [path || './']; const availablePaths = Object.values(config.paths).flat(); @@ -76,10 +77,14 @@ export async function extractUntrackedMessagesTask({ export function extractUntrackedMessages(inputPaths: string[]) { return inputPaths.map((inputPath) => ({ title: `Checking untracked messages in ${inputPath}`, - task: async (context: { reporter: ErrorReporter; config: I18nConfig }) => { + task: async (context: I18nCheckTaskContext) => { const { reporter, config } = context; const initialErrorsNumber = reporter.errors.length; - const result = await extractUntrackedMessagesTask({ path: inputPath, config, reporter }); + const result = await extractUntrackedMessagesTask({ + path: inputPath, + config: config as I18nConfig, + reporter, + }); if (reporter.errors.length === initialErrorsNumber) { return result; } diff --git a/src/dev/i18n/tasks/merge_configs.ts b/src/dev/i18n/tasks/merge_configs.ts index 89ce47dcbecf2..916980dc2cb4c 100644 --- a/src/dev/i18n/tasks/merge_configs.ts +++ b/src/dev/i18n/tasks/merge_configs.ts @@ -7,7 +7,8 @@ */ import { resolve, join } from 'path'; -import { ErrorReporter, I18nConfig, assignConfigFromPath, arrayify } from '..'; +import { assignConfigFromPath, arrayify } from '..'; +import { I18nCheckTaskContext } from '../types'; export function mergeConfigs(additionalConfigPaths: string | string[] = []) { const root = join(__dirname, '../../../../'); @@ -17,7 +18,7 @@ export function mergeConfigs(additionalConfigPaths: string | string[] = []) { const configPaths = [kibanaRC, xpackRC, ...arrayify(additionalConfigPaths)]; return configPaths.map((configPath) => ({ - task: async (context: { reporter: ErrorReporter; config?: I18nConfig }) => { + task: async (context: I18nCheckTaskContext) => { try { context.config = await assignConfigFromPath(context.config, configPath); } catch (err) { diff --git a/src/dev/i18n/types.ts b/src/dev/i18n/types.ts new file mode 100644 index 0000000000000..4b790051b294c --- /dev/null +++ b/src/dev/i18n/types.ts @@ -0,0 +1,16 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0 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 { I18nConfig } from './config'; +import { ErrorReporter } from './utils'; + +export interface I18nCheckTaskContext { + config?: I18nConfig; + reporter: ErrorReporter; + messages: Map; +} diff --git a/src/dev/run_i18n_check.ts b/src/dev/run_i18n_check.ts index 2d04e7c9ca3a5..eed82a1f08783 100644 --- a/src/dev/run_i18n_check.ts +++ b/src/dev/run_i18n_check.ts @@ -7,13 +7,13 @@ */ import chalk from 'chalk'; -import Listr from 'listr'; +import { Listr } from 'listr2'; import { createFailError } from '@kbn/dev-cli-errors'; import { run } from '@kbn/dev-cli-runner'; import { ToolingLog } from '@kbn/tooling-log'; import { getTimeReporter } from '@kbn/ci-stats-reporter'; -import { ErrorReporter, I18nConfig } from './i18n'; +import { ErrorReporter } from './i18n'; import { extractDefaultMessages, extractUntrackedMessages, @@ -21,6 +21,7 @@ import { checkConfigs, mergeConfigs, } from './i18n/tasks'; +import { I18nCheckTaskContext } from './i18n/types'; const toolingLog = new ToolingLog({ level: 'info', @@ -30,8 +31,8 @@ const toolingLog = new ToolingLog({ const runStartTime = Date.now(); const reportTime = getTimeReporter(toolingLog, 'scripts/i18n_check'); -const skipOnNoTranslations = ({ config }: { config: I18nConfig }) => - !config.translations.length && 'No translations found.'; +const skipOnNoTranslations = ({ config }: I18nCheckTaskContext) => + !config?.translations.length && 'No translations found.'; run( async ({ @@ -74,36 +75,38 @@ run( const srcPaths = Array().concat(path || ['./src', './packages', './x-pack']); - const list = new Listr( + const list = new Listr( [ { title: 'Checking .i18nrc.json files', - task: () => new Listr(checkConfigs(includeConfig), { exitOnError: true }), + task: (context, task) => + task.newListr(checkConfigs(includeConfig), { exitOnError: true }), }, { title: 'Merging .i18nrc.json files', - task: () => new Listr(mergeConfigs(includeConfig), { exitOnError: true }), + task: (context, task) => + task.newListr(mergeConfigs(includeConfig), { exitOnError: true }), }, { title: 'Checking For Untracked Messages based on .i18nrc.json', enabled: (_) => !ignoreUntracked, skip: skipOnNoTranslations, - task: ({ config }) => - new Listr(extractUntrackedMessages(srcPaths), { exitOnError: true }), + task: (context, task) => + task.newListr(extractUntrackedMessages(srcPaths), { exitOnError: true }), }, { title: 'Validating Default Messages', skip: skipOnNoTranslations, - task: ({ config }) => - new Listr(extractDefaultMessages(config, srcPaths), { exitOnError: true }), + task: (context, task) => + task.newListr(extractDefaultMessages(context.config!, srcPaths), { exitOnError: true }), }, { title: 'Compatibility Checks', skip: skipOnNoTranslations, - task: ({ config }) => - new Listr( + task: (context, task) => + task.newListr( checkCompatibility( - config, + context.config!, { ignoreMalformed: !!ignoreMalformed, ignoreIncompatible: !!ignoreIncompatible, @@ -120,7 +123,7 @@ run( { concurrent: false, exitOnError: true, - renderer: process.env.CI ? 'verbose' : 'default', + renderer: process.env.CI ? 'verbose' : ('default' as any), } ); diff --git a/src/dev/run_i18n_extract.ts b/src/dev/run_i18n_extract.ts index 2c1f39e929a36..cc356a0cdb5d7 100644 --- a/src/dev/run_i18n_extract.ts +++ b/src/dev/run_i18n_extract.ts @@ -7,13 +7,14 @@ */ import chalk from 'chalk'; -import Listr from 'listr'; +import { Listr } from 'listr2'; import { resolve } from 'path'; import { createFailError } from '@kbn/dev-cli-errors'; import { run } from '@kbn/dev-cli-runner'; import { ErrorReporter, serializeToJson, serializeToJson5, writeFileAsync } from './i18n'; import { extractDefaultMessages, mergeConfigs } from './i18n/tasks'; +import { I18nCheckTaskContext } from './i18n/types'; run( async ({ @@ -38,22 +39,23 @@ run( } const srcPaths = Array().concat(path || ['./src', './packages', './x-pack']); - const list = new Listr( + const list = new Listr( [ { title: 'Merging .i18nrc.json files', - task: () => new Listr(mergeConfigs(includeConfig), { exitOnError: true }), + task: (context, task) => + task.newListr(mergeConfigs(includeConfig), { exitOnError: true }), }, { title: 'Extracting Default Messages', - task: ({ config }) => - new Listr(extractDefaultMessages(config, srcPaths), { exitOnError: true }), + task: (context, task) => + task.newListr(extractDefaultMessages(context.config!, srcPaths), { exitOnError: true }), }, { title: 'Writing to file', - enabled: (ctx) => outputDir && ctx.messages.size, - task: async (ctx) => { - const sortedMessages = [...ctx.messages].sort(([key1], [key2]) => + enabled: (ctx) => Boolean(outputDir && ctx.messages.size > 0), + task: async (context) => { + const sortedMessages = [...context.messages].sort(([key1], [key2]) => key1.localeCompare(key2) ); await writeFileAsync( @@ -66,7 +68,7 @@ run( }, ], { - renderer: process.env.CI ? 'verbose' : 'default', + renderer: process.env.CI ? 'verbose' : ('default' as any), } ); diff --git a/src/dev/run_i18n_integrate.ts b/src/dev/run_i18n_integrate.ts index 80e2f8cb1f33b..4788036320ca4 100644 --- a/src/dev/run_i18n_integrate.ts +++ b/src/dev/run_i18n_integrate.ts @@ -7,12 +7,13 @@ */ import chalk from 'chalk'; -import Listr from 'listr'; +import { Listr } from 'listr2'; import { createFailError } from '@kbn/dev-cli-errors'; import { run } from '@kbn/dev-cli-runner'; import { ErrorReporter, integrateLocaleFiles } from './i18n'; import { extractDefaultMessages, mergeConfigs } from './i18n/tasks'; +import { I18nCheckTaskContext } from './i18n/types'; run( async ({ @@ -69,7 +70,7 @@ run( const srcPaths = Array().concat(path || ['./src', './packages', './x-pack']); - const list = new Listr( + const list = new Listr( [ { title: 'Merging .i18nrc.json files', @@ -77,13 +78,13 @@ run( }, { title: 'Extracting Default Messages', - task: ({ config }) => - new Listr(extractDefaultMessages(config, srcPaths), { exitOnError: true }), + task: (context) => + new Listr(extractDefaultMessages(context.config!, srcPaths), { exitOnError: true }), }, { title: 'Integrating Locale File', - task: async ({ messages, config }) => { - await integrateLocaleFiles(messages, { + task: async (context) => { + await integrateLocaleFiles(context.messages, { sourceFileName: source, targetFileName: target, dryRun, @@ -91,14 +92,14 @@ run( ignoreUnused, ignoreMissing, ignoreMalformed, - config, + config: context.config!, log, }); }, }, ], { - renderer: process.env.CI ? 'verbose' : 'default', + renderer: process.env.CI ? 'verbose' : ('default' as any), } ); diff --git a/x-pack/plugins/observability_solution/apm/scripts/precommit.js b/x-pack/plugins/observability_solution/apm/scripts/precommit.js index 79a05a8ec2304..fcf6120fc36f4 100644 --- a/x-pack/plugins/observability_solution/apm/scripts/precommit.js +++ b/x-pack/plugins/observability_solution/apm/scripts/precommit.js @@ -9,7 +9,7 @@ /* eslint-disable import/no-extraneous-dependencies*/ const execa = require('execa'); -const Listr = require('listr'); +const { Listr } = require('listr2'); const { resolve } = require('path'); const root = resolve(__dirname, '../../../..'); diff --git a/yarn.lock b/yarn.lock index ff292b52c7143..17e5466fc27db 100644 --- a/yarn.lock +++ b/yarn.lock @@ -7845,13 +7845,6 @@ resolved "https://registry.yarnpkg.com/@remix-run/router/-/router-1.6.3.tgz#8205baf6e17ef93be35bf62c37d2d594e9be0dad" integrity sha512-EXJysQ7J3veRECd0kZFQwYYd5sJMcq2O/m60zu1W2l3oVQ9xtub8jTOtYRE0+M2iomyG/W3Ps7+vp2kna0C27Q== -"@samverschueren/stream-to-observable@^0.3.0": - version "0.3.0" - resolved "https://registry.yarnpkg.com/@samverschueren/stream-to-observable/-/stream-to-observable-0.3.0.tgz#ecdf48d532c58ea477acfcab80348424f8d0662f" - integrity sha512-MI4Xx6LHs4Webyvi6EbspgyAb4D2Q2VtnCQ1blOJcoLS6mVa8lNN2rkIy1CVxfTUpoyIbCTkXES1rLXztFD1lg== - dependencies: - any-observable "^0.3.0" - "@searchkit/sdk@^3.0.0": version "3.0.0" resolved "https://registry.yarnpkg.com/@searchkit/sdk/-/sdk-3.0.0.tgz#63fcec0edcba05d241042b8476be1b86d77142e4" @@ -10082,14 +10075,6 @@ resolved "https://registry.yarnpkg.com/@types/linkify-it/-/linkify-it-2.1.0.tgz#ea3dd64c4805597311790b61e872cbd1ed2cd806" integrity sha512-Q7DYAOi9O/+cLLhdaSvKdaumWyHbm7HAk/bFwwyTuU0arR5yyCeW5GOoqt4tJTpDRxhpx9Q8kQL6vMpuw9hDSw== -"@types/listr@^0.14.0": - version "0.14.0" - resolved "https://registry.yarnpkg.com/@types/listr/-/listr-0.14.0.tgz#55161177ed5043987871bca5f66d87ca0a63a0b7" - integrity sha512-8ZLo3UiyxuzgmbJYc8vMC0kbF3RFaB3ZZOh7xM1nfcGxypFoJZi0P7ndD4MLSYqWW4M4zG6PWvObVkpHjg+45g== - dependencies: - "@types/node" "*" - rxjs "^6.5.1" - "@types/loader-utils@^2.0.3": version "2.0.3" resolved "https://registry.yarnpkg.com/@types/loader-utils/-/loader-utils-2.0.3.tgz#fbc2337358f8f4a7dc532ac0a3646c74275edf2d" @@ -11638,11 +11623,6 @@ ansi-colors@^3.0.0: resolved "https://registry.yarnpkg.com/ansi-colors/-/ansi-colors-3.2.4.tgz#e3a3da4bfbae6c86a9c285625de124a234026fbf" integrity sha512-hHUXGagefjN2iRrID63xckIvotOXOojhQKWIPUZ4mNUZ9nLZW+7FMNoE1lOkEhNWYsx/7ysGIuJYCiMAA9FnrA== -ansi-escapes@^3.0.0: - version "3.2.0" - resolved "https://registry.yarnpkg.com/ansi-escapes/-/ansi-escapes-3.2.0.tgz#8780b98ff9dbf5638152d1f1fe5c1d7b4442976b" - integrity sha512-cBhpre4ma+U0T1oM5fXg7Dy1Jw7zzwv7lt/GoCpr+hDQJoYnKVPLL4dCvSEFMmQurOQvSrwT7SL/DAlhBI97RQ== - ansi-escapes@^4.2.1, ansi-escapes@^4.3.0: version "4.3.0" resolved "https://registry.yarnpkg.com/ansi-escapes/-/ansi-escapes-4.3.0.tgz#a4ce2b33d6b214b7950d8595c212f12ac9cc569d" @@ -11650,6 +11630,11 @@ ansi-escapes@^4.2.1, ansi-escapes@^4.3.0: dependencies: type-fest "^0.8.1" +ansi-escapes@^6.2.0: + version "6.2.1" + resolved "https://registry.yarnpkg.com/ansi-escapes/-/ansi-escapes-6.2.1.tgz#76c54ce9b081dad39acec4b5d53377913825fb0f" + integrity sha512-4nJ3yixlEthEJ9Rk4vPcdBRkZvQZlYyu8j4/Mqz5sgIkddmEnH2Yj2ZrnP9S3tQOvSNRUIgVNF/1yPpRAGNRig== + ansi-gray@^0.1.1: version "0.1.1" resolved "https://registry.yarnpkg.com/ansi-gray/-/ansi-gray-0.1.1.tgz#2962cf54ec9792c48510a3deb524436861ef7251" @@ -11706,7 +11691,7 @@ ansi-styles@^5.0.0: resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-5.2.0.tgz#07449690ad45777d1924ac2abb2fc8895dba836b" integrity sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA== -ansi-styles@^6.1.0: +ansi-styles@^6.0.0, ansi-styles@^6.1.0, ansi-styles@^6.2.1: version "6.2.1" resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-6.2.1.tgz#0e62320cf99c21afff3b3012192546aacbfb05c5" integrity sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug== @@ -11728,11 +11713,6 @@ antlr4@^4.13.1-patch-1: resolved "https://registry.yarnpkg.com/antlr4/-/antlr4-4.13.1-patch-1.tgz#946176f863f890964a050c4f18c47fd6f7e57602" integrity sha512-OjFLWWLzDMV9rdFhpvroCWR4ooktNg9/nvVYSA5z28wuVpU36QUNuioR1XLnQtcjVlf8npjyz593PxnU/f/Cow== -any-observable@^0.3.0: - version "0.3.0" - resolved "https://registry.yarnpkg.com/any-observable/-/any-observable-0.3.0.tgz#af933475e5806a67d0d7df090dd5e8bef65d119b" - integrity sha512-/FQM1EDkTsf63Ub2C6O7GuYFDsSXUwsaZDurV0np41ocwq0jthUAYCmhBX9f+KwlaCgIuWyr/4WlUQUBfKfZog== - anymatch@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/anymatch/-/anymatch-2.0.0.tgz#bcb24b4f37934d9aa7ac17b4adaf89e7c76ef2eb" @@ -13448,7 +13428,7 @@ chalk@4.1.2, chalk@^4.0.0, chalk@^4.0.2, chalk@^4.1.0, chalk@^4.1.1, chalk@^4.1. ansi-styles "^4.1.0" supports-color "^7.1.0" -chalk@^1.0.0, chalk@^1.1.3: +chalk@^1.0.0: version "1.1.3" resolved "https://registry.yarnpkg.com/chalk/-/chalk-1.1.3.tgz#a8115c55e4a702fe4d150abd3872822a7e09fc98" integrity sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg= @@ -13684,13 +13664,6 @@ cli-boxes@^3.0.0: resolved "https://registry.yarnpkg.com/cli-boxes/-/cli-boxes-3.0.0.tgz#71a10c716feeba005e4504f36329ef0b17cf3145" integrity sha512-/lzGpEWL/8PfI0BmBOPRwp0c/wFNX1RdUML3jK/RcSBA9T8mZDdQpqYBKtCFTOfQbwPqWEOpjqW+Fnayc0969g== -cli-cursor@^2.0.0, cli-cursor@^2.1.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/cli-cursor/-/cli-cursor-2.1.0.tgz#b35dac376479facc3e94747d41d0d0f5238ffcb5" - integrity sha1-s12sN2R5+sw+lHR9QdDQ9SOP/LU= - dependencies: - restore-cursor "^2.0.0" - cli-cursor@^3.1.0: version "3.1.0" resolved "https://registry.yarnpkg.com/cli-cursor/-/cli-cursor-3.1.0.tgz#264305a7ae490d1d03bf0c9ba7c925d1753af307" @@ -13698,6 +13671,13 @@ cli-cursor@^3.1.0: dependencies: restore-cursor "^3.1.0" +cli-cursor@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/cli-cursor/-/cli-cursor-4.0.0.tgz#3cecfe3734bf4fe02a8361cbdc0f6fe28c6a57ea" + integrity sha512-VGtlMu3x/4DOtIUwEkRezxUZ2lBacNJCHash0N0WeZDBS+7Ux1dm3XWAgWYxLJFMMdOeXMHXorshEFhbMSGelg== + dependencies: + restore-cursor "^4.0.0" + cli-progress@^3.12.0: version "3.12.0" resolved "https://registry.yarnpkg.com/cli-progress/-/cli-progress-3.12.0.tgz#807ee14b66bcc086258e444ad0f19e7d42577942" @@ -13719,14 +13699,6 @@ cli-table3@^0.6.1, cli-table3@~0.6.1: optionalDependencies: colors "1.4.0" -cli-truncate@^0.2.1: - version "0.2.1" - resolved "https://registry.yarnpkg.com/cli-truncate/-/cli-truncate-0.2.1.tgz#9f15cfbb0705005369216c626ac7d05ab90dd574" - integrity sha1-nxXPuwcFAFNpIWxiasfQWrkN1XQ= - dependencies: - slice-ansi "0.0.4" - string-width "^1.0.1" - cli-truncate@^2.1.0: version "2.1.0" resolved "https://registry.yarnpkg.com/cli-truncate/-/cli-truncate-2.1.0.tgz#c39e28bf05edcde5be3b98992a22deed5a2b93c7" @@ -13735,6 +13707,14 @@ cli-truncate@^2.1.0: slice-ansi "^3.0.0" string-width "^4.2.0" +cli-truncate@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/cli-truncate/-/cli-truncate-4.0.0.tgz#6cc28a2924fee9e25ce91e973db56c7066e6172a" + integrity sha512-nPdaFdQ0h/GEigbPClz11D0v/ZJEwxmeVZGeMo3Z5StPtUTkA9o1lD6QwoirYiSDzbcwn2XcjwmCp68W1IS4TA== + dependencies: + slice-ansi "^5.0.0" + string-width "^7.0.0" + cli-width@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/cli-width/-/cli-width-3.0.0.tgz#a2f48437a2caa9a22436e794bf071ec9e61cedf6" @@ -13936,10 +13916,10 @@ colorette@^1.2.0, colorette@^1.2.1, colorette@^1.2.2: resolved "https://registry.yarnpkg.com/colorette/-/colorette-1.4.0.tgz#5190fbb87276259a86ad700bff2c6d6faa3fca40" integrity sha512-Y2oEozpomLn7Q3HFP7dpww7AtMJplbM9lGZP6RDfHqmbeRjiwRg4n6VM6j4KLmRke85uWEI7JqF17f3pqdRA0g== -colorette@^2.0.10, colorette@^2.0.14: - version "2.0.19" - resolved "https://registry.yarnpkg.com/colorette/-/colorette-2.0.19.tgz#cdf044f47ad41a0f4b56b3a0d5b4e6e1a2d5a798" - integrity sha512-3tlv/dIP7FWvj3BsbHrGLJ6l/oKh1O3TcgBqMn+yyCagOxc23fyzDS6HypQbgxWbkpDnf52p1LuR4eWDQ/K9WQ== +colorette@^2.0.10, colorette@^2.0.14, colorette@^2.0.20: + version "2.0.20" + resolved "https://registry.yarnpkg.com/colorette/-/colorette-2.0.20.tgz#9eb793e6833067f7235902fcd3b09917a000a95a" + integrity sha512-IfEDxwoWIjkeXL1eXcDiow4UbKjhLdq6/EuSVR9GMN7KVH3r9gQ83e73hsz1Nd1T3ijd5xv1wcWRYO+D6kCI2w== colors@1.4.0: version "1.4.0" @@ -15067,7 +15047,7 @@ data-urls@^3.0.2: whatwg-mimetype "^3.0.0" whatwg-url "^11.0.0" -date-fns@^1.27.2, date-fns@^1.30.1: +date-fns@^1.30.1: version "1.30.1" resolved "https://registry.yarnpkg.com/date-fns/-/date-fns-1.30.1.tgz#2e71bf0b119153dbb4cc4e88d9ea5acfb50dc05c" integrity sha512-hBSVCvSmWC+QypYObzwGOd9wqdDpOt+0wl0KbU+R+uuZBS1jN8VsD1ss3irQDknRj5NvxiTF6oj/nDRnN/UQNw== @@ -16001,11 +15981,6 @@ electron-to-chromium@^1.4.668: resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.4.701.tgz#7335e5761331774b4dea54cd24a1b84861d45cdf" integrity sha512-K3WPQ36bUOtXg/1+69bFlFOvdSm0/0bGqmsfPDLRXLanoKXdA+pIWuf/VbA9b+2CwBFuONgl4NEz4OEm+OJOKA== -elegant-spinner@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/elegant-spinner/-/elegant-spinner-1.0.1.tgz#db043521c95d7e303fd8f345bedc3349cfb0729e" - integrity sha1-2wQ1IcldfjA/2PNFvtwzSc+wcp4= - element-resize-detector@^1.2.2: version "1.2.3" resolved "https://registry.yarnpkg.com/element-resize-detector/-/element-resize-detector-1.2.3.tgz#5078d9b99398fe4c589f8c8df94ff99e5d413ff3" @@ -16041,6 +16016,11 @@ emittery@^0.13.1: resolved "https://registry.yarnpkg.com/emoji-regex/-/emoji-regex-6.1.1.tgz#c6cd0ec1b0642e2a3c67a1137efc5e796da4f88e" integrity sha1-xs0OwbBkLio8Z6ETfvxeeW2k+I4= +emoji-regex@^10.3.0: + version "10.3.0" + resolved "https://registry.yarnpkg.com/emoji-regex/-/emoji-regex-10.3.0.tgz#76998b9268409eb3dae3de989254d456e70cfe23" + integrity sha512-QpLs9D9v9kArv4lfDEgg1X/gN5XLnf/A6l9cs8SPZLRZR3ZkY9+kwIQTxm+fsSej5UMYGE8fdoaZVIBlqG0XTw== + emoji-regex@^8.0.0: version "8.0.0" resolved "https://registry.yarnpkg.com/emoji-regex/-/emoji-regex-8.0.0.tgz#e818fd69ce5ccfcb404594f842963bf53164cc37" @@ -16906,6 +16886,11 @@ eventemitter3@^4.0.0, eventemitter3@^4.0.4, eventemitter3@^4.0.7: resolved "https://registry.yarnpkg.com/eventemitter3/-/eventemitter3-4.0.7.tgz#2de9b68f6528d5644ef5c59526a1b4a07306169f" integrity sha512-8guHBZCwKnFhYdHr2ysuRWErTwhoN2X8XELRlrRwpmfeY2jjuUN4taQMsULKUVo1K4DvZl+0pgfyoysHxvmvEw== +eventemitter3@^5.0.1: + version "5.0.1" + resolved "https://registry.yarnpkg.com/eventemitter3/-/eventemitter3-5.0.1.tgz#53f5ffd0a492ac800721bb42c66b841de96423c4" + integrity sha512-GWkBvjiSZK87ELrYOSESUYeVIc9mvLLf/nXalMOS5dYrgZq9o5OVkbZAVM06CVxYsCwH9BDZFPlQTlPA1j4ahA== + events@^1.0.2: version "1.1.1" resolved "https://registry.yarnpkg.com/events/-/events-1.1.1.tgz#9ebdb7635ad099c70dcc4c2a1f5004288e8bd924" @@ -17360,21 +17345,6 @@ figgy-pudding@^3.5.1: resolved "https://registry.yarnpkg.com/figgy-pudding/-/figgy-pudding-3.5.1.tgz#862470112901c727a0e495a80744bd5baa1d6790" integrity sha512-vNKxJHTEKNThjfrdJwHc7brvM6eVevuO5nTj6ez8ZQ1qbXTvGthucRF7S4vf2cr71QVnT70V34v0S1DyQsti0w== -figures@^1.7.0: - version "1.7.0" - resolved "https://registry.yarnpkg.com/figures/-/figures-1.7.0.tgz#cbe1e3affcf1cd44b80cadfed28dc793a9701d2e" - integrity sha1-y+Hjr/zxzUS4DK3+0o3Hk6lwHS4= - dependencies: - escape-string-regexp "^1.0.5" - object-assign "^4.1.0" - -figures@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/figures/-/figures-2.0.0.tgz#3ab1a2d2a62c8bfb431a0c94cb797a2fce27c962" - integrity sha1-OrGi0qYsi/tDGgyUy3l6L84nyWI= - dependencies: - escape-string-regexp "^1.0.5" - figures@^3.0.0, figures@^3.2.0: version "3.2.0" resolved "https://registry.yarnpkg.com/figures/-/figures-3.2.0.tgz#625c18bd293c604dc4a8ddb2febf0c88341746af" @@ -18033,6 +18003,11 @@ get-caller-file@^2.0.1, get-caller-file@^2.0.5: resolved "https://registry.yarnpkg.com/get-caller-file/-/get-caller-file-2.0.5.tgz#4f94412a82db32f36e3b0b9741f8a97feb031f7e" integrity sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg== +get-east-asian-width@^1.0.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/get-east-asian-width/-/get-east-asian-width-1.2.0.tgz#5e6ebd9baee6fb8b7b6bd505221065f0cd91f64e" + integrity sha512-2nk+7SIVb14QrgXFHcm84tD4bKQz0RxPuMT8Ag5KPOq7J5fEmAg0UbXdTOSHqNuHSU28k55qnceesxXRZGzKWA== + get-intrinsic@^1.0.2, get-intrinsic@^1.1.1, get-intrinsic@^1.1.3, get-intrinsic@^1.2.0, get-intrinsic@^1.2.1, get-intrinsic@^1.2.2, get-intrinsic@^1.2.4: version "1.2.4" resolved "https://registry.yarnpkg.com/get-intrinsic/-/get-intrinsic-1.2.4.tgz#e385f5a4b5227d449c3eabbad05494ef0abbeadd" @@ -19314,11 +19289,6 @@ indent-string@^2.1.0: dependencies: repeating "^2.0.0" -indent-string@^3.0.0: - version "3.2.0" - resolved "https://registry.yarnpkg.com/indent-string/-/indent-string-3.2.0.tgz#4a5fd6d27cc332f37e5419a504dbb837105c9289" - integrity sha1-Sl/W0nzDMvN+VBmlBNu4NxBckok= - indent-string@^4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/indent-string/-/indent-string-4.0.0.tgz#624f8f4497d619b2d9768531d58f4122854d7251" @@ -19750,16 +19720,23 @@ is-fullwidth-code-point@^1.0.0: dependencies: number-is-nan "^1.0.0" -is-fullwidth-code-point@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz#a3b30a5c4f199183167aaab93beefae3ddfb654f" - integrity sha1-o7MKXE8ZkYMWeqq5O+764937ZU8= - is-fullwidth-code-point@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz#f116f8064fe90b3f7844a38997c0b75051269f1d" integrity sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg== +is-fullwidth-code-point@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-4.0.0.tgz#fae3167c729e7463f8461ce512b080a49268aa88" + integrity sha512-O4L094N2/dZ7xqVdrXhh9r1KODPJpFms8B5sGdJLPy664AgvXsreZUyCQQNItZRDlYug4xStLjNp/sz3HvBowQ== + +is-fullwidth-code-point@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-5.0.0.tgz#9609efced7c2f97da7b60145ef481c787c7ba704" + integrity sha512-OVa3u9kkBbw7b8Xw5F9P+D/T9X+Z4+JruYVNapTjPYZYUznQ5YfWeFkOj606XYYW8yugTfC8Pj0hYqvi4ryAhA== + dependencies: + get-east-asian-width "^1.0.0" + is-function@^1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/is-function/-/is-function-1.0.2.tgz#4f097f30abf6efadac9833b17ca5dc03f8144e08" @@ -19889,13 +19866,6 @@ is-object@^1.0.1: resolved "https://registry.yarnpkg.com/is-object/-/is-object-1.0.1.tgz#8952688c5ec2ffd6b03ecc85e769e02903083470" integrity sha1-iVJojF7C/9awPsyF52ngKQMINHA= -is-observable@^1.1.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/is-observable/-/is-observable-1.1.0.tgz#b3e986c8f44de950867cab5403f5a3465005975e" - integrity sha512-NqCa4Sa2d+u7BWc6CukaObG3Fh+CU9bvixbpcXYhy2VvYS7vVGIdAgnIS5Ks3A/cqk4rebLJ9s8zBstT2aKnIA== - dependencies: - symbol-observable "^1.1.0" - is-odd@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/is-odd/-/is-odd-2.0.0.tgz#7646624671fd7ea558ccd9a2795182f2958f1b24" @@ -21523,35 +21493,6 @@ listenercount@~1.0.1: resolved "https://registry.yarnpkg.com/listenercount/-/listenercount-1.0.1.tgz#84c8a72ab59c4725321480c975e6508342e70937" integrity sha512-3mk/Zag0+IJxeDrxSgaDPy4zZ3w05PRZeJNnlWhzFz5OkX49J4krc+A8X2d2M69vGMBEX0uyl8M+W+8gH+kBqQ== -listr-silent-renderer@^1.1.1: - version "1.1.1" - resolved "https://registry.yarnpkg.com/listr-silent-renderer/-/listr-silent-renderer-1.1.1.tgz#924b5a3757153770bf1a8e3fbf74b8bbf3f9242e" - integrity sha1-kktaN1cVN3C/Go4/v3S4u/P5JC4= - -listr-update-renderer@^0.5.0: - version "0.5.0" - resolved "https://registry.yarnpkg.com/listr-update-renderer/-/listr-update-renderer-0.5.0.tgz#4ea8368548a7b8aecb7e06d8c95cb45ae2ede6a2" - integrity sha512-tKRsZpKz8GSGqoI/+caPmfrypiaq+OQCbd+CovEC24uk1h952lVj5sC7SqyFUm+OaJ5HN/a1YLt5cit2FMNsFA== - dependencies: - chalk "^1.1.3" - cli-truncate "^0.2.1" - elegant-spinner "^1.0.1" - figures "^1.7.0" - indent-string "^3.0.0" - log-symbols "^1.0.2" - log-update "^2.3.0" - strip-ansi "^3.0.1" - -listr-verbose-renderer@^0.5.0: - version "0.5.0" - resolved "https://registry.yarnpkg.com/listr-verbose-renderer/-/listr-verbose-renderer-0.5.0.tgz#f1132167535ea4c1261102b9f28dac7cba1e03db" - integrity sha512-04PDPqSlsqIOaaaGZ+41vq5FejI9auqTInicFRndCBgE3bXG8D6W1I+mWhk+1nqbHmyhla/6BUrd5OSiHwKRXw== - dependencies: - chalk "^2.4.1" - cli-cursor "^2.1.0" - date-fns "^1.27.2" - figures "^2.0.0" - listr2@^3.8.3: version "3.10.0" resolved "https://registry.yarnpkg.com/listr2/-/listr2-3.10.0.tgz#58105a53ed7fa1430d1b738c6055ef7bb006160f" @@ -21565,20 +21506,17 @@ listr2@^3.8.3: through "^2.3.8" wrap-ansi "^7.0.0" -listr@^0.14.1: - version "0.14.3" - resolved "https://registry.yarnpkg.com/listr/-/listr-0.14.3.tgz#2fea909604e434be464c50bddba0d496928fa586" - integrity sha512-RmAl7su35BFd/xoMamRjpIE4j3v+L28o8CT5YhAXQJm1fD+1l9ngXY8JAQRJ+tFK2i5njvi0iRUKV09vPwA0iA== +listr2@^8.2.1: + version "8.2.1" + resolved "https://registry.yarnpkg.com/listr2/-/listr2-8.2.1.tgz#06a1a6efe85f23c5324180d7c1ddbd96b5eefd6d" + integrity sha512-irTfvpib/rNiD637xeevjO2l3Z5loZmuaRi0L0YE5LfijwVY96oyVn0DFD3o/teAok7nfobMG1THvvcHh/BP6g== dependencies: - "@samverschueren/stream-to-observable" "^0.3.0" - is-observable "^1.1.0" - is-promise "^2.1.0" - is-stream "^1.1.0" - listr-silent-renderer "^1.1.1" - listr-update-renderer "^0.5.0" - listr-verbose-renderer "^0.5.0" - p-map "^2.0.0" - rxjs "^6.3.3" + cli-truncate "^4.0.0" + colorette "^2.0.20" + eventemitter3 "^5.0.1" + log-update "^6.0.0" + rfdc "^1.3.1" + wrap-ansi "^9.0.0" lmdb@^2.9.2: version "2.9.2" @@ -21822,13 +21760,6 @@ log-symbols@4.1.0, log-symbols@^4.0.0, log-symbols@^4.1.0: chalk "^4.1.0" is-unicode-supported "^0.1.0" -log-symbols@^1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/log-symbols/-/log-symbols-1.0.2.tgz#376ff7b58ea3086a0f09facc74617eca501e1a18" - integrity sha1-N2/3tY6jCGoPCfrMdGF+ylAeGhg= - dependencies: - chalk "^1.0.0" - log-symbols@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/log-symbols/-/log-symbols-3.0.0.tgz#f3a08516a5dea893336a7dee14d18a1cfdab77c4" @@ -21836,15 +21767,6 @@ log-symbols@^3.0.0: dependencies: chalk "^2.4.2" -log-update@^2.3.0: - version "2.3.0" - resolved "https://registry.yarnpkg.com/log-update/-/log-update-2.3.0.tgz#88328fd7d1ce7938b29283746f0b1bc126b24708" - integrity sha1-iDKP19HOeTiykoN0bwsbwSayRwg= - dependencies: - ansi-escapes "^3.0.0" - cli-cursor "^2.0.0" - wrap-ansi "^3.0.1" - log-update@^4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/log-update/-/log-update-4.0.0.tgz#589ecd352471f2a1c0c570287543a64dfd20e0a1" @@ -21855,6 +21777,17 @@ log-update@^4.0.0: slice-ansi "^4.0.0" wrap-ansi "^6.2.0" +log-update@^6.0.0: + version "6.0.0" + resolved "https://registry.yarnpkg.com/log-update/-/log-update-6.0.0.tgz#0ddeb7ac6ad658c944c1de902993fce7c33f5e59" + integrity sha512-niTvB4gqvtof056rRIrTZvjNYE4rCUzO6X/X+kYjd7WFxXeJ0NwEFnRxX6ehkvv3jTwrXnNdtAak5XYZuIyPFw== + dependencies: + ansi-escapes "^6.2.0" + cli-cursor "^4.0.0" + slice-ansi "^7.0.0" + strip-ansi "^7.1.0" + wrap-ansi "^9.0.0" + logform@^2.3.2, logform@^2.4.0: version "2.4.0" resolved "https://registry.yarnpkg.com/logform/-/logform-2.4.0.tgz#131651715a17d50f09c2a2c1a524ff1a4164bcfe" @@ -22573,11 +22506,6 @@ mime@2.6.0, mime@^2.4.4: resolved "https://registry.yarnpkg.com/mime/-/mime-2.6.0.tgz#a2a682a95cd4d0cb1d6257e28f83da7e35800367" integrity sha512-USPkMeET31rOMiarsBNIHZKLGgvKc/LrjofAnBlOttf5ajRvqiRA8QsenbcooctK6d6Ts6aqZXBA+XbkKthiQg== -mimic-fn@^1.0.0: - version "1.2.0" - resolved "https://registry.yarnpkg.com/mimic-fn/-/mimic-fn-1.2.0.tgz#820c86a39334640e99516928bd03fca88057d022" - integrity sha512-jf84uxzwiuiIVKiOLpfYk7N46TSy8ubTonmneY9vrpHNAnp0QBt2BxWV9dO3/j+BoVAb+a5G6YDPW3M5HOdMWQ== - mimic-fn@^2.1.0: version "2.1.0" resolved "https://registry.yarnpkg.com/mimic-fn/-/mimic-fn-2.1.0.tgz#7ed2c2ccccaf84d3ffcb7a69b57711fc2083401b" @@ -23922,13 +23850,6 @@ one-time@^1.0.0: dependencies: fn.name "1.x.x" -onetime@^2.0.0: - version "2.0.1" - resolved "https://registry.yarnpkg.com/onetime/-/onetime-2.0.1.tgz#067428230fd67443b2794b22bba528b6867962d4" - integrity sha1-BnQoIw/WdEOyeUsiu6UotoZ5YtQ= - dependencies: - mimic-fn "^1.0.0" - onetime@^5.1.0, onetime@^5.1.2: version "5.1.2" resolved "https://registry.yarnpkg.com/onetime/-/onetime-5.1.2.tgz#d0e96ebb56b07476df1dd9c4806e5237985ca45e" @@ -27183,14 +27104,6 @@ responselike@^3.0.0: dependencies: lowercase-keys "^3.0.0" -restore-cursor@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/restore-cursor/-/restore-cursor-2.0.0.tgz#9f7ee287f82fd326d4fd162923d62129eee0dfaf" - integrity sha1-n37ih/gv0ybU/RYpI9YhKe7g368= - dependencies: - onetime "^2.0.0" - signal-exit "^3.0.2" - restore-cursor@^3.1.0: version "3.1.0" resolved "https://registry.yarnpkg.com/restore-cursor/-/restore-cursor-3.1.0.tgz#39f67c54b3a7a58cea5236d95cf0034239631f7e" @@ -27199,6 +27112,14 @@ restore-cursor@^3.1.0: onetime "^5.1.0" signal-exit "^3.0.2" +restore-cursor@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/restore-cursor/-/restore-cursor-4.0.0.tgz#519560a4318975096def6e609d44100edaa4ccb9" + integrity sha512-I9fPXU9geO9bHOt9pHHOhOkYerIMsmVaWB0rA2AI9ERh/+x/i7MV5HKBNrg+ljO5eoPVgCcnFuRjJ9uH6I/3eg== + dependencies: + onetime "^5.1.0" + signal-exit "^3.0.2" + resumer@^0.0.0: version "0.0.0" resolved "https://registry.yarnpkg.com/resumer/-/resumer-0.0.0.tgz#f1e8f461e4064ba39e82af3cdc2a8c893d076759" @@ -27231,6 +27152,11 @@ rfc4648@^1.5.2: resolved "https://registry.yarnpkg.com/rfc4648/-/rfc4648-1.5.2.tgz#cf5dac417dd83e7f4debf52e3797a723c1373383" integrity sha512-tLOizhR6YGovrEBLatX1sdcuhoSCXddw3mqNVAcKxGJ+J0hFeJ+SjeWCv5UPA/WU3YzWPPuCVYgXBKZUPGpKtg== +rfdc@^1.3.1: + version "1.3.1" + resolved "https://registry.yarnpkg.com/rfdc/-/rfdc-1.3.1.tgz#2b6d4df52dffe8bb346992a10ea9451f24373a8f" + integrity sha512-r5a3l5HzYlIC68TpmYKlxWjmOP6wiPJ1vWv2HeLhNsRZMrCkxeqxiHlQ21oXmQ4F3SiryXBHhAD7JZqvOJjFmg== + rgbcolor@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/rgbcolor/-/rgbcolor-1.0.1.tgz#d6505ecdb304a6595da26fa4b43307306775945d" @@ -27343,7 +27269,7 @@ rxjs-report-usage@^1.0.4: glob "~7.2.0" prompts "~2.4.2" -rxjs@^6.3.3, rxjs@^6.4.0, rxjs@^6.5.1, rxjs@^6.6.0, rxjs@^6.6.7: +rxjs@^6.4.0, rxjs@^6.6.0, rxjs@^6.6.7: version "6.6.7" resolved "https://registry.yarnpkg.com/rxjs/-/rxjs-6.6.7.tgz#90ac018acabf491bf65044235d5863c4dab804c9" integrity sha512-hTdwr+7yYNIT5n4AMYp85KA6yw2Va0FLa3Rguvbpa4W3I5xynaBZo41cM3XM+4Q6fRMj3sBYIR1VAmZMXYJvRQ== @@ -28109,11 +28035,6 @@ slash@^3.0.0: resolved "https://registry.yarnpkg.com/slash/-/slash-3.0.0.tgz#6539be870c165adbd5240220dbe361f1bc4d4634" integrity sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q== -slice-ansi@0.0.4: - version "0.0.4" - resolved "https://registry.yarnpkg.com/slice-ansi/-/slice-ansi-0.0.4.tgz#edbf8903f66f7ce2f8eafd6ceed65e264c831b35" - integrity sha1-7b+JA/ZvfOL46v1s7tZeJkyDGzU= - slice-ansi@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/slice-ansi/-/slice-ansi-3.0.0.tgz#31ddc10930a1b7e0b67b08c96c2f49b77a789787" @@ -28132,6 +28053,22 @@ slice-ansi@^4.0.0: astral-regex "^2.0.0" is-fullwidth-code-point "^3.0.0" +slice-ansi@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/slice-ansi/-/slice-ansi-5.0.0.tgz#b73063c57aa96f9cd881654b15294d95d285c42a" + integrity sha512-FC+lgizVPfie0kkhqUScwRu1O/lF6NOgJmlCgK+/LYxDCTk8sGelYaHDhFcDN+Sn3Cv+3VSa4Byeo+IMCzpMgQ== + dependencies: + ansi-styles "^6.0.0" + is-fullwidth-code-point "^4.0.0" + +slice-ansi@^7.0.0: + version "7.1.0" + resolved "https://registry.yarnpkg.com/slice-ansi/-/slice-ansi-7.1.0.tgz#cd6b4655e298a8d1bdeb04250a433094b347b9a9" + integrity sha512-bSiSngZ/jWeX93BqeIAbImyTbEihizcwNjFoRUIY/T1wWQsfsm2Vw1agPKylXvQTU7iASGdHhyqRlqQzfz+Htg== + dependencies: + ansi-styles "^6.2.1" + is-fullwidth-code-point "^5.0.0" + slide@~1.1.3: version "1.1.6" resolved "https://registry.yarnpkg.com/slide/-/slide-1.1.6.tgz#56eb027d65b4d2dce6cb2e2d32c4d4afc9e1d707" @@ -28809,14 +28746,6 @@ string-width@^1.0.1: is-fullwidth-code-point "^1.0.0" strip-ansi "^3.0.0" -string-width@^2.1.1: - version "2.1.1" - resolved "https://registry.yarnpkg.com/string-width/-/string-width-2.1.1.tgz#ab93f27a8dc13d28cac815c462143a6d9012ae9e" - integrity sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw== - dependencies: - is-fullwidth-code-point "^2.0.0" - strip-ansi "^4.0.0" - string-width@^5.0.1, string-width@^5.1.2: version "5.1.2" resolved "https://registry.yarnpkg.com/string-width/-/string-width-5.1.2.tgz#14f8daec6d81e7221d2a357e668cab73bdbca794" @@ -28826,6 +28755,15 @@ string-width@^5.0.1, string-width@^5.1.2: emoji-regex "^9.2.2" strip-ansi "^7.0.1" +string-width@^7.0.0: + version "7.1.0" + resolved "https://registry.yarnpkg.com/string-width/-/string-width-7.1.0.tgz#d994252935224729ea3719c49f7206dc9c46550a" + integrity sha512-SEIJCWiX7Kg4c129n48aDRwLbFb2LJmXXFrWBG4NGaRtMQ3myKPKbwrD1BKqQn74oCoNMBVrfDEr5M9YxCsrkw== + dependencies: + emoji-regex "^10.3.0" + get-east-asian-width "^1.0.0" + strip-ansi "^7.1.0" + "string.prototype.matchall@^4.0.0 || ^3.0.1", string.prototype.matchall@^4.0.8: version "4.0.8" resolved "https://registry.yarnpkg.com/string.prototype.matchall/-/string.prototype.matchall-4.0.8.tgz#3bf85722021816dcd1bf38bb714915887ca79fd3" @@ -28931,13 +28869,6 @@ strip-ansi@^3.0.0, strip-ansi@^3.0.1: dependencies: ansi-regex "^2.0.0" -strip-ansi@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-4.0.0.tgz#a8479022eb1ac368a871389b635262c505ee368f" - integrity sha1-qEeQIusaw2iocTibY1JixQXuNo8= - dependencies: - ansi-regex "^3.0.0" - strip-ansi@^7.0.1, strip-ansi@^7.1.0: version "7.1.0" resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-7.1.0.tgz#d5b6568ca689d8561370b0707685d22434faff45" @@ -29290,7 +29221,7 @@ swrv@1.0.4: resolved "https://registry.yarnpkg.com/swrv/-/swrv-1.0.4.tgz#278b4811ed4acbb1ae46654972a482fd1847e480" integrity sha512-zjEkcP8Ywmj+xOJW3lIT65ciY/4AL4e/Or7Gj0MzU3zBJNMdJiT8geVZhINavnlHRMMCcJLHhraLTAiDOTmQ9g== -symbol-observable@^1.1.0, symbol-observable@^1.2.0: +symbol-observable@^1.2.0: version "1.2.0" resolved "https://registry.yarnpkg.com/symbol-observable/-/symbol-observable-1.2.0.tgz#c22688aed4eab3cdc2dfeacbb561660560a00804" integrity sha512-e900nM8RRtGhlV36KGEU9k65K3mPb1WV70OdjfxlG2EAuM1noi/E/BaW/uMhL7bPEssK8QV57vN3esixjUvcXQ== @@ -31828,14 +31759,6 @@ wrap-ansi@^2.0.0: string-width "^1.0.1" strip-ansi "^3.0.1" -wrap-ansi@^3.0.1: - version "3.0.1" - resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-3.0.1.tgz#288a04d87eda5c286e060dfe8f135ce8d007f8ba" - integrity sha1-KIoE2H7aXChuBg3+jxNc6NAH+Lo= - dependencies: - string-width "^2.1.1" - strip-ansi "^4.0.0" - wrap-ansi@^6.2.0: version "6.2.0" resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-6.2.0.tgz#e9393ba07102e6c91a3b221478f0257cd2856e53" @@ -31854,6 +31777,15 @@ wrap-ansi@^8.1.0: string-width "^5.0.1" strip-ansi "^7.0.1" +wrap-ansi@^9.0.0: + version "9.0.0" + resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-9.0.0.tgz#1a3dc8b70d85eeb8398ddfb1e4a02cd186e58b3e" + integrity sha512-G8ura3S+3Z2G+mkgNRq8dqaFZAuxfsxpBB8OCTGRTCtp+l/v9nbFNmCUP1BZMts3G1142MsZfn6eeUKrr4PD1Q== + dependencies: + ansi-styles "^6.2.1" + string-width "^7.0.0" + strip-ansi "^7.1.0" + wrappy@1: version "1.0.2" resolved "https://registry.yarnpkg.com/wrappy/-/wrappy-1.0.2.tgz#b5243d8f3ec1aa35f1364605bc0d1036e30ab69f" From 9c090ccccc72329301ffe4466b2420fb9032619e Mon Sep 17 00:00:00 2001 From: amyjtechwriter <61687663+amyjtechwriter@users.noreply.github.com> Date: Tue, 7 May 2024 12:38:16 +0100 Subject: [PATCH 17/86] [DOCS] Kibana 8.13.4 release notes (#182795) ## Summary Adds the 8.13.4 release notes. --- docs/CHANGELOG.asciidoc | 14 ++++++++++++++ 1 file changed, 14 insertions(+) diff --git a/docs/CHANGELOG.asciidoc b/docs/CHANGELOG.asciidoc index e821cb98f4fd0..09b083b7213b2 100644 --- a/docs/CHANGELOG.asciidoc +++ b/docs/CHANGELOG.asciidoc @@ -10,6 +10,7 @@ Review important information about the {kib} 8.x releases. +* <> * <> * <> * <> @@ -65,6 +66,19 @@ Review important information about the {kib} 8.x releases. -- +[[release-notes-8.13.4]] +== {kib} 8.13.4 + +The 8.13.4 release includes the following bug fixes. + +[float] +[[fixes-v8.13.4]] +=== Bug Fixes +Lens & Visualizations:: +* Fixes table sorting when changing the interval on the time picker in *Lens* ({kibana-pull}182173[#182173]). +Dashboards:: +* Fixes a bug with drilldowns where the control group on a source dashboard could be replaced by the control group from the destination dashboard ({kibana-pull}179485[#179485]). + [[release-notes-8.13.3]] == {kib} 8.13.3 From da11705614e44c0eb8c072cc0de9d9ee5000983d Mon Sep 17 00:00:00 2001 From: Kyle Pollich Date: Tue, 7 May 2024 07:52:05 -0400 Subject: [PATCH 18/86] [Fleet] Switch Fleet SO namespaceType to single behind a feature flag (#181436) Ref https://github.com/elastic/kibana/issues/180708 Closes https://github.com/elastic/kibana/issues/181860 Allows Fleet's saved object definitions to be switched to `namespaceType: single` based on the presence of a feature flag. --------- Co-authored-by: kibanamachine <42973632+kibanamachine@users.noreply.github.com> --- .../fleet/common/experimental_features.ts | 1 + x-pack/plugins/fleet/server/plugin.ts | 7 +- .../fleet/server/saved_objects/index.ts | 1207 +++++++++-------- 3 files changed, 614 insertions(+), 601 deletions(-) diff --git a/x-pack/plugins/fleet/common/experimental_features.ts b/x-pack/plugins/fleet/common/experimental_features.ts index a12711012f307..0350af4f24620 100644 --- a/x-pack/plugins/fleet/common/experimental_features.ts +++ b/x-pack/plugins/fleet/common/experimental_features.ts @@ -30,6 +30,7 @@ export const allowedExperimentalValues = Object.freeze>( subfeaturePrivileges: false, enablePackagesStateMachine: true, advancedPolicySettings: true, + useSpaceAwareness: false, }); type ExperimentalConfigKeys = Array; diff --git a/x-pack/plugins/fleet/server/plugin.ts b/x-pack/plugins/fleet/server/plugin.ts index c24f7859b1189..02e6d7baf9577 100644 --- a/x-pack/plugins/fleet/server/plugin.ts +++ b/x-pack/plugins/fleet/server/plugin.ts @@ -288,10 +288,13 @@ export class FleetPlugin core.status.set(this.fleetStatus$.asObservable()); - registerSavedObjects(core.savedObjects); + const experimentalFeatures = parseExperimentalConfigValue(config.enableExperimental ?? []); + + registerSavedObjects(core.savedObjects, { + useSpaceAwareness: experimentalFeatures.useSpaceAwareness, + }); registerEncryptedSavedObjects(deps.encryptedSavedObjects); - const experimentalFeatures = parseExperimentalConfigValue(config.enableExperimental ?? []); // Register feature if (deps.features) { deps.features.registerKibanaFeature({ diff --git a/x-pack/plugins/fleet/server/saved_objects/index.ts b/x-pack/plugins/fleet/server/saved_objects/index.ts index d1ed80cce4e43..6124205017dc5 100644 --- a/x-pack/plugins/fleet/server/saved_objects/index.ts +++ b/x-pack/plugins/fleet/server/saved_objects/index.ts @@ -92,259 +92,205 @@ import { settingsV1 } from './model_versions/v1'; * Please update typings in `/common/types` as well as * schemas in `/server/types` if mappings are updated. */ -export const getSavedObjectTypes = (): { [key: string]: SavedObjectsType } => ({ - // Deprecated - [GLOBAL_SETTINGS_SAVED_OBJECT_TYPE]: { - name: GLOBAL_SETTINGS_SAVED_OBJECT_TYPE, - indexPattern: INGEST_SAVED_OBJECT_INDEX, - hidden: false, - namespaceType: 'agnostic', - management: { - importableAndExportable: false, - }, - mappings: { - properties: { - fleet_server_hosts: { type: 'keyword' }, - has_seen_add_data_notice: { type: 'boolean', index: false }, - prerelease_integrations_enabled: { type: 'boolean' }, - secret_storage_requirements_met: { type: 'boolean' }, - output_secret_storage_requirements_met: { type: 'boolean' }, +export const getSavedObjectTypes = ( + options = { useSpaceAwareness: false } +): { [key: string]: SavedObjectsType } => { + const { useSpaceAwareness } = options; + + return { + // Deprecated + [GLOBAL_SETTINGS_SAVED_OBJECT_TYPE]: { + name: GLOBAL_SETTINGS_SAVED_OBJECT_TYPE, + indexPattern: INGEST_SAVED_OBJECT_INDEX, + hidden: false, + namespaceType: 'agnostic', + management: { + importableAndExportable: false, }, - }, - migrations: { - '7.10.0': migrateSettingsToV7100, - '7.13.0': migrateSettingsToV7130, - '8.6.0': migrateSettingsToV860, - }, - modelVersions: { - 1: settingsV1, - }, - }, - [AGENT_POLICY_SAVED_OBJECT_TYPE]: { - name: AGENT_POLICY_SAVED_OBJECT_TYPE, - indexPattern: INGEST_SAVED_OBJECT_INDEX, - hidden: false, - namespaceType: 'agnostic', - management: { - importableAndExportable: false, - }, - mappings: { - properties: { - name: { type: 'keyword' }, - schema_version: { type: 'version' }, - description: { type: 'text' }, - namespace: { type: 'keyword' }, - is_managed: { type: 'boolean' }, - is_default: { type: 'boolean' }, - is_default_fleet_server: { type: 'boolean' }, - status: { type: 'keyword' }, - unenroll_timeout: { type: 'integer' }, - inactivity_timeout: { type: 'integer' }, - updated_at: { type: 'date' }, - updated_by: { type: 'keyword' }, - revision: { type: 'integer' }, - monitoring_enabled: { type: 'keyword', index: false }, - is_preconfigured: { type: 'keyword' }, - data_output_id: { type: 'keyword' }, - monitoring_output_id: { type: 'keyword' }, - download_source_id: { type: 'keyword' }, - fleet_server_host_id: { type: 'keyword' }, - agent_features: { - properties: { - name: { type: 'keyword' }, - enabled: { type: 'boolean' }, - }, + mappings: { + properties: { + fleet_server_hosts: { type: 'keyword' }, + has_seen_add_data_notice: { type: 'boolean', index: false }, + prerelease_integrations_enabled: { type: 'boolean' }, + secret_storage_requirements_met: { type: 'boolean' }, + output_secret_storage_requirements_met: { type: 'boolean' }, }, - is_protected: { type: 'boolean' }, - overrides: { type: 'flattened', index: false }, - keep_monitoring_alive: { type: 'boolean' }, - advanced_settings: { type: 'flattened', index: false }, }, - }, - migrations: { - '7.10.0': migrateAgentPolicyToV7100, - '7.12.0': migrateAgentPolicyToV7120, - '8.4.0': migrateAgentPolicyToV840, - '8.5.0': migrateAgentPolicyToV850, - '8.9.0': migrateAgentPolicyToV890, - }, - modelVersions: { - '1': { - changes: [ - { - type: 'mappings_addition', - addedMappings: { - advanced_settings: { type: 'flattened', index: false }, - }, - }, - ], + migrations: { + '7.10.0': migrateSettingsToV7100, + '7.13.0': migrateSettingsToV7130, + '8.6.0': migrateSettingsToV860, + }, + modelVersions: { + 1: settingsV1, }, }, - }, - [OUTPUT_SAVED_OBJECT_TYPE]: { - name: OUTPUT_SAVED_OBJECT_TYPE, - indexPattern: INGEST_SAVED_OBJECT_INDEX, - hidden: false, - namespaceType: 'agnostic', - management: { - importableAndExportable: false, - }, - mappings: { - properties: { - output_id: { type: 'keyword', index: false }, - name: { type: 'keyword' }, - type: { type: 'keyword' }, - is_default: { type: 'boolean' }, - is_default_monitoring: { type: 'boolean' }, - hosts: { type: 'keyword' }, - ca_sha256: { type: 'keyword', index: false }, - ca_trusted_fingerprint: { type: 'keyword', index: false }, - service_token: { type: 'keyword', index: false }, - config: { type: 'flattened' }, - config_yaml: { type: 'text' }, - is_preconfigured: { type: 'boolean', index: false }, - is_internal: { type: 'boolean', index: false }, - ssl: { type: 'binary' }, - proxy_id: { type: 'keyword' }, - shipper: { - dynamic: false, // we aren't querying or aggregating over this data, so we don't need to specify any fields - properties: {}, - }, - allow_edit: { enabled: false }, - version: { type: 'keyword' }, - key: { type: 'keyword' }, - compression: { type: 'keyword' }, - compression_level: { type: 'integer' }, - client_id: { type: 'keyword' }, - auth_type: { type: 'keyword' }, - connection_type: { type: 'keyword' }, - username: { type: 'keyword' }, - password: { type: 'text', index: false }, - sasl: { - dynamic: false, - properties: { - mechanism: { type: 'text' }, - }, - }, - partition: { type: 'keyword' }, - random: { - dynamic: false, - properties: { - group_events: { type: 'integer' }, + [AGENT_POLICY_SAVED_OBJECT_TYPE]: { + name: AGENT_POLICY_SAVED_OBJECT_TYPE, + indexPattern: INGEST_SAVED_OBJECT_INDEX, + hidden: false, + namespaceType: useSpaceAwareness ? 'single' : 'agnostic', + management: { + importableAndExportable: false, + }, + mappings: { + properties: { + name: { type: 'keyword' }, + schema_version: { type: 'version' }, + description: { type: 'text' }, + namespace: { type: 'keyword' }, + is_managed: { type: 'boolean' }, + is_default: { type: 'boolean' }, + is_default_fleet_server: { type: 'boolean' }, + status: { type: 'keyword' }, + unenroll_timeout: { type: 'integer' }, + inactivity_timeout: { type: 'integer' }, + updated_at: { type: 'date' }, + updated_by: { type: 'keyword' }, + revision: { type: 'integer' }, + monitoring_enabled: { type: 'keyword', index: false }, + is_preconfigured: { type: 'keyword' }, + data_output_id: { type: 'keyword' }, + monitoring_output_id: { type: 'keyword' }, + download_source_id: { type: 'keyword' }, + fleet_server_host_id: { type: 'keyword' }, + agent_features: { + properties: { + name: { type: 'keyword' }, + enabled: { type: 'boolean' }, + }, }, + is_protected: { type: 'boolean' }, + overrides: { type: 'flattened', index: false }, + keep_monitoring_alive: { type: 'boolean' }, + advanced_settings: { type: 'flattened', index: false }, }, - round_robin: { - dynamic: false, - properties: { - group_events: { type: 'integer' }, - }, + }, + migrations: { + '7.10.0': migrateAgentPolicyToV7100, + '7.12.0': migrateAgentPolicyToV7120, + '8.4.0': migrateAgentPolicyToV840, + '8.5.0': migrateAgentPolicyToV850, + '8.9.0': migrateAgentPolicyToV890, + }, + modelVersions: { + '1': { + changes: [ + { + type: 'mappings_addition', + addedMappings: { + advanced_settings: { type: 'flattened', index: false }, + }, + }, + ], }, - hash: { - dynamic: false, - properties: { - hash: { type: 'text' }, - random: { type: 'boolean' }, + }, + }, + [OUTPUT_SAVED_OBJECT_TYPE]: { + name: OUTPUT_SAVED_OBJECT_TYPE, + indexPattern: INGEST_SAVED_OBJECT_INDEX, + hidden: false, + namespaceType: 'agnostic', + management: { + importableAndExportable: false, + }, + mappings: { + properties: { + output_id: { type: 'keyword', index: false }, + name: { type: 'keyword' }, + type: { type: 'keyword' }, + is_default: { type: 'boolean' }, + is_default_monitoring: { type: 'boolean' }, + hosts: { type: 'keyword' }, + ca_sha256: { type: 'keyword', index: false }, + ca_trusted_fingerprint: { type: 'keyword', index: false }, + service_token: { type: 'keyword', index: false }, + config: { type: 'flattened' }, + config_yaml: { type: 'text' }, + is_preconfigured: { type: 'boolean', index: false }, + is_internal: { type: 'boolean', index: false }, + ssl: { type: 'binary' }, + proxy_id: { type: 'keyword' }, + shipper: { + dynamic: false, // we aren't querying or aggregating over this data, so we don't need to specify any fields + properties: {}, + }, + allow_edit: { enabled: false }, + version: { type: 'keyword' }, + key: { type: 'keyword' }, + compression: { type: 'keyword' }, + compression_level: { type: 'integer' }, + client_id: { type: 'keyword' }, + auth_type: { type: 'keyword' }, + connection_type: { type: 'keyword' }, + username: { type: 'keyword' }, + password: { type: 'text', index: false }, + sasl: { + dynamic: false, + properties: { + mechanism: { type: 'text' }, + }, }, - }, - topic: { type: 'text', index: false }, - topics: { - dynamic: false, - properties: { - topic: { type: 'keyword' }, - when: { - dynamic: false, - properties: { - type: { type: 'text' }, - condition: { type: 'text' }, - }, + partition: { type: 'keyword' }, + random: { + dynamic: false, + properties: { + group_events: { type: 'integer' }, }, }, - }, - headers: { - dynamic: false, - properties: { - key: { type: 'text' }, - value: { type: 'text' }, + round_robin: { + dynamic: false, + properties: { + group_events: { type: 'integer' }, + }, }, - }, - timeout: { type: 'integer' }, - broker_timeout: { type: 'integer' }, - broker_ack_reliability: { type: 'text' }, - broker_buffer_size: { type: 'integer' }, - required_acks: { type: 'integer' }, - channel_buffer_size: { type: 'integer' }, - secrets: { - dynamic: false, - properties: { - password: { - dynamic: false, - properties: { - id: { type: 'keyword' }, - }, + hash: { + dynamic: false, + properties: { + hash: { type: 'text' }, + random: { type: 'boolean' }, }, - ssl: { - dynamic: false, - properties: { - key: { - dynamic: false, - properties: { - id: { type: 'keyword' }, - }, + }, + topic: { type: 'text', index: false }, + topics: { + dynamic: false, + properties: { + topic: { type: 'keyword' }, + when: { + dynamic: false, + properties: { + type: { type: 'text' }, + condition: { type: 'text' }, }, }, }, - service_token: { - dynamic: false, - properties: { - id: { type: 'keyword' }, - }, - }, }, - }, - preset: { - type: 'keyword', - index: false, - }, - }, - }, - modelVersions: { - '1': { - changes: [ - { - type: 'mappings_deprecation', - deprecatedMappings: [ - 'broker_ack_reliability', - 'broker_buffer_size', - 'channel_buffer_size', - ], - }, - { - type: 'data_backfill', - backfillFn: migrateOutputToV8100, - }, - ], - schemas: { - forwardCompatibility: migrateOutputEvictionsFromV8100, - }, - }, - '2': { - changes: [ - { - type: 'mappings_addition', - addedMappings: { - service_token: { type: 'keyword', index: false }, + headers: { + dynamic: false, + properties: { + key: { type: 'text' }, + value: { type: 'text' }, }, }, - ], - }, - '3': { - changes: [ - { - type: 'mappings_addition', - addedMappings: { - secrets: { + timeout: { type: 'integer' }, + broker_timeout: { type: 'integer' }, + broker_ack_reliability: { type: 'text' }, + broker_buffer_size: { type: 'integer' }, + required_acks: { type: 'integer' }, + channel_buffer_size: { type: 'integer' }, + secrets: { + dynamic: false, + properties: { + password: { + dynamic: false, properties: { - service_token: { + id: { type: 'keyword' }, + }, + }, + ssl: { + dynamic: false, + properties: { + key: { dynamic: false, properties: { id: { type: 'keyword' }, @@ -352,425 +298,488 @@ export const getSavedObjectTypes = (): { [key: string]: SavedObjectsType } => ({ }, }, }, - }, - }, - ], - }, - '4': { - changes: [ - { - type: 'mappings_addition', - addedMappings: { - preset: { - type: 'keyword', - index: false, + service_token: { + dynamic: false, + properties: { + id: { type: 'keyword' }, + }, }, }, }, - ], - }, - '5': { - changes: [ - { - type: 'mappings_addition', - addedMappings: { - is_internal: { type: 'boolean', index: false }, - }, + preset: { + type: 'keyword', + index: false, }, - ], + }, }, - '6': { - changes: [ - { - type: 'mappings_addition', - addedMappings: { - topic: { type: 'text', index: false }, + modelVersions: { + '1': { + changes: [ + { + type: 'mappings_deprecation', + deprecatedMappings: [ + 'broker_ack_reliability', + 'broker_buffer_size', + 'channel_buffer_size', + ], }, - }, - ], - }, - }, - migrations: { - '7.13.0': migrateOutputToV7130, - '8.0.0': migrateOutputToV800, - }, - }, - [PACKAGE_POLICY_SAVED_OBJECT_TYPE]: { - name: PACKAGE_POLICY_SAVED_OBJECT_TYPE, - indexPattern: INGEST_SAVED_OBJECT_INDEX, - hidden: false, - namespaceType: 'agnostic', - management: { - importableAndExportable: false, - }, - mappings: { - properties: { - name: { type: 'keyword' }, - description: { type: 'text' }, - namespace: { type: 'keyword' }, - enabled: { type: 'boolean' }, - is_managed: { type: 'boolean' }, - policy_id: { type: 'keyword' }, - package: { - properties: { - name: { type: 'keyword' }, - title: { type: 'keyword' }, - version: { type: 'keyword' }, + { + type: 'data_backfill', + backfillFn: migrateOutputToV8100, + }, + ], + schemas: { + forwardCompatibility: migrateOutputEvictionsFromV8100, }, }, - elasticsearch: { - dynamic: false, - properties: {}, + '2': { + changes: [ + { + type: 'mappings_addition', + addedMappings: { + service_token: { type: 'keyword', index: false }, + }, + }, + ], }, - vars: { type: 'flattened' }, - inputs: { - dynamic: false, - properties: {}, + '3': { + changes: [ + { + type: 'mappings_addition', + addedMappings: { + secrets: { + properties: { + service_token: { + dynamic: false, + properties: { + id: { type: 'keyword' }, + }, + }, + }, + }, + }, + }, + ], }, - secret_references: { properties: { id: { type: 'keyword' } } }, - overrides: { type: 'flattened', index: false }, - revision: { type: 'integer' }, - updated_at: { type: 'date' }, - updated_by: { type: 'keyword' }, - created_at: { type: 'date' }, - created_by: { type: 'keyword' }, - }, - }, - modelVersions: { - '1': { - changes: [ - { - type: 'data_backfill', - backfillFn: migratePackagePolicyToV8100, - }, - { - type: 'data_backfill', - backfillFn: migrateSyntheticsPackagePolicyToV8100, - }, - ], - schemas: { - forwardCompatibility: migratePackagePolicyEvictionsFromV8100, + '4': { + changes: [ + { + type: 'mappings_addition', + addedMappings: { + preset: { + type: 'keyword', + index: false, + }, + }, + }, + ], }, - }, - '2': { - changes: [ - { - type: 'data_backfill', - backfillFn: migratePackagePolicyToV8110, - }, - ], - schemas: { - forwardCompatibility: migratePackagePolicyEvictionsFromV8110, + '5': { + changes: [ + { + type: 'mappings_addition', + addedMappings: { + is_internal: { type: 'boolean', index: false }, + }, + }, + ], }, - }, - '3': { - changes: [ - { - type: 'data_backfill', - backfillFn: migratePackagePolicyToV81102, - }, - ], - schemas: { - forwardCompatibility: migratePackagePolicyEvictionsFromV81102, + '6': { + changes: [ + { + type: 'mappings_addition', + addedMappings: { + topic: { type: 'text', index: false }, + }, + }, + ], }, }, - '4': { - changes: [ - { - type: 'data_backfill', - backfillFn: migrateCspPackagePolicyToV8110, - }, - ], + migrations: { + '7.13.0': migrateOutputToV7130, + '8.0.0': migrateOutputToV800, }, - '5': { - changes: [ - { - type: 'data_backfill', - backfillFn: migrateSyntheticsPackagePolicyToV8120, - }, - ], - }, - '6': { - changes: [ - { - type: 'data_backfill', - backfillFn: migratePackagePolicyToV8140, - }, - ], + }, + [PACKAGE_POLICY_SAVED_OBJECT_TYPE]: { + name: PACKAGE_POLICY_SAVED_OBJECT_TYPE, + indexPattern: INGEST_SAVED_OBJECT_INDEX, + hidden: false, + namespaceType: useSpaceAwareness ? 'single' : 'agnostic', + management: { + importableAndExportable: false, }, - '7': { - changes: [ - { - type: 'data_backfill', - backfillFn: migratePackagePolicyEnableCapsToV8140, + mappings: { + properties: { + name: { type: 'keyword' }, + description: { type: 'text' }, + namespace: { type: 'keyword' }, + enabled: { type: 'boolean' }, + is_managed: { type: 'boolean' }, + policy_id: { type: 'keyword' }, + package: { + properties: { + name: { type: 'keyword' }, + title: { type: 'keyword' }, + version: { type: 'keyword' }, + }, }, - ], + elasticsearch: { + dynamic: false, + properties: {}, + }, + vars: { type: 'flattened' }, + inputs: { + dynamic: false, + properties: {}, + }, + secret_references: { properties: { id: { type: 'keyword' } } }, + overrides: { type: 'flattened', index: false }, + revision: { type: 'integer' }, + updated_at: { type: 'date' }, + updated_by: { type: 'keyword' }, + created_at: { type: 'date' }, + created_by: { type: 'keyword' }, + }, }, - '8': { - changes: [ - { - type: 'data_backfill', - backfillFn: migratePackagePolicyAddAntivirusRegistrationModeToV8140, + modelVersions: { + '1': { + changes: [ + { + type: 'data_backfill', + backfillFn: migratePackagePolicyToV8100, + }, + { + type: 'data_backfill', + backfillFn: migrateSyntheticsPackagePolicyToV8100, + }, + ], + schemas: { + forwardCompatibility: migratePackagePolicyEvictionsFromV8100, }, - ], - }, - '9': { - changes: [ - { - type: 'mappings_addition', - addedMappings: { - overrides: { type: 'flattened', index: false }, + }, + '2': { + changes: [ + { + type: 'data_backfill', + backfillFn: migratePackagePolicyToV8110, }, + ], + schemas: { + forwardCompatibility: migratePackagePolicyEvictionsFromV8110, }, - ], - }, - }, - migrations: { - '7.10.0': migratePackagePolicyToV7100, - '7.11.0': migratePackagePolicyToV7110, - '7.12.0': migratePackagePolicyToV7120, - '7.13.0': migratePackagePolicyToV7130, - '7.14.0': migratePackagePolicyToV7140, - '7.15.0': migratePackagePolicyToV7150, - '7.16.0': migratePackagePolicyToV7160, - '8.2.0': migratePackagePolicyToV820, - '8.3.0': migratePackagePolicyToV830, - '8.4.0': migratePackagePolicyToV840, - '8.5.0': migratePackagePolicyToV850, - '8.6.0': migratePackagePolicyToV860, - '8.7.0': migratePackagePolicyToV870, - '8.8.0': migratePackagePolicyToV880, - }, - }, - [PACKAGES_SAVED_OBJECT_TYPE]: { - name: PACKAGES_SAVED_OBJECT_TYPE, - indexPattern: INGEST_SAVED_OBJECT_INDEX, - hidden: false, - namespaceType: 'agnostic', - management: { - importableAndExportable: false, - }, - mappings: { - properties: { - name: { type: 'keyword' }, - version: { type: 'keyword' }, - internal: { type: 'boolean' }, - keep_policies_up_to_date: { type: 'boolean', index: false }, - es_index_patterns: { - dynamic: false, - properties: {}, }, - verification_status: { type: 'keyword' }, - verification_key_id: { type: 'keyword' }, - installed_es: { - type: 'nested', - properties: { - id: { type: 'keyword' }, - type: { type: 'keyword' }, - version: { type: 'keyword' }, - deferred: { type: 'boolean' }, + '3': { + changes: [ + { + type: 'data_backfill', + backfillFn: migratePackagePolicyToV81102, + }, + ], + schemas: { + forwardCompatibility: migratePackagePolicyEvictionsFromV81102, }, }, - latest_install_failed_attempts: { type: 'object', enabled: false }, - latest_executed_state: { type: 'object', enabled: false }, - installed_kibana: { - dynamic: false, - properties: {}, + '4': { + changes: [ + { + type: 'data_backfill', + backfillFn: migrateCspPackagePolicyToV8110, + }, + ], }, - installed_kibana_space_id: { type: 'keyword' }, - package_assets: { - dynamic: false, - properties: {}, + '5': { + changes: [ + { + type: 'data_backfill', + backfillFn: migrateSyntheticsPackagePolicyToV8120, + }, + ], + }, + '6': { + changes: [ + { + type: 'data_backfill', + backfillFn: migratePackagePolicyToV8140, + }, + ], }, - install_started_at: { type: 'date' }, - install_version: { type: 'keyword' }, - install_status: { type: 'keyword' }, - install_source: { type: 'keyword' }, - install_format_schema_version: { type: 'version' }, - experimental_data_stream_features: { - type: 'nested', - properties: { - data_stream: { type: 'keyword' }, - features: { - type: 'nested', - dynamic: false, - properties: { - synthetic_source: { type: 'boolean' }, - tsdb: { type: 'boolean' }, + '7': { + changes: [ + { + type: 'data_backfill', + backfillFn: migratePackagePolicyEnableCapsToV8140, + }, + ], + }, + '8': { + changes: [ + { + type: 'data_backfill', + backfillFn: migratePackagePolicyAddAntivirusRegistrationModeToV8140, + }, + ], + }, + '9': { + changes: [ + { + type: 'mappings_addition', + addedMappings: { + overrides: { type: 'flattened', index: false }, }, }, - }, + ], }, }, + migrations: { + '7.10.0': migratePackagePolicyToV7100, + '7.11.0': migratePackagePolicyToV7110, + '7.12.0': migratePackagePolicyToV7120, + '7.13.0': migratePackagePolicyToV7130, + '7.14.0': migratePackagePolicyToV7140, + '7.15.0': migratePackagePolicyToV7150, + '7.16.0': migratePackagePolicyToV7160, + '8.2.0': migratePackagePolicyToV820, + '8.3.0': migratePackagePolicyToV830, + '8.4.0': migratePackagePolicyToV840, + '8.5.0': migratePackagePolicyToV850, + '8.6.0': migratePackagePolicyToV860, + '8.7.0': migratePackagePolicyToV870, + '8.8.0': migratePackagePolicyToV880, + }, }, - modelVersions: { - '1': { - changes: [ - { - type: 'mappings_addition', - addedMappings: { - latest_install_failed_attempts: { type: 'object', enabled: false }, + [PACKAGES_SAVED_OBJECT_TYPE]: { + name: PACKAGES_SAVED_OBJECT_TYPE, + indexPattern: INGEST_SAVED_OBJECT_INDEX, + hidden: false, + namespaceType: useSpaceAwareness ? 'single' : 'agnostic', + management: { + importableAndExportable: false, + }, + mappings: { + properties: { + name: { type: 'keyword' }, + version: { type: 'keyword' }, + internal: { type: 'boolean' }, + keep_policies_up_to_date: { type: 'boolean', index: false }, + es_index_patterns: { + dynamic: false, + properties: {}, + }, + verification_status: { type: 'keyword' }, + verification_key_id: { type: 'keyword' }, + installed_es: { + type: 'nested', + properties: { + id: { type: 'keyword' }, + type: { type: 'keyword' }, + version: { type: 'keyword' }, + deferred: { type: 'boolean' }, }, }, - ], - }, - '2': { - changes: [ - { - type: 'mappings_addition', - addedMappings: { - latest_executed_state: { type: 'object', enabled: false }, + latest_install_failed_attempts: { type: 'object', enabled: false }, + latest_executed_state: { type: 'object', enabled: false }, + installed_kibana: { + dynamic: false, + properties: {}, + }, + installed_kibana_space_id: { type: 'keyword' }, + package_assets: { + dynamic: false, + properties: {}, + }, + install_started_at: { type: 'date' }, + install_version: { type: 'keyword' }, + install_status: { type: 'keyword' }, + install_source: { type: 'keyword' }, + install_format_schema_version: { type: 'version' }, + experimental_data_stream_features: { + type: 'nested', + properties: { + data_stream: { type: 'keyword' }, + features: { + type: 'nested', + dynamic: false, + properties: { + synthetic_source: { type: 'boolean' }, + tsdb: { type: 'boolean' }, + }, + }, }, }, - ], + }, }, - }, - migrations: { - '7.14.0': migrateInstallationToV7140, - '7.14.1': migrateInstallationToV7140, - '7.16.0': migrateInstallationToV7160, - '8.0.0': migrateInstallationToV800, - '8.3.0': migrateInstallationToV830, - '8.4.0': migrateInstallationToV840, - '8.6.0': migrateInstallationToV860, - }, - }, - [ASSETS_SAVED_OBJECT_TYPE]: { - name: ASSETS_SAVED_OBJECT_TYPE, - indexPattern: INGEST_SAVED_OBJECT_INDEX, - hidden: false, - namespaceType: 'agnostic', - management: { - importableAndExportable: false, - }, - mappings: { - properties: { - package_name: { type: 'keyword' }, - package_version: { type: 'keyword' }, - install_source: { type: 'keyword' }, - asset_path: { type: 'keyword' }, - media_type: { type: 'keyword' }, - data_utf8: { type: 'text', index: false }, - data_base64: { type: 'binary' }, + modelVersions: { + '1': { + changes: [ + { + type: 'mappings_addition', + addedMappings: { + latest_install_failed_attempts: { type: 'object', enabled: false }, + }, + }, + ], + }, + '2': { + changes: [ + { + type: 'mappings_addition', + addedMappings: { + latest_executed_state: { type: 'object', enabled: false }, + }, + }, + ], + }, }, - }, - }, - [PRECONFIGURATION_DELETION_RECORD_SAVED_OBJECT_TYPE]: { - name: PRECONFIGURATION_DELETION_RECORD_SAVED_OBJECT_TYPE, - indexPattern: INGEST_SAVED_OBJECT_INDEX, - hidden: false, - namespaceType: 'agnostic', - management: { - importableAndExportable: false, - }, - mappings: { - properties: { - id: { type: 'keyword' }, + migrations: { + '7.14.0': migrateInstallationToV7140, + '7.14.1': migrateInstallationToV7140, + '7.16.0': migrateInstallationToV7160, + '8.0.0': migrateInstallationToV800, + '8.3.0': migrateInstallationToV830, + '8.4.0': migrateInstallationToV840, + '8.6.0': migrateInstallationToV860, }, }, - }, - [DOWNLOAD_SOURCE_SAVED_OBJECT_TYPE]: { - name: DOWNLOAD_SOURCE_SAVED_OBJECT_TYPE, - indexPattern: INGEST_SAVED_OBJECT_INDEX, - hidden: false, - namespaceType: 'agnostic', - management: { - importableAndExportable: false, - }, - mappings: { - properties: { - source_id: { type: 'keyword', index: false }, - name: { type: 'keyword' }, - is_default: { type: 'boolean' }, - host: { type: 'keyword' }, - proxy_id: { type: 'keyword' }, + [ASSETS_SAVED_OBJECT_TYPE]: { + name: ASSETS_SAVED_OBJECT_TYPE, + indexPattern: INGEST_SAVED_OBJECT_INDEX, + hidden: false, + namespaceType: useSpaceAwareness ? 'single' : 'agnostic', + management: { + importableAndExportable: false, + }, + mappings: { + properties: { + package_name: { type: 'keyword' }, + package_version: { type: 'keyword' }, + install_source: { type: 'keyword' }, + asset_path: { type: 'keyword' }, + media_type: { type: 'keyword' }, + data_utf8: { type: 'text', index: false }, + data_base64: { type: 'binary' }, + }, }, }, - }, - [FLEET_SERVER_HOST_SAVED_OBJECT_TYPE]: { - name: FLEET_SERVER_HOST_SAVED_OBJECT_TYPE, - indexPattern: INGEST_SAVED_OBJECT_INDEX, - hidden: false, - namespaceType: 'agnostic', - management: { - importableAndExportable: false, + [PRECONFIGURATION_DELETION_RECORD_SAVED_OBJECT_TYPE]: { + name: PRECONFIGURATION_DELETION_RECORD_SAVED_OBJECT_TYPE, + indexPattern: INGEST_SAVED_OBJECT_INDEX, + hidden: false, + namespaceType: useSpaceAwareness ? 'single' : 'agnostic', + management: { + importableAndExportable: false, + }, + mappings: { + properties: { + id: { type: 'keyword' }, + }, + }, }, - mappings: { - properties: { - name: { type: 'keyword' }, - is_default: { type: 'boolean' }, - is_internal: { type: 'boolean', index: false }, - host_urls: { type: 'keyword', index: false }, - is_preconfigured: { type: 'boolean' }, - proxy_id: { type: 'keyword' }, + [DOWNLOAD_SOURCE_SAVED_OBJECT_TYPE]: { + name: DOWNLOAD_SOURCE_SAVED_OBJECT_TYPE, + indexPattern: INGEST_SAVED_OBJECT_INDEX, + hidden: false, + namespaceType: useSpaceAwareness ? 'single' : 'agnostic', + management: { + importableAndExportable: false, + }, + mappings: { + properties: { + source_id: { type: 'keyword', index: false }, + name: { type: 'keyword' }, + is_default: { type: 'boolean' }, + host: { type: 'keyword' }, + proxy_id: { type: 'keyword' }, + }, }, }, - modelVersions: { - '1': { - changes: [ - { - type: 'mappings_addition', - addedMappings: { - is_internal: { type: 'boolean', index: false }, + [FLEET_SERVER_HOST_SAVED_OBJECT_TYPE]: { + name: FLEET_SERVER_HOST_SAVED_OBJECT_TYPE, + indexPattern: INGEST_SAVED_OBJECT_INDEX, + hidden: false, + namespaceType: 'agnostic', + management: { + importableAndExportable: false, + }, + mappings: { + properties: { + name: { type: 'keyword' }, + is_default: { type: 'boolean' }, + is_internal: { type: 'boolean', index: false }, + host_urls: { type: 'keyword', index: false }, + is_preconfigured: { type: 'boolean' }, + proxy_id: { type: 'keyword' }, + }, + }, + modelVersions: { + '1': { + changes: [ + { + type: 'mappings_addition', + addedMappings: { + is_internal: { type: 'boolean', index: false }, + }, }, - }, - ], + ], + }, }, }, - }, - [FLEET_PROXY_SAVED_OBJECT_TYPE]: { - name: FLEET_PROXY_SAVED_OBJECT_TYPE, - indexPattern: INGEST_SAVED_OBJECT_INDEX, - hidden: false, - namespaceType: 'agnostic', - management: { - importableAndExportable: false, - }, - mappings: { - properties: { - name: { type: 'keyword' }, - url: { type: 'keyword', index: false }, - proxy_headers: { type: 'text', index: false }, - certificate_authorities: { type: 'keyword', index: false }, - certificate: { type: 'keyword', index: false }, - certificate_key: { type: 'keyword', index: false }, - is_preconfigured: { type: 'boolean' }, + [FLEET_PROXY_SAVED_OBJECT_TYPE]: { + name: FLEET_PROXY_SAVED_OBJECT_TYPE, + indexPattern: INGEST_SAVED_OBJECT_INDEX, + hidden: false, + namespaceType: 'agnostic', + management: { + importableAndExportable: false, + }, + mappings: { + properties: { + name: { type: 'keyword' }, + url: { type: 'keyword', index: false }, + proxy_headers: { type: 'text', index: false }, + certificate_authorities: { type: 'keyword', index: false }, + certificate: { type: 'keyword', index: false }, + certificate_key: { type: 'keyword', index: false }, + is_preconfigured: { type: 'boolean' }, + }, }, }, - }, - [MESSAGE_SIGNING_KEYS_SAVED_OBJECT_TYPE]: { - name: MESSAGE_SIGNING_KEYS_SAVED_OBJECT_TYPE, - indexPattern: INGEST_SAVED_OBJECT_INDEX, - hidden: true, - namespaceType: 'agnostic', - management: { - importableAndExportable: false, - }, - mappings: { - dynamic: false, - properties: {}, - }, - }, - [UNINSTALL_TOKENS_SAVED_OBJECT_TYPE]: { - name: UNINSTALL_TOKENS_SAVED_OBJECT_TYPE, - indexPattern: INGEST_SAVED_OBJECT_INDEX, - hidden: true, - namespaceType: 'agnostic', - management: { - importableAndExportable: false, + [MESSAGE_SIGNING_KEYS_SAVED_OBJECT_TYPE]: { + name: MESSAGE_SIGNING_KEYS_SAVED_OBJECT_TYPE, + indexPattern: INGEST_SAVED_OBJECT_INDEX, + hidden: true, + namespaceType: useSpaceAwareness ? 'single' : 'agnostic', + management: { + importableAndExportable: false, + }, + mappings: { + dynamic: false, + properties: {}, + }, }, - mappings: { - dynamic: false, - properties: { - policy_id: { type: 'keyword' }, - token_plain: { type: 'keyword' }, + [UNINSTALL_TOKENS_SAVED_OBJECT_TYPE]: { + name: UNINSTALL_TOKENS_SAVED_OBJECT_TYPE, + indexPattern: INGEST_SAVED_OBJECT_INDEX, + hidden: true, + namespaceType: useSpaceAwareness ? 'single' : 'agnostic', + management: { + importableAndExportable: false, + }, + mappings: { + dynamic: false, + properties: { + policy_id: { type: 'keyword' }, + token_plain: { type: 'keyword' }, + }, }, }, - }, -}); + }; +}; -export function registerSavedObjects(savedObjects: SavedObjectsServiceSetup) { - const savedObjectTypes = getSavedObjectTypes(); +export function registerSavedObjects( + savedObjects: SavedObjectsServiceSetup, + options = { useSpaceAwareness: false } +) { + const savedObjectTypes = getSavedObjectTypes({ useSpaceAwareness: options.useSpaceAwareness }); Object.values(savedObjectTypes).forEach((type) => { savedObjects.registerType(type); }); From fdc79c262b112290ffade1c2a4ea39f1a139a8f8 Mon Sep 17 00:00:00 2001 From: Drew Tate Date: Tue, 7 May 2024 06:50:25 -0600 Subject: [PATCH 19/86] [ES|QL] bucket as an aggregation (#182762) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit ## Summary This PR adds validation and autocomplete support for the `bucket` function to be used in both the `stats` clause and the `by` clause in accordance with [the docs](https://www.elastic.co/guide/en/elasticsearch/reference/master/esql-functions-operators.html#esql-bucket): Screenshot 2024-05-06 at 10 45 03 AM It also fixes the short-hand signature of `bucket(numberField, number)` which was incorrectly configured as `bucket(numberField, time_literal)`. ### Checklist Delete any items that are not applicable to this PR. - [x] [Documentation](https://www.elastic.co/guide/en/kibana/master/development-documentation.html) was added for features that require explanation or tutorials - [x] [Unit or functional tests](https://www.elastic.co/guide/en/kibana/master/development-tests.html) were updated or added to match the most common scenarios --- .../src/autocomplete/autocomplete.test.ts | 9 +++++++-- .../src/autocomplete/autocomplete.ts | 16 ++++++++++------ .../src/definitions/commands.ts | 4 ++++ .../src/definitions/grouping.ts | 7 ++++--- .../src/definitions/types.ts | 2 +- .../validation/esql_validation_meta_tests.json | 10 ++++++---- 6 files changed, 32 insertions(+), 16 deletions(-) diff --git a/packages/kbn-esql-validation-autocomplete/src/autocomplete/autocomplete.test.ts b/packages/kbn-esql-validation-autocomplete/src/autocomplete/autocomplete.test.ts index 02d609c9a9a17..f173ec52039e7 100644 --- a/packages/kbn-esql-validation-autocomplete/src/autocomplete/autocomplete.test.ts +++ b/packages/kbn-esql-validation-autocomplete/src/autocomplete/autocomplete.test.ts @@ -109,6 +109,8 @@ function getFunctionSignaturesByReturnType( const list = []; if (agg) { list.push(...statsAggregationFunctionDefinitions); + // right now all grouping functions are agg functions too + list.push(...groupingFunctionDefinitions); } if (grouping) { list.push(...groupingFunctionDefinitions); @@ -120,7 +122,10 @@ function getFunctionSignaturesByReturnType( if (builtin) { list.push(...builtinFunctions.filter(({ name }) => (skipAssign ? name !== '=' : true))); } - return list + + const deduped = Array.from(new Set(list)); + + return deduped .filter(({ signatures, ignoreAsSuggestion, supportedCommands, supportedOptions, name }) => { if (ignoreAsSuggestion) { return false; @@ -732,7 +737,7 @@ describe('autocomplete', () => { testSuggestions( 'from a | stats round(', [ - ...getFunctionSignaturesByReturnType('stats', 'number', { agg: true }), + ...getFunctionSignaturesByReturnType('stats', 'number', { agg: true, grouping: true }), ...getFieldNamesByType('number'), ...getFunctionSignaturesByReturnType('eval', 'number', { evalMath: true }, undefined, [ 'round', diff --git a/packages/kbn-esql-validation-autocomplete/src/autocomplete/autocomplete.ts b/packages/kbn-esql-validation-autocomplete/src/autocomplete/autocomplete.ts index d45ffcde9c8a2..db1824dac44f7 100644 --- a/packages/kbn-esql-validation-autocomplete/src/autocomplete/autocomplete.ts +++ b/packages/kbn-esql-validation-autocomplete/src/autocomplete/autocomplete.ts @@ -1106,12 +1106,16 @@ async function getFunctionArgsSuggestions( new Set( fnDefinition.signatures.reduce((acc, signature) => { const p = signature.params[argIndex]; - const _suggestions: string[] = - p && p.literalSuggestions - ? p.literalSuggestions - : p && p.literalOptions - ? p.literalOptions - : []; + if (!p) { + return acc; + } + + const _suggestions: string[] = p.literalSuggestions + ? p.literalSuggestions + : p.literalOptions + ? p.literalOptions + : []; + return acc.concat(_suggestions); }, [] as string[]) ) diff --git a/packages/kbn-esql-validation-autocomplete/src/definitions/commands.ts b/packages/kbn-esql-validation-autocomplete/src/definitions/commands.ts index 861d18110d08f..414c0fa6a8a9a 100644 --- a/packages/kbn-esql-validation-autocomplete/src/definitions/commands.ts +++ b/packages/kbn-esql-validation-autocomplete/src/definitions/commands.ts @@ -134,6 +134,8 @@ export const commandDefinitions: CommandDefinition[] = [ } function checkAggExistence(arg: ESQLFunction): boolean { + // TODO the grouping function check may not + // hold true for all future cases if (isAggFunction(arg)) { return true; } @@ -172,6 +174,8 @@ export const commandDefinitions: CommandDefinition[] = [ // * or if it's a builtin function, then all operands are agg functions or literals // * or if it's a eval function then all arguments are agg functions or literals function checkFunctionContent(arg: ESQLFunction) { + // TODO the grouping function check may not + // hold true for all future cases if (isAggFunction(arg)) { return true; } diff --git a/packages/kbn-esql-validation-autocomplete/src/definitions/grouping.ts b/packages/kbn-esql-validation-autocomplete/src/definitions/grouping.ts index 612b898d4c6c6..fc725cbe0b429 100644 --- a/packages/kbn-esql-validation-autocomplete/src/definitions/grouping.ts +++ b/packages/kbn-esql-validation-autocomplete/src/definitions/grouping.ts @@ -16,8 +16,9 @@ export const groupingFunctionDefinitions: FunctionDefinition[] = [ description: i18n.translate('kbn-esql-validation-autocomplete.esql.definitions.autoBucketDoc', { defaultMessage: `Automatically bucket dates based on a given range and bucket target.`, }), - type: 'grouping', - supportedCommands: [], + // type agg because it can also be used as an aggregation... + type: 'agg', + supportedCommands: ['stats'], supportedOptions: ['by'], signatures: [ { @@ -31,7 +32,7 @@ export const groupingFunctionDefinitions: FunctionDefinition[] = [ { params: [ { name: 'field', type: 'number' }, - { name: 'buckets', type: 'time_literal', constantOnly: true }, + { name: 'buckets', type: 'number', constantOnly: true }, ], returnType: 'number', examples: ['from index | eval hd = bucket(bytes, 1 hour)'], diff --git a/packages/kbn-esql-validation-autocomplete/src/definitions/types.ts b/packages/kbn-esql-validation-autocomplete/src/definitions/types.ts index 0ae892bf98fa6..b4997f68ba919 100644 --- a/packages/kbn-esql-validation-autocomplete/src/definitions/types.ts +++ b/packages/kbn-esql-validation-autocomplete/src/definitions/types.ts @@ -9,7 +9,7 @@ import type { ESQLCommand, ESQLCommandOption, ESQLFunction, ESQLMessage } from '@kbn/esql-ast'; export interface FunctionDefinition { - type: 'builtin' | 'agg' | 'eval' | 'grouping'; + type: 'builtin' | 'agg' | 'eval'; ignoreAsSuggestion?: boolean; name: string; alias?: string[]; diff --git a/packages/kbn-esql-validation-autocomplete/src/validation/esql_validation_meta_tests.json b/packages/kbn-esql-validation-autocomplete/src/validation/esql_validation_meta_tests.json index 40738d519679b..c9b89c0163111 100644 --- a/packages/kbn-esql-validation-autocomplete/src/validation/esql_validation_meta_tests.json +++ b/packages/kbn-esql-validation-autocomplete/src/validation/esql_validation_meta_tests.json @@ -15778,17 +15778,19 @@ "warning": [] }, { - "query": "from a_index | stats by bucket(numberField, 1 year)", + "query": "from a_index | stats by bucket(numberField, 5)", "error": [], "warning": [] }, { - "query": "from a_index | stats by bucket(numberField, 1 year)", - "error": [], + "query": "from a_index | stats by bucket(numberField, numberField)", + "error": [ + "Argument of [bucket] must be a constant, received [numberField]" + ], "warning": [] }, { - "query": "from a_index | stats by bin(numberField, 1 year)", + "query": "from a_index | stats by bin(numberField, 5)", "error": [], "warning": [] }, From 1857c84ca5680d6ec60129608dd6eaa18c824a46 Mon Sep 17 00:00:00 2001 From: Dima Arnautov Date: Tue, 7 May 2024 15:15:07 +0200 Subject: [PATCH 20/86] [ML] Functional tests for Advanced settings in anomaly detection alerting rule (#182565) ## Summary Part of https://github.com/elastic/kibana/issues/182235 Adds functional tests for the Advanced settings section in the anomaly detection rule flyout. ### Checklist - [x] [Unit or functional tests](https://www.elastic.co/guide/en/kibana/master/development-tests.html) were updated or added to match the most common scenarios - [ ] [Flaky Test Runner](https://ci-stats.kibana.dev/trigger_flaky_test_runner/1) was used on any tests changed --- .../advanced_settings.tsx | 20 +++++++++--- .../public/alerting/time_interval_control.tsx | 1 + .../plugins/ml/public/alerting/validators.ts | 2 +- .../test/functional/services/ml/alerting.ts | 32 +++++++++++++++---- .../discover_ml_uptime/ml/alert_flyout.ts | 8 +++++ 5 files changed, 52 insertions(+), 11 deletions(-) diff --git a/x-pack/plugins/ml/public/alerting/anomaly_detection_rule/advanced_settings.tsx b/x-pack/plugins/ml/public/alerting/anomaly_detection_rule/advanced_settings.tsx index 97d152c2b1115..d9d6e983e5996 100644 --- a/x-pack/plugins/ml/public/alerting/anomaly_detection_rule/advanced_settings.tsx +++ b/x-pack/plugins/ml/public/alerting/anomaly_detection_rule/advanced_settings.tsx @@ -5,9 +5,6 @@ * 2.0. */ -import type { FC } from 'react'; -import React from 'react'; -import { FormattedMessage } from '@kbn/i18n-react'; import { EuiAccordion, EuiDescribedFormGroup, @@ -17,9 +14,14 @@ import { EuiSpacer, EuiText, } from '@elastic/eui'; +import { FormattedMessage } from '@kbn/i18n-react'; +import { isDefined } from '@kbn/ml-is-defined'; +import type { FC } from 'react'; +import React, { useMemo } from 'react'; +import { validateTopNBucket } from '../validators'; +import { TOP_N_BUCKETS_COUNT } from '../../../common/constants/alerts'; import { type MlAnomalyDetectionAlertAdvancedSettings } from '../../../common/types/alerts'; import { TimeIntervalControl } from '../time_interval_control'; -import { TOP_N_BUCKETS_COUNT } from '../../../common/constants/alerts'; interface AdvancedSettingsProps { value: MlAnomalyDetectionAlertAdvancedSettings; @@ -27,6 +29,13 @@ interface AdvancedSettingsProps { } export const AdvancedSettings: FC = React.memo(({ value, onChange }) => { + const topNBucketsValidationErrors = useMemo(() => { + if (!isDefined(value.topNBuckets)) { + return null; + } + return validateTopNBucket(value.topNBuckets); + }, [value.topNBuckets]); + return ( = React.memo(({ value, defaultMessage="Number of latest buckets" /> } + isInvalid={topNBucketsValidationErrors !== null} + data-test-subj={'mlAnomalyAlertTopNBucketsFormRow'} > = React.memo(({ value, onChange({ topNBuckets: Number(e.target.value) }); }} data-test-subj={'mlAnomalyAlertTopNBuckets'} + isInvalid={topNBucketsValidationErrors !== null} /> diff --git a/x-pack/plugins/ml/public/alerting/time_interval_control.tsx b/x-pack/plugins/ml/public/alerting/time_interval_control.tsx index 5e664294963fa..43eafe7acaedc 100644 --- a/x-pack/plugins/ml/public/alerting/time_interval_control.tsx +++ b/x-pack/plugins/ml/public/alerting/time_interval_control.tsx @@ -37,6 +37,7 @@ export const TimeIntervalControl: FC = ({ label={label} isInvalid={isInvalid} error={invalidTimeIntervalMessage(value ?? undefined)} + data-test-subj={'mlAnomalyAlertAdvancedSettingsLookbackInterval'} > { await ml.alerting.assertTopNBuckets(1); await ml.alerting.assertLookbackInterval('123m'); + await ml.testExecution.logTestStep( + 'should support updating the advanced settings section with valid values only' + ); + await ml.alerting.setTopNBuckets(0, true); + await ml.alerting.setTopNBuckets(2); + await ml.alerting.setLookbackInterval('invalid_value', true); + await ml.alerting.setLookbackInterval('2h'); + await ml.testExecution.logTestStep('should preview the alert condition'); await ml.alerting.assertPreviewButtonState(false); await ml.alerting.setTestInterval('5y'); From df11bea8c94fd9a85ff121c97fb4b968b97d06b3 Mon Sep 17 00:00:00 2001 From: Jon Date: Tue, 7 May 2024 08:18:50 -0500 Subject: [PATCH 21/86] [ci] skip failed test reporting when triggered upstream (#182815) This skips failed test reporting when elasticsearch triggers a pipeline to validate an unpublished version against Kibana. --- .buildkite/scripts/lifecycle/post_command.sh | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/.buildkite/scripts/lifecycle/post_command.sh b/.buildkite/scripts/lifecycle/post_command.sh index 218184d36f65a..b22293dbcb8b6 100755 --- a/.buildkite/scripts/lifecycle/post_command.sh +++ b/.buildkite/scripts/lifecycle/post_command.sh @@ -43,7 +43,10 @@ if [[ "$IS_TEST_EXECUTION_STEP" == "true" ]]; then buildkite-agent artifact upload '.es/**/*.hprof' buildkite-agent artifact upload 'data/es_debug_*.tar.gz' - if [[ $BUILDKITE_COMMAND_EXIT_STATUS -ne 0 ]]; then + if [[ $BUILDKITE_COMMAND_EXIT_STATUS -ne 0 ]] && \ + # Skip when triggered from elasticsearch's validation pipeline + [[ $BUILDKITE_TRIGGERED_FROM_BUILD_PIPELINE_SLUG != 'elasticsearch-serverless-intake' ]] + then echo "--- Run Failed Test Reporter" node scripts/report_failed_tests --build-url="${BUILDKITE_BUILD_URL}#${BUILDKITE_JOB_ID}" 'target/junit/**/*.xml' fi From c6ff9caa6f45e86767598e0183cc199f92e16fb7 Mon Sep 17 00:00:00 2001 From: Victor Martinez Date: Tue, 7 May 2024 15:22:46 +0200 Subject: [PATCH 22/86] CODEOWNERS: GitHub actions for obs-robots automation (#182796) As discussed in https://github.com/elastic/kibana/pull/182773#issuecomment-2097968561 --- .github/CODEOWNERS | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/.github/CODEOWNERS b/.github/CODEOWNERS index c503ad05d345d..cdf47d35f9ceb 100644 --- a/.github/CODEOWNERS +++ b/.github/CODEOWNERS @@ -1028,11 +1028,6 @@ packages/kbn-monaco/src/esql @elastic/kibana-esql ### Observability Plugins -# Observability robots -/.github/workflows/deploy-my-kibana.yml @elastic/observablt-robots -/.github/workflows/undeploy-my-kibana.yml @elastic/observablt-robots -/.github/workflows/oblt-github-commands @elastic/observablt-robots - # Infra Monitoring ## This plugin mostly contains the codebase for the infra services, but also includes some code for the Logs UI app. ## To keep @elastic/obs-ux-logs-team as codeowner of the plugin manifest without requiring a review for all the other code changes @@ -1686,6 +1681,11 @@ x-pack/plugins/observability_solution/synthetics/server/saved_objects/saved_obje x-pack/plugins/observability_solution/synthetics/server/saved_objects/synthetics_monitor.ts @elastic/obs-ux-infra_services-team @elastic/kibana-security x-pack/plugins/observability_solution/synthetics/server/saved_objects/synthetics_param.ts @elastic/obs-ux-infra_services-team @elastic/kibana-security +# Specialised GitHub workflows for the Observability robots +/.github/workflows/deploy-my-kibana.yml @elastic/observablt-robots @elastic/kibana-operations +/.github/workflows/oblt-github-commands @elastic/observablt-robots @elastic/kibana-operations +/.github/workflows/undeploy-my-kibana.yml @elastic/observablt-robots @elastic/kibana-operations + #### ## These rules are always last so they take ultimate priority over everything else #### From a5ba2d664b7b9eb8a0413cbb99a646c4b789c297 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?S=C3=A9bastien=20Loix?= Date: Tue, 7 May 2024 14:51:04 +0100 Subject: [PATCH 23/86] [Stateful sidenav] Refactors (#182689) --- .../src/project_navigation/breadcrumbs.tsx | 4 +- .../project_navigation_service.test.ts | 32 +-- .../project_navigation_service.ts | 182 +++++++++--------- .../core-chrome-browser-internal/src/types.ts | 10 +- .../ui/solution_nav_switcher_breadcrumbs.tsx | 4 +- src/plugins/navigation/public/plugin.test.ts | 3 +- src/plugins/navigation/public/plugin.tsx | 29 ++- src/plugins/navigation/server/plugin.ts | 22 ++- 8 files changed, 132 insertions(+), 154 deletions(-) diff --git a/packages/core/chrome/core-chrome-browser-internal/src/project_navigation/breadcrumbs.tsx b/packages/core/chrome/core-chrome-browser-internal/src/project_navigation/breadcrumbs.tsx index 39a7a25424d6f..ed23d25434664 100644 --- a/packages/core/chrome/core-chrome-browser-internal/src/project_navigation/breadcrumbs.tsx +++ b/packages/core/chrome/core-chrome-browser-internal/src/project_navigation/breadcrumbs.tsx @@ -41,7 +41,7 @@ export function buildBreadcrumbs({ solutionNavigations?: { definitions: SolutionNavigationDefinitions; activeId: string; - onChange: (id: string, options?: { redirect?: boolean }) => void; + onChange: (id: string) => void; }; }): ChromeProjectBreadcrumb[] { const rootCrumb = buildRootCrumb({ @@ -107,7 +107,7 @@ function buildRootCrumb({ solutionNavigations?: { definitions: SolutionNavigationDefinitions; activeId: string; - onChange: (id: string, options?: { redirect?: boolean }) => void; + onChange: (id: string) => void; }; }): ChromeProjectBreadcrumb { if (solutionNavigations) { diff --git a/packages/core/chrome/core-chrome-browser-internal/src/project_navigation/project_navigation_service.test.ts b/packages/core/chrome/core-chrome-browser-internal/src/project_navigation/project_navigation_service.test.ts index 508e72c5b86b4..71fac1455031b 100644 --- a/packages/core/chrome/core-chrome-browser-internal/src/project_navigation/project_navigation_service.test.ts +++ b/packages/core/chrome/core-chrome-browser-internal/src/project_navigation/project_navigation_service.test.ts @@ -1003,28 +1003,18 @@ describe('solution navigations', () => { } }); - it('should throw if the active solution navigation is not registered', async () => { - const { projectNavigation } = setup(); - - projectNavigation.updateSolutionNavigations({ 1: solution1, 2: solution2 }); - - expect(() => { - projectNavigation.changeActiveSolutionNavigation('3'); - }).toThrowErrorMatchingInlineSnapshot( - `"Solution navigation definition with id \\"3\\" does not exist."` - ); - }); - it('should change the active solution if no node match the current Location', async () => { - const { projectNavigation, navLinksService } = setup({ + const { projectNavigation, navLinksService, application } = setup({ locationPathName: '/app/app3', // we are on app3 which only exists in solution3 navLinkIds: ['app1', 'app2', 'app3'], }); + navLinksService.get.mockReturnValue({ url: '/app/app3', href: '/app/app3' } as any); + const getActiveDefinition = () => - lastValueFrom(projectNavigation.getActiveSolutionNavDefinition$().pipe(take(1))); + firstValueFrom(projectNavigation.getActiveSolutionNavDefinition$()); - projectNavigation.updateSolutionNavigations({ 1: solution1, 2: solution2, 3: solution3 }); + projectNavigation.updateSolutionNavigations({ solution1, solution2, solution3 }); { const definition = await getActiveDefinition(); @@ -1032,20 +1022,12 @@ describe('solution navigations', () => { } // Change to solution 2, but we are still on '/app/app3' which only exists in solution3 - projectNavigation.changeActiveSolutionNavigation('2'); + projectNavigation.changeActiveSolutionNavigation('solution2'); { const definition = await getActiveDefinition(); expect(definition?.id).toBe('solution3'); // The solution3 was activated as it matches the "/app/app3" location + expect(application.navigateToUrl).toHaveBeenCalled(); // Redirect } - - navLinksService.get.mockReturnValue({ url: '/app/app2', href: '/app/app2' } as any); - projectNavigation.changeActiveSolutionNavigation('2', { redirect: true }); // We ask to redirect to the home page of solution 2 - { - const definition = await getActiveDefinition(); - expect(definition?.id).toBe('solution2'); - } - - navLinksService.get.mockReset(); }); }); diff --git a/packages/core/chrome/core-chrome-browser-internal/src/project_navigation/project_navigation_service.ts b/packages/core/chrome/core-chrome-browser-internal/src/project_navigation/project_navigation_service.ts index 1f3efef5d7821..ddd00cea5b37e 100644 --- a/packages/core/chrome/core-chrome-browser-internal/src/project_navigation/project_navigation_service.ts +++ b/packages/core/chrome/core-chrome-browser-internal/src/project_navigation/project_navigation_service.ts @@ -33,7 +33,6 @@ import { type Observable, type Subscription, take, - debounceTime, } from 'rxjs'; import { type Location, createLocation } from 'history'; import deepEqual from 'react-fast-compare'; @@ -80,26 +79,30 @@ export class ProjectNavigationService { }>({ breadcrumbs: [], params: { absolute: false } }); private readonly stop$ = new ReplaySubject(1); private readonly solutionNavDefinitions$ = new BehaviorSubject({}); + // As the active definition **id** and the definitions are set independently, one before the other without + // any guarantee of order, we need to store the next active definition id in a separate BehaviorSubject + private readonly nextSolutionNavDefinitionId$ = new BehaviorSubject(null); + // The active solution navigation definition id that has been initiated and is currently active private readonly activeSolutionNavDefinitionId$ = new BehaviorSubject(null); private readonly location$ = new BehaviorSubject(createLocation('/')); private deepLinksMap$: Observable> = of({}); private cloudLinks$ = new BehaviorSubject({}); private application?: InternalApplicationStart; private navLinksService?: ChromeNavLinks; - private http?: InternalHttpStart; + private _http?: InternalHttpStart; private navigationChangeSubscription?: Subscription; private unlistenHistory?: () => void; public start({ application, navLinksService, http, chromeBreadcrumbs$, logger }: StartDeps) { this.application = application; this.navLinksService = navLinksService; - this.http = http; + this._http = http; this.logger = logger; this.onHistoryLocationChange(application.history.location); this.unlistenHistory = application.history.listen(this.onHistoryLocationChange.bind(this)); this.handleActiveNodesChange(); - this.handleEmptyActiveNodes(); + this.handleSolutionNavDefinitionChange(); this.deepLinksMap$ = navLinksService.getNavLinks$().pipe( map((navLinks) => { @@ -137,7 +140,7 @@ export class ProjectNavigationService { }, getNavigationTreeUi$: this.getNavigationTreeUi$.bind(this), getActiveNodes$: () => { - return this.activeNodes$.pipe(takeUntil(this.stop$)); + return this.activeNodes$.pipe(takeUntil(this.stop$), distinctUntilChanged(deepEqual)); }, setSideNavComponent: this.setSideNavComponent.bind(this), getProjectSideNavComponent$: () => { @@ -178,7 +181,10 @@ export class ProjectNavigationService { ? { definitions: solutionNavDefinitions, activeId: activeSolutionNavDefinitionId, - onChange: this.changeActiveSolutionNavigation.bind(this), + onChange: (id: string) => { + this.goToSolutionHome(id); + this.changeActiveSolutionNavigation(id); + }, } : undefined; @@ -217,14 +223,13 @@ export class ProjectNavigationService { private initNavigation(id: string, navTreeDefinition$: Observable) { if (this.activeSolutionNavDefinitionId$.getValue() === id) return; - this.activeSolutionNavDefinitionId$.next(id); - if (this.navigationChangeSubscription) { this.navigationChangeSubscription.unsubscribe(); } let initialised = false; this.projectNavigationNavTreeFlattened = {}; + this.navigationChangeSubscription = combineLatest([ navTreeDefinition$, this.deepLinksMap$, @@ -243,13 +248,26 @@ export class ProjectNavigationService { next: ({ navigationTree, navigationTreeUI }) => { this.navigationTree$.next(navigationTree); this.navigationTreeUi$.next(navigationTreeUI); - this.projectNavigationNavTreeFlattened = flattenNav(navigationTree); - // At initialization, we want to force the update of the active nodes, so 2 empty arrays [] - // are not considered equal and we update the Observable value. - this.updateActiveProjectNavigationNodes({ forceUpdate: !initialised }); - initialised = true; + // Verify if the current location is part of the navigation tree of + // the initiated solution. If not, we need to find the correct solution + const activeNodes = this.updateActiveProjectNavigationNodes(); + let willChangeSolution = false; + + if (activeNodes.length === 0) { + const solutionForCurrentLocation = this.findSolutionForCurrentLocation(); + if (solutionForCurrentLocation) { + willChangeSolution = true; + this.goToSolutionHome(solutionForCurrentLocation); + this.changeActiveSolutionNavigation(solutionForCurrentLocation); + } + } + + if (!initialised && !willChangeSolution) { + this.activeSolutionNavDefinitionId$.next(id); + initialised = true; + } }, error: (err) => { this.logger?.error(err); @@ -271,7 +289,7 @@ export class ProjectNavigationService { flattendTree?: Record; } = {}): ChromeProjectNavigationNode[][] { if (!this.application) return []; - if (!Object.keys(this.projectNavigationNavTreeFlattened).length) return []; + if (!Object.keys(flattendTree).length) return []; const location = _location ?? this.application.history.location; let currentPathname = this.http?.basePath.prepend(location.pathname) ?? location.pathname; @@ -292,23 +310,15 @@ export class ProjectNavigationService { */ private updateActiveProjectNavigationNodes({ location, - forceUpdate = false, - }: { location?: Location; forceUpdate?: boolean } = {}) { + }: { location?: Location } = {}): ChromeProjectNavigationNode[][] { const activeNodes = this.findActiveNodes({ location }); - // Each time we call findActiveNodes() we create a new array of activeNodes. As this array is used - // in React in useCallback() and useMemo() dependencies arrays it triggers an infinite navigation - // tree registration loop. To avoid that we only notify the listeners when the activeNodes array - // has actually changed. - const requiresUpdate = forceUpdate ? true : !deepEqual(activeNodes, this.activeNodes$.value); - - if (!requiresUpdate) return; - this.activeNodes$.next(activeNodes); + return activeNodes; } private onHistoryLocationChange(location: Location) { - this.location$.next(location); this.updateActiveProjectNavigationNodes({ location }); + this.location$.next(location); } private handleActiveNodesChange() { @@ -338,30 +348,17 @@ export class ProjectNavigationService { * lands on a page that does not belong to the current active solution navigation. In this case, * we need to find the correct solution navigation based on the current location and switch to it. */ - private handleEmptyActiveNodes() { - combineLatest([ - this.activeNodes$, - this.solutionNavDefinitions$, - this.activeSolutionNavDefinitionId$.pipe(distinctUntilChanged()), - this.location$, - ]) - .pipe(takeUntil(this.stop$), debounceTime(20)) - .subscribe(([activeNodes, definitions, activeSolution, location]) => { - if ( - activeNodes.length > 0 || - activeSolution === null || - Object.keys(definitions).length === 0 || - Object.keys(this.projectNavigationNavTreeFlattened).length === 0 - ) { - return; - } + private findSolutionForCurrentLocation(): string | null { + if (Object.keys(this.solutionNavDefinitions$.getValue()).length === 0) return null; - // We have an active solution navigation but no active nodes, this means that - // the current location is not part of the current solution navigation. - // We need to find the correct solution navigation based on the current location. - let found = false; + let idFound: string | null = null; + combineLatest([this.solutionNavDefinitions$, this.location$]) + .pipe(take(1)) + .subscribe(([definitions, location]) => { Object.entries(definitions).forEach(([id, definition]) => { + if (idFound) return; + combineLatest([definition.navigationTree$, this.deepLinksMap$, this.cloudLinks$]) .pipe( take(1), @@ -373,72 +370,71 @@ export class ProjectNavigationService { ) ) .subscribe(({ navigationTree }) => { - if (found) return; - const maybeActiveNodes = this.findActiveNodes({ location, flattendTree: flattenNav(navigationTree), }); if (maybeActiveNodes.length > 0) { - found = true; - this.changeActiveSolutionNavigation(id); + idFound = id; } }); }); }); + + return idFound; } private setSideNavComponent(component: SideNavComponent | null) { this.customProjectSideNavComponent$.next({ current: component }); } - private changeActiveSolutionNavigation( - id: string | null, - { onlyIfNotSet = false, redirect = false } = {} - ) { - if (this.activeSolutionNavDefinitionId$.getValue() === id) return; - if (onlyIfNotSet && this.activeSolutionNavDefinitionId$.getValue() !== null) { - return; - } - - const definitions = this.solutionNavDefinitions$.getValue(); - this.activeSolutionNavDefinitionId$.next(null); - // We don't want to change to "classic" if `id` is `null` when we haven't received - // any definitions yet. Serverless Kibana could be impacted by this. - // When we **do** have definitions, then passing `null` does mean we should change to "classic". - if (Object.keys(definitions).length > 0) { - if (id === null) { - this.navigationTree$.next(undefined); - this.activeSolutionNavDefinitionId$.next(null); - } else { - const definition = definitions[id]; - if (!definition) { - throw new Error(`Solution navigation definition with id "${id}" does not exist.`); + private handleSolutionNavDefinitionChange() { + combineLatest([ + this.solutionNavDefinitions$, + this.nextSolutionNavDefinitionId$.pipe(distinctUntilChanged()), + ]) + .pipe(takeUntil(this.stop$)) + .subscribe(([definitions, nextId]) => { + const definition = typeof nextId === 'string' ? definitions[nextId] : undefined; + const noActiveDefinition = + Object.keys(definitions).length === 0 || !definition || nextId === null; + + if (noActiveDefinition) { + this.navigationTree$.next(undefined); + this.activeNodes$.next([]); + return; } const { sideNavComponent } = definition; if (sideNavComponent) { this.setSideNavComponent(sideNavComponent); } + this.initNavigation(nextId, definition.navigationTree$); + }); + } - let location: Location | undefined; - if (redirect) { - // Navigate to the new home page if it's defined, otherwise navigate to the default home page - const link = this.navLinksService?.get(definition.homePage ?? 'home'); - if (link) { - const linkUrl = this.http?.basePath.remove(link.url) ?? link.url; - location = createLocation(linkUrl); - this.location$.next(location); - this.application?.navigateToUrl(link.href); - } - } + private goToSolutionHome(id: string) { + const definitions = this.solutionNavDefinitions$.getValue(); + const definition = definitions[id]; + if (!definition) { + throw new Error(`No solution navigation definition found for id ${id}`); + } - this.initNavigation(id, definition.navigationTree$); - } - } else if (id !== null) { - this.activeSolutionNavDefinitionId$.next(id); + // Navigate to the new home page if it's defined + const link = this.navLinksService?.get(definition.homePage ?? 'undefined'); + if (!link) { + throw new Error(`No home page defined for solution navigation ${definition.id}`); } + + const location = createLocation(link.url); + this.location$.next(location); + this.application?.navigateToUrl(link.url); + } + + private changeActiveSolutionNavigation(id: string | null) { + if (this.nextSolutionNavDefinitionId$.getValue() === id) return; + this.nextSolutionNavDefinitionId$.next(id); } private getSolutionsNavDefinitions$() { @@ -451,9 +447,8 @@ export class ProjectNavigationService { map(([definitions, id]) => { if (id === null) return null; if (Object.keys(definitions).length === 0) return null; - if (!definitions[id]) { - throw new Error(`Solution navigation definition with id "${id}" does not exist.`); - } + if (!definitions[id]) return null; + // We strip out the sideNavComponent from the definition as it should only be used internally const { sideNavComponent, ...definition } = definitions[id]; return definition; @@ -475,6 +470,13 @@ export class ProjectNavigationService { } } + private get http() { + if (!this._http) { + throw new Error('Http service not provided.'); + } + return this._http; + } + public stop() { this.stop$.next(); this.unlistenHistory?.(); diff --git a/packages/core/chrome/core-chrome-browser-internal/src/types.ts b/packages/core/chrome/core-chrome-browser-internal/src/types.ts index 6413c0a683112..41f96b6e751d6 100644 --- a/packages/core/chrome/core-chrome-browser-internal/src/types.ts +++ b/packages/core/chrome/core-chrome-browser-internal/src/types.ts @@ -113,14 +113,6 @@ export interface InternalChromeStart extends ChromeStart { * @param id The id of the active solution navigation. If `null` is provided, the solution navigation * will be replaced with the legacy Kibana navigation. */ - changeActiveSolutionNavigation( - id: string | null, - options?: { - /** only change if there isn't any active solution yet */ - onlyIfNotSet?: boolean; - /** redirect to the new navigation home page */ - redirect?: boolean; - } - ): void; + changeActiveSolutionNavigation(id: string | null): void; }; } diff --git a/packages/core/chrome/core-chrome-browser-internal/src/ui/solution_nav_switcher_breadcrumbs.tsx b/packages/core/chrome/core-chrome-browser-internal/src/ui/solution_nav_switcher_breadcrumbs.tsx index a536cb0e0bfd8..abb617e988724 100644 --- a/packages/core/chrome/core-chrome-browser-internal/src/ui/solution_nav_switcher_breadcrumbs.tsx +++ b/packages/core/chrome/core-chrome-browser-internal/src/ui/solution_nav_switcher_breadcrumbs.tsx @@ -22,7 +22,7 @@ export const getSolutionNavSwitcherBreadCrumb = ({ }: { definitions: SolutionNavigationDefinitions; activeId: string; - onChange: (id: string, options?: { redirect?: boolean }) => void; + onChange: (id: string) => void; cloudLinks: CloudLinks; }): ChromeProjectBreadcrumb => { const text = Object.values(definitions).find(({ id }) => id === activeId)?.title; @@ -48,7 +48,7 @@ export const getSolutionNavSwitcherBreadCrumb = ({ iconType={icon as string} data-test-subj={`solutionNavSwitcher-${id}`} onClick={() => { - onChange(id, { redirect: true }); + onChange(id); closePopover(); }} />, diff --git a/src/plugins/navigation/public/plugin.test.ts b/src/plugins/navigation/public/plugin.test.ts index 1aad72a3344f3..07de4ff3483a5 100644 --- a/src/plugins/navigation/public/plugin.test.ts +++ b/src/plugins/navigation/public/plugin.test.ts @@ -160,8 +160,7 @@ describe('Navigation Plugin', () => { expect(coreStart.chrome.project.updateSolutionNavigations).toHaveBeenCalled(); expect(coreStart.chrome.project.changeActiveSolutionNavigation).toHaveBeenCalledWith( - 'security', - { onlyIfNotSet: true } + 'security' ); }); diff --git a/src/plugins/navigation/public/plugin.tsx b/src/plugins/navigation/public/plugin.tsx index 79f7a032daf72..e62eb5c2c104f 100644 --- a/src/plugins/navigation/public/plugin.tsx +++ b/src/plugins/navigation/public/plugin.tsx @@ -10,6 +10,7 @@ import { combineLatest, debounceTime, distinctUntilChanged, + firstValueFrom, from, map, Observable, @@ -139,9 +140,11 @@ export class NavigationPublicPlugin isSolutionNavExperiementEnabled$ = !onCloud || isServerless ? of(false) - : from(cloudExperiments.getVariation(SOLUTION_NAV_FEATURE_FLAG_NAME, false)).pipe( - shareReplay(1) - ); + : from( + cloudExperiments + .getVariation(SOLUTION_NAV_FEATURE_FLAG_NAME, false) + .catch(() => false) + ).pipe(shareReplay(1)); this.isSolutionNavEnabled$ = isSolutionNavExperiementEnabled$.pipe( switchMap((isFeatureEnabled) => { @@ -171,22 +174,14 @@ export class NavigationPublicPlugin }); // Initialize the solution navigation if it is enabled - isSolutionNavExperiementEnabled$.pipe(take(1)).subscribe((isFeatureEnabled) => { - if (!isFeatureEnabled) return; + isSolutionNavExperiementEnabled$.pipe(take(1)).subscribe((isEnabled) => { + if (!isEnabled) return; chrome.project.setCloudUrls(cloud!); this.addDefaultSolutionNavigation({ chrome }); this.susbcribeToSolutionNavUiSettings({ core, security, defaultSolution }); }); - // Keep track of the solution navigation enabled state - let isSolutionNavEnabled = false; - isSolutionNavExperiementEnabled$ - .pipe(takeUntil(this.stop$)) - .subscribe((_isSolutionNavEnabled) => { - isSolutionNavEnabled = _isSolutionNavEnabled; - }); - return { ui: { TopNavMenu: createTopNav(unifiedSearch, extensions), @@ -194,8 +189,10 @@ export class NavigationPublicPlugin createTopNavWithCustomContext: createCustomTopNav, }, addSolutionNavigation: (solutionNavigation) => { - if (!isSolutionNavEnabled) return; - return this.addSolutionNavigation(solutionNavigation); + firstValueFrom(isSolutionNavExperiementEnabled$).then((isEnabled) => { + if (!isEnabled) return; + this.addSolutionNavigation(solutionNavigation); + }); }, isSolutionNavEnabled$: this.isSolutionNavEnabled$, }; @@ -234,7 +231,7 @@ export class NavigationPublicPlugin chrome.project.changeActiveSolutionNavigation(null); chrome.setChromeStyle('classic'); } else { - chrome.project.changeActiveSolutionNavigation(defaultSolution, { onlyIfNotSet: true }); + chrome.project.changeActiveSolutionNavigation(defaultSolution); } }); } diff --git a/src/plugins/navigation/server/plugin.ts b/src/plugins/navigation/server/plugin.ts index 6724ed8c20c53..979a2285a42ed 100644 --- a/src/plugins/navigation/server/plugin.ts +++ b/src/plugins/navigation/server/plugin.ts @@ -33,15 +33,21 @@ export class NavigationServerPlugin core: CoreSetup, plugins: NavigationServerSetupDependencies ) { - if (plugins.cloud?.isCloudEnabled && !this.isServerless()) { - const config = this.initializerContext.config.get(); + const config = this.initializerContext.config.get(); + const isSolutionNavExperiementEnabled = + Boolean(plugins.cloud?.isCloudEnabled) && !this.isServerless(); - void core.getStartServices().then(async ([coreStart, deps]) => { - if (await deps.cloudExperiments?.getVariation(SOLUTION_NAV_FEATURE_FLAG_NAME, false)) { - core.uiSettings.registerGlobal(getUiSettings(config)); - } else { - await this.removeUiSettings(coreStart, getUiSettings(config)); - } + if (isSolutionNavExperiementEnabled) { + void core.getStartServices().then(([coreStart, deps]) => { + return deps.cloudExperiments + ?.getVariation(SOLUTION_NAV_FEATURE_FLAG_NAME, false) + .then(async (enabled) => { + if (enabled) { + core.uiSettings.registerGlobal(getUiSettings(config)); + } else { + await this.removeUiSettings(coreStart, getUiSettings(config)); + } + }); }); } From 314d6eef4d366511598864033c9f980f0e48b4e6 Mon Sep 17 00:00:00 2001 From: Carlos Crespo Date: Tue, 7 May 2024 10:54:03 -0300 Subject: [PATCH 24/86] [APM] Fix condition to use `serviceTransactionMetric` documents (#180903) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit closes https://github.com/elastic/kibana/issues/167578 (https://github.com/elastic/kibana/issues/167578#issuecomment-2061114814) ## Summary This PR fixes when `/time_range_metadata` returns `hasDocs=true` for `serviceTransactionMetric` to make sure the UI doesn't lose information by querying `serviceTransactionMetric` docs in a range where docs from APM < 8.7 still exists. **IMPORTANT** ❗ Based on the APM Server [changelog](https://github.com/elastic/apm-server/blob/bbf4eb276bee1deb29ad65a3ab79ac31a482f03d/changelogs/8.7.asciidoc#L71) and this [issue](https://github.com/elastic/apm-server/issues/9703), `serviceTransactionMetric` doc was added in 8.7 as well as the aggregations by `10m` and `60m` intervals for `transaction` docs. In `8.7`, the `transaction.duration.summary` was also introduced, therefore the new rollup interval docs will always contain the new field. Based on that, the logic was changed to - Verify whether `transaction` `10m` and `60m` are supported within a given time range - Verify whether or not `transaction.duration.summary` is supported for `transaction` `1m` docs - All other doc types and intervals are presupposed to support `transaction.duration.summary` ### Range starting from when there is no data (contains docs generated by APM < 8.7 and APM >= 8.7) image ```json { "isUsingServiceDestinationMetrics": false, "sources": [ { "documentType": "serviceTransactionMetric", "rollupInterval": "1m", "hasDocs": false, "hasDurationSummaryField": false }, { "documentType": "serviceTransactionMetric", "rollupInterval": "10m", "hasDocs": false, "hasDurationSummaryField": false }, { "documentType": "serviceTransactionMetric", "rollupInterval": "60m", "hasDocs": false, "hasDurationSummaryField": false }, { "documentType": "transactionMetric", "rollupInterval": "1m", "hasDocs": true, "hasDurationSummaryField": false }, { "documentType": "transactionMetric", "rollupInterval": "10m", "hasDocs": true, "hasDurationSummaryField": false }, { "documentType": "transactionMetric", "rollupInterval": "60m", "hasDocs": true, "hasDurationSummaryField": false }, { "documentType": "transactionEvent", "rollupInterval": "none", "hasDocs": true, "hasDurationSummaryField": false } ] } ``` ### Range starting from when first docs were ingested (contains docs generated by APM < 8.7 and APM >= 8.7) image ```json { "isUsingServiceDestinationMetrics": false, "sources": [ { "documentType": "serviceTransactionMetric", "rollupInterval": "1m", "hasDocs": false, "hasDurationSummaryField": false }, { "documentType": "serviceTransactionMetric", "rollupInterval": "10m", "hasDocs": false, "hasDurationSummaryField": false }, { "documentType": "serviceTransactionMetric", "rollupInterval": "60m", "hasDocs": false, "hasDurationSummaryField": false }, { "documentType": "transactionMetric", "rollupInterval": "1m", "hasDocs": true, "hasDurationSummaryField": false }, { "documentType": "transactionMetric", "rollupInterval": "10m", "hasDocs": true, "hasDurationSummaryField": false }, { "documentType": "transactionMetric", "rollupInterval": "60m", "hasDocs": true, "hasDurationSummaryField": false }, { "documentType": "transactionEvent", "rollupInterval": "none", "hasDocs": true, "hasDurationSummaryField": false } ] } ``` ### Range starting from when only APM >= 8.7 docs exist image ```json { "isUsingServiceDestinationMetrics": false, "sources": [ { "documentType": "serviceTransactionMetric", "rollupInterval": "1m", "hasDocs": true, "hasDurationSummaryField": true }, { "documentType": "serviceTransactionMetric", "rollupInterval": "10m", "hasDocs": true, "hasDurationSummaryField": true }, { "documentType": "serviceTransactionMetric", "rollupInterval": "60m", "hasDocs": true, "hasDurationSummaryField": true }, { "documentType": "transactionMetric", "rollupInterval": "1m", "hasDocs": true, "hasDurationSummaryField": false }, { "documentType": "transactionMetric", "rollupInterval": "10m", "hasDocs": true, "hasDurationSummaryField": false }, { "documentType": "transactionMetric", "rollupInterval": "60m", "hasDocs": true, "hasDurationSummaryField": false }, { "documentType": "transactionEvent", "rollupInterval": "none", "hasDocs": true, "hasDurationSummaryField": false } ] } ``` ### How to tests Generate docs without ServiceTransactionMetrics ```bash node scripts/synthtrace service_summary_field_version_dependent.ts --versionOverride=8.6.2 --from=now-2h --to=now --clean ``` Generate docs with ServiceTransactionMetrics ```bash node scripts/synthtrace service_summary_field_version_dependent.ts --from=now-1h --to=now ``` Follow the same steps from above. --------- Co-authored-by: Kibana Machine <42973632+kibanamachine@users.noreply.github.com> --- .../apm_synthtrace_es_client/apm_pipeline.ts | 33 ++- .../client/apm_synthtrace_es_client/index.ts | 12 +- ...service_summary_field_version_dependent.ts | 34 ++- packages/kbn-journeys/services/synthtrace.ts | 2 +- .../apm/dev_docs/apm_queries.md | 2 +- .../apm/ftr_e2e/setup_cypress_node_events.ts | 4 +- .../lib/helpers/get_document_sources.ts | 88 +++----- .../server/lib/helpers/transactions/index.ts | 11 +- .../many_apm_server_versions.spec.ts | 77 +++---- .../time_range_metadata.spec.ts | 195 +++++++++++++----- 10 files changed, 271 insertions(+), 187 deletions(-) diff --git a/packages/kbn-apm-synthtrace/src/lib/apm/client/apm_synthtrace_es_client/apm_pipeline.ts b/packages/kbn-apm-synthtrace/src/lib/apm/client/apm_synthtrace_es_client/apm_pipeline.ts index bd6acc25431a7..a31b800d864c5 100644 --- a/packages/kbn-apm-synthtrace/src/lib/apm/client/apm_synthtrace_es_client/apm_pipeline.ts +++ b/packages/kbn-apm-synthtrace/src/lib/apm/client/apm_synthtrace_es_client/apm_pipeline.ts @@ -6,11 +6,13 @@ * Side Public License, v 1. */ +import semver from 'semver'; import { PassThrough, pipeline, Readable } from 'stream'; import { getDedotTransform } from '../../../shared/get_dedot_transform'; import { getSerializeTransform } from '../../../shared/get_serialize_transform'; import { Logger } from '../../../utils/create_logger'; import { fork } from '../../../utils/stream_utils'; +import { deleteSummaryFieldTransform } from '../../../utils/transform_helpers'; import { createBreakdownMetricsAggregator } from '../../aggregators/create_breakdown_metrics_aggregator'; import { createServiceMetricsAggregator } from '../../aggregators/create_service_metrics_aggregator'; import { createServiceSummaryMetricsAggregator } from '../../aggregators/create_service_summary_metrics_aggregator'; @@ -22,22 +24,32 @@ import { getRoutingTransform } from './get_routing_transform'; export function apmPipeline(logger: Logger, version: string, includeSerialization: boolean = true) { return (base: Readable) => { + const continousRollupSupported = + !version || semver.gte(semver.coerce(version)?.version ?? version, '8.7.0'); + const aggregators = [ createTransactionMetricsAggregator('1m'), - createTransactionMetricsAggregator('10m'), - createTransactionMetricsAggregator('60m'), - createServiceMetricsAggregator('1m'), - createServiceMetricsAggregator('10m'), - createServiceMetricsAggregator('60m'), - createServiceSummaryMetricsAggregator('1m'), - createServiceSummaryMetricsAggregator('10m'), - createServiceSummaryMetricsAggregator('60m'), createSpanMetricsAggregator('1m'), - createSpanMetricsAggregator('10m'), - createSpanMetricsAggregator('60m'), + ...(continousRollupSupported + ? [ + createTransactionMetricsAggregator('10m'), + createTransactionMetricsAggregator('60m'), + createServiceMetricsAggregator('1m'), + createServiceMetricsAggregator('10m'), + createServiceMetricsAggregator('60m'), + createServiceSummaryMetricsAggregator('1m'), + createServiceSummaryMetricsAggregator('10m'), + createServiceSummaryMetricsAggregator('60m'), + createSpanMetricsAggregator('10m'), + createSpanMetricsAggregator('60m'), + ] + : []), ]; const serializationTransform = includeSerialization ? [getSerializeTransform()] : []; + const removeDurationSummaryTransform = !continousRollupSupported + ? [deleteSummaryFieldTransform()] + : []; return pipeline( // @ts-expect-error Some weird stuff here with the type definition for pipeline. We have tests! @@ -49,6 +61,7 @@ export function apmPipeline(logger: Logger, version: string, includeSerializatio getApmServerMetadataTransform(version), getRoutingTransform(), getDedotTransform(), + ...removeDurationSummaryTransform, (err) => { if (err) { logger.error(err); diff --git a/packages/kbn-apm-synthtrace/src/lib/apm/client/apm_synthtrace_es_client/index.ts b/packages/kbn-apm-synthtrace/src/lib/apm/client/apm_synthtrace_es_client/index.ts index 310c33c10483d..db63334009d3a 100644 --- a/packages/kbn-apm-synthtrace/src/lib/apm/client/apm_synthtrace_es_client/index.ts +++ b/packages/kbn-apm-synthtrace/src/lib/apm/client/apm_synthtrace_es_client/index.ts @@ -65,7 +65,15 @@ export class ApmSynthtraceEsClient extends SynthtraceEsClient { this.logger.info(`Updated component template: ${name}`); } - getDefaultPipeline(includeSerialization: boolean = true) { - return apmPipeline(this.logger, this.version, includeSerialization); + getDefaultPipeline( + { + includeSerialization, + versionOverride, + }: { + includeSerialization?: boolean; + versionOverride?: string; + } = { includeSerialization: true } + ) { + return apmPipeline(this.logger, versionOverride ?? this.version, includeSerialization); } } diff --git a/packages/kbn-apm-synthtrace/src/scenarios/service_summary_field_version_dependent.ts b/packages/kbn-apm-synthtrace/src/scenarios/service_summary_field_version_dependent.ts index 37999bff114c2..fed416d787936 100644 --- a/packages/kbn-apm-synthtrace/src/scenarios/service_summary_field_version_dependent.ts +++ b/packages/kbn-apm-synthtrace/src/scenarios/service_summary_field_version_dependent.ts @@ -8,36 +8,26 @@ import { ApmFields, apm } from '@kbn/apm-synthtrace-client'; import { random } from 'lodash'; -import { pipeline, Readable } from 'stream'; +import { Readable } from 'stream'; import semver from 'semver'; import { Scenario } from '../cli/scenario'; -import { - addObserverVersionTransform, - deleteSummaryFieldTransform, -} from '../lib/utils/transform_helpers'; import { withClient } from '../lib/utils/with_client'; +import { RunOptions } from '../cli/utils/parse_run_cli_flags'; +import { Logger } from '../lib/utils/create_logger'; -const scenario: Scenario = async ({ logger, versionOverride }) => { +const scenario: Scenario = async ({ + logger, + versionOverride, +}: RunOptions & { logger: Logger }) => { const version = versionOverride as string; - const isLegacy = versionOverride && semver.lt(version, '8.7.0'); + const isLegacy = version ? semver.lt(version as string, '8.7.0') : false; return { bootstrap: async ({ apmEsClient }) => { if (isLegacy) { apmEsClient.pipeline((base: Readable) => { - const defaultPipeline = apmEsClient.getDefaultPipeline()( - base - ) as unknown as NodeJS.ReadableStream; - - return pipeline( - defaultPipeline, - addObserverVersionTransform(version), - deleteSummaryFieldTransform(), - (err) => { - if (err) { - logger.error(err); - } - } - ); + return apmEsClient.getDefaultPipeline({ + versionOverride: version, + })(base); }); } }, @@ -45,7 +35,7 @@ const scenario: Scenario = async ({ logger, versionOverride }) => { const successfulTimestamps = range.ratePerMinute(6); const instance = apm .service({ - name: `java${isLegacy ? '-legacy' : ''}`, + name: `java`, environment: 'production', agentName: 'java', }) diff --git a/packages/kbn-journeys/services/synthtrace.ts b/packages/kbn-journeys/services/synthtrace.ts index ffb4f06f20007..d96e186c1b1e6 100644 --- a/packages/kbn-journeys/services/synthtrace.ts +++ b/packages/kbn-journeys/services/synthtrace.ts @@ -117,7 +117,7 @@ async function initApmSynthtraceClient(options: SynthtraceClientOptions) { version: packageVersion, }); - synthEsClient.pipeline(synthEsClient.getDefaultPipeline(false)); + synthEsClient.pipeline(synthEsClient.getDefaultPipeline({ includeSerialization: false })); return synthEsClient; } diff --git a/x-pack/plugins/observability_solution/apm/dev_docs/apm_queries.md b/x-pack/plugins/observability_solution/apm/dev_docs/apm_queries.md index 7b0fd244bfdd5..8f7ee301e6467 100644 --- a/x-pack/plugins/observability_solution/apm/dev_docs/apm_queries.md +++ b/x-pack/plugins/observability_solution/apm/dev_docs/apm_queries.md @@ -226,7 +226,7 @@ GET apm-*-metric-*,metrics-apm*/_search?terminate_after=1000 Service transaction metrics are aggregated metric documents that hold latency and throughput metrics pivoted by `service.name`, `service.environment` and `transaction.type`. Additionally, `agent.name` and `service.language.name` are included as metadata. -We use the response from the `GET /internal/apm/time_range_metadata` endpoint to determine what data source is available. A data source is considered available if there is either data before the current time range, or, if there is no data at all before the current time range, if there is data within the current time range. This means that existing deployments will use transaction metrics right after upgrading (instead of using service transaction metrics and seeing a mostly blank screen), but also that new deployments immediately get the benefits of service transaction metrics, instead of falling all the way back to transaction events. +We use the response from the `GET /internal/apm/time_range_metadata` endpoint to determine what data source is available. Service transaction metrics docs, introduced in APM >= 8.7, is considered available if there is data before *and* within the current time range. This ensure the UI won't miss information shipped by APM < 8.7. For < 8.7 documents, availability is determined by whether there is data before the current time range, or no data at all before the current time range, but there is data within the current time range. This means that existing deployments will use transaction metrics right after upgrading (instead of using service transaction metrics and seeing a mostly blank screen), but also that new deployments immediately get the benefits of service transaction metrics, instead of falling all the way back to transaction events. A pre-aggregated document where `_doc_count` is the number of transaction events diff --git a/x-pack/plugins/observability_solution/apm/ftr_e2e/setup_cypress_node_events.ts b/x-pack/plugins/observability_solution/apm/ftr_e2e/setup_cypress_node_events.ts index c8e6f473e2e3b..3d322a169663c 100644 --- a/x-pack/plugins/observability_solution/apm/ftr_e2e/setup_cypress_node_events.ts +++ b/x-pack/plugins/observability_solution/apm/ftr_e2e/setup_cypress_node_events.ts @@ -28,7 +28,9 @@ export function setupNodeEvents(on: Cypress.PluginEvents, config: Cypress.Plugin version: config.env.APM_PACKAGE_VERSION, }); - synthtraceEsClient.pipeline(synthtraceEsClient.getDefaultPipeline(false)); + synthtraceEsClient.pipeline( + synthtraceEsClient.getDefaultPipeline({ includeSerialization: false }) + ); initPlugin(on, config); diff --git a/x-pack/plugins/observability_solution/apm/server/lib/helpers/get_document_sources.ts b/x-pack/plugins/observability_solution/apm/server/lib/helpers/get_document_sources.ts index 9f959cb195cec..ca049603b5c52 100644 --- a/x-pack/plugins/observability_solution/apm/server/lib/helpers/get_document_sources.ts +++ b/x-pack/plugins/observability_solution/apm/server/lib/helpers/get_document_sources.ts @@ -11,22 +11,13 @@ import { RollupInterval } from '../../../common/rollup'; import { APMEventClient } from './create_es_client/create_apm_event_client'; import { getConfigForDocumentType } from './create_es_client/document_type'; import { TimeRangeMetadata } from '../../../common/time_range_metadata'; -import { getDurationLegacyFilter } from './transactions'; +import { isDurationSummaryNotSupportedFilter } from './transactions'; const QUERY_INDEX = { - BEFORE: 0, - CURRENT: 1, - DURATION_SUMMARY: 2, + DOCUMENT_TYPE: 0, + DURATION_SUMMARY_NOT_SUPPORTED: 1, } as const; -interface DocumentTypeData { - documentType: ApmDocumentType; - rollupInterval: RollupInterval; - hasDocBefore: boolean; - hasDocAfter: boolean; - allHaveDurationSummary: boolean; -} - const getRequest = ({ documentType, rollupInterval, @@ -93,10 +84,8 @@ export async function getDocumentSources({ documentTypesToCheck, }); - const hasAnySourceDocBefore = documentTypesInfo.some((source) => source.hasDocBefore); - return [ - ...mapToSources(documentTypesInfo, hasAnySourceDocBefore), + ...documentTypesInfo, { documentType: ApmDocumentType.TransactionEvent, rollupInterval: RollupInterval.None, @@ -120,7 +109,7 @@ const getDocumentTypesInfo = async ({ kuery: string; enableContinuousRollups: boolean; documentTypesToCheck: ApmDocumentType[]; -}) => { +}): Promise => { const getRequests = getDocumentTypeRequestsFn({ enableContinuousRollups, start, @@ -131,25 +120,36 @@ const getDocumentTypesInfo = async ({ const sourceRequests = documentTypesToCheck.flatMap(getRequests); const allSearches = sourceRequests - .flatMap(({ before, current, durationSummaryCheck }) => [before, current, durationSummaryCheck]) + .flatMap(({ documentTypeQuery, durationSummaryNotSupportedQuery }) => [ + documentTypeQuery, + durationSummaryNotSupportedQuery, + ]) .filter((request): request is ReturnType => request !== undefined); const allResponses = (await apmEventClient.msearch('get_document_availability', ...allSearches)) .responses; + const hasAnyLegacyDocuments = sourceRequests.some( + ({ documentType, rollupInterval }, index) => + isLegacyDocType(documentType, rollupInterval) && + allResponses[index + QUERY_INDEX.DURATION_SUMMARY_NOT_SUPPORTED].hits.total.value > 0 + ); + return sourceRequests.map(({ documentType, rollupInterval, ...queries }) => { const numberOfQueries = Object.values(queries).filter(Boolean).length; // allResponses is sorted by the order of the requests in sourceRequests const docTypeResponses = allResponses.splice(0, numberOfQueries); + const hasDocs = docTypeResponses[QUERY_INDEX.DOCUMENT_TYPE].hits.total.value > 0; + // can only use >=8.7 document types (ServiceTransactionMetrics or TransactionMetrics with 10m and 60m intervals) + // if there are no legacy documents + const canUseContinousRollupDocs = hasDocs && !hasAnyLegacyDocuments; return { documentType, rollupInterval, - hasDocBefore: docTypeResponses[QUERY_INDEX.BEFORE].hits.total.value > 0, - hasDocAfter: docTypeResponses[QUERY_INDEX.CURRENT].hits.total.value > 0, - allHaveDurationSummary: docTypeResponses[QUERY_INDEX.DURATION_SUMMARY] - ? docTypeResponses[QUERY_INDEX.DURATION_SUMMARY].hits.total.value === 0 - : true, + hasDocs: isLegacyDocType(documentType, rollupInterval) ? hasDocs : canUseContinousRollupDocs, + // all >=8.7 document types with rollups support duration summary + hasDurationSummaryField: canUseContinousRollupDocs, }; }); }; @@ -168,9 +168,7 @@ const getDocumentTypeRequestsFn = }) => (documentType: ApmDocumentType) => { const currentRange = rangeQuery(start, end); - const diff = end - start; const kql = kqlQuery(kuery); - const beforeRange = rangeQuery(start - diff, end - diff); const rollupIntervals = enableContinuousRollups ? getConfigForDocumentType(documentType).rollupIntervals @@ -179,48 +177,26 @@ const getDocumentTypeRequestsFn = return rollupIntervals.map((rollupInterval) => ({ documentType, rollupInterval, - before: getRequest({ - documentType, - rollupInterval, - filters: [...kql, ...beforeRange], - }), - current: getRequest({ + documentTypeQuery: getRequest({ documentType, rollupInterval, filters: [...kql, ...currentRange], }), - ...(documentType !== ApmDocumentType.ServiceTransactionMetric + ...(isLegacyDocType(documentType, rollupInterval) ? { - durationSummaryCheck: getRequest({ + durationSummaryNotSupportedQuery: getRequest({ documentType, rollupInterval, - filters: [...kql, ...currentRange, getDurationLegacyFilter()], + filters: [...kql, ...currentRange, isDurationSummaryNotSupportedFilter()], }), } - : {}), + : undefined), })); }; -const mapToSources = (sources: DocumentTypeData[], hasAnySourceDocBefore: boolean) => { - return sources.map((source) => { - const { documentType, hasDocAfter, hasDocBefore, rollupInterval, allHaveDurationSummary } = - source; - - const hasDocBeforeOrAfter = hasDocBefore || hasDocAfter; - - // If there is any data before, we require that data is available before - // this time range to mark this source as available. If we don't do that, - // users that upgrade to a version that starts generating service tx metrics - // will see a mostly empty screen for a while after upgrading. - // If we only check before, users with a new deployment will use raw transaction - // events. - const hasDocs = hasAnySourceDocBefore ? hasDocBefore : hasDocBeforeOrAfter; - - return { - documentType, - rollupInterval, - hasDocs, - hasDurationSummaryField: allHaveDurationSummary, - }; - }); +const isLegacyDocType = (documentType: ApmDocumentType, rollupInterval: RollupInterval) => { + return ( + documentType === ApmDocumentType.TransactionMetric && + rollupInterval === RollupInterval.OneMinute + ); }; diff --git a/x-pack/plugins/observability_solution/apm/server/lib/helpers/transactions/index.ts b/x-pack/plugins/observability_solution/apm/server/lib/helpers/transactions/index.ts index 117c2c667b9c2..f1aa16f4e4f37 100644 --- a/x-pack/plugins/observability_solution/apm/server/lib/helpers/transactions/index.ts +++ b/x-pack/plugins/observability_solution/apm/server/lib/helpers/transactions/index.ts @@ -164,17 +164,10 @@ export function isRootTransaction(searchAggregatedTransactions: boolean) { }; } -export function getDurationLegacyFilter(): QueryDslQueryContainer { +export function isDurationSummaryNotSupportedFilter(): QueryDslQueryContainer { return { bool: { - must: [ - { - bool: { - filter: [{ exists: { field: TRANSACTION_DURATION_HISTOGRAM } }], - must_not: [{ exists: { field: TRANSACTION_DURATION_SUMMARY } }], - }, - }, - ], + must_not: [{ exists: { field: TRANSACTION_DURATION_SUMMARY } }], }, }; } diff --git a/x-pack/test/apm_api_integration/tests/time_range_metadata/many_apm_server_versions.spec.ts b/x-pack/test/apm_api_integration/tests/time_range_metadata/many_apm_server_versions.spec.ts index 01b4b35530836..6031b7dd8de5b 100644 --- a/x-pack/test/apm_api_integration/tests/time_range_metadata/many_apm_server_versions.spec.ts +++ b/x-pack/test/apm_api_integration/tests/time_range_metadata/many_apm_server_versions.spec.ts @@ -7,11 +7,7 @@ import expect from '@kbn/expect'; import { apm, timerange } from '@kbn/apm-synthtrace-client'; import moment from 'moment'; -import { - addObserverVersionTransform, - ApmSynthtraceEsClient, - deleteSummaryFieldTransform, -} from '@kbn/apm-synthtrace'; +import { ApmSynthtraceEsClient } from '@kbn/apm-synthtrace'; import { TRANSACTION_DURATION_HISTOGRAM, TRANSACTION_DURATION_SUMMARY, @@ -19,7 +15,7 @@ import { import { ApmDocumentType } from '@kbn/apm-plugin/common/document_type'; import { RollupInterval } from '@kbn/apm-plugin/common/rollup'; import { LatencyAggregationType } from '@kbn/apm-plugin/common/latency_aggregation_types'; -import { pipeline, Readable } from 'stream'; +import { Readable } from 'stream'; import { FtrProviderContext } from '../../common/ftr_provider_context'; import { ApmApiClient } from '../../common/config'; @@ -32,9 +28,9 @@ export default function ApiTest({ getService }: FtrProviderContext) { const baseTime = new Date('2023-10-01T00:00:00.000Z').getTime(); const startLegacy = moment(baseTime).add(0, 'minutes'); const start = moment(baseTime).add(5, 'minutes'); - const end = moment(baseTime).add(10, 'minutes'); + const endLegacy = moment(baseTime).add(10, 'minutes'); + const end = moment(baseTime).add(15, 'minutes'); - // FLAKY: https://github.com/elastic/kibana/issues/177534 registry.when( 'Time range metadata when there are multiple APM Server versions', { config: 'basic', archives: [] }, @@ -44,7 +40,7 @@ export default function ApiTest({ getService }: FtrProviderContext) { await generateTraceDataForService({ serviceName: 'synth-java-legacy', start: startLegacy, - end, + end: endLegacy, isLegacy: true, synthtrace, }); @@ -78,7 +74,7 @@ export default function ApiTest({ getService }: FtrProviderContext) { }); // @ts-expect-error - expect(res.hits.total.value).to.be(10); + expect(res.hits.total.value).to.be(20); }); it('ingests transaction metrics without transaction.duration.summary', async () => { @@ -95,7 +91,7 @@ export default function ApiTest({ getService }: FtrProviderContext) { }); // @ts-expect-error - expect(res.hits.total.value).to.be(20); + expect(res.hits.total.value).to.be(10); }); it('has transaction.duration.summary field for every document type', async () => { @@ -103,7 +99,7 @@ export default function ApiTest({ getService }: FtrProviderContext) { endpoint: 'GET /internal/apm/time_range_metadata', params: { query: { - start: start.toISOString(), + start: endLegacy.toISOString(), end: end.toISOString(), enableContinuousRollups: true, enableServiceTransactionMetrics: true, @@ -116,8 +112,8 @@ export default function ApiTest({ getService }: FtrProviderContext) { const allHasSummaryField = response.body.sources .filter( (source) => - source.documentType === ApmDocumentType.TransactionMetric && - source.rollupInterval !== RollupInterval.OneMinute + source.documentType !== ApmDocumentType.TransactionEvent && + source.rollupInterval !== RollupInterval.SixtyMinutes // there is not enough data for 60 minutes ) .every((source) => { return source.hasDurationSummaryField; @@ -132,7 +128,7 @@ export default function ApiTest({ getService }: FtrProviderContext) { params: { query: { start: startLegacy.toISOString(), - end: end.toISOString(), + end: endLegacy.toISOString(), enableContinuousRollups: true, enableServiceTransactionMetrics: true, useSpanName: false, @@ -148,11 +144,35 @@ export default function ApiTest({ getService }: FtrProviderContext) { expect(allHasSummaryField).to.eql(false); }); + it('does not support transaction.duration.summary for transactionMetric 1m when not all documents within the range support it ', async () => { + const response = await apmApiClient.readUser({ + endpoint: 'GET /internal/apm/time_range_metadata', + params: { + query: { + start: startLegacy.toISOString(), + end: end.toISOString(), + enableContinuousRollups: true, + enableServiceTransactionMetrics: true, + useSpanName: false, + kuery: '', + }, + }, + }); + + const hasDurationSummaryField = response.body.sources.find( + (source) => + source.documentType === ApmDocumentType.TransactionMetric && + source.rollupInterval === RollupInterval.OneMinute // there is not enough data for 60 minutes in the timerange defined for the tests + )?.hasDurationSummaryField; + + expect(hasDurationSummaryField).to.eql(false); + }); + it('does not have latency data for synth-java-legacy', async () => { const res = await getLatencyChartForService({ serviceName: 'synth-java-legacy', start, - end, + end: endLegacy, apmApiClient, useDurationSummary: true, }); @@ -171,18 +191,13 @@ export default function ApiTest({ getService }: FtrProviderContext) { const res = await getLatencyChartForService({ serviceName: 'synth-java', start, - end, + end: endLegacy, apmApiClient, useDurationSummary: true, }); expect(res.body.currentPeriod.latencyTimeseries.map(({ y }) => y)).to.eql([ - 1000000, - 1000000, - 1000000, - 1000000, - 1000000, - null, + 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, ]); }); }); @@ -256,21 +271,7 @@ function generateTraceDataForService({ ); const apmPipeline = (base: Readable) => { - const defaultPipeline = synthtrace.getDefaultPipeline()( - base - ) as unknown as NodeJS.ReadableStream; - - return pipeline( - defaultPipeline, - addObserverVersionTransform('8.5.0'), - deleteSummaryFieldTransform(), - (err) => { - if (err) { - // eslint-disable-next-line no-console - console.error(err); - } - } - ); + return synthtrace.getDefaultPipeline({ versionOverride: '8.5.0' })(base); }; return synthtrace.index(events, isLegacy ? apmPipeline : undefined); diff --git a/x-pack/test/apm_api_integration/tests/time_range_metadata/time_range_metadata.spec.ts b/x-pack/test/apm_api_integration/tests/time_range_metadata/time_range_metadata.spec.ts index 43aee07583c18..6e73372f261ae 100644 --- a/x-pack/test/apm_api_integration/tests/time_range_metadata/time_range_metadata.spec.ts +++ b/x-pack/test/apm_api_integration/tests/time_range_metadata/time_range_metadata.spec.ts @@ -11,12 +11,8 @@ import { omit, sortBy } from 'lodash'; import moment, { Moment } from 'moment'; import { ApmDocumentType } from '@kbn/apm-plugin/common/document_type'; import { RollupInterval } from '@kbn/apm-plugin/common/rollup'; -import { - addObserverVersionTransform, - ApmSynthtraceEsClient, - deleteSummaryFieldTransform, -} from '@kbn/apm-synthtrace'; -import { Readable, pipeline } from 'stream'; +import { ApmSynthtraceEsClient } from '@kbn/apm-synthtrace'; +import { Readable } from 'stream'; import { ToolingLog } from '@kbn/tooling-log'; import { FtrProviderContext } from '../../common/ftr_provider_context'; @@ -78,9 +74,8 @@ export default function ApiTest({ getService }: FtrProviderContext) { }); }); - // FLAKY: https://github.com/elastic/kibana/issues/177541 registry.when( - 'Time range metadata when generating summary data', + 'Time range metadata when generating data with multiple APM server versions', { config: 'basic', archives: [] }, () => { describe('data loaded with and without summary field', () => { @@ -88,7 +83,7 @@ export default function ApiTest({ getService }: FtrProviderContext) { const withoutSummaryFieldEnd = moment(withoutSummaryFieldStart).add(2, 'hours'); const withSummaryFieldStart = moment(withoutSummaryFieldEnd); - const withSummaryFieldEnd = moment(withoutSummaryFieldEnd).add(2, 'hours'); + const withSummaryFieldEnd = moment(withSummaryFieldStart).add(2, 'hours'); before(async () => { await getTransactionEvents({ @@ -112,42 +107,161 @@ export default function ApiTest({ getService }: FtrProviderContext) { return apmSynthtraceEsClient.clean(); }); - describe('Values for hasDurationSummaryField for transaction metrics', () => { - it('returns true when summary field is available both inside and outside the range', async () => { + describe('aggregators and summary field support', () => { + it('returns support only for legacy transactionMetrics 1m without duration summary field', async () => { const response = await getTimeRangeMedata({ - start: moment(withSummaryFieldStart).add(1, 'hour'), - end: moment(withSummaryFieldEnd), + start: withoutSummaryFieldStart, + end: withoutSummaryFieldEnd, }); expect( response.sources.filter( - (source) => - source.documentType === ApmDocumentType.TransactionMetric && - source.hasDurationSummaryField - ).length - ).to.eql(3); + (source) => source.documentType !== ApmDocumentType.TransactionEvent + ) + ).to.eql([ + { + documentType: ApmDocumentType.ServiceTransactionMetric, + rollupInterval: RollupInterval.TenMinutes, + hasDocs: false, + hasDurationSummaryField: false, + }, + { + documentType: ApmDocumentType.ServiceTransactionMetric, + rollupInterval: RollupInterval.OneMinute, + hasDocs: false, + hasDurationSummaryField: false, + }, + { + documentType: ApmDocumentType.ServiceTransactionMetric, + rollupInterval: RollupInterval.SixtyMinutes, + hasDocs: false, + hasDurationSummaryField: false, + }, + { + documentType: ApmDocumentType.TransactionMetric, + rollupInterval: RollupInterval.TenMinutes, + hasDocs: false, + hasDurationSummaryField: false, + }, + { + documentType: ApmDocumentType.TransactionMetric, + rollupInterval: RollupInterval.OneMinute, + hasDocs: true, + hasDurationSummaryField: false, + }, + { + documentType: ApmDocumentType.TransactionMetric, + rollupInterval: RollupInterval.SixtyMinutes, + hasDocs: false, + hasDurationSummaryField: false, + }, + ]); + }); + + it('returns support for all document types with duration summary field', async () => { + const response = await getTimeRangeMedata({ + start: withSummaryFieldStart, + end: withSummaryFieldEnd, + }); + + expect( + response.sources.filter( + (source) => source.documentType !== ApmDocumentType.TransactionEvent + ) + ).to.eql([ + { + documentType: ApmDocumentType.ServiceTransactionMetric, + rollupInterval: RollupInterval.TenMinutes, + hasDocs: true, + hasDurationSummaryField: true, + }, + { + documentType: ApmDocumentType.ServiceTransactionMetric, + rollupInterval: RollupInterval.OneMinute, + hasDocs: true, + hasDurationSummaryField: true, + }, + { + documentType: ApmDocumentType.ServiceTransactionMetric, + rollupInterval: RollupInterval.SixtyMinutes, + hasDocs: true, + hasDurationSummaryField: true, + }, + { + documentType: ApmDocumentType.TransactionMetric, + rollupInterval: RollupInterval.TenMinutes, + hasDocs: true, + hasDurationSummaryField: true, + }, + { + documentType: ApmDocumentType.TransactionMetric, + rollupInterval: RollupInterval.OneMinute, + hasDocs: true, + hasDurationSummaryField: true, + }, + { + documentType: ApmDocumentType.TransactionMetric, + rollupInterval: RollupInterval.SixtyMinutes, + hasDocs: true, + hasDurationSummaryField: true, + }, + ]); }); - it('returns false when summary field is available inside but not outside the range', async () => { + it('returns support only for transaction 1m when timerange includes both new and legacy documents', async () => { const response = await getTimeRangeMedata({ - start: moment(withSummaryFieldStart).subtract(30, 'minutes'), - end: moment(withSummaryFieldEnd), + start: withoutSummaryFieldStart, + end: withSummaryFieldEnd, }); expect( response.sources.filter( - (source) => - source.documentType === ApmDocumentType.TransactionMetric && - !source.hasDurationSummaryField - ).length - ).to.eql(2); + (source) => source.documentType !== ApmDocumentType.TransactionEvent + ) + ).to.eql([ + { + documentType: ApmDocumentType.ServiceTransactionMetric, + rollupInterval: RollupInterval.TenMinutes, + hasDocs: false, + hasDurationSummaryField: false, + }, + { + documentType: ApmDocumentType.ServiceTransactionMetric, + rollupInterval: RollupInterval.OneMinute, + hasDocs: false, + hasDurationSummaryField: false, + }, + { + documentType: ApmDocumentType.ServiceTransactionMetric, + rollupInterval: RollupInterval.SixtyMinutes, + hasDocs: false, + hasDurationSummaryField: false, + }, + { + documentType: ApmDocumentType.TransactionMetric, + rollupInterval: RollupInterval.TenMinutes, + hasDocs: false, + hasDurationSummaryField: false, + }, + { + documentType: ApmDocumentType.TransactionMetric, + rollupInterval: RollupInterval.OneMinute, + hasDocs: true, + hasDurationSummaryField: false, + }, + { + documentType: ApmDocumentType.TransactionMetric, + rollupInterval: RollupInterval.SixtyMinutes, + hasDocs: false, + hasDurationSummaryField: false, + }, + ]); }); }); }); } ); - // FLAKY: https://github.com/elastic/kibana/issues/177601 registry.when( 'Time range metadata when generating data', { config: 'basic', archives: [] }, @@ -400,8 +514,8 @@ export default function ApiTest({ getService }: FtrProviderContext) { }); describe('when service metrics are only available in the current time range', () => { - before(async () => { - await es.deleteByQuery({ + before(async () => + es.deleteByQuery({ index: 'metrics-apm*', query: { bool: { @@ -414,7 +528,7 @@ export default function ApiTest({ getService }: FtrProviderContext) { { range: { '@timestamp': { - lte: start.toISOString(), + gte: start.toISOString(), }, }, }, @@ -423,8 +537,8 @@ export default function ApiTest({ getService }: FtrProviderContext) { }, refresh: true, expand_wildcards: ['open', 'hidden'], - }); - }); + }) + ); it('marks service transaction metrics as unavailable', async () => { const response = await getTimeRangeMedata({ @@ -495,7 +609,7 @@ export default function ApiTest({ getService }: FtrProviderContext) { documentType: ApmDocumentType.TransactionMetric, rollupInterval: RollupInterval.OneMinute, hasDocs: false, - hasDurationSummaryField: true, + hasDurationSummaryField: false, }, { documentType: ApmDocumentType.TransactionMetric, @@ -561,20 +675,7 @@ function getTransactionEvents({ ]; const apmPipeline = (base: Readable) => { - const defaultPipeline = synthtrace.getDefaultPipeline()( - base - ) as unknown as NodeJS.ReadableStream; - - return pipeline( - defaultPipeline, - addObserverVersionTransform('8.5.0'), - deleteSummaryFieldTransform(), - (err) => { - if (err) { - logger.error(err); - } - } - ); + return synthtrace.getDefaultPipeline({ versionOverride: '8.5.0' })(base); }; return synthtrace.index(events, isLegacy ? apmPipeline : undefined); From 2ad67e9f89a1810b41ee98f4011ce23325ffe143 Mon Sep 17 00:00:00 2001 From: Samiul Monir <150824886+Samiul-TheSoccerFan@users.noreply.github.com> Date: Tue, 7 May 2024 10:21:29 -0400 Subject: [PATCH 25/86] [Serverless ]Fix Playground in Serverless (#182739) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit ## Summary We encountered an issue in Serverless ```core.entry.js:16 TypeError: Cannot read properties of undefined (reading 'reportUiCounter') at searchPlayground.chunk.0.js:3:27662 at Object.useMemo (kbn-ui-shared-deps-npm.dll.js:425:65135) at t.useMemo (kbn-ui-shared-deps-npm.dll.js:401:5744) at u (searchPlayground.chunk.0.js:3:27646) at pe (searchPlayground.chunk.1.js:3:48026) at la (kbn-ui-shared-deps-npm.dll.js:425:59212) at ec (kbn-ui-shared-deps-npm.dll.js:425:114853) at Pc (kbn-ui-shared-deps-npm.dll.js:425:99713) at Nc (kbn-ui-shared-deps-npm.dll.js:425:99563) at Dc (kbn-ui-shared-deps-npm.dll.js:425:99396) ``` This PR includes: - Fix Playground loading issue - Added Functional testing ## UX ![Screenshot 2024-05-06 at 2 15 42 PM](https://github.com/elastic/kibana/assets/150824886/27e47cc9-a556-4c61-9b2e-3a327984181b) ![Screenshot 2024-05-06 at 2 15 51 PM](https://github.com/elastic/kibana/assets/150824886/f21d22e0-40d2-4a9b-bd68-d673a30e147d) ### Checklist Delete any items that are not applicable to this PR. - [ ] Any text added follows [EUI's writing guidelines](https://elastic.github.io/eui/#/guidelines/writing), uses sentence case text and includes [i18n support](https://github.com/elastic/kibana/blob/main/packages/kbn-i18n/README.md) - [ ] [Documentation](https://www.elastic.co/guide/en/kibana/master/development-documentation.html) was added for features that require explanation or tutorials - [ ] [Unit or functional tests](https://www.elastic.co/guide/en/kibana/master/development-tests.html) were updated or added to match the most common scenarios - [ ] [Flaky Test Runner](https://ci-stats.kibana.dev/trigger_flaky_test_runner/1) was used on any tests changed - [ ] Any UI touched in this PR is usable by keyboard only (learn more about [keyboard accessibility](https://webaim.org/techniques/keyboard/)) - [ ] Any UI touched in this PR does not create any new axe failures (run axe in browser: [FF](https://addons.mozilla.org/en-US/firefox/addon/axe-devtools/), [Chrome](https://chrome.google.com/webstore/detail/axe-web-accessibility-tes/lhdoppojpmngadmnindnejefpokejbdd?hl=en-US)) - [ ] If a plugin configuration key changed, check if it needs to be allowlisted in the cloud and added to the [docker list](https://github.com/elastic/kibana/blob/main/src/dev/build/tasks/os_packages/docker_generator/resources/base/bin/kibana-docker) - [ ] This renders correctly on smaller devices using a responsive layout. (You can test this [in your browser](https://www.browserstack.com/guide/responsive-testing-on-local-server)) - [ ] This was checked for [cross-browser compatibility](https://www.elastic.co/support/matrix#matrix_browsers) ### For maintainers - [ ] This was checked for breaking API changes and was [labeled appropriately](https://www.elastic.co/guide/en/kibana/master/contributing.html#kibana-release-notes-process) --- x-pack/plugins/search_playground/kibana.jsonc | 3 +- .../public/components/chat.tsx | 10 ++--- .../edit_context/edit_context_flyout.tsx | 8 ++-- .../message_list/citations_table.tsx | 4 +- .../message_list/retrieval_docs_flyout.tsx | 2 +- .../set_up_connector_panel_for_start_chat.tsx | 9 ++-- .../sources_panel_for_start_chat.tsx | 1 + .../public/components/start_chat_panel.tsx | 4 +- .../public/components/start_new_chat.tsx | 4 +- .../include_citations_field.tsx | 2 +- .../instructions_field.tsx | 2 +- .../summarization_model.tsx | 2 +- .../public/components/toolbar.tsx | 2 +- .../components/view_code/view_code_flyout.tsx | 4 +- .../view_query/view_query_flyout.tsx | 6 +-- .../public/hooks/use_source_indices_field.ts | 9 ++-- .../public/hooks/use_usage_tracker.test.ts | 25 ++++++++--- .../public/hooks/use_usage_tracker.ts | 41 ++++++++++--------- .../plugins/search_playground/public/types.ts | 4 +- .../functional/page_objects/index.ts | 2 + .../page_objects/svl_playground_page.ts | 26 ++++++++++++ .../test_suites/search/navigation.ts | 9 ++++ .../test_suites/search/playground_overview.ts | 27 ++++++++++++ 23 files changed, 146 insertions(+), 60 deletions(-) create mode 100644 x-pack/test_serverless/functional/page_objects/svl_playground_page.ts create mode 100644 x-pack/test_serverless/functional/test_suites/search/playground_overview.ts diff --git a/x-pack/plugins/search_playground/kibana.jsonc b/x-pack/plugins/search_playground/kibana.jsonc index 07c5866b34029..221d5bf9e1873 100644 --- a/x-pack/plugins/search_playground/kibana.jsonc +++ b/x-pack/plugins/search_playground/kibana.jsonc @@ -20,7 +20,8 @@ "triggersActionsUi", ], "optionalPlugins": [ - "cloud" + "cloud", + "usageCollection", ], "requiredBundles": [ "kibanaReact" diff --git a/x-pack/plugins/search_playground/public/components/chat.tsx b/x-pack/plugins/search_playground/public/components/chat.tsx index d0c28117fcca4..59e52778e42ca 100644 --- a/x-pack/plugins/search_playground/public/components/chat.tsx +++ b/x-pack/plugins/search_playground/public/components/chat.tsx @@ -68,13 +68,13 @@ export const Chat = () => { data: buildFormData(data), } ); - usageTracker.click(AnalyticsEvents.chatQuestionSent); + usageTracker?.click(AnalyticsEvents.chatQuestionSent); resetField(ChatFormFields.question); }; const handleStopRequest = () => { stopRequest(); - usageTracker.click(AnalyticsEvents.chatRequestStopped); + usageTracker?.click(AnalyticsEvents.chatRequestStopped); }; const chatMessages = useMemo( () => [ @@ -101,15 +101,15 @@ export const Chat = () => { }); setIsRegenerating(false); - usageTracker.click(AnalyticsEvents.chatRegenerateMessages); + usageTracker?.click(AnalyticsEvents.chatRegenerateMessages); }; const handleClearChat = () => { setMessages([]); - usageTracker.click(AnalyticsEvents.chatCleared); + usageTracker?.click(AnalyticsEvents.chatCleared); }; useEffect(() => { - usageTracker.load(AnalyticsEvents.chatPageLoaded); + usageTracker?.load(AnalyticsEvents.chatPageLoaded); }, [usageTracker]); return ( diff --git a/x-pack/plugins/search_playground/public/components/edit_context/edit_context_flyout.tsx b/x-pack/plugins/search_playground/public/components/edit_context/edit_context_flyout.tsx index 5a3a6065cba3a..c56b1848e70f4 100644 --- a/x-pack/plugins/search_playground/public/components/edit_context/edit_context_flyout.tsx +++ b/x-pack/plugins/search_playground/public/components/edit_context/edit_context_flyout.tsx @@ -65,23 +65,23 @@ export const EditContextFlyout: React.FC = ({ onClose }) ...tempSourceFields, [index]: [field], }); - usageTracker.click(AnalyticsEvents.editContextFieldToggled); + usageTracker?.click(AnalyticsEvents.editContextFieldToggled); }; const saveSourceFields = () => { - usageTracker.click(AnalyticsEvents.editContextSaved); + usageTracker?.click(AnalyticsEvents.editContextSaved); onChangeSourceFields(tempSourceFields); onChangeSize(docSize); onClose(); }; const handleDocSizeChange = (e: React.ChangeEvent) => { - usageTracker.click(AnalyticsEvents.editContextDocSizeChanged); + usageTracker?.click(AnalyticsEvents.editContextDocSizeChanged); setDocSize(Number(e.target.value)); }; useEffect(() => { - usageTracker.load(AnalyticsEvents.editContextFlyoutOpened); + usageTracker?.load(AnalyticsEvents.editContextFlyoutOpened); }, [usageTracker]); return ( diff --git a/x-pack/plugins/search_playground/public/components/message_list/citations_table.tsx b/x-pack/plugins/search_playground/public/components/message_list/citations_table.tsx index aaa6fcb650f96..feca593604a92 100644 --- a/x-pack/plugins/search_playground/public/components/message_list/citations_table.tsx +++ b/x-pack/plugins/search_playground/public/components/message_list/citations_table.tsx @@ -32,12 +32,12 @@ export const CitationsTable: React.FC = ({ citations }) => if (itemIdToExpandedRowMapValues[citation.metadata._id]) { delete itemIdToExpandedRowMapValues[citation.metadata._id]; - usageTracker.click(AnalyticsEvents.citationDetailsCollapsed); + usageTracker?.click(AnalyticsEvents.citationDetailsCollapsed); } else { itemIdToExpandedRowMapValues[citation.metadata._id] = ( {citation.content} ); - usageTracker.click(AnalyticsEvents.citationDetailsExpanded); + usageTracker?.click(AnalyticsEvents.citationDetailsExpanded); } setItemIdToExpandedRowMap(itemIdToExpandedRowMapValues); diff --git a/x-pack/plugins/search_playground/public/components/message_list/retrieval_docs_flyout.tsx b/x-pack/plugins/search_playground/public/components/message_list/retrieval_docs_flyout.tsx index 80d6e1dbe5bdc..38ddc9cc4458a 100644 --- a/x-pack/plugins/search_playground/public/components/message_list/retrieval_docs_flyout.tsx +++ b/x-pack/plugins/search_playground/public/components/message_list/retrieval_docs_flyout.tsx @@ -81,7 +81,7 @@ export const RetrievalDocsFlyout: React.FC = ({ ]; useEffect(() => { - usageTracker.load(AnalyticsEvents.retrievalDocsFlyoutOpened); + usageTracker?.load(AnalyticsEvents.retrievalDocsFlyoutOpened); }, [usageTracker]); return ( diff --git a/x-pack/plugins/search_playground/public/components/set_up_connector_panel_for_start_chat.tsx b/x-pack/plugins/search_playground/public/components/set_up_connector_panel_for_start_chat.tsx index 2bd885b46514b..2430cd4e6c7a0 100644 --- a/x-pack/plugins/search_playground/public/components/set_up_connector_panel_for_start_chat.tsx +++ b/x-pack/plugins/search_playground/public/components/set_up_connector_panel_for_start_chat.tsx @@ -36,19 +36,19 @@ export const SetUpConnectorPanelForStartChat: React.FC = () => { setConnectorFlyoutOpen(false); }; const handleSetupGenAiConnector = () => { - usageTracker.click(AnalyticsEvents.genAiConnectorCreated); + usageTracker?.click(AnalyticsEvents.genAiConnectorCreated); setConnectorFlyoutOpen(true); }; useEffect(() => { if (connectors?.length) { if (showCallout) { - usageTracker.load(AnalyticsEvents.genAiConnectorAdded); + usageTracker?.load(AnalyticsEvents.genAiConnectorAdded); } else { - usageTracker.load(AnalyticsEvents.genAiConnectorExists); + usageTracker?.load(AnalyticsEvents.genAiConnectorExists); } } else { - usageTracker.load(AnalyticsEvents.genAiConnectorSetup); + usageTracker?.load(AnalyticsEvents.genAiConnectorSetup); } }, [connectors?.length, showCallout, usageTracker]); @@ -82,6 +82,7 @@ export const SetUpConnectorPanelForStartChat: React.FC = () => { defaultMessage="You need to connect to a large-language model to use this feature. Start by adding connection details for your LLM provider." /> } + dataTestSubj="connectToLLMChatPanel" > diff --git a/x-pack/plugins/search_playground/public/components/sources_panel/sources_panel_for_start_chat.tsx b/x-pack/plugins/search_playground/public/components/sources_panel/sources_panel_for_start_chat.tsx index 8e2b2b7896c5e..5a270fe3d44dd 100644 --- a/x-pack/plugins/search_playground/public/components/sources_panel/sources_panel_for_start_chat.tsx +++ b/x-pack/plugins/search_playground/public/components/sources_panel/sources_panel_for_start_chat.tsx @@ -35,6 +35,7 @@ export const SourcesPanelForStartChat: React.FC = () => { "Select the Elasticsearch indices you'd like to query, providing additional context for the LLM.", })} isValid={!!selectedIndices.length} + dataTestSubj="selectIndicesChatPanel" > {!!selectedIndices?.length && ( diff --git a/x-pack/plugins/search_playground/public/components/start_chat_panel.tsx b/x-pack/plugins/search_playground/public/components/start_chat_panel.tsx index c08d9bdbeeafd..996f088090d29 100644 --- a/x-pack/plugins/search_playground/public/components/start_chat_panel.tsx +++ b/x-pack/plugins/search_playground/public/components/start_chat_panel.tsx @@ -22,6 +22,7 @@ interface StartChatPanelProps { title: string; description: string | React.ReactNode; isValid?: boolean; + dataTestSubj: string; } export const StartChatPanel: FC> = ({ @@ -29,8 +30,9 @@ export const StartChatPanel: FC> = ({ description, children, isValid, + dataTestSubj, }) => ( - +
{title}
diff --git a/x-pack/plugins/search_playground/public/components/start_new_chat.tsx b/x-pack/plugins/search_playground/public/components/start_new_chat.tsx index eef59b44820ea..0db891438cb3d 100644 --- a/x-pack/plugins/search_playground/public/components/start_new_chat.tsx +++ b/x-pack/plugins/search_playground/public/components/start_new_chat.tsx @@ -37,7 +37,7 @@ export const StartNewChat: React.FC = ({ onStartClick }) => { const usageTracker = useUsageTracker(); useEffect(() => { - usageTracker.load(AnalyticsEvents.startNewChatPageLoaded); + usageTracker?.load(AnalyticsEvents.startNewChatPageLoaded); }, [usageTracker]); return ( @@ -85,7 +85,7 @@ export const StartNewChat: React.FC = ({ onStartClick }) => {
- + = ({ const usageTracker = useUsageTracker(); const handleChange = (value: boolean) => { onChange(value); - usageTracker.click(`${AnalyticsEvents.includeCitations}_${String(value)}`); + usageTracker?.click(`${AnalyticsEvents.includeCitations}_${String(value)}`); }; return ( diff --git a/x-pack/plugins/search_playground/public/components/summarization_panel/instructions_field.tsx b/x-pack/plugins/search_playground/public/components/summarization_panel/instructions_field.tsx index d4e909c3f1dd2..baea917937264 100644 --- a/x-pack/plugins/search_playground/public/components/summarization_panel/instructions_field.tsx +++ b/x-pack/plugins/search_playground/public/components/summarization_panel/instructions_field.tsx @@ -29,7 +29,7 @@ export const InstructionsField: React.FC = ({ value, onC }; const handleBlur = () => { if (baseValue !== value) { - usageTracker.click(AnalyticsEvents.instructionsFieldChanged); + usageTracker?.click(AnalyticsEvents.instructionsFieldChanged); } setBaseValue(''); }; diff --git a/x-pack/plugins/search_playground/public/components/summarization_panel/summarization_model.tsx b/x-pack/plugins/search_playground/public/components/summarization_panel/summarization_model.tsx index dc390479a5b1b..13a77d0c01e10 100644 --- a/x-pack/plugins/search_playground/public/components/summarization_panel/summarization_model.tsx +++ b/x-pack/plugins/search_playground/public/components/summarization_panel/summarization_model.tsx @@ -97,7 +97,7 @@ export const SummarizationModel: React.FC = ({ ); useEffect(() => { - usageTracker.click( + usageTracker?.click( `${AnalyticsEvents.modelSelected}_${selectedModel.value || selectedModel.connectorType}` ); }, [usageTracker, selectedModel]); diff --git a/x-pack/plugins/search_playground/public/components/toolbar.tsx b/x-pack/plugins/search_playground/public/components/toolbar.tsx index b35062fa80eb6..e322c9c6bb3ff 100644 --- a/x-pack/plugins/search_playground/public/components/toolbar.tsx +++ b/x-pack/plugins/search_playground/public/components/toolbar.tsx @@ -13,7 +13,7 @@ import { EditContextAction } from './edit_context/edit_context_action'; export const Toolbar: React.FC = () => { return ( - + diff --git a/x-pack/plugins/search_playground/public/components/view_code/view_code_flyout.tsx b/x-pack/plugins/search_playground/public/components/view_code/view_code_flyout.tsx index b9eba5baa673b..b90ea9a9ee3b3 100644 --- a/x-pack/plugins/search_playground/public/components/view_code/view_code_flyout.tsx +++ b/x-pack/plugins/search_playground/public/components/view_code/view_code_flyout.tsx @@ -70,11 +70,11 @@ export const ViewCodeFlyout: React.FC = ({ onClose }) => { }; useEffect(() => { - usageTracker.load(AnalyticsEvents.viewCodeFlyoutOpened); + usageTracker?.load(AnalyticsEvents.viewCodeFlyoutOpened); }, [usageTracker]); useEffect(() => { - usageTracker.click(`${AnalyticsEvents.viewCodeLanguageChange}_${selectedLanguage}`); + usageTracker?.click(`${AnalyticsEvents.viewCodeLanguageChange}_${selectedLanguage}`); }, [usageTracker, selectedLanguage]); return ( diff --git a/x-pack/plugins/search_playground/public/components/view_query/view_query_flyout.tsx b/x-pack/plugins/search_playground/public/components/view_query/view_query_flyout.tsx index 621fecfaf72d4..d808fec85aaa4 100644 --- a/x-pack/plugins/search_playground/public/components/view_query/view_query_flyout.tsx +++ b/x-pack/plugins/search_playground/public/components/view_query/view_query_flyout.tsx @@ -106,7 +106,7 @@ export const ViewQueryFlyout: React.FC = ({ onClose }) => ...tempQueryFields, [index]: newFields, }); - usageTracker.count(AnalyticsEvents.viewQueryFieldsUpdated, newFields.length); + usageTracker?.count(AnalyticsEvents.viewQueryFieldsUpdated, newFields.length); }; const saveQuery = () => { @@ -117,12 +117,12 @@ export const ViewQueryFlyout: React.FC = ({ onClose }) => const groupedQueryFields = groupTypeQueryFields(fields, tempQueryFields); groupedQueryFields.forEach((typeQueryFields) => - usageTracker.click(`${AnalyticsEvents.viewQuerySaved}_${typeQueryFields}`) + usageTracker?.click(`${AnalyticsEvents.viewQuerySaved}_${typeQueryFields}`) ); }; useEffect(() => { - usageTracker.load(AnalyticsEvents.viewQueryFlyoutOpened); + usageTracker?.load(AnalyticsEvents.viewQueryFlyoutOpened); }, [usageTracker]); return ( diff --git a/x-pack/plugins/search_playground/public/hooks/use_source_indices_field.ts b/x-pack/plugins/search_playground/public/hooks/use_source_indices_field.ts index 1704181d7bc94..342be7c191778 100644 --- a/x-pack/plugins/search_playground/public/hooks/use_source_indices_field.ts +++ b/x-pack/plugins/search_playground/public/hooks/use_source_indices_field.ts @@ -91,7 +91,10 @@ export const useSourceIndicesFields = () => { onElasticsearchQueryChange(createQuery(defaultFields, fields)); onSourceFieldsChange(defaultSourceFields); - usageTracker.count(AnalyticsEvents.sourceFieldsLoaded, Object.values(fields)?.flat()?.length); + usageTracker?.count( + AnalyticsEvents.sourceFieldsLoaded, + Object.values(fields)?.flat()?.length + ); } else { setNoFieldsIndicesWarning(null); } @@ -103,14 +106,14 @@ export const useSourceIndicesFields = () => { const newIndices = [...selectedIndices, newIndex]; setLoading(true); onIndicesChange(newIndices); - usageTracker.count(AnalyticsEvents.sourceIndexUpdated, newIndices.length); + usageTracker?.count(AnalyticsEvents.sourceIndexUpdated, newIndices.length); }; const removeIndex = (index: IndexName) => { const newIndices = selectedIndices.filter((indexName: string) => indexName !== index); setLoading(true); onIndicesChange(newIndices); - usageTracker.count(AnalyticsEvents.sourceIndexUpdated, newIndices.length); + usageTracker?.count(AnalyticsEvents.sourceIndexUpdated, newIndices.length); }; return { diff --git a/x-pack/plugins/search_playground/public/hooks/use_usage_tracker.test.ts b/x-pack/plugins/search_playground/public/hooks/use_usage_tracker.test.ts index 2f2d118c0646d..9fb74674504f8 100644 --- a/x-pack/plugins/search_playground/public/hooks/use_usage_tracker.test.ts +++ b/x-pack/plugins/search_playground/public/hooks/use_usage_tracker.test.ts @@ -30,15 +30,15 @@ describe('useUsageTracker', () => { it('returns bound functions for tracking usage', () => { const { result } = renderHook(() => useUsageTracker()); - expect(typeof result.current.click).toBe('function'); - expect(typeof result.current.count).toBe('function'); - expect(typeof result.current.load).toBe('function'); + expect(typeof result.current?.click).toBe('function'); + expect(typeof result.current?.count).toBe('function'); + expect(typeof result.current?.load).toBe('function'); }); it('calls reportUiCounter with correct arguments for click', () => { const { result } = renderHook(() => useUsageTracker()); - result.current.click('button_click'); + result.current?.click('button_click'); expect(reportUiCounter).toHaveBeenCalledWith('search_playground', 'click', 'button_click'); }); @@ -46,7 +46,7 @@ describe('useUsageTracker', () => { it('calls reportUiCounter with correct arguments for count', () => { const { result } = renderHook(() => useUsageTracker()); - result.current.count('item_count'); + result.current?.count('item_count'); expect(reportUiCounter).toHaveBeenCalledWith('search_playground', 'count', 'item_count'); }); @@ -54,8 +54,21 @@ describe('useUsageTracker', () => { it('calls reportUiCounter with correct arguments for load', () => { const { result } = renderHook(() => useUsageTracker()); - result.current.load('page_loaded'); + result.current?.load('page_loaded'); expect(reportUiCounter).toHaveBeenCalledWith('search_playground', 'loaded', 'page_loaded'); }); + + it('does not reportUiCounter if usageCollection is not loaded properly', () => { + reportUiCounter = jest.fn(); + (useKibana as jest.Mock).mockReturnValue({ + services: { usageCollection: undefined }, + }); + + const { result } = renderHook(() => useUsageTracker()); + + result.current?.load('page_loaded'); + + expect(reportUiCounter).toHaveBeenCalledTimes(0); + }); }); diff --git a/x-pack/plugins/search_playground/public/hooks/use_usage_tracker.ts b/x-pack/plugins/search_playground/public/hooks/use_usage_tracker.ts index e8b63c120da0e..7764c0d84c85d 100644 --- a/x-pack/plugins/search_playground/public/hooks/use_usage_tracker.ts +++ b/x-pack/plugins/search_playground/public/hooks/use_usage_tracker.ts @@ -14,24 +14,25 @@ const APP_TRACKER_NAME = 'search_playground'; export const useUsageTracker = () => { const { usageCollection } = useKibana().services; - return useMemo( - () => ({ - click: usageCollection.reportUiCounter.bind( - usageCollection, - APP_TRACKER_NAME, - METRIC_TYPE.CLICK - ), - count: usageCollection.reportUiCounter.bind( - usageCollection, - APP_TRACKER_NAME, - METRIC_TYPE.COUNT - ), - load: usageCollection.reportUiCounter.bind( - usageCollection, - APP_TRACKER_NAME, - METRIC_TYPE.LOADED - ), - }), - [usageCollection] - ); + return useMemo(() => { + if (usageCollection) { + return { + click: usageCollection.reportUiCounter.bind( + usageCollection, + APP_TRACKER_NAME, + METRIC_TYPE.CLICK + ), + count: usageCollection.reportUiCounter.bind( + usageCollection, + APP_TRACKER_NAME, + METRIC_TYPE.COUNT + ), + load: usageCollection.reportUiCounter.bind( + usageCollection, + APP_TRACKER_NAME, + METRIC_TYPE.LOADED + ), + }; + } + }, [usageCollection]); }; diff --git a/x-pack/plugins/search_playground/public/types.ts b/x-pack/plugins/search_playground/public/types.ts index 1bfbca56f8f44..ebca62cad5acd 100644 --- a/x-pack/plugins/search_playground/public/types.ts +++ b/x-pack/plugins/search_playground/public/types.ts @@ -40,7 +40,7 @@ export interface SearchPlaygroundPluginStart { export interface AppPluginStartDependencies { history: AppMountParameters['history']; - usageCollection: UsageCollectionStart; + usageCollection?: UsageCollectionStart; navigation: NavigationPublicPluginStart; triggersActionsUi: TriggersAndActionsUIPublicPluginStart; share: SharePluginStart; @@ -52,7 +52,7 @@ export interface AppServicesContext { share: SharePluginStart; cloud?: CloudSetup; triggersActionsUi: TriggersAndActionsUIPublicPluginStart; - usageCollection: UsageCollectionStart; + usageCollection?: UsageCollectionStart; } export enum ChatFormFields { diff --git a/x-pack/test_serverless/functional/page_objects/index.ts b/x-pack/test_serverless/functional/page_objects/index.ts index f1604d48508e2..ebc85de7d332c 100644 --- a/x-pack/test_serverless/functional/page_objects/index.ts +++ b/x-pack/test_serverless/functional/page_objects/index.ts @@ -21,6 +21,7 @@ import { SvlRuleDetailsPageProvider } from './svl_rule_details_ui_page'; import { SvlSearchConnectorsPageProvider } from './svl_search_connectors_page'; import { SvlManagementPageProvider } from './svl_management_page'; import { SvlIngestPipelines } from './svl_ingest_pipelines'; +import { SvlPlaygroundPageProvider } from './svl_playground_page'; export const pageObjects = { ...xpackFunctionalPageObjects, @@ -38,4 +39,5 @@ export const pageObjects = { svlRuleDetailsUI: SvlRuleDetailsPageProvider, svlManagementPage: SvlManagementPageProvider, svlIngestPipelines: SvlIngestPipelines, + svlPlaygroundUI: SvlPlaygroundPageProvider, }; diff --git a/x-pack/test_serverless/functional/page_objects/svl_playground_page.ts b/x-pack/test_serverless/functional/page_objects/svl_playground_page.ts new file mode 100644 index 0000000000000..e0c26c031eb50 --- /dev/null +++ b/x-pack/test_serverless/functional/page_objects/svl_playground_page.ts @@ -0,0 +1,26 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import { FtrProviderContext } from '../ftr_provider_context'; + +export function SvlPlaygroundPageProvider({ getService }: FtrProviderContext) { + const testSubjects = getService('testSubjects'); + return { + PlaygrounStartChatPage: { + async expectPlaygroundStartChatPageComponentsToExist() { + await testSubjects.existOrFail('chat-playground-home-page-title'); + await testSubjects.existOrFail('selectIndicesChatPanel'); + await testSubjects.existOrFail('startChatButton'); + }, + + async expectPlaygroundHeaderComponentsToExist() { + await testSubjects.existOrFail('playground-header-actions'); + await testSubjects.existOrFail('playground-documentation-link'); + }, + }, + }; +} diff --git a/x-pack/test_serverless/functional/test_suites/search/navigation.ts b/x-pack/test_serverless/functional/test_suites/search/navigation.ts index a8af6692be57f..cfa54657dbeb2 100644 --- a/x-pack/test_serverless/functional/test_suites/search/navigation.ts +++ b/x-pack/test_serverless/functional/test_suites/search/navigation.ts @@ -70,6 +70,15 @@ export default function ({ getPageObject, getService }: FtrProviderContext) { await expectNoPageReload(); }); + it('navigate to playground from side nav', async () => { + await svlCommonNavigation.sidenav.clickLink({ deepLinkId: 'searchPlayground' }); + await svlCommonNavigation.breadcrumbs.expectBreadcrumbTexts(['Build', 'Playground']); + + await svlCommonNavigation.sidenav.expectLinkActive({ deepLinkId: 'searchPlayground' }); + + expect(await browser.getCurrentUrl()).contain('/app/search_playground/chat'); + }); + it("management apps from the sidenav hide the 'stack management' root from the breadcrumbs", async () => { await svlCommonNavigation.sidenav.clickLink({ deepLinkId: 'management:index_management' }); await svlCommonNavigation.breadcrumbs.expectBreadcrumbTexts([ diff --git a/x-pack/test_serverless/functional/test_suites/search/playground_overview.ts b/x-pack/test_serverless/functional/test_suites/search/playground_overview.ts new file mode 100644 index 0000000000000..17d9d81c1014c --- /dev/null +++ b/x-pack/test_serverless/functional/test_suites/search/playground_overview.ts @@ -0,0 +1,27 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import { FtrProviderContext } from '../../ftr_provider_context'; + +export default function ({ getPageObjects }: FtrProviderContext) { + const pageObjects = getPageObjects(['svlCommonPage', 'svlCommonNavigation', 'svlPlaygroundUI']); + describe('Playground', function () { + before(async () => { + await pageObjects.svlCommonPage.login(); + await pageObjects.svlCommonNavigation.sidenav.clickLink({ deepLinkId: 'searchPlayground' }); + }); + + after(async () => { + await pageObjects.svlCommonPage.forceLogout(); + }); + + it('playground app is loaded', async () => { + await pageObjects.svlPlaygroundUI.PlaygrounStartChatPage.expectPlaygroundStartChatPageComponentsToExist(); + await pageObjects.svlPlaygroundUI.PlaygrounStartChatPage.expectPlaygroundHeaderComponentsToExist(); + }); + }); +} From 75a4907c11685dcbcaee82dd340a8fb87513a844 Mon Sep 17 00:00:00 2001 From: Davis Plumlee <56367316+dplumlee@users.noreply.github.com> Date: Tue, 7 May 2024 10:21:56 -0400 Subject: [PATCH 26/86] [Security Solution] Fixes Rule Bulk Actions Integration Tests (#182527) ## Summary Resolves https://github.com/elastic/kibana/issues/182512 `should enable rules and migrate actions` test expects the rule to return a successful status but it always returns a partial failure as it cannot find the rule's index pattern: `auditbeat-*`. [Flaky test runner result (internal)](https://buildkite.com/elastic/kibana-flaky-test-suite-runner/builds/5862) ### Checklist Delete any items that are not applicable to this PR. - [x] [Unit or functional tests](https://www.elastic.co/guide/en/kibana/master/development-tests.html) were updated or added to match the most common scenarios - [x] [Flaky Test Runner](https://ci-stats.kibana.dev/trigger_flaky_test_runner/1) was used on any tests changed ### For maintainers - [ ] This was checked for breaking API changes and was [labeled appropriately](https://www.elastic.co/guide/en/kibana/master/contributing.html#kibana-release-notes-process) --- .../trial_license_complete_tier/perform_bulk_action_ess.ts | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/x-pack/test/security_solution_api_integration/test_suites/detections_response/rules_management/rule_bulk_actions/trial_license_complete_tier/perform_bulk_action_ess.ts b/x-pack/test/security_solution_api_integration/test_suites/detections_response/rules_management/rule_bulk_actions/trial_license_complete_tier/perform_bulk_action_ess.ts index 7295ebe9b769d..846fd9f7d4204 100644 --- a/x-pack/test/security_solution_api_integration/test_suites/detections_response/rules_management/rule_bulk_actions/trial_license_complete_tier/perform_bulk_action_ess.ts +++ b/x-pack/test/security_solution_api_integration/test_suites/detections_response/rules_management/rule_bulk_actions/trial_license_complete_tier/perform_bulk_action_ess.ts @@ -46,8 +46,7 @@ export default ({ getService }: FtrProviderContext): void => { const createWebHookConnector = () => createConnector(getWebHookAction()); // Failing: See https://github.com/elastic/kibana/issues/173804 - // Failing: See https://github.com/elastic/kibana/issues/182512 - describe.skip('@ess perform_bulk_action - ESS specific logic', () => { + describe('@ess perform_bulk_action - ESS specific logic', () => { beforeEach(async () => { await deleteAllRules(supertest, log); }); @@ -107,7 +106,7 @@ export default ({ getService }: FtrProviderContext): void => { webhookUrl: 'http://localhost:1234', }, }), - createRule(supertest, log, getSimpleRule(ruleId, false)), + createRule(supertest, log, { ...getSimpleRule(ruleId, false), index: ['*'] }), ]); await createLegacyRuleAction(supertest, rule1.id, connector.body.id); From 63e6152dbed00211f669473d4412e1ac291c4f66 Mon Sep 17 00:00:00 2001 From: Andrew Macri Date: Tue, 7 May 2024 10:38:20 -0400 Subject: [PATCH 27/86] [Security Solution] [Attack discovery] Attack discovery text updates (#182620) ## [Security Solution] [Attack discovery] Attack discovery text updates ### Summary This PR updates updates text in the following _Attack discovery_ views: - Mini Attack chain tooltip - Loading callout - Time remaining popover - Empty prompt per the details in the _Before_ and _After_ screenshots of the sections below. _Above: Updates to text in the Empty prompt (video)_ ### Mini Attack chain tooltip **Before:** ![mini_attack_chain_before](https://github.com/elastic/kibana/assets/4459398/b6b5f7c8-50a4-45d0-9283-ea1e7a787916) **After:** ![mini_attack_chain_after](https://github.com/elastic/kibana/assets/4459398/d48bce2e-114d-431a-ad24-1b31b6ca751f) ### Loading callout **Before:** ![loading_before](https://github.com/elastic/kibana/assets/4459398/564d794f-260c-451f-9dab-19d4744c6a8b) **After:** ![loading_after](https://github.com/elastic/kibana/assets/4459398/23542352-43d7-4e2f-a4ec-842a526a7188) ### Time remaining popover **Before:** ![time_remaining_before](https://github.com/elastic/kibana/assets/4459398/12c1fb26-674b-4486-81aa-874881a9abe8) **After:** ![time_remaining_after](https://github.com/elastic/kibana/assets/4459398/6c003dc1-ef02-4410-982b-d7ebe57f5321) ### Empty prompt **Before:** ![empty_before](https://github.com/elastic/kibana/assets/4459398/4340b87c-1878-40e5-8741-f2e1120111ea) **After:** ![empty_after](https://github.com/elastic/kibana/assets/4459398/31119bf1-22ac-4414-ac38-911025d506ca) ![empty_info_tooltip](https://github.com/elastic/kibana/assets/4459398/3cb6ab33-b111-4260-8536-8d428a983c93) --- .../attack/mini_attack_chain/translations.ts | 2 +- .../pages/empty_prompt/index.tsx | 30 ++++++++++++++++++- .../pages/empty_prompt/translations.ts | 17 ++++++++++- .../last_times_popover/translations.ts | 2 +- .../pages/loading_callout/translations.ts | 2 +- 5 files changed, 48 insertions(+), 5 deletions(-) diff --git a/x-pack/plugins/security_solution/public/attack_discovery/attack/mini_attack_chain/translations.ts b/x-pack/plugins/security_solution/public/attack_discovery/attack/mini_attack_chain/translations.ts index 2332ab5a0c5ef..a5c2bb2cc815b 100644 --- a/x-pack/plugins/security_solution/public/attack_discovery/attack/mini_attack_chain/translations.ts +++ b/x-pack/plugins/security_solution/public/attack_discovery/attack/mini_attack_chain/translations.ts @@ -10,6 +10,6 @@ import { i18n } from '@kbn/i18n'; export const ATTACK_CHAIN_TOOLTIP = (tacticsCount: number) => i18n.translate('xpack.securitySolution.attackDiscovery.miniAttackChain.attackChainTooltip', { defaultMessage: - '{tacticsCount} {tacticsCount, plural, one {tactic was} other {tactics were}} identified in the analysis, providing insight into the nature of the detected violations:', + '{tacticsCount} {tacticsCount, plural, one {tactic was} other {tactics were}} identified in the attack:', values: { tacticsCount }, }); diff --git a/x-pack/plugins/security_solution/public/attack_discovery/pages/empty_prompt/index.tsx b/x-pack/plugins/security_solution/public/attack_discovery/pages/empty_prompt/index.tsx index d5e8c8cb2bf2e..a5ee15a452aca 100644 --- a/x-pack/plugins/security_solution/public/attack_discovery/pages/empty_prompt/index.tsx +++ b/x-pack/plugins/security_solution/public/attack_discovery/pages/empty_prompt/index.tsx @@ -11,11 +11,14 @@ import { EuiEmptyPrompt, EuiFlexGroup, EuiFlexItem, + EuiIconTip, EuiLink, EuiSpacer, EuiText, EuiToolTip, + useEuiTheme, } from '@elastic/eui'; +import { css } from '@emotion/react'; import React, { useMemo } from 'react'; import { useAssistantAvailability } from '../../../assistant/use_assistant_availability'; @@ -35,6 +38,7 @@ const EmptyPromptComponent: React.FC = ({ isDisabled = false, onGenerate, }) => { + const { euiTheme } = useEuiTheme(); const { hasAssistantPrivilege } = useAssistantAvailability(); const title = useMemo( () => ( @@ -51,6 +55,16 @@ const EmptyPromptComponent: React.FC = ({ + + {i18n.UP_TO} + + @@ -58,11 +72,25 @@ const EmptyPromptComponent: React.FC = ({ {i18n.ALERTS_WILL_BE_ANALYZED(alertsCount)} + + + + ), - [alertsCount] + [alertsCount, euiTheme.size.xs] ); const body = useMemo( diff --git a/x-pack/plugins/security_solution/public/attack_discovery/pages/empty_prompt/translations.ts b/x-pack/plugins/security_solution/public/attack_discovery/pages/empty_prompt/translations.ts index d71b47c3f099d..33ffdbdf478f2 100644 --- a/x-pack/plugins/security_solution/public/attack_discovery/pages/empty_prompt/translations.ts +++ b/x-pack/plugins/security_solution/public/attack_discovery/pages/empty_prompt/translations.ts @@ -30,6 +30,14 @@ export const LEARN_MORE = i18n.translate( } ); +export const RESPONSES_FROM_AI_SYSTEMS = i18n.translate( + 'xpack.securitySolution.attackDiscovery.pages.emptyPrompt.responsesFromAiSystemsTooltip', + { + defaultMessage: + 'Responses from AI systems may not always be entirely accurate, although they can seem convincing. For more information on the Attack Discovery feature and its usage, please reference the documentation.', + } +); + export const SELECT_A_CONNECTOR = i18n.translate( 'xpack.securitySolution.attackDiscovery.pages.emptyPrompt.selectAConnectorLabel', { @@ -40,6 +48,13 @@ export const SELECT_A_CONNECTOR = i18n.translate( export const START_GENERATING_DISCOVERIES = i18n.translate( 'xpack.securitySolution.attackDiscovery.pages.emptyPrompt.startGeneratingDiscoveriesLabel', { - defaultMessage: 'Start generating discoveries via Elastic AI Assistant.', + defaultMessage: 'Start discovering attacks with the power of AI and Elastic Security.', + } +); + +export const UP_TO = i18n.translate( + 'xpack.securitySolution.attackDiscovery.pages.emptyPrompt.upToTitle', + { + defaultMessage: 'Up to', } ); diff --git a/x-pack/plugins/security_solution/public/attack_discovery/pages/loading_callout/countdown/last_times_popover/translations.ts b/x-pack/plugins/security_solution/public/attack_discovery/pages/loading_callout/countdown/last_times_popover/translations.ts index 502449d925676..96cd82112fe71 100644 --- a/x-pack/plugins/security_solution/public/attack_discovery/pages/loading_callout/countdown/last_times_popover/translations.ts +++ b/x-pack/plugins/security_solution/public/attack_discovery/pages/loading_callout/countdown/last_times_popover/translations.ts @@ -12,7 +12,7 @@ export const AVERAGE_TIME_IS_CALCULATED = (intervals: number) => 'xpack.securitySolution.attackDiscovery.loadingCallout.countdown.lastTimesPopover.aiIsCurrentlyAnalyzing', { defaultMessage: - 'Average time is calculated over the last {intervals} {intervals, plural, =1 {generation} other {generations}} on the selected connector:', + 'Remaining time is based on the average speed of the last {intervals} {intervals, plural, =1 {time} other {times}} the same connector generated results.', values: { intervals }, } ); diff --git a/x-pack/plugins/security_solution/public/attack_discovery/pages/loading_callout/translations.ts b/x-pack/plugins/security_solution/public/attack_discovery/pages/loading_callout/translations.ts index a63a419b147b5..6c8f9b60c5ac6 100644 --- a/x-pack/plugins/security_solution/public/attack_discovery/pages/loading_callout/translations.ts +++ b/x-pack/plugins/security_solution/public/attack_discovery/pages/loading_callout/translations.ts @@ -11,7 +11,7 @@ export const AI_IS_CURRENTLY_ANALYZING = (alertsCount: number) => i18n.translate( 'xpack.securitySolution.attackDiscovery.pages.loadingCallout.aiIsCurrentlyAnalyzing', { - defaultMessage: `AI is currently analyzing up to {alertsCount} {alertsCount, plural, =1 {alert} other {alerts}} in the last 24 hours to generate discoveries.`, + defaultMessage: `AI is analyzing up to {alertsCount} {alertsCount, plural, =1 {alert} other {alerts}} in the last 24 hours to generate discoveries.`, values: { alertsCount }, } ); From 407a03f9039441d56c32a3ef3e8160d2109b7340 Mon Sep 17 00:00:00 2001 From: mohamedhamed-ahmed Date: Tue, 7 May 2024 17:45:18 +0300 Subject: [PATCH 28/86] [Dataset Quality] Reactive Summary Panel (#182657) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Relatd to https://github.com/elastic/kibana/issues/179172 ## 📝 Summary This PR is the first step into making the summary panel reactive to all table filters. The `Dataset Quality` & `Active Datasets` are now reactive to all table filters. The `Estimated Data` is going to come later on in a separate PR. ## 🎥 Demo https://github.com/elastic/kibana/assets/11225826/c7b18dfc-24ef-4e25-a194-a024902679a1 --- .../dataset_quality/common/translations.ts | 2 +- .../dataset_quality/dataset_quality.tsx | 18 +-- .../dataset_quality/filters/filters.tsx | 2 +- .../last_day_data_placeholder.tsx | 17 +-- .../hooks/use_dataset_quality_table.tsx | 1 + .../public/hooks/use_summary_panel.tsx | 43 ++++--- .../summary_panel/src/defaults.ts | 9 -- .../summary_panel/src/notifications.ts | 19 --- .../summary_panel/src/state_machine.ts | 113 +----------------- .../state_machines/summary_panel/src/types.ts | 50 +------- .../translations/translations/fr-FR.json | 2 - .../translations/translations/ja-JP.json | 2 - .../translations/translations/zh-CN.json | 2 - 13 files changed, 44 insertions(+), 236 deletions(-) diff --git a/x-pack/plugins/observability_solution/dataset_quality/common/translations.ts b/x-pack/plugins/observability_solution/dataset_quality/common/translations.ts index d31f3d537eb22..1f3d1e3c8d403 100644 --- a/x-pack/plugins/observability_solution/dataset_quality/common/translations.ts +++ b/x-pack/plugins/observability_solution/dataset_quality/common/translations.ts @@ -193,7 +193,7 @@ export const summaryPanelDatasetsActivityText = i18n.translate( export const summaryPanelDatasetsActivityTooltipText = i18n.translate( 'xpack.datasetQuality.summaryPanelDatasetsActivityTooltipText', { - defaultMessage: 'The number of datasets with activity in the last 24 hours.', + defaultMessage: 'The number of datasets with activity in the selected time range.', } ); diff --git a/x-pack/plugins/observability_solution/dataset_quality/public/components/dataset_quality/dataset_quality.tsx b/x-pack/plugins/observability_solution/dataset_quality/public/components/dataset_quality/dataset_quality.tsx index 6fcd7dc732405..ad343f912e4ff 100644 --- a/x-pack/plugins/observability_solution/dataset_quality/public/components/dataset_quality/dataset_quality.tsx +++ b/x-pack/plugins/observability_solution/dataset_quality/public/components/dataset_quality/dataset_quality.tsx @@ -41,16 +41,16 @@ export const createDatasetQuality = ({ ); return ( - - + + - - + + ); }; }; @@ -67,10 +67,10 @@ function DatasetQuality() {
- + - + diff --git a/x-pack/plugins/observability_solution/dataset_quality/public/components/dataset_quality/filters/filters.tsx b/x-pack/plugins/observability_solution/dataset_quality/public/components/dataset_quality/filters/filters.tsx index 75c9f6e72b9e0..8c247104415cd 100644 --- a/x-pack/plugins/observability_solution/dataset_quality/public/components/dataset_quality/filters/filters.tsx +++ b/x-pack/plugins/observability_solution/dataset_quality/public/components/dataset_quality/filters/filters.tsx @@ -55,7 +55,7 @@ export default function Filters() { ); return ( - + diff --git a/x-pack/plugins/observability_solution/dataset_quality/public/components/dataset_quality/summary_panel/last_day_data_placeholder.tsx b/x-pack/plugins/observability_solution/dataset_quality/public/components/dataset_quality/summary_panel/last_day_data_placeholder.tsx index fba5df2e9dbe2..2c5bbb35063cf 100644 --- a/x-pack/plugins/observability_solution/dataset_quality/public/components/dataset_quality/summary_panel/last_day_data_placeholder.tsx +++ b/x-pack/plugins/observability_solution/dataset_quality/public/components/dataset_quality/summary_panel/last_day_data_placeholder.tsx @@ -16,8 +16,6 @@ import { EuiIconTip, EuiSkeletonTitle, } from '@elastic/eui'; -import { summaryPanelLast24hText } from '../../../../common/translations'; - interface LastDayDataPlaceholderParams { title: string; tooltip: string; @@ -34,16 +32,11 @@ export function LastDayDataPlaceholder({ return ( - - - {title} - - - - - - {summaryPanelLast24hText} - + + {title} + + + {isLoading ? ( diff --git a/x-pack/plugins/observability_solution/dataset_quality/public/hooks/use_dataset_quality_table.tsx b/x-pack/plugins/observability_solution/dataset_quality/public/hooks/use_dataset_quality_table.tsx index eaac36d016de6..5ca7c6e281bdf 100644 --- a/x-pack/plugins/observability_solution/dataset_quality/public/hooks/use_dataset_quality_table.tsx +++ b/x-pack/plugins/observability_solution/dataset_quality/public/hooks/use_dataset_quality_table.tsx @@ -205,6 +205,7 @@ export const useDatasetQualityTable = () => { sort: { sort }, onTableChange, pagination, + filteredItems, renderedItems, columns, loading, diff --git a/x-pack/plugins/observability_solution/dataset_quality/public/hooks/use_summary_panel.tsx b/x-pack/plugins/observability_solution/dataset_quality/public/hooks/use_summary_panel.tsx index 9d4108ff7340c..db83151a2e6e3 100644 --- a/x-pack/plugins/observability_solution/dataset_quality/public/hooks/use_summary_panel.tsx +++ b/x-pack/plugins/observability_solution/dataset_quality/public/hooks/use_summary_panel.tsx @@ -10,6 +10,9 @@ import { useInterpret, useSelector } from '@xstate/react'; import { IToasts } from '@kbn/core-notifications-browser'; import { IDataStreamsStatsClient } from '../services/data_streams_stats'; import { createDatasetsSummaryPanelStateMachine } from '../state_machines/summary_panel'; +import { useDatasetQualityTable } from '.'; +import { useDatasetQualityContext } from '../components/dataset_quality/context'; +import { filterInactiveDatasets } from '../utils'; interface SummaryPanelContextDeps { dataStreamStatsClient: IDataStreamsStatsClient; @@ -17,6 +20,11 @@ interface SummaryPanelContextDeps { } const useSummaryPanel = ({ dataStreamStatsClient, toasts }: SummaryPanelContextDeps) => { + const { service } = useDatasetQualityContext(); + const { filteredItems } = useDatasetQualityTable(); + + const { timeRange } = useSelector(service, (state) => state.context.filters); + const summaryPanelStateService = useInterpret(() => createDatasetsSummaryPanelStateMachine({ dataStreamStatsClient, @@ -27,29 +35,28 @@ const useSummaryPanel = ({ dataStreamStatsClient, toasts }: SummaryPanelContextD /* Datasets Quality */ - const datasetsQuality = useSelector( - summaryPanelStateService, - (state) => state.context.datasetsQuality - ); - const isDatasetsQualityLoading = useSelector( - summaryPanelStateService, - (state) => - state.matches('datasetsQuality.fetching') || - state.matches('datasetsQuality.retrying') || - state.matches('datasetsActivity.fetching') + + const datasetsQuality = { + percentages: filteredItems.map((item) => item.degradedDocs.percentage), + }; + + const isDatasetsQualityLoading = useSelector(service, (state) => + state.matches('degradedDocs.fetching') ); /* Datasets Activity */ - const datasetsActivity = useSelector( - summaryPanelStateService, - (state) => state.context.datasetsActivity - ); - const isDatasetsActivityLoading = useSelector( - summaryPanelStateService, - (state) => - state.matches('datasetsActivity.fetching') || state.matches('datasetsActivity.retrying') + const datasetsActivity = { + total: filteredItems.length, + active: filterInactiveDatasets({ + datasets: filteredItems, + timeRange, + }).length, + }; + + const isDatasetsActivityLoading = useSelector(service, (state) => + state.matches('datasets.fetching') ); /* diff --git a/x-pack/plugins/observability_solution/dataset_quality/public/state_machines/summary_panel/src/defaults.ts b/x-pack/plugins/observability_solution/dataset_quality/public/state_machines/summary_panel/src/defaults.ts index be7327c47a8cb..be67409c3dab1 100644 --- a/x-pack/plugins/observability_solution/dataset_quality/public/state_machines/summary_panel/src/defaults.ts +++ b/x-pack/plugins/observability_solution/dataset_quality/public/state_machines/summary_panel/src/defaults.ts @@ -11,19 +11,10 @@ export const MAX_RETRIES = 1; export const RETRY_DELAY_IN_MS = 5000; export const defaultContext: DefaultDatasetsSummaryPanelContext = { - datasetsQuality: { - percentages: [], - }, - datasetsActivity: { - total: 0, - active: 0, - }, estimatedData: { estimatedDataInBytes: 0, }, retries: { - datasetsQualityRetries: 0, - datasetsActivityRetries: 0, estimatedDataRetries: 0, }, }; diff --git a/x-pack/plugins/observability_solution/dataset_quality/public/state_machines/summary_panel/src/notifications.ts b/x-pack/plugins/observability_solution/dataset_quality/public/state_machines/summary_panel/src/notifications.ts index dabd30f02af61..6b6e48ecdc785 100644 --- a/x-pack/plugins/observability_solution/dataset_quality/public/state_machines/summary_panel/src/notifications.ts +++ b/x-pack/plugins/observability_solution/dataset_quality/public/state_machines/summary_panel/src/notifications.ts @@ -8,25 +8,6 @@ import { IToasts } from '@kbn/core/public'; import { i18n } from '@kbn/i18n'; -export const fetchDatasetsQualityFailedNotifier = (toasts: IToasts, error: Error) => { - toasts.addDanger({ - title: i18n.translate('xpack.datasetQuality.fetchDatasetsQualityDetailsFailed', { - defaultMessage: "We couldn't get your datasets quality details. Default values are shown.", - }), - text: error.message, - }); -}; - -export const fetchDatasetsActivityFailedNotifier = (toasts: IToasts, error: Error) => { - toasts.addDanger({ - title: i18n.translate('xpack.datasetQuality.fetchDatasetsActivityFailed', { - defaultMessage: - "We couldn't get your active/inactive datasets details. Default values are shown.", - }), - text: error.message, - }); -}; - export const fetchDatasetsEstimatedDataFailedNotifier = (toasts: IToasts, error: Error) => { toasts.addDanger({ title: i18n.translate('xpack.datasetQuality.fetchDatasetsEstimatedDataFailed', { diff --git a/x-pack/plugins/observability_solution/dataset_quality/public/state_machines/summary_panel/src/state_machine.ts b/x-pack/plugins/observability_solution/dataset_quality/public/state_machines/summary_panel/src/state_machine.ts index ae5e414c192fb..60d038549a8e1 100644 --- a/x-pack/plugins/observability_solution/dataset_quality/public/state_machines/summary_panel/src/state_machine.ts +++ b/x-pack/plugins/observability_solution/dataset_quality/public/state_machines/summary_panel/src/state_machine.ts @@ -8,19 +8,11 @@ import { IToasts } from '@kbn/core/public'; import { getDateISORange } from '@kbn/timerange'; import { assign, createMachine, DoneInvokeEvent, InterpreterFrom } from 'xstate'; -import { DataStreamStat } from '../../../../common/data_streams_stats/data_stream_stat'; import { DEFAULT_TIME_RANGE } from '../../../../common/constants'; import { IDataStreamsStatsClient } from '../../../services/data_streams_stats'; -import { filterInactiveDatasets } from '../../../utils/filter_inactive_datasets'; import { defaultContext, MAX_RETRIES, RETRY_DELAY_IN_MS } from './defaults'; +import { fetchDatasetsEstimatedDataFailedNotifier } from './notifications'; import { - fetchDatasetsActivityFailedNotifier, - fetchDatasetsEstimatedDataFailedNotifier, - fetchDatasetsQualityFailedNotifier, -} from './notifications'; -import { - DatasetsActivityDetails, - DatasetsQuality, DatasetsSummaryPanelContext, DatasetsSummaryPanelState, DatasetSummaryPanelEvent, @@ -40,78 +32,6 @@ export const createPureDatasetsSummaryPanelStateMachine = ( id: 'DatasetsQualitySummaryPanel', type: 'parallel', states: { - datasetsQuality: { - initial: 'fetching', - states: { - fetching: { - invoke: { - src: 'loadDatasetsQuality', - onDone: { - target: 'loaded', - actions: ['storeDatasetsQuality'], - }, - onError: [ - { - target: 'retrying', - cond: { - type: 'canRetry', - counter: 'datasetsQualityRetries', - }, - actions: ['incrementDatasetsQualityRetries'], - }, - { - target: 'loaded', - actions: ['notifyFetchDatasetsQualityFailed'], - }, - ], - }, - }, - retrying: { - after: { - [RETRY_DELAY_IN_MS]: 'fetching', - }, - }, - loaded: { - type: 'final', - }, - }, - }, - datasetsActivity: { - initial: 'fetching', - states: { - fetching: { - invoke: { - src: 'loadDatasetsActivity', - onDone: { - target: 'loaded', - actions: ['storeDatasetsActivity'], - }, - onError: [ - { - target: 'retrying', - cond: { - type: 'canRetry', - counter: 'datasetsActivityRetries', - }, - actions: ['incrementDatasetsActivityRetries'], - }, - { - target: 'loaded', - actions: ['notifyFetchDatasetsActivityFailed'], - }, - ], - }, - }, - retrying: { - after: { - [RETRY_DELAY_IN_MS]: 'fetching', - }, - }, - loaded: { - type: 'final', - }, - }, - }, estimatedData: { initial: 'fetching', states: { @@ -163,12 +83,6 @@ export const createPureDatasetsSummaryPanelStateMachine = ( }, { actions: { - storeDatasetsQuality: assign((_context, event) => - 'data' in event ? { datasetsQuality: event.data as DatasetsQuality } : {} - ), - storeDatasetsActivity: assign((_context, event) => - 'data' in event ? { datasetsActivity: event.data as DatasetsActivityDetails } : {} - ), storeEstimatedData: assign((_context, event) => 'data' in event ? { @@ -176,12 +90,6 @@ export const createPureDatasetsSummaryPanelStateMachine = ( } : {} ), - incrementDatasetsQualityRetries: assign(({ retries }, _event) => ({ - retries: { ...retries, datasetsQualityRetries: retries.datasetsQualityRetries + 1 }, - })), - incrementDatasetsActivityRetries: assign(({ retries }, _event) => ({ - retries: { ...retries, datasetsActivityRetries: retries.datasetsActivityRetries + 1 }, - })), incrementEstimatedDataRetries: assign(({ retries }, _event) => ({ retries: { ...retries, estimatedDataRetries: retries.estimatedDataRetries + 1 }, })), @@ -214,29 +122,10 @@ export const createDatasetsSummaryPanelStateMachine = ({ }: DatasetsSummaryPanelStateMachineDependencies) => createPureDatasetsSummaryPanelStateMachine(initialContext).withConfig({ actions: { - notifyFetchDatasetsQualityFailed: (_context, event: DoneInvokeEvent) => - fetchDatasetsQualityFailedNotifier(toasts, event.data), - notifyFetchDatasetsActivityFailed: (_context, event: DoneInvokeEvent) => - fetchDatasetsActivityFailedNotifier(toasts, event.data), notifyFetchEstimatedDataFailed: (_context, event: DoneInvokeEvent) => fetchDatasetsEstimatedDataFailedNotifier(toasts, event.data), }, services: { - loadDatasetsQuality: async (_context) => { - const dataStreamsStats = await dataStreamStatsClient.getDataStreamsDegradedStats(); - const percentages = dataStreamsStats.map((stat) => stat.percentage); - return { percentages }; - }, - loadDatasetsActivity: async (_context) => { - const dataStreamStats = await dataStreamStatsClient.getDataStreamsStats(); - const activeDataStreams = filterInactiveDatasets({ - datasets: dataStreamStats.map(DataStreamStat.create), - }); - return { - total: dataStreamStats.length, - active: activeDataStreams.length, - }; - }, loadEstimatedData: async (_context) => { const { startDate, endDate } = getDateISORange(DEFAULT_TIME_RANGE); return dataStreamStatsClient.getDataStreamsEstimatedDataInBytes({ diff --git a/x-pack/plugins/observability_solution/dataset_quality/public/state_machines/summary_panel/src/types.ts b/x-pack/plugins/observability_solution/dataset_quality/public/state_machines/summary_panel/src/types.ts index f627d5f511110..3e8b4c7ef9919 100644 --- a/x-pack/plugins/observability_solution/dataset_quality/public/state_machines/summary_panel/src/types.ts +++ b/x-pack/plugins/observability_solution/dataset_quality/public/state_machines/summary_panel/src/types.ts @@ -9,32 +9,13 @@ import { DoneInvokeEvent } from 'xstate'; import { GetDataStreamsEstimatedDataInBytesResponse } from '../../../../common/data_streams_stats'; export interface Retries { - datasetsQualityRetries: number; - datasetsActivityRetries: number; estimatedDataRetries: number; } -export interface DatasetsQuality { - percentages: number[]; -} - -export interface DatasetsActivityDetails { - total: number; - active: number; -} - export interface EstimatedDataDetails { estimatedDataInBytes: number; } -export interface WithDatasetsQuality { - datasetsQuality: DatasetsQuality; -} - -export interface WithActiveDatasets { - datasetsActivity: DatasetsActivityDetails; -} - export interface WithEstimatedData { estimatedData: EstimatedDataDetails; } @@ -43,36 +24,9 @@ export interface WithRetries { retries: Retries; } -export type DefaultDatasetsSummaryPanelContext = WithDatasetsQuality & - WithActiveDatasets & - WithEstimatedData & - WithRetries; +export type DefaultDatasetsSummaryPanelContext = WithEstimatedData & WithRetries; export type DatasetsSummaryPanelState = - | { - value: 'datasetsQuality.fetching'; - context: DefaultDatasetsSummaryPanelContext; - } - | { - value: 'datasetsQuality.loaded'; - context: DefaultDatasetsSummaryPanelContext; - } - | { - value: 'datasetsQuality.retrying'; - context: DefaultDatasetsSummaryPanelContext; - } - | { - value: 'datasetsActivity.fetching'; - context: DefaultDatasetsSummaryPanelContext; - } - | { - value: 'datasetsActivity.loaded'; - context: DefaultDatasetsSummaryPanelContext; - } - | { - value: 'datasetsActivity.retrying'; - context: DefaultDatasetsSummaryPanelContext; - } | { value: 'estimatedData.fetching'; context: DefaultDatasetsSummaryPanelContext; @@ -92,8 +46,6 @@ export type DatasetsSummaryPanelState = export type DatasetSummaryPanelEvent = | DoneInvokeEvent - | DoneInvokeEvent - | DoneInvokeEvent | DoneInvokeEvent | DoneInvokeEvent; diff --git a/x-pack/plugins/translations/translations/fr-FR.json b/x-pack/plugins/translations/translations/fr-FR.json index c5a3f25e77197..3096ecc47cec2 100644 --- a/x-pack/plugins/translations/translations/fr-FR.json +++ b/x-pack/plugins/translations/translations/fr-FR.json @@ -13188,9 +13188,7 @@ "xpack.datasetQuality.expandLabel": "Développer", "xpack.datasetQuality.fetchDatasetDetailsFailed": "Nous n'avons pas pu obtenir les détails de votre ensemble de données.", "xpack.datasetQuality.fetchDatasetDetailsFailed.noDatasetSelected": "Vous n'avez sélectionné aucun ensemble de données", - "xpack.datasetQuality.fetchDatasetsActivityFailed": "Nous n'avons pas pu obtenir les détails de vos ensembles de données actifs ou inactifs. Les valeurs par défaut sont affichées.", "xpack.datasetQuality.fetchDatasetsEstimatedDataFailed": "Nous n'avons pas pu obtenir les données estimées de vos ensembles de données. Les valeurs par défaut sont affichées.", - "xpack.datasetQuality.fetchDatasetsQualityDetailsFailed": "Nous n'avons pas pu obtenir de détails concernant la qualité de vos ensembles de données. Les valeurs par défaut sont affichées.", "xpack.datasetQuality.fetchDatasetStatsFailed": "Nous n'avons pas pu obtenir vos ensembles de données.", "xpack.datasetQuality.fetchDegradedStatsFailed": "Nous n'avons pas pu obtenir d'informations sur vos documents dégradés.", "xpack.datasetQuality.flyoutCancelText": "Annuler", diff --git a/x-pack/plugins/translations/translations/ja-JP.json b/x-pack/plugins/translations/translations/ja-JP.json index c319d13c704d8..ddb0f672e86a0 100644 --- a/x-pack/plugins/translations/translations/ja-JP.json +++ b/x-pack/plugins/translations/translations/ja-JP.json @@ -13168,9 +13168,7 @@ "xpack.datasetQuality.expandLabel": "拡張", "xpack.datasetQuality.fetchDatasetDetailsFailed": "データセット詳細を取得できませんでした。", "xpack.datasetQuality.fetchDatasetDetailsFailed.noDatasetSelected": "データセットが選択されていません", - "xpack.datasetQuality.fetchDatasetsActivityFailed": "アクティブ/非アクティブなデータセット詳細を取得できませんでした。デフォルト値が表示されます。", "xpack.datasetQuality.fetchDatasetsEstimatedDataFailed": "データセット推定データを取得できませんでした。デフォルト値が表示されます。", - "xpack.datasetQuality.fetchDatasetsQualityDetailsFailed": "データセット品質詳細を取得できませんでした。デフォルト値が表示されます。", "xpack.datasetQuality.fetchDatasetStatsFailed": "データセットを取得できませんでした。", "xpack.datasetQuality.fetchDegradedStatsFailed": "劣化したドキュメント情報を取得できませんでした。", "xpack.datasetQuality.flyoutCancelText": "キャンセル", diff --git a/x-pack/plugins/translations/translations/zh-CN.json b/x-pack/plugins/translations/translations/zh-CN.json index 7264328c582f7..4049a2bfb6b91 100644 --- a/x-pack/plugins/translations/translations/zh-CN.json +++ b/x-pack/plugins/translations/translations/zh-CN.json @@ -13193,9 +13193,7 @@ "xpack.datasetQuality.expandLabel": "展开", "xpack.datasetQuality.fetchDatasetDetailsFailed": "无法获取数据集详情。", "xpack.datasetQuality.fetchDatasetDetailsFailed.noDatasetSelected": "尚未选择任何数据集", - "xpack.datasetQuality.fetchDatasetsActivityFailed": "无法获取活动/非活动数据集详情。将显示默认值。", "xpack.datasetQuality.fetchDatasetsEstimatedDataFailed": "无法获取数据集估计数据。将显示默认值。", - "xpack.datasetQuality.fetchDatasetsQualityDetailsFailed": "无法获取数据集质量详情。将显示默认值。", "xpack.datasetQuality.fetchDatasetStatsFailed": "无法获取数据集。", "xpack.datasetQuality.fetchDegradedStatsFailed": "无法获取已降级文档信息。", "xpack.datasetQuality.flyoutCancelText": "取消", From 3b4aa1ebbc07f5e4e7875b23addb06c60197a8af Mon Sep 17 00:00:00 2001 From: Konrad Szwarc Date: Tue, 7 May 2024 17:02:51 +0200 Subject: [PATCH 29/86] [EDR Workflows][MKI] Skip processes cy test in MKI environment. (#182818) In MKI we don't specify Fleet Server version, it's being provided to us as part of the Serverless instance that these tests run against. It caused issues with installing agents that are +2 versions ahead of the FS. Therefore I went with an api call to /api/fleet/agents/available_versions and install latest version of an agent that is available. At this point it's 13.2 and it happens only if MKI environment is detected Since the `/components/agentbeat` took place in agent 14 it's not there yet (in `13.2`). Hence the error we are seeing. --- .../response_actions/response_console/process_operations.cy.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/x-pack/plugins/security_solution/public/management/cypress/e2e/response_actions/response_console/process_operations.cy.ts b/x-pack/plugins/security_solution/public/management/cypress/e2e/response_actions/response_console/process_operations.cy.ts index f7c70ebf8c7e9..1b5fcddf6b392 100644 --- a/x-pack/plugins/security_solution/public/management/cypress/e2e/response_actions/response_console/process_operations.cy.ts +++ b/x-pack/plugins/security_solution/public/management/cypress/e2e/response_actions/response_console/process_operations.cy.ts @@ -26,7 +26,7 @@ import { deleteAllLoadedEndpointData } from '../../../tasks/delete_all_endpoint_ const AGENT_BEAT_FILE_PATH_SUFFIX = '/components/agentbeat'; -describe('Response console', { tags: ['@ess', '@serverless'] }, () => { +describe('Response console', { tags: ['@ess', '@serverless', '@skipInServerlessMKI'] }, () => { beforeEach(() => { login(); }); From 6ca7cbcffc550c1b68f1c3fe7ded386dd2810a47 Mon Sep 17 00:00:00 2001 From: Pierre Gayvallet Date: Tue, 7 May 2024 17:04:56 +0200 Subject: [PATCH 30/86] rolling file appender: implement retention policy (#182346) ## Summary Fix https://github.com/elastic/kibana/issues/165191 Support more complex retention policies via the introduction of the `retention` configuration section of the `rolling-file` appender. 3 different retention policies are supported: - File count based (`maxFiles`) - Total file size based (`maxAccumulatedFileSize`) - Last modification date based (`removeOlderThan`) Backward-compatibility is assured by using the `strategy.max` (the only way to define the only retention before this PR) as a default for `retention.maxFiles` ## Examples #### maxFiles ```yaml logging: appenders: rolling-file: type: rolling-file fileName: /var/logs/kibana.log layout: type: pattern policy: type: time-interval interval: 1d modulate: true retention: maxFiles: 5 ``` #### maxAccumulatedFileSize ```yaml logging: appenders: rolling-file: type: rolling-file fileName: /var/logs/kibana.log layout: type: pattern policy: type: time-interval interval: 1d modulate: true retention: maxAccumulatedFileSize: "5GB" ``` #### removeOlderThan ```yaml logging: appenders: rolling-file: type: rolling-file fileName: /var/logs/kibana.log layout: type: pattern policy: type: time-interval interval: 1d modulate: true retention: removeOlderThan: "30d" ``` ## Release note Kibana's `rolling-file` appender now supports more advanced retention policies. Please refer to the Kibana logging documentation for more details --- .../src/appenders/rolling_file/mocks.ts | 13 +- .../retention/create_retention_policy.test.ts | 34 +++++ .../retention/create_retention_policy.ts | 28 ++++ .../appenders/rolling_file/retention/fs.ts | 27 ++++ .../appenders/rolling_file/retention/index.ts | 10 ++ .../retention/retention_policy.test.mocks.ts | 32 ++++ .../retention/retention_policy.test.ts | 141 ++++++++++++++++++ .../retention/retention_policy.ts | 85 +++++++++++ .../retention/utils.test.mocks.ts | 19 +++ .../rolling_file/retention/utils.test.ts | 104 +++++++++++++ .../appenders/rolling_file/retention/utils.ts | 56 +++++++ .../rolling_file_appender.test.mocks.ts | 10 ++ .../rolling_file_appender.test.ts | 26 ++++ .../rolling_file/rolling_file_appender.ts | 39 +++-- .../rolling_file/rolling_file_context.ts | 15 ++ .../numeric/numeric_strategy.test.mocks.ts | 3 - .../numeric/numeric_strategy.test.ts | 36 +---- .../strategies/numeric/numeric_strategy.ts | 34 +++-- .../numeric/rolling_tasks.test.mocks.ts | 3 - .../strategies/numeric/rolling_tasks.test.ts | 29 +--- .../strategies/numeric/rolling_tasks.ts | 12 +- .../core/logging/core-logging-server/index.ts | 1 + .../src/appenders/index.ts | 1 + .../src/appenders/rolling_file.ts | 12 ++ src/core/server/docs/kib_core_logging.mdx | 92 +++++++++++- .../logging/rolling_file_appender.test.ts | 109 +++++++++++++- 26 files changed, 862 insertions(+), 109 deletions(-) create mode 100644 packages/core/logging/core-logging-server-internal/src/appenders/rolling_file/retention/create_retention_policy.test.ts create mode 100644 packages/core/logging/core-logging-server-internal/src/appenders/rolling_file/retention/create_retention_policy.ts create mode 100644 packages/core/logging/core-logging-server-internal/src/appenders/rolling_file/retention/fs.ts create mode 100644 packages/core/logging/core-logging-server-internal/src/appenders/rolling_file/retention/index.ts create mode 100644 packages/core/logging/core-logging-server-internal/src/appenders/rolling_file/retention/retention_policy.test.mocks.ts create mode 100644 packages/core/logging/core-logging-server-internal/src/appenders/rolling_file/retention/retention_policy.test.ts create mode 100644 packages/core/logging/core-logging-server-internal/src/appenders/rolling_file/retention/retention_policy.ts create mode 100644 packages/core/logging/core-logging-server-internal/src/appenders/rolling_file/retention/utils.test.mocks.ts create mode 100644 packages/core/logging/core-logging-server-internal/src/appenders/rolling_file/retention/utils.test.ts create mode 100644 packages/core/logging/core-logging-server-internal/src/appenders/rolling_file/retention/utils.ts diff --git a/packages/core/logging/core-logging-server-internal/src/appenders/rolling_file/mocks.ts b/packages/core/logging/core-logging-server-internal/src/appenders/rolling_file/mocks.ts index ae52a8556784b..360487c0c5c3c 100644 --- a/packages/core/logging/core-logging-server-internal/src/appenders/rolling_file/mocks.ts +++ b/packages/core/logging/core-logging-server-internal/src/appenders/rolling_file/mocks.ts @@ -12,13 +12,16 @@ import type { RollingFileContext } from './rolling_file_context'; import type { RollingFileManager } from './rolling_file_manager'; import type { TriggeringPolicy } from './policies/policy'; import type { RollingStrategy } from './strategies/strategy'; +import type { RetentionPolicy } from './retention/retention_policy'; -const createContextMock = (filePath: string) => { +const createContextMock = (filePath: string = 'kibana.log') => { const mock: jest.Mocked = { currentFileSize: 0, currentFileTime: 0, filePath, refreshFileInfo: jest.fn(), + getOrderedRolledFiles: jest.fn(), + setOrderedRolledFileFn: jest.fn(), }; return mock; }; @@ -52,10 +55,18 @@ const createFileManagerMock = () => { return mock; }; +const createRetentionPolicyMock = () => { + const mock: jest.Mocked = { + apply: jest.fn(), + }; + return mock; +}; + export const rollingFileAppenderMocks = { createContext: createContextMock, createStrategy: createStrategyMock, createPolicy: createPolicyMock, createLayout: createLayoutMock, createFileManager: createFileManagerMock, + createRetentionPolicy: createRetentionPolicyMock, }; diff --git a/packages/core/logging/core-logging-server-internal/src/appenders/rolling_file/retention/create_retention_policy.test.ts b/packages/core/logging/core-logging-server-internal/src/appenders/rolling_file/retention/create_retention_policy.test.ts new file mode 100644 index 0000000000000..24974d4e33e44 --- /dev/null +++ b/packages/core/logging/core-logging-server-internal/src/appenders/rolling_file/retention/create_retention_policy.test.ts @@ -0,0 +1,34 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0 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 { RollingStrategyConfig } from '@kbn/core-logging-server'; +import { mergeRetentionPolicyConfig } from './create_retention_policy'; + +describe('mergeRetentionPolicyConfig', () => { + const createRollingStrategyConfig = (max: number): RollingStrategyConfig => { + return { + type: 'numeric', + pattern: '-%i', + max, + }; + }; + + it('uses the value from the retention strategy config if defined', () => { + const merged = mergeRetentionPolicyConfig({ maxFiles: 42 }, createRollingStrategyConfig(10)); + expect(merged).toEqual({ + maxFiles: 42, + }); + }); + + it('uses the value from the rolling strategy config not defined on the retention config', () => { + const merged = mergeRetentionPolicyConfig({}, createRollingStrategyConfig(10)); + expect(merged).toEqual({ + maxFiles: 10, + }); + }); +}); diff --git a/packages/core/logging/core-logging-server-internal/src/appenders/rolling_file/retention/create_retention_policy.ts b/packages/core/logging/core-logging-server-internal/src/appenders/rolling_file/retention/create_retention_policy.ts new file mode 100644 index 0000000000000..33e8bb4c8da35 --- /dev/null +++ b/packages/core/logging/core-logging-server-internal/src/appenders/rolling_file/retention/create_retention_policy.ts @@ -0,0 +1,28 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0 and the Server Side Public License, v 1; you may not use this file except + * in compliance with, at your election, the Elastic License 2.0 or the Server + * Side Public License, v 1. + */ + +import type { RetentionPolicyConfig, RollingStrategyConfig } from '@kbn/core-logging-server'; +import type { RollingFileContext } from '../rolling_file_context'; +import { GenericRetentionPolicy, type RetentionPolicy } from './retention_policy'; + +export const createRetentionPolicy = ( + config: RetentionPolicyConfig, + context: RollingFileContext +): RetentionPolicy => { + return new GenericRetentionPolicy(config, context); +}; + +export const mergeRetentionPolicyConfig = ( + config: RetentionPolicyConfig | undefined, + strategyConfig: RollingStrategyConfig +): RetentionPolicyConfig => { + return { + ...config, + maxFiles: config?.maxFiles || strategyConfig.max, + }; +}; diff --git a/packages/core/logging/core-logging-server-internal/src/appenders/rolling_file/retention/fs.ts b/packages/core/logging/core-logging-server-internal/src/appenders/rolling_file/retention/fs.ts new file mode 100644 index 0000000000000..ffa0f5d4ebe21 --- /dev/null +++ b/packages/core/logging/core-logging-server-internal/src/appenders/rolling_file/retention/fs.ts @@ -0,0 +1,27 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0 and the Server Side Public License, v 1; you may not use this file except + * in compliance with, at your election, the Elastic License 2.0 or the Server + * Side Public License, v 1. + */ + +import { unlink, stat } from 'fs/promises'; + +export const deleteFiles = async ({ filesToDelete }: { filesToDelete: string[] }) => { + await Promise.all(filesToDelete.map((fileToDelete) => unlink(fileToDelete))); +}; + +export type GetFileInfoResult = { exist: false } | { exist: true; size: number; mtime: Date }; + +export const getFileInfo = async (absFilePath: string): Promise => { + try { + const { size, mtime } = await stat(absFilePath); + return { exist: true, size, mtime }; + } catch (e) { + if (e.code === 'ENOENT') { + return { exist: false }; + } + throw e; + } +}; diff --git a/packages/core/logging/core-logging-server-internal/src/appenders/rolling_file/retention/index.ts b/packages/core/logging/core-logging-server-internal/src/appenders/rolling_file/retention/index.ts new file mode 100644 index 0000000000000..26fac7ac06e80 --- /dev/null +++ b/packages/core/logging/core-logging-server-internal/src/appenders/rolling_file/retention/index.ts @@ -0,0 +1,10 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0 and the Server Side Public License, v 1; you may not use this file except + * in compliance with, at your election, the Elastic License 2.0 or the Server + * Side Public License, v 1. + */ + +export { retentionPolicyConfigSchema, type RetentionPolicy } from './retention_policy'; +export { createRetentionPolicy, mergeRetentionPolicyConfig } from './create_retention_policy'; diff --git a/packages/core/logging/core-logging-server-internal/src/appenders/rolling_file/retention/retention_policy.test.mocks.ts b/packages/core/logging/core-logging-server-internal/src/appenders/rolling_file/retention/retention_policy.test.mocks.ts new file mode 100644 index 0000000000000..b3aeb0c5fb97c --- /dev/null +++ b/packages/core/logging/core-logging-server-internal/src/appenders/rolling_file/retention/retention_policy.test.mocks.ts @@ -0,0 +1,32 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0 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 { listFilesOlderThan, listFilesExceedingSize } from './utils'; +import type { deleteFiles } from './fs'; + +export const listFilesExceedingSizeMock: jest.MockedFn = jest.fn(); +export const listFilesOlderThanMock: jest.MockedFn = jest.fn(); + +jest.doMock('./utils', () => { + const actual = jest.requireActual('./utils'); + return { + ...actual, + listFilesExceedingSize: listFilesExceedingSizeMock, + listFilesOlderThan: listFilesOlderThanMock, + }; +}); + +export const deleteFilesMock: jest.MockedFn = jest.fn(); + +jest.doMock('./fs', () => { + const actual = jest.requireActual('./fs'); + return { + ...actual, + deleteFiles: deleteFilesMock, + }; +}); diff --git a/packages/core/logging/core-logging-server-internal/src/appenders/rolling_file/retention/retention_policy.test.ts b/packages/core/logging/core-logging-server-internal/src/appenders/rolling_file/retention/retention_policy.test.ts new file mode 100644 index 0000000000000..142523b4bf8eb --- /dev/null +++ b/packages/core/logging/core-logging-server-internal/src/appenders/rolling_file/retention/retention_policy.test.ts @@ -0,0 +1,141 @@ +/* + * Copyright 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 { + listFilesExceedingSizeMock, + listFilesOlderThanMock, + deleteFilesMock, +} from './retention_policy.test.mocks'; +import type { RetentionPolicyConfig } from '@kbn/core-logging-server'; +import { rollingFileAppenderMocks } from '../mocks'; +import { GenericRetentionPolicy, retentionPolicyConfigSchema } from './retention_policy'; + +describe('GenericRetentionPolicy', () => { + let context: ReturnType; + let config: RetentionPolicyConfig; + + beforeEach(() => { + deleteFilesMock.mockReset(); + listFilesExceedingSizeMock.mockReset(); + listFilesOlderThanMock.mockReset(); + + context = rollingFileAppenderMocks.createContext(); + }); + + it('supports the maxFile directive', async () => { + config = retentionPolicyConfigSchema.validate({ + maxFiles: 2, + }); + context.getOrderedRolledFiles.mockResolvedValue(['file-1', 'file-2', 'file-3', 'file-4']); + + const policy = new GenericRetentionPolicy(config, context); + + await policy.apply(); + + expect(deleteFilesMock).toHaveBeenCalledTimes(1); + expect(deleteFilesMock).toHaveBeenCalledWith({ + filesToDelete: ['file-3', 'file-4'], + }); + }); + + it('supports the maxAccumulatedFileSize directive', async () => { + config = retentionPolicyConfigSchema.validate({ + maxAccumulatedFileSize: '50b', + }); + context.getOrderedRolledFiles.mockResolvedValue(['file-1', 'file-2', 'file-3', 'file-4']); + + listFilesExceedingSizeMock.mockResolvedValue(['file-4']); + + const policy = new GenericRetentionPolicy(config, context); + + await policy.apply(); + + expect(listFilesOlderThanMock).not.toHaveBeenCalled(); + expect(listFilesExceedingSizeMock).toHaveBeenCalledTimes(1); + expect(listFilesExceedingSizeMock).toHaveBeenCalledWith({ + orderedFiles: ['file-1', 'file-2', 'file-3', 'file-4'], + maxSizeInBytes: config.maxAccumulatedFileSize!.getValueInBytes(), + }); + + expect(deleteFilesMock).toHaveBeenCalledTimes(1); + expect(deleteFilesMock).toHaveBeenCalledWith({ + filesToDelete: ['file-4'], + }); + }); + + it('supports the removeOlderThan directive', async () => { + config = retentionPolicyConfigSchema.validate({ + removeOlderThan: '30d', + }); + context.getOrderedRolledFiles.mockResolvedValue(['file-1', 'file-2', 'file-3', 'file-4']); + + listFilesOlderThanMock.mockResolvedValue(['file-2', 'file-3', 'file-4']); + + const policy = new GenericRetentionPolicy(config, context); + + await policy.apply(); + + expect(listFilesExceedingSizeMock).not.toHaveBeenCalled(); + expect(listFilesOlderThanMock).toHaveBeenCalledTimes(1); + expect(listFilesOlderThanMock).toHaveBeenCalledWith({ + orderedFiles: ['file-1', 'file-2', 'file-3', 'file-4'], + duration: config.removeOlderThan!, + }); + + expect(deleteFilesMock).toHaveBeenCalledTimes(1); + expect(deleteFilesMock).toHaveBeenCalledWith({ + filesToDelete: ['file-2', 'file-3', 'file-4'], + }); + }); + + it('supports all directives at the same time', async () => { + config = retentionPolicyConfigSchema.validate({ + maxFiles: 3, + removeOlderThan: '30d', + maxAccumulatedFileSize: '50b', + }); + context.getOrderedRolledFiles.mockResolvedValue(['file-1', 'file-2', 'file-3', 'file-4']); + + listFilesOlderThanMock.mockResolvedValue(['file-2']); + listFilesExceedingSizeMock.mockResolvedValue(['file-3']); + + const policy = new GenericRetentionPolicy(config, context); + + await policy.apply(); + + expect(listFilesExceedingSizeMock).toHaveBeenCalledTimes(1); + expect(listFilesExceedingSizeMock).toHaveBeenCalledWith({ + orderedFiles: ['file-1', 'file-2', 'file-3', 'file-4'], + maxSizeInBytes: config.maxAccumulatedFileSize!.getValueInBytes(), + }); + + expect(listFilesOlderThanMock).toHaveBeenCalledTimes(1); + expect(listFilesOlderThanMock).toHaveBeenCalledWith({ + orderedFiles: ['file-1', 'file-2', 'file-3', 'file-4'], + duration: config.removeOlderThan!, + }); + + expect(deleteFilesMock).toHaveBeenCalledTimes(1); + expect(deleteFilesMock).toHaveBeenCalledWith({ + filesToDelete: ['file-4', 'file-3', 'file-2'], + }); + }); + + it('do not call deleteFiles if no file should be deleted', async () => { + config = retentionPolicyConfigSchema.validate({ + maxFiles: 5, + }); + context.getOrderedRolledFiles.mockResolvedValue(['file-1', 'file-2', 'file-3', 'file-4']); + + const policy = new GenericRetentionPolicy(config, context); + + await policy.apply(); + + expect(deleteFilesMock).not.toHaveBeenCalled(); + }); +}); diff --git a/packages/core/logging/core-logging-server-internal/src/appenders/rolling_file/retention/retention_policy.ts b/packages/core/logging/core-logging-server-internal/src/appenders/rolling_file/retention/retention_policy.ts new file mode 100644 index 0000000000000..9f2150e4a575d --- /dev/null +++ b/packages/core/logging/core-logging-server-internal/src/appenders/rolling_file/retention/retention_policy.ts @@ -0,0 +1,85 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0 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 { dirname, join } from 'path'; +import { schema } from '@kbn/config-schema'; +import type { RetentionPolicyConfig } from '@kbn/core-logging-server'; +import type { RollingFileContext } from '../rolling_file_context'; +import { deleteFiles } from './fs'; +import { listFilesExceedingSize, listFilesOlderThan } from './utils'; + +export const retentionPolicyConfigSchema = schema.object( + { + maxFiles: schema.maybe(schema.number({ min: 1, max: 365 })), + maxAccumulatedFileSize: schema.maybe(schema.byteSize()), + removeOlderThan: schema.maybe(schema.duration({ max: '365d' })), + }, + { + validate: (config) => { + if (!config.maxFiles && !config.maxAccumulatedFileSize && !config.removeOlderThan) { + return 'Retention policy must define at least one directive: maxFiles, maxAccumulatedFileSize or removeOlderThan'; + } + }, + } +); + +export interface RetentionPolicy { + /** + * Apply the configured policy, checking the existing log files bound to the appender + * and disposing of those that should. + */ + apply(): Promise; +} + +export class GenericRetentionPolicy implements RetentionPolicy { + private readonly logFileFolder; + + constructor( + private readonly config: RetentionPolicyConfig, + private readonly context: RollingFileContext + ) { + this.logFileFolder = dirname(this.context.filePath); + } + + async apply() { + const { maxFiles, maxAccumulatedFileSize, removeOlderThan } = this.config; + const orderedFilesBaseNames = await this.context.getOrderedRolledFiles(); + const absOrderedFiles = orderedFilesBaseNames.map((filepath) => + join(this.logFileFolder, filepath) + ); + + const filesToDelete: Set = new Set(); + + if (maxFiles) { + const exceedingFiles = absOrderedFiles.slice(maxFiles, absOrderedFiles.length); + exceedingFiles.forEach((file) => filesToDelete.add(file)); + } + + if (maxAccumulatedFileSize) { + const toRemoveByFileSize = await listFilesExceedingSize({ + orderedFiles: absOrderedFiles, + maxSizeInBytes: maxAccumulatedFileSize.getValueInBytes(), + }); + toRemoveByFileSize.forEach((file) => filesToDelete.add(file)); + } + + if (removeOlderThan) { + const toRemoveByAge = await listFilesOlderThan({ + orderedFiles: absOrderedFiles, + duration: removeOlderThan, + }); + toRemoveByAge.forEach((file) => filesToDelete.add(file)); + } + + if (filesToDelete.size > 0) { + await deleteFiles({ + filesToDelete: [...filesToDelete], + }); + } + } +} diff --git a/packages/core/logging/core-logging-server-internal/src/appenders/rolling_file/retention/utils.test.mocks.ts b/packages/core/logging/core-logging-server-internal/src/appenders/rolling_file/retention/utils.test.mocks.ts new file mode 100644 index 0000000000000..ed8da1f9e513b --- /dev/null +++ b/packages/core/logging/core-logging-server-internal/src/appenders/rolling_file/retention/utils.test.mocks.ts @@ -0,0 +1,19 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0 and the Server Side Public License, v 1; you may not use this file except + * in compliance with, at your election, the Elastic License 2.0 or the Server + * Side Public License, v 1. + */ + +import type { getFileInfo } from './fs'; + +export const getFileInfoMock: jest.MockedFn = jest.fn(); + +jest.doMock('./fs', () => { + const actual = jest.requireActual('./fs'); + return { + ...actual, + getFileInfo: getFileInfoMock, + }; +}); diff --git a/packages/core/logging/core-logging-server-internal/src/appenders/rolling_file/retention/utils.test.ts b/packages/core/logging/core-logging-server-internal/src/appenders/rolling_file/retention/utils.test.ts new file mode 100644 index 0000000000000..deba5ff7265f8 --- /dev/null +++ b/packages/core/logging/core-logging-server-internal/src/appenders/rolling_file/retention/utils.test.ts @@ -0,0 +1,104 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0 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 moment from 'moment-timezone'; +import { getFileInfoMock } from './utils.test.mocks'; +import { listFilesOlderThan, listFilesExceedingSize } from './utils'; + +describe('listFilesExceedingSize', () => { + beforeEach(() => { + getFileInfoMock.mockReset(); + }); + + const mockWithSizeMap = (fileSizeMap: Record) => { + getFileInfoMock.mockImplementation(async (fileName) => { + const fileSize = fileSizeMap[fileName]; + if (fileSize !== undefined) { + return { exist: true, size: fileSize, mtime: new Date() }; + } + return { exist: false }; + }); + }; + + it('returns an empty list if total accumulated size is lower than the limit', async () => { + mockWithSizeMap({ + 'file-1': 50, + 'file-2': 50, + 'file-3': 50, + }); + + const result = await listFilesExceedingSize({ + orderedFiles: ['file-1', 'file-2', 'file-3'], + maxSizeInBytes: 200, + }); + + expect(result).toEqual([]); + }); + + it('returns the list of files over the limit, including the one that breached the limit', async () => { + mockWithSizeMap({ + 'file-1': 100, + 'file-2': 100, + 'file-3': 100, + 'file-4': 100, + }); + + const result = await listFilesExceedingSize({ + orderedFiles: ['file-1', 'file-2', 'file-3', 'file-4'], + maxSizeInBytes: 250, + }); + + expect(result).toEqual(['file-3', 'file-4']); + }); +}); + +describe('listFilesOlderThan', () => { + beforeEach(() => { + getFileInfoMock.mockReset(); + }); + + const mockWithMtime = (fileMtimeMap: Record) => { + getFileInfoMock.mockImplementation(async (fileName) => { + const fileDate = fileMtimeMap[fileName]; + if (fileDate !== undefined) { + return { exist: true, size: 0, mtime: fileDate }; + } + return { exist: false }; + }); + }; + + it('returns an empty list if total accumulated size is lower than the limit', async () => { + mockWithMtime({ + 'file-1': moment().add(-1, 'day').toDate(), + 'file-2': moment().add(-10, 'day').toDate(), + 'file-3': moment().add(-20, 'day').toDate(), + }); + + const result = await listFilesOlderThan({ + orderedFiles: ['file-1', 'file-2', 'file-3'], + duration: moment.duration(15, 'day'), + }); + + expect(result).toEqual(['file-3']); + }); + + it('ignores files that were not found', async () => { + mockWithMtime({ + 'file-1': moment().add(-1, 'day').toDate(), + 'file-2': moment().add(-20, 'day').toDate(), + 'file-3': undefined, + }); + + const result = await listFilesOlderThan({ + orderedFiles: ['file-1', 'file-2', 'file-3'], + duration: moment.duration(15, 'day'), + }); + + expect(result).toEqual(['file-2']); + }); +}); diff --git a/packages/core/logging/core-logging-server-internal/src/appenders/rolling_file/retention/utils.ts b/packages/core/logging/core-logging-server-internal/src/appenders/rolling_file/retention/utils.ts new file mode 100644 index 0000000000000..4b75ac5eb6380 --- /dev/null +++ b/packages/core/logging/core-logging-server-internal/src/appenders/rolling_file/retention/utils.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 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 moment, { type Duration } from 'moment-timezone'; +import { getFileInfo } from './fs'; + +export const listFilesExceedingSize = async ({ + orderedFiles, + maxSizeInBytes, +}: { + orderedFiles: string[]; + maxSizeInBytes: number; +}): Promise => { + let currentSize = 0; + + for (let i = 0; i < orderedFiles.length; i++) { + const filePath = orderedFiles[i]; + const stats = await getFileInfo(filePath); + if (stats.exist) { + currentSize += stats.size; + if (currentSize > maxSizeInBytes) { + return orderedFiles.slice(i); + } + } + } + + return []; +}; + +export const listFilesOlderThan = async ({ + orderedFiles, + duration, +}: { + orderedFiles: string[]; + duration: Duration; +}): Promise => { + const filesOlderThanLimit = []; + const timeLimit = moment().subtract(duration).toDate().getTime(); + + for (let i = 0; i < orderedFiles.length; i++) { + const filePath = orderedFiles[i]; + const stats = await getFileInfo(filePath); + if (stats.exist) { + if (stats.mtime.getTime() < timeLimit) { + filesOlderThanLimit.push(filePath); + } + } + } + + return filesOlderThanLimit; +}; diff --git a/packages/core/logging/core-logging-server-internal/src/appenders/rolling_file/rolling_file_appender.test.mocks.ts b/packages/core/logging/core-logging-server-internal/src/appenders/rolling_file/rolling_file_appender.test.mocks.ts index b903710632969..2384db0d573a4 100644 --- a/packages/core/logging/core-logging-server-internal/src/appenders/rolling_file/rolling_file_appender.test.mocks.ts +++ b/packages/core/logging/core-logging-server-internal/src/appenders/rolling_file/rolling_file_appender.test.mocks.ts @@ -38,10 +38,20 @@ jest.doMock('./rolling_file_context', () => ({ RollingFileContext: RollingFileContextMock, })); +export const createRetentionPolicyMock = jest.fn(); +jest.doMock('./retention', () => { + const actual = jest.requireActual('./retention'); + return { + ...actual, + createRetentionPolicy: createRetentionPolicyMock, + }; +}); + export const resetAllMocks = () => { LayoutsMock.create.mockReset(); createTriggeringPolicyMock.mockReset(); createRollingStrategyMock.mockReset(); + createRetentionPolicyMock.mockReset(); RollingFileManagerMock.mockReset(); RollingFileContextMock.mockReset(); }; diff --git a/packages/core/logging/core-logging-server-internal/src/appenders/rolling_file/rolling_file_appender.test.ts b/packages/core/logging/core-logging-server-internal/src/appenders/rolling_file/rolling_file_appender.test.ts index f5bdc5d307084..1379dc13da70f 100644 --- a/packages/core/logging/core-logging-server-internal/src/appenders/rolling_file/rolling_file_appender.test.ts +++ b/packages/core/logging/core-logging-server-internal/src/appenders/rolling_file/rolling_file_appender.test.ts @@ -9,6 +9,7 @@ import { createRollingStrategyMock, createTriggeringPolicyMock, + createRetentionPolicyMock, LayoutsMock, resetAllMocks, RollingFileContextMock, @@ -38,6 +39,9 @@ const config: RollingFileAppenderConfig = { max: 5, pattern: '-%i', }, + retention: { + maxFiles: 7, + }, }; const createLogRecord = (parts: Partial = {}): LogRecord => ({ @@ -72,6 +76,7 @@ describe('RollingFileAppender', () => { let layout: ReturnType; let strategy: ReturnType; let policy: ReturnType; + let retention: ReturnType; let context: ReturnType; let fileManager: ReturnType; @@ -85,6 +90,9 @@ describe('RollingFileAppender', () => { strategy = rollingFileAppenderMocks.createStrategy(); createRollingStrategyMock.mockReturnValue(strategy); + retention = rollingFileAppenderMocks.createRetentionPolicy(); + createRetentionPolicyMock.mockReturnValue(retention); + context = rollingFileAppenderMocks.createContext('file-path'); RollingFileContextMock.mockImplementation(() => context); @@ -111,6 +119,9 @@ describe('RollingFileAppender', () => { expect(createTriggeringPolicyMock).toHaveBeenCalledTimes(1); expect(createTriggeringPolicyMock).toHaveBeenCalledWith(config.policy, context); + expect(createRetentionPolicyMock).toHaveBeenCalledTimes(1); + expect(createRetentionPolicyMock).toHaveBeenCalledWith(config.retention, context); + expect(createRollingStrategyMock).toHaveBeenCalledTimes(1); expect(createRollingStrategyMock).toHaveBeenCalledWith(config.strategy, context); }); @@ -189,6 +200,21 @@ describe('RollingFileAppender', () => { expect(fileManager.closeStream).toHaveBeenCalledTimes(1); }); + it('triggers the retention policy once the rollout is complete', async () => { + const { promise, resolve } = createPromiseResolver(); + strategy.rollout.mockReturnValue(promise); + + const log = createLogRecord({ message: '1' }); + appender.append(log); + + expect(retention.apply).not.toHaveBeenCalled(); + + resolve(); + await nextTick(); + + expect(retention.apply).toHaveBeenCalledTimes(1); + }); + it('logs the event once the rollout is complete', async () => { const { promise, resolve } = createPromiseResolver(); strategy.rollout.mockReturnValue(promise); diff --git a/packages/core/logging/core-logging-server-internal/src/appenders/rolling_file/rolling_file_appender.ts b/packages/core/logging/core-logging-server-internal/src/appenders/rolling_file/rolling_file_appender.ts index 3dee8a83c4c08..33c3af6ed5a5f 100644 --- a/packages/core/logging/core-logging-server-internal/src/appenders/rolling_file/rolling_file_appender.ts +++ b/packages/core/logging/core-logging-server-internal/src/appenders/rolling_file/rolling_file_appender.ts @@ -7,12 +7,26 @@ */ import { schema } from '@kbn/config-schema'; -import { LogRecord, Layout, DisposableAppender } from '@kbn/logging'; +import type { LogRecord, Layout, DisposableAppender } from '@kbn/logging'; import type { RollingFileAppenderConfig } from '@kbn/core-logging-server'; import { Layouts } from '../../layouts/layouts'; import { BufferAppender } from '../buffer/buffer_appender'; -import { createTriggeringPolicy, triggeringPolicyConfigSchema, TriggeringPolicy } from './policies'; -import { RollingStrategy, createRollingStrategy, rollingStrategyConfigSchema } from './strategies'; +import { + createTriggeringPolicy, + triggeringPolicyConfigSchema, + type TriggeringPolicy, +} from './policies'; +import { + createRollingStrategy, + rollingStrategyConfigSchema, + type RollingStrategy, +} from './strategies'; +import { + createRetentionPolicy, + mergeRetentionPolicyConfig, + retentionPolicyConfigSchema, + type RetentionPolicy, +} from './retention'; import { RollingFileManager } from './rolling_file_manager'; import { RollingFileContext } from './rolling_file_context'; @@ -27,6 +41,7 @@ export class RollingFileAppender implements DisposableAppender { fileName: schema.string(), policy: triggeringPolicyConfigSchema, strategy: rollingStrategyConfigSchema, + retention: schema.maybe(retentionPolicyConfigSchema), }); private isRolling = false; @@ -36,8 +51,9 @@ export class RollingFileAppender implements DisposableAppender { private readonly layout: Layout; private readonly context: RollingFileContext; private readonly fileManager: RollingFileManager; - private readonly policy: TriggeringPolicy; - private readonly strategy: RollingStrategy; + private readonly triggeringPolicy: TriggeringPolicy; + private readonly rollingStrategy: RollingStrategy; + private readonly retentionPolicy: RetentionPolicy; private readonly buffer: BufferAppender; constructor(config: RollingFileAppenderConfig) { @@ -45,8 +61,12 @@ export class RollingFileAppender implements DisposableAppender { this.context.refreshFileInfo(); this.fileManager = new RollingFileManager(this.context); this.layout = Layouts.create(config.layout); - this.policy = createTriggeringPolicy(config.policy, this.context); - this.strategy = createRollingStrategy(config.strategy, this.context); + this.triggeringPolicy = createTriggeringPolicy(config.policy, this.context); + this.rollingStrategy = createRollingStrategy(config.strategy, this.context); + this.retentionPolicy = createRetentionPolicy( + mergeRetentionPolicyConfig(config.retention, config.strategy), + this.context + ); this.buffer = new BufferAppender(); } @@ -96,8 +116,9 @@ export class RollingFileAppender implements DisposableAppender { } this.isRolling = true; try { - await this.strategy.rollout(); + await this.rollingStrategy.rollout(); await this.fileManager.closeStream(); + await this.retentionPolicy.apply(); } catch (e) { // eslint-disable-next-line no-console console.error('[RollingFileAppender]: error while rolling file: ', e); @@ -129,6 +150,6 @@ export class RollingFileAppender implements DisposableAppender { * Checks if the current event should trigger a rollout */ private needRollout(record: LogRecord) { - return this.policy.isTriggeringEvent(record); + return this.triggeringPolicy.isTriggeringEvent(record); } } diff --git a/packages/core/logging/core-logging-server-internal/src/appenders/rolling_file/rolling_file_context.ts b/packages/core/logging/core-logging-server-internal/src/appenders/rolling_file/rolling_file_context.ts index 744a15535a863..995cd08583e05 100644 --- a/packages/core/logging/core-logging-server-internal/src/appenders/rolling_file/rolling_file_context.ts +++ b/packages/core/logging/core-logging-server-internal/src/appenders/rolling_file/rolling_file_context.ts @@ -8,6 +8,8 @@ import { statSync } from 'fs'; +export type GetOrderedRolledFileFn = () => Promise; + /** * Context shared between the rolling file manager, policy and strategy. */ @@ -36,4 +38,17 @@ export class RollingFileContext { this.currentFileSize = 0; } } + + #orderedRolledFileFn?: GetOrderedRolledFileFn; + + public async getOrderedRolledFiles(): Promise { + if (this.#orderedRolledFileFn) { + return this.#orderedRolledFileFn(); + } + throw new Error('orderedRolledFileFn not registered on the context'); + } + + public setOrderedRolledFileFn(fn: GetOrderedRolledFileFn) { + this.#orderedRolledFileFn = fn; + } } diff --git a/packages/core/logging/core-logging-server-internal/src/appenders/rolling_file/strategies/numeric/numeric_strategy.test.mocks.ts b/packages/core/logging/core-logging-server-internal/src/appenders/rolling_file/strategies/numeric/numeric_strategy.test.mocks.ts index 4ba76cb5148a0..cba9531feaa11 100644 --- a/packages/core/logging/core-logging-server-internal/src/appenders/rolling_file/strategies/numeric/numeric_strategy.test.mocks.ts +++ b/packages/core/logging/core-logging-server-internal/src/appenders/rolling_file/strategies/numeric/numeric_strategy.test.mocks.ts @@ -7,14 +7,12 @@ */ export const getOrderedRolledFilesMock = jest.fn(); -export const deleteFilesMock = jest.fn(); export const rollPreviousFilesInOrderMock = jest.fn(); export const rollCurrentFileMock = jest.fn(); export const shouldSkipRolloutMock = jest.fn(); jest.doMock('./rolling_tasks', () => ({ getOrderedRolledFiles: getOrderedRolledFilesMock, - deleteFiles: deleteFilesMock, rollPreviousFilesInOrder: rollPreviousFilesInOrderMock, rollCurrentFile: rollCurrentFileMock, shouldSkipRollout: shouldSkipRolloutMock, @@ -23,7 +21,6 @@ jest.doMock('./rolling_tasks', () => ({ export const resetAllMock = () => { shouldSkipRolloutMock.mockReset(); getOrderedRolledFilesMock.mockReset(); - deleteFilesMock.mockReset(); rollPreviousFilesInOrderMock.mockReset(); rollCurrentFileMock.mockReset(); }; diff --git a/packages/core/logging/core-logging-server-internal/src/appenders/rolling_file/strategies/numeric/numeric_strategy.test.ts b/packages/core/logging/core-logging-server-internal/src/appenders/rolling_file/strategies/numeric/numeric_strategy.test.ts index 731c0079bd9e7..3571daa30ab43 100644 --- a/packages/core/logging/core-logging-server-internal/src/appenders/rolling_file/strategies/numeric/numeric_strategy.test.ts +++ b/packages/core/logging/core-logging-server-internal/src/appenders/rolling_file/strategies/numeric/numeric_strategy.test.ts @@ -10,7 +10,6 @@ import { join } from 'path'; import { resetAllMock, shouldSkipRolloutMock, - deleteFilesMock, getOrderedRolledFilesMock, rollCurrentFileMock, rollPreviousFilesInOrderMock, @@ -42,6 +41,11 @@ describe('NumericRollingStrategy', () => { resetAllMock(); }); + it('calls `context.setOrderedRolledFileFn` in constructor', () => { + expect(context.setOrderedRolledFileFn).toHaveBeenCalledTimes(1); + expect(context.setOrderedRolledFileFn).toHaveBeenCalledWith(expect.any(Function)); + }); + it('calls `getOrderedRolledFiles` with the correct parameters', async () => { await strategy.rollout(); @@ -53,23 +57,6 @@ describe('NumericRollingStrategy', () => { }); }); - it('calls `deleteFiles` with the correct files', async () => { - getOrderedRolledFilesMock.mockResolvedValue([ - 'kibana.1.log', - 'kibana.2.log', - 'kibana.3.log', - 'kibana.4.log', - ]); - - await strategy.rollout(); - - expect(deleteFilesMock).toHaveBeenCalledTimes(1); - expect(deleteFilesMock).toHaveBeenCalledWith({ - filesToDelete: ['kibana.3.log', 'kibana.4.log'], - logFileFolder, - }); - }); - it('calls `rollPreviousFilesInOrder` with the correct files', async () => { getOrderedRolledFilesMock.mockResolvedValue([ 'kibana.1.log', @@ -82,7 +69,7 @@ describe('NumericRollingStrategy', () => { expect(rollPreviousFilesInOrderMock).toHaveBeenCalledTimes(1); expect(rollPreviousFilesInOrderMock).toHaveBeenCalledWith({ - filesToRoll: ['kibana.1.log', 'kibana.2.log'], + filesToRoll: ['kibana.1.log', 'kibana.2.log', 'kibana.3.log', 'kibana.4.log'], logFileFolder, logFileBaseName, pattern, @@ -116,24 +103,14 @@ describe('NumericRollingStrategy', () => { await strategy.rollout(); - const deleteFilesCall = deleteFilesMock.mock.invocationCallOrder[0]; const rollPreviousFilesInOrderCall = rollPreviousFilesInOrderMock.mock.invocationCallOrder[0]; const rollCurrentFileCall = rollCurrentFileMock.mock.invocationCallOrder[0]; const refreshFileInfoCall = context.refreshFileInfo.mock.invocationCallOrder[0]; - expect(deleteFilesCall).toBeLessThan(rollPreviousFilesInOrderCall); expect(rollPreviousFilesInOrderCall).toBeLessThan(rollCurrentFileCall); expect(rollCurrentFileCall).toBeLessThan(refreshFileInfoCall); }); - it('do not calls `deleteFiles` if no file should be deleted', async () => { - getOrderedRolledFilesMock.mockResolvedValue(['kibana.1.log', 'kibana.2.log']); - - await strategy.rollout(); - - expect(deleteFilesMock).not.toHaveBeenCalled(); - }); - it('do not calls `rollPreviousFilesInOrder` if no file should be rolled', async () => { getOrderedRolledFilesMock.mockResolvedValue([]); @@ -154,7 +131,6 @@ describe('NumericRollingStrategy', () => { await strategy.rollout(); expect(getOrderedRolledFilesMock).not.toHaveBeenCalled(); - expect(deleteFilesMock).not.toHaveBeenCalled(); expect(rollPreviousFilesInOrderMock).not.toHaveBeenCalled(); expect(rollCurrentFileMock).not.toHaveBeenCalled(); expect(context.refreshFileInfo).not.toHaveBeenCalled(); diff --git a/packages/core/logging/core-logging-server-internal/src/appenders/rolling_file/strategies/numeric/numeric_strategy.ts b/packages/core/logging/core-logging-server-internal/src/appenders/rolling_file/strategies/numeric/numeric_strategy.ts index f63c78264dc46..8791b3f46e52a 100644 --- a/packages/core/logging/core-logging-server-internal/src/appenders/rolling_file/strategies/numeric/numeric_strategy.ts +++ b/packages/core/logging/core-logging-server-internal/src/appenders/rolling_file/strategies/numeric/numeric_strategy.ts @@ -14,7 +14,6 @@ import { RollingFileContext } from '../../rolling_file_context'; import { shouldSkipRollout, getOrderedRolledFiles, - deleteFiles, rollCurrentFile, rollPreviousFilesInOrder, } from './rolling_tasks'; @@ -46,7 +45,8 @@ export const numericRollingStrategyConfigSchema = schema.object({ * strategy: * type: numeric * pattern: "-%i" - * max: 2 + * retention: + * maxFiles: 2 * ``` * - During the first rollover kibana.log is renamed to kibana-1.log. A new kibana.log file is created and starts * being written to. @@ -69,6 +69,15 @@ export class NumericRollingStrategy implements RollingStrategy { this.logFilePath = this.context.filePath; this.logFileBaseName = basename(this.context.filePath); this.logFileFolder = dirname(this.context.filePath); + context.setOrderedRolledFileFn(this.getOrderedRolledFiles.bind(this)); + } + + private async getOrderedRolledFiles() { + return await getOrderedRolledFiles({ + logFileFolder: this.logFileFolder, + logFileBaseName: this.logFileBaseName, + pattern: this.config.pattern, + }); } async rollout() { @@ -82,20 +91,15 @@ export class NumericRollingStrategy implements RollingStrategy { } // get the files matching the pattern in the folder, and sort them by `%i` value - const orderedFiles = await getOrderedRolledFiles({ - logFileFolder, - logFileBaseName, - pattern, - }); - const filesToRoll = orderedFiles.slice(0, this.config.max - 1); - const filesToDelete = orderedFiles.slice(filesToRoll.length, orderedFiles.length); - - if (filesToDelete.length > 0) { - await deleteFiles({ logFileFolder, filesToDelete }); - } + const orderedFilesToRoll = await this.getOrderedRolledFiles(); - if (filesToRoll.length > 0) { - await rollPreviousFilesInOrder({ filesToRoll, logFileFolder, logFileBaseName, pattern }); + if (orderedFilesToRoll.length > 0) { + await rollPreviousFilesInOrder({ + filesToRoll: orderedFilesToRoll, + logFileFolder, + logFileBaseName, + pattern, + }); } await rollCurrentFile({ pattern, logFileBaseName, logFileFolder }); diff --git a/packages/core/logging/core-logging-server-internal/src/appenders/rolling_file/strategies/numeric/rolling_tasks.test.mocks.ts b/packages/core/logging/core-logging-server-internal/src/appenders/rolling_file/strategies/numeric/rolling_tasks.test.mocks.ts index 03d51ea68cac1..3a69c86fcb747 100644 --- a/packages/core/logging/core-logging-server-internal/src/appenders/rolling_file/strategies/numeric/rolling_tasks.test.mocks.ts +++ b/packages/core/logging/core-logging-server-internal/src/appenders/rolling_file/strategies/numeric/rolling_tasks.test.mocks.ts @@ -7,20 +7,17 @@ */ export const readdirMock = jest.fn(); -export const unlinkMock = jest.fn(); export const renameMock = jest.fn(); export const accessMock = jest.fn(); jest.doMock('fs/promises', () => ({ readdir: readdirMock, - unlink: unlinkMock, rename: renameMock, access: accessMock, })); export const clearAllMocks = () => { readdirMock.mockClear(); - unlinkMock.mockClear(); renameMock.mockClear(); accessMock.mockClear(); }; diff --git a/packages/core/logging/core-logging-server-internal/src/appenders/rolling_file/strategies/numeric/rolling_tasks.test.ts b/packages/core/logging/core-logging-server-internal/src/appenders/rolling_file/strategies/numeric/rolling_tasks.test.ts index 3f7c56bac582b..12d408f9ab611 100644 --- a/packages/core/logging/core-logging-server-internal/src/appenders/rolling_file/strategies/numeric/rolling_tasks.test.ts +++ b/packages/core/logging/core-logging-server-internal/src/appenders/rolling_file/strategies/numeric/rolling_tasks.test.ts @@ -7,18 +7,11 @@ */ import { join } from 'path'; -import { - accessMock, - readdirMock, - renameMock, - unlinkMock, - clearAllMocks, -} from './rolling_tasks.test.mocks'; +import { accessMock, readdirMock, renameMock, clearAllMocks } from './rolling_tasks.test.mocks'; import { shouldSkipRollout, rollCurrentFile, rollPreviousFilesInOrder, - deleteFiles, getOrderedRolledFiles, } from './rolling_tasks'; @@ -97,26 +90,6 @@ describe('NumericRollingStrategy tasks', () => { }); }); - describe('deleteFiles', () => { - it('calls `unlink` once for each file', async () => { - await deleteFiles({ - logFileFolder: 'log-folder', - filesToDelete: ['file-a', 'file-b', 'file-c'], - }); - - expect(unlinkMock).toHaveBeenCalledTimes(3); - }); - it('calls `unlink` with the correct parameters', async () => { - await deleteFiles({ - logFileFolder: 'log-folder', - filesToDelete: ['file-a', 'file-b'], - }); - - expect(unlinkMock).toHaveBeenNthCalledWith(1, join('log-folder', 'file-a')); - expect(unlinkMock).toHaveBeenNthCalledWith(2, join('log-folder', 'file-b')); - }); - }); - describe('getOrderedRolledFiles', () => { it('returns the rolled files matching the pattern in order', async () => { readdirMock.mockResolvedValue([ diff --git a/packages/core/logging/core-logging-server-internal/src/appenders/rolling_file/strategies/numeric/rolling_tasks.ts b/packages/core/logging/core-logging-server-internal/src/appenders/rolling_file/strategies/numeric/rolling_tasks.ts index 15bae8901ddcb..4f880653cb81b 100644 --- a/packages/core/logging/core-logging-server-internal/src/appenders/rolling_file/strategies/numeric/rolling_tasks.ts +++ b/packages/core/logging/core-logging-server-internal/src/appenders/rolling_file/strategies/numeric/rolling_tasks.ts @@ -7,7 +7,7 @@ */ import { join } from 'path'; -import { readdir, unlink, access } from 'fs/promises'; +import { readdir, access } from 'fs/promises'; import { getFileNameMatcher, getRollingFileName } from './pattern_matcher'; import { moveFile } from './utils'; @@ -47,16 +47,6 @@ export const getOrderedRolledFiles = async ({ .map(({ fileName }) => fileName); }; -export const deleteFiles = async ({ - logFileFolder, - filesToDelete, -}: { - logFileFolder: string; - filesToDelete: string[]; -}) => { - await Promise.all(filesToDelete.map((fileToDelete) => unlink(join(logFileFolder, fileToDelete)))); -}; - export const rollPreviousFilesInOrder = async ({ filesToRoll, logFileFolder, diff --git a/packages/core/logging/core-logging-server/index.ts b/packages/core/logging/core-logging-server/index.ts index 1cade96cf3d01..16f4b188fee23 100644 --- a/packages/core/logging/core-logging-server/index.ts +++ b/packages/core/logging/core-logging-server/index.ts @@ -23,4 +23,5 @@ export type { RewritePolicyConfig, MetaRewritePolicyConfigProperty, MetaRewritePolicyConfig, + RetentionPolicyConfig, } from './src/appenders'; diff --git a/packages/core/logging/core-logging-server/src/appenders/index.ts b/packages/core/logging/core-logging-server/src/appenders/index.ts index 698b70c939347..ddaa4c9ee1ae1 100644 --- a/packages/core/logging/core-logging-server/src/appenders/index.ts +++ b/packages/core/logging/core-logging-server/src/appenders/index.ts @@ -26,6 +26,7 @@ export type { TimeIntervalTriggeringPolicyConfig, NumericRollingStrategyConfig, RollingStrategyConfig, + RetentionPolicyConfig, } from './rolling_file'; /** @public */ diff --git a/packages/core/logging/core-logging-server/src/appenders/rolling_file.ts b/packages/core/logging/core-logging-server/src/appenders/rolling_file.ts index 4de6c92cedd0a..dda8a57a940c7 100644 --- a/packages/core/logging/core-logging-server/src/appenders/rolling_file.ts +++ b/packages/core/logging/core-logging-server/src/appenders/rolling_file.ts @@ -32,6 +32,10 @@ export interface RollingFileAppenderConfig { * The {@link RollingStrategy | rollout strategy} to use for rolling. */ strategy: RollingStrategyConfig; + /** + * The {@link RetentionPolicy | retention strategy} to use to know which files to keep. + */ + retention?: RetentionPolicyConfig; } /** @@ -106,6 +110,14 @@ export interface NumericRollingStrategyConfig { /** * The maximum number of files to keep. Once this number is reached, oldest * files will be deleted. Defaults to `7` + * + * @deprecated use retention policy instead */ max: number; } + +export interface RetentionPolicyConfig { + maxFiles?: number; + maxAccumulatedFileSize?: ByteSizeValue; + removeOlderThan?: Duration; +} diff --git a/src/core/server/docs/kib_core_logging.mdx b/src/core/server/docs/kib_core_logging.mdx index f117f0d54f718..f097192865a96 100644 --- a/src/core/server/docs/kib_core_logging.mdx +++ b/src/core/server/docs/kib_core_logging.mdx @@ -18,7 +18,8 @@ tags: ['kibana','dev', 'contributor', 'api docs'] - [Appenders](#appenders) - [Rolling File Appender](#rolling-file-appender) - [Triggering Policies](#triggering-policies) - - [Rolling strategies](#rolling-strategies) + - [Rolling Strategies](#rolling-strategies) + - [Retention Policies](#retention-policies) - [Configuration](#configuration) - [Usage](#usage) - [Logging config migration](#logging-config-migration) @@ -270,15 +271,13 @@ The default value is `true`. #### Rolling strategies -The rolling strategy determines how the rollover should occur: both the naming of the rolled files, -and their retention policy. +The rolling strategy determines how the naming of the rolled file should be performed. There is currently one strategy supported: `numeric`. ##### NumericRollingStrategy -This strategy will suffix the file with a given pattern when rolling, -and will retains a fixed amount of rolled files. +This strategy will suffix the file with a given pattern when rolling. ```yaml logging: @@ -291,7 +290,8 @@ logging: strategy: type: numeric pattern: '-%i' - max: 2 + retention: + maxFiles: 2 layout: type: pattern ``` @@ -323,6 +323,86 @@ The maximum number of files to keep. Once this number is reached, oldest files w The default value is `7` +**deprecated**: Please use a retention policy instead. + +#### Retention Policies + +The retention policy defines when the rolled files must be deleted. + +##### maxFiles + +Retention policy that will keep, at max, the defined number of files (ordered from the most recent to the oldest one) +and delete the others. + +This is the same behavior as what was previously achieved via the deprecated `strategy.max` field. + +**Example**: Appender configured to keep `5` rolled files: +```yaml +logging: + appenders: + rolling-file: + type: rolling-file + fileName: /var/logs/kibana.log + layout: + type: pattern + policy: + // ... + strategy: + // ... + retention: + maxFiles: 5 +``` + +##### maxAccumulatedFileSize + +Retention policy based on the size on disk used by the rolled files. Size count will be +performed from the most recent file to the oldest one, and will delete all files +(including the one breaching the threshold) over the limit. Only the size from the rolled files is taken into +account (the active file is ignored). + +*Note:* The field supports the following optional suffixes: `b`, `kb`, `mb`, `gb` and `tb` (case-insensitive). The default suffix is `b` + +**Example**: Appender configured to keep 5GB of rolled logs at maximum: +```yaml +logging: + appenders: + rolling-file: + type: rolling-file + fileName: /var/logs/kibana.log + layout: + type: pattern + policy: + // ... + strategy: + // ... + retention: + maxAccumulatedFileSize: "5GB" +``` + +##### removeOlderThan + +Retention policy based on the time (modification date - `mtime`) the files were rolled, and that will delete all files +that are older than the specified duration. + +*Note:* The field supports the following optional suffixes: `ms`, `s`, `m`, `h`, `d`, `w`, `M` and `Y`. The default suffix is `ms`. + +**Example**: Appender configured to delete rolled files after 30 days: +```yaml +logging: + appenders: + rolling-file: + type: rolling-file + fileName: /var/logs/kibana.log + layout: + type: pattern + policy: + // ... + strategy: + // ... + retention: + removeOlderThan: "30d" +``` + ### Rewrite Appender *This appender is currently considered experimental and is not intended diff --git a/src/core/server/integration_tests/logging/rolling_file_appender.test.ts b/src/core/server/integration_tests/logging/rolling_file_appender.test.ts index 65fe152bdc9b0..c5a0760a09b74 100644 --- a/src/core/server/integration_tests/logging/rolling_file_appender.test.ts +++ b/src/core/server/integration_tests/logging/rolling_file_appender.test.ts @@ -60,7 +60,7 @@ describe('RollingFileAppender', () => { const expectedFileContent = (indices: number[]) => indices.map(message).join('\n') + '\n'; describe('`size-limit` policy with `numeric` strategy', () => { - it('rolls the log file in the correct order', async () => { + it('supports the deprecated `strategy.max` field', async () => { root = createRoot({ type: 'rolling-file', fileName: logFile, @@ -106,7 +106,7 @@ describe('RollingFileAppender', () => { expect(await getFileContent('kibana.2.log')).toEqual(expectedFileContent([1, 2, 3])); }); - it('only keep the correct number of files', async () => { + it('maxFile retention: only keep the correct number of files', async () => { root = createRoot({ type: 'rolling-file', fileName: logFile, @@ -120,9 +120,11 @@ describe('RollingFileAppender', () => { }, strategy: { type: 'numeric', - max: 2, pattern: '-%i', }, + retention: { + maxFiles: 2, + }, }); await root.preboot(); await root.setup(); @@ -153,6 +155,107 @@ describe('RollingFileAppender', () => { expect(await getFileContent('kibana-1.log')).toEqual(expectedFileContent([5, 6])); expect(await getFileContent('kibana-2.log')).toEqual(expectedFileContent([3, 4])); }); + + it('maxAccumulatedFileSize retention: only keep the correct number of files', async () => { + root = createRoot({ + type: 'rolling-file', + fileName: logFile, + layout: { + type: 'pattern', + pattern: '%message', + }, + policy: { + type: 'size-limit', + size: '60b', + }, + strategy: { + type: 'numeric', + pattern: '-%i', + }, + retention: { + maxAccumulatedFileSize: '100b', + }, + }); + await root.preboot(); + await root.setup(); + + const logger = root.logger.get('test.rolling.file'); + + // size = 60b, message.length ~= 40b, should roll every 2 message + + // last file - 'kibana-3.log' (which will be removed during rolling) + logger.info(message(1)); + logger.info(message(2)); + // roll - 'kibana-2.log' (which will be removed during rolling) + logger.info(message(3)); + logger.info(message(4)); + // roll - 'kibana-1.log' + logger.info(message(5)); + logger.info(message(6)); + // roll - 'kibana.log' + logger.info(message(7)); + logger.info(message(8)); + + await flush(); + + const files = await readdir(testDir); + + expect(files.sort()).toEqual(['kibana-1.log', 'kibana.log']); + expect(await getFileContent('kibana.log')).toEqual(expectedFileContent([7, 8])); + expect(await getFileContent('kibana-1.log')).toEqual(expectedFileContent([5, 6])); + }); + + it('removeOlderThan retention: only keep the correct files', async () => { + root = createRoot({ + type: 'rolling-file', + fileName: logFile, + layout: { + type: 'pattern', + pattern: '%message', + }, + policy: { + type: 'size-limit', + size: '60b', + }, + strategy: { + type: 'numeric', + pattern: '-%i', + }, + retention: { + removeOlderThan: '2s', + }, + }); + await root.preboot(); + await root.setup(); + + const logger = root.logger.get('test.rolling.file'); + + // size = 60b, message.length ~= 40b, should roll every 2 message + + // last file - 'kibana-3.log' (which will be removed during rolling) + logger.info(message(1)); + logger.info(message(2)); + // roll - 'kibana-2.log' (which will be removed during rolling) + logger.info(message(3)); + logger.info(message(4)); + + await delay(2500); + + // roll - 'kibana-1.log' + logger.info(message(5)); + logger.info(message(6)); + // roll - 'kibana.log' + logger.info(message(7)); + logger.info(message(8)); + + await flush(); + + const files = await readdir(testDir); + + expect(files.sort()).toEqual(['kibana-1.log', 'kibana.log']); + expect(await getFileContent('kibana.log')).toEqual(expectedFileContent([7, 8])); + expect(await getFileContent('kibana-1.log')).toEqual(expectedFileContent([5, 6])); + }); }); describe('`time-interval` policy with `numeric` strategy', () => { From c6c8ee062357c6066c8ea49f9917acf068aa2b8b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Patryk=20Kopyci=C5=84ski?= Date: Tue, 7 May 2024 17:14:05 +0200 Subject: [PATCH 31/86] Enable aiAssistantFlyoutMode flag (#182633) ## Summary Enables `aiAssistantFlyoutMode` flag by default --- .../packages/kbn-elastic-assistant/impl/assistant/index.tsx | 2 +- .../plugins/security_solution/common/experimental_features.ts | 2 +- .../public/attack_discovery/pages/header/index.tsx | 4 +++- x-pack/plugins/security_solution/public/plugin.tsx | 2 +- 4 files changed, 6 insertions(+), 4 deletions(-) diff --git a/x-pack/packages/kbn-elastic-assistant/impl/assistant/index.tsx b/x-pack/packages/kbn-elastic-assistant/impl/assistant/index.tsx index 07f3598101709..b589cd5626a87 100644 --- a/x-pack/packages/kbn-elastic-assistant/impl/assistant/index.tsx +++ b/x-pack/packages/kbn-elastic-assistant/impl/assistant/index.tsx @@ -894,7 +894,7 @@ const AssistantComponent: React.FC = ({ selectedConversation={currentConversation} defaultConnector={defaultConnector} docLinks={docLinks} - isDisabled={isDisabled} + isDisabled={isDisabled || isLoadingChatSend} isSettingsModalVisible={isSettingsModalVisible} onToggleShowAnonymizedValues={onToggleShowAnonymizedValues} setIsSettingsModalVisible={setIsSettingsModalVisible} diff --git a/x-pack/plugins/security_solution/common/experimental_features.ts b/x-pack/plugins/security_solution/common/experimental_features.ts index 175a40288b9d8..1f46816c52dd2 100644 --- a/x-pack/plugins/security_solution/common/experimental_features.ts +++ b/x-pack/plugins/security_solution/common/experimental_features.ts @@ -255,7 +255,7 @@ export const allowedExperimentalValues = Object.freeze({ /** * Enables Security AI Assistant's Flyout mode */ - aiAssistantFlyoutMode: false, + aiAssistantFlyoutMode: true, /** * Enables the new modal for the value list items diff --git a/x-pack/plugins/security_solution/public/attack_discovery/pages/header/index.tsx b/x-pack/plugins/security_solution/public/attack_discovery/pages/header/index.tsx index ba07122fbfb04..d74c7c4801f4d 100644 --- a/x-pack/plugins/security_solution/public/attack_discovery/pages/header/index.tsx +++ b/x-pack/plugins/security_solution/public/attack_discovery/pages/header/index.tsx @@ -11,6 +11,7 @@ import { ConnectorSelectorInline } from '@kbn/elastic-assistant'; import { noop } from 'lodash/fp'; import React from 'react'; +import { useIsExperimentalFeatureEnabled } from '../../../common/hooks/use_experimental_features'; import { useAssistantAvailability } from '../../../assistant/use_assistant_availability'; import * as i18n from './translations'; @@ -27,6 +28,7 @@ const HeaderComponent: React.FC = ({ onGenerate, onConnectorIdSelected, }) => { + const isFlyoutMode = useIsExperimentalFeatureEnabled('aiAssistantFlyoutMode'); const { hasAssistantPrivilege } = useAssistantAvailability(); const { euiTheme } = useEuiTheme(); const disabled = !hasAssistantPrivilege || isLoading || connectorId == null; @@ -43,7 +45,7 @@ const HeaderComponent: React.FC = ({ > Date: Tue, 7 May 2024 18:25:54 +0300 Subject: [PATCH 32/86] [APM] Introduce `/apm/assets/services` API (#181842) ## Summary https://github.com/elastic/kibana/issues/181720 The PR introduces the API `internal/apm/assets/services` and the `createAssetsESClient` which is responsible for fetching data from the `assets` index. ### Response ``` { "services": [ { "asset": { "signalTypes": { "asset.traces": true, "asset.logs": true }, "identifyingMetadata": [ "service.name" ] }, "service": { "name": "multisignal-service", "environment": "testing" } } ] } ``` ### Required fields 1. start 2. end 3. kuery Example ``` http://localhost:5601/lph/internal/apm/assets/services?kuery=service.name:synth-node-0&start=2024-04-26T10%3A26%3A34.677Z&end=2024-04-26T10%3A26%3A34.677Z& ``` ### Notes - Environment filter is not included in this PR as there is a still a discussion in OAM - The endpoint will be moved to another plugin, we decided to have in apm for now due to time constrains --------- Co-authored-by: kibanamachine <42973632+kibanamachine@users.noreply.github.com> --- packages/kbn-apm-synthtrace/index.ts | 2 +- .../apm/common/es_fields/assets.ts | 10 + .../create_assets_es_clients.ts | 67 +++++ .../get_global_apm_server_route_repository.ts | 2 + .../apm/server/routes/assets/get_assets.ts | 65 +++++ .../assets/services/get_service_assets.ts | 72 +++++ .../server/routes/assets/services/routes.ts | 44 +++ .../server/routes/assets/services/types.ts | 33 +++ .../test/apm_api_integration/common/config.ts | 11 + .../asset_services/asset_services.spec.ts | 261 ++++++++++++++++++ 10 files changed, 566 insertions(+), 1 deletion(-) create mode 100644 x-pack/plugins/observability_solution/apm/common/es_fields/assets.ts create mode 100644 x-pack/plugins/observability_solution/apm/server/lib/helpers/create_es_client/create_assets_es_client/create_assets_es_clients.ts create mode 100644 x-pack/plugins/observability_solution/apm/server/routes/assets/get_assets.ts create mode 100644 x-pack/plugins/observability_solution/apm/server/routes/assets/services/get_service_assets.ts create mode 100644 x-pack/plugins/observability_solution/apm/server/routes/assets/services/routes.ts create mode 100644 x-pack/plugins/observability_solution/apm/server/routes/assets/services/types.ts create mode 100644 x-pack/test/apm_api_integration/tests/asset_services/asset_services.spec.ts diff --git a/packages/kbn-apm-synthtrace/index.ts b/packages/kbn-apm-synthtrace/index.ts index 8ed45126e7cf9..459e3802ae660 100644 --- a/packages/kbn-apm-synthtrace/index.ts +++ b/packages/kbn-apm-synthtrace/index.ts @@ -14,7 +14,7 @@ export { InfraSynthtraceEsClient } from './src/lib/infra/infra_synthtrace_es_cli export { InfraSynthtraceKibanaClient } from './src/lib/infra/infra_synthtrace_kibana_client'; export { MonitoringSynthtraceEsClient } from './src/lib/monitoring/monitoring_synthtrace_es_client'; export { LogsSynthtraceEsClient } from './src/lib/logs/logs_synthtrace_es_client'; - +export { AssetsSynthtraceEsClient } from './src/lib/assets/assets_synthtrace_es_client'; export { addObserverVersionTransform, deleteSummaryFieldTransform, diff --git a/x-pack/plugins/observability_solution/apm/common/es_fields/assets.ts b/x-pack/plugins/observability_solution/apm/common/es_fields/assets.ts new file mode 100644 index 0000000000000..ffe0c99286fc5 --- /dev/null +++ b/x-pack/plugins/observability_solution/apm/common/es_fields/assets.ts @@ -0,0 +1,10 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +export const ASSET_TYPE = 'asset.type'; +export const LAST_SEEN = 'asset.last_seen'; +export const FIRST_SEEN = 'asset.first_seen'; diff --git a/x-pack/plugins/observability_solution/apm/server/lib/helpers/create_es_client/create_assets_es_client/create_assets_es_clients.ts b/x-pack/plugins/observability_solution/apm/server/lib/helpers/create_es_client/create_assets_es_client/create_assets_es_clients.ts new file mode 100644 index 0000000000000..2b77f08f10269 --- /dev/null +++ b/x-pack/plugins/observability_solution/apm/server/lib/helpers/create_es_client/create_assets_es_client/create_assets_es_clients.ts @@ -0,0 +1,67 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ +import { ESSearchRequest, InferSearchResponseOf } from '@kbn/es-types'; +import type { KibanaRequest } from '@kbn/core/server'; +import { ElasticsearchClient } from '@kbn/core/server'; +import { unwrapEsResponse } from '@kbn/observability-plugin/common/utils/unwrap_es_response'; +import { withApmSpan } from '../../../../utils/with_apm_span'; + +const ASSETS_INDEX_NAME = 'assets'; + +export function cancelEsRequestOnAbort>( + promise: T, + request: KibanaRequest, + controller: AbortController +): T { + const subscription = request.events.aborted$.subscribe(() => { + controller.abort(); + }); + + return promise.finally(() => subscription.unsubscribe()) as T; +} + +export interface AssetsESClient { + search( + operationName: string, + searchRequest: TSearchRequest + ): Promise>; +} + +export async function createAssetsESClient({ + request, + esClient, +}: { + request: KibanaRequest; + esClient: ElasticsearchClient; +}) { + return { + search( + operationName: string, + searchRequest: TSearchRequest + ): Promise> { + const controller = new AbortController(); + + const promise = withApmSpan(operationName, () => { + return cancelEsRequestOnAbort( + esClient.search( + { ...searchRequest, index: [ASSETS_INDEX_NAME] }, + { + signal: controller.signal, + meta: true, + } + ) as unknown as Promise<{ + body: InferSearchResponseOf; + }>, + request, + controller + ); + }); + + return unwrapEsResponse(promise); + }, + }; +} diff --git a/x-pack/plugins/observability_solution/apm/server/routes/apm_routes/get_global_apm_server_route_repository.ts b/x-pack/plugins/observability_solution/apm/server/routes/apm_routes/get_global_apm_server_route_repository.ts index 6c7b6d07ad2f4..8fee2cba47dc6 100644 --- a/x-pack/plugins/observability_solution/apm/server/routes/apm_routes/get_global_apm_server_route_repository.ts +++ b/x-pack/plugins/observability_solution/apm/server/routes/apm_routes/get_global_apm_server_route_repository.ts @@ -44,6 +44,7 @@ import { suggestionsRouteRepository } from '../suggestions/route'; import { timeRangeMetadataRoute } from '../time_range_metadata/route'; import { traceRouteRepository } from '../traces/route'; import { transactionRouteRepository } from '../transactions/route'; +import { servicesAssetsRoutesRepository } from '../assets/services/routes'; function getTypedGlobalApmServerRouteRepository() { const repository = { @@ -55,6 +56,7 @@ function getTypedGlobalApmServerRouteRepository() { ...observabilityOverviewRouteRepository, ...serviceMapRouteRepository, ...serviceRouteRepository, + ...servicesAssetsRoutesRepository, ...serviceGroupRouteRepository, ...suggestionsRouteRepository, ...traceRouteRepository, diff --git a/x-pack/plugins/observability_solution/apm/server/routes/assets/get_assets.ts b/x-pack/plugins/observability_solution/apm/server/routes/assets/get_assets.ts new file mode 100644 index 0000000000000..0848b014eee0c --- /dev/null +++ b/x-pack/plugins/observability_solution/apm/server/routes/assets/get_assets.ts @@ -0,0 +1,65 @@ +/* + * Copyright 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 { QueryDslQueryContainer } from '@elastic/elasticsearch/lib/api/typesWithBodyKey'; +import { termQuery, kqlQuery } from '@kbn/observability-plugin/server'; +import { ASSET_TYPE, FIRST_SEEN, LAST_SEEN } from '../../../common/es_fields/assets'; +import { AssetsESClient } from '../../lib/helpers/create_es_client/create_assets_es_client/create_assets_es_clients'; + +type AssetType = 'service'; + +export function assetsRangeQuery(start: number, end: number): QueryDslQueryContainer[] { + return [ + { + range: { + [FIRST_SEEN]: { + gte: start, + }, + }, + }, + { + range: { + [LAST_SEEN]: { + lte: end, + }, + }, + }, + ]; +} + +export async function getAssets({ + assetsESClient, + start, + end, + kuery, + assetType, + size, +}: { + assetsESClient: AssetsESClient; + start: number; + end: number; + kuery: string; + assetType: AssetType; + size: number; +}) { + const response = await assetsESClient.search(`get_${assetType}_from_assets`, { + body: { + size, + track_total_hits: false, + query: { + bool: { + filter: [ + ...termQuery(ASSET_TYPE, assetType), + ...kqlQuery(kuery), + ...assetsRangeQuery(start, end), + ], + }, + }, + }, + }); + + return response; +} diff --git a/x-pack/plugins/observability_solution/apm/server/routes/assets/services/get_service_assets.ts b/x-pack/plugins/observability_solution/apm/server/routes/assets/services/get_service_assets.ts new file mode 100644 index 0000000000000..a467ffd3f71d4 --- /dev/null +++ b/x-pack/plugins/observability_solution/apm/server/routes/assets/services/get_service_assets.ts @@ -0,0 +1,72 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ +import { Logger } from '@kbn/core/server'; +import { errors } from '@elastic/elasticsearch'; +import { WrappedElasticsearchClientError } from '@kbn/observability-plugin/server'; +import { AssetsESClient } from '../../../lib/helpers/create_es_client/create_assets_es_client/create_assets_es_clients'; +import { withApmSpan } from '../../../utils/with_apm_span'; +import { ServiceAssetDocument } from './types'; +import { getAssets } from '../get_assets'; + +export const MAX_NUMBER_OF_SERVICES = 1_000; + +export async function getServiceAssets({ + assetsESClient, + start, + end, + kuery, + logger, +}: { + assetsESClient: AssetsESClient; + start: number; + end: number; + kuery: string; + logger: Logger; +}) { + return withApmSpan('get_service_assets', async () => { + try { + const response = await getAssets({ + assetsESClient, + start, + end, + kuery, + size: MAX_NUMBER_OF_SERVICES, + assetType: 'service', + }); + + return response.hits.hits.map((hit) => { + const serviceAsset = hit._source as ServiceAssetDocument; + + return { + asset: { + signalTypes: serviceAsset.asset.signalTypes, + identifyingMetadata: serviceAsset.asset.identifying_metadata, + }, + service: { + name: serviceAsset.service.name, + environment: serviceAsset.service.environment, + }, + }; + }); + } catch (error) { + // If the index does not exist, handle it gracefully + if ( + error instanceof WrappedElasticsearchClientError && + error.originalError instanceof errors.ResponseError + ) { + const type = error.originalError.body.error.type; + + if (type === 'index_not_found_exception') { + logger.error(`Asset index does not exist. Unable to fetch services.`); + return []; + } + } + + throw error; + } + }); +} diff --git a/x-pack/plugins/observability_solution/apm/server/routes/assets/services/routes.ts b/x-pack/plugins/observability_solution/apm/server/routes/assets/services/routes.ts new file mode 100644 index 0000000000000..876ff495eae17 --- /dev/null +++ b/x-pack/plugins/observability_solution/apm/server/routes/assets/services/routes.ts @@ -0,0 +1,44 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ +import * as t from 'io-ts'; +import { createApmServerRoute } from '../../apm_routes/create_apm_server_route'; +import { createAssetsESClient } from '../../../lib/helpers/create_es_client/create_assets_es_client/create_assets_es_clients'; +import { getServiceAssets } from './get_service_assets'; +import { kueryRt, rangeRt } from '../../default_api_types'; +import { AssetServicesResponse } from './types'; + +const servicesAssetsRoute = createApmServerRoute({ + endpoint: 'GET /internal/apm/assets/services', + params: t.type({ + query: t.intersection([kueryRt, rangeRt]), + }), + options: { tags: ['access:apm'] }, + async handler(resources): Promise { + const { context, params, request } = resources; + const coreContext = await context.core; + + const assetsESClient = await createAssetsESClient({ + request, + esClient: coreContext.elasticsearch.client.asCurrentUser, + }); + + const { start, end, kuery } = params.query; + + const services = await getServiceAssets({ + assetsESClient, + start, + end, + kuery, + logger: resources.logger, + }); + return { services }; + }, +}); + +export const servicesAssetsRoutesRepository = { + ...servicesAssetsRoute, +}; diff --git a/x-pack/plugins/observability_solution/apm/server/routes/assets/services/types.ts b/x-pack/plugins/observability_solution/apm/server/routes/assets/services/types.ts new file mode 100644 index 0000000000000..14fb8a012239c --- /dev/null +++ b/x-pack/plugins/observability_solution/apm/server/routes/assets/services/types.ts @@ -0,0 +1,33 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +export interface SignalTypes { + 'asset.trace'?: boolean; + 'asset.logs'?: boolean; +} + +interface ServiceItem { + environment?: string; + name: string; +} + +interface AssetItem { + signalTypes: SignalTypes; + identifyingMetadata: string[]; +} + +export interface ServiceAssetDocument { + asset: { + signalTypes: SignalTypes; + identifying_metadata: string[]; + }; + service: ServiceItem; +} + +export interface AssetServicesResponse { + services: Array<{ asset: AssetItem; service: ServiceItem }>; +} diff --git a/x-pack/test/apm_api_integration/common/config.ts b/x-pack/test/apm_api_integration/common/config.ts index c22fb0325288b..37278fa510bc9 100644 --- a/x-pack/test/apm_api_integration/common/config.ts +++ b/x-pack/test/apm_api_integration/common/config.ts @@ -11,6 +11,7 @@ import { ApmSynthtraceEsClient, ApmSynthtraceKibanaClient, LogsSynthtraceEsClient, + AssetsSynthtraceEsClient, createLogger, LogLevel, } from '@kbn/apm-synthtrace'; @@ -75,6 +76,10 @@ export interface CreateTest { logSynthtraceEsClient: ( context: InheritedFtrProviderContext ) => Promise; + synthtraceEsClient: (context: InheritedFtrProviderContext) => Promise; + assetsSynthtraceEsClient: ( + context: InheritedFtrProviderContext + ) => Promise; apmSynthtraceEsClient: (context: InheritedFtrProviderContext) => Promise; synthtraceKibanaClient: ( context: InheritedFtrProviderContext @@ -121,6 +126,12 @@ export function createTestConfig( logger: createLogger(LogLevel.info), refreshAfterIndex: true, }), + assetsSynthtraceEsClient: (context: InheritedFtrProviderContext) => + new AssetsSynthtraceEsClient({ + client: context.getService('es'), + logger: createLogger(LogLevel.info), + refreshAfterIndex: true, + }), synthtraceKibanaClient: () => synthtraceKibanaClient, apmApiClient: async (context: InheritedFtrProviderContext) => { const { username, password } = servers.kibana; diff --git a/x-pack/test/apm_api_integration/tests/asset_services/asset_services.spec.ts b/x-pack/test/apm_api_integration/tests/asset_services/asset_services.spec.ts new file mode 100644 index 0000000000000..983c2c7ec7c2f --- /dev/null +++ b/x-pack/test/apm_api_integration/tests/asset_services/asset_services.spec.ts @@ -0,0 +1,261 @@ +/* + * Copyright 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 { Readable } from 'stream'; +import { + apm, + timerange, + log, + generateShortId, + Instance, + Serializable, +} from '@kbn/apm-synthtrace-client'; +import { RecursivePartial } from '@kbn/apm-plugin/typings/common'; +import expect from '@kbn/expect'; +import moment from 'moment'; +import { + APIReturnType, + APIClientRequestParamsOf, +} from '@kbn/apm-plugin/public/services/rest/create_call_apm_api'; +import { FtrProviderContext } from '../../common/ftr_provider_context'; + +export default function ApiTest({ getService }: FtrProviderContext) { + const registry = getService('registry'); + const apmApiClient = getService('apmApiClient'); + const assetsSynthtraceClient = getService('assetsSynthtraceEsClient'); + + const start = new Date(moment().subtract(10, 'minutes').valueOf()).toISOString(); + const end = new Date(moment().valueOf()).toISOString(); + const range = timerange(start, end); + + async function getServiceAssets( + overrides?: RecursivePartial< + APIClientRequestParamsOf<'GET /internal/apm/assets/services'>['params'] + > + ) { + const response = await apmApiClient.readUser({ + endpoint: 'GET /internal/apm/assets/services', + params: { + query: { + start, + end, + kuery: '', + ...overrides?.query, + }, + }, + }); + return response; + } + + let response: { + status: number; + body: APIReturnType<'GET /internal/apm/assets/services'>; + }; + + registry.when('Asset services when data is not loaded', { config: 'basic', archives: [] }, () => { + it('handles the empty state', async () => { + response = await getServiceAssets({ query: { start, end } }); + expect(response.status).to.be(200); + expect(response.body.services.length).to.be(0); + }); + }); + + registry.when('Asset services when data is loaded', { config: 'basic', archives: [] }, () => { + before(async () => { + const transactionName = '240rpm/75% 1000ms'; + + const successfulTimestamps = range.interval('1m').rate(1); + const failedTimestamps = range.interval('1m').rate(1); + const serviceNames = ['multisignal-service', 'apm-only-service']; + + const instances = serviceNames.map((serviceName) => + apm + .service({ name: serviceName, environment: 'testing', agentName: 'nodejs' }) + .instance('instance') + ); + const instanceSpans = (instance: Instance) => { + const successfulTraceEvents = successfulTimestamps.generator((timestamp) => + instance + .transaction({ transactionName }) + .timestamp(timestamp) + .duration(1000) + .success() + .children( + instance + .span({ + spanName: 'GET apm-*/_search', + spanType: 'db', + spanSubtype: 'elasticsearch', + }) + .duration(1000) + .success() + .destination('elasticsearch') + .timestamp(timestamp), + instance + .span({ spanName: 'custom_operation', spanType: 'custom' }) + .duration(100) + .success() + .timestamp(timestamp) + ) + ); + + const failedTraceEvents = failedTimestamps.generator((timestamp) => + instance + .transaction({ transactionName }) + .timestamp(timestamp) + .duration(1000) + .failure() + .errors( + instance + .error({ + message: '[ResponseError] index_not_found_exception', + type: 'ResponseError', + }) + .timestamp(timestamp + 50) + ) + ); + + const metricsets = range + .interval('30s') + .rate(1) + .generator((timestamp) => + instance + .appMetrics({ + 'system.memory.actual.free': 800, + 'system.memory.total': 1000, + 'system.cpu.total.norm.pct': 0.6, + 'system.process.cpu.total.norm.pct': 0.7, + }) + .timestamp(timestamp) + ); + + return [...successfulTraceEvents, ...failedTraceEvents, ...metricsets]; + }; + + const logEvents = range + .interval('1m') + .rate(1) + .generator((timestamp) => { + return [ + log + .create() + .message('this is a log message') + .service('logs-only-service') + .logLevel('error') + .defaults({ + 'trace.id': generateShortId(), + 'agent.name': 'synth-agent', + }) + .timestamp(timestamp), + log + .create() + .message('this is a log message') + .service('multisignal-service') + .logLevel('error') + .defaults({ + 'trace.id': generateShortId(), + 'agent.name': 'synth-agent', + }) + .timestamp(timestamp), + ]; + }); + + function* createGeneratorFromArray(arr: Array>) { + yield* arr; + } + const traces = instances.flatMap((instance) => instanceSpans(instance)); + const tracesGenAssets = createGeneratorFromArray(traces); + + // + return await assetsSynthtraceClient.index( + Readable.from(Array.from(logEvents).concat(Array.from(tracesGenAssets))) + ); + }); + + after(async () => { + await assetsSynthtraceClient.clean(); + }); + + describe('when no additional filters are applied', () => { + before(async () => { + response = await getServiceAssets({ query: { start, end } }); + }); + + it('returns a successful response', async () => { + expect(response.status).to.be(200); + expect(response.body.services.length).to.be(3); + }); + + it('returns all services', () => { + const multisignal = response.body.services.find( + (item) => item.service.name === 'multisignal-service' + ); + + expect(multisignal?.asset.signalTypes).to.eql({ + 'asset.traces': true, + 'asset.logs': true, + }); + expect(multisignal?.service.environment).to.be('testing'); + + const apmOnly = response.body.services.find( + (item) => item.service.name === 'apm-only-service' + ); + + expect(apmOnly?.asset.signalTypes).to.eql({ 'asset.traces': true }); + expect(apmOnly?.service.environment).to.be('testing'); + + const logsOnly = response.body.services.find( + (item) => item.service.name === 'logs-only-service' + ); + + expect(logsOnly?.asset.signalTypes).to.eql({ 'asset.logs': true }); + expect(logsOnly?.service.environment).not.to.be('testing'); + }); + }); + + describe('when additional filters are applied', () => { + it('returns no services when the time range is outside the data range', async () => { + response = await getServiceAssets({ + query: { start: '2022-10-01T00:00:00.000Z', end: '2022-10-01T01:00:00.000Z' }, + }); + expect(response.status).to.be(200); + expect(response.body.services.length).to.be(0); + }); + + it('returns services when the time range is within the data range', async () => { + response = await getServiceAssets({ + query: { + start: new Date(moment().subtract(2, 'days').valueOf()).toISOString(), + end: new Date(moment().add(1, 'days').valueOf()).toISOString(), + }, + }); + + expect(response.status).to.be(200); + expect(response.body.services.length).to.be(3); + }); + + it('returns services when filtering by service.name', async () => { + response = await getServiceAssets({ + query: { start, end, kuery: 'service.name: "logs-only-*" ' }, + }); + expect(response.status).to.be(200); + const service = response.body.services[0]; + expect(service.service.name).to.be('logs-only-service'); + expect(service.asset.signalTypes['asset.logs']).to.be(true); + }); + + it('returns not services when filtering by a field that does not exist in assets', async () => { + response = await getServiceAssets({ + query: { start, end, kuery: 'transaction.name: "240rpm/75% 1000ms" ' }, + }); + + expect(response.status).to.be(200); + expect(response.body.services.length).to.be(0); + }); + }); + }); +} From 579f5bef330b557b565fafd809ad74b5754fabc4 Mon Sep 17 00:00:00 2001 From: Bena Kansara <69037875+benakansara@users.noreply.github.com> Date: Tue, 7 May 2024 17:55:37 +0200 Subject: [PATCH 33/86] [Observability] [Alert details] Fix not able to attach alert to case (#181297) Closes https://github.com/elastic/kibana/issues/178704 - Adds `_index` to `get` alert response so that it can be used to attach alert to case from alert details page. https://github.com/elastic/kibana/assets/69037875/06a1482a-0192-4f08-88f9-fdf121b7a9ca --------- Co-authored-by: kibanamachine <42973632+kibanamachine@users.noreply.github.com> --- .../public/hooks/use_fetch_alert_detail.test.ts | 3 +++ .../public/pages/alert_details/alert_details.tsx | 1 + .../alert_details/components/header_actions.test.tsx | 3 ++- .../pages/alert_details/components/header_actions.tsx | 10 ++++++++-- .../server/handlers/action/create_action_handler.ts | 2 +- .../server/handlers/action/create_action_service.ts | 2 +- .../server/handlers/action/create_queries.test.ts | 6 +++--- .../osquery/server/handlers/action/create_queries.ts | 4 ++-- .../routes/live_query/create_live_query_route.ts | 5 ++++- .../server/alert_data_client/alerts_client.ts | 5 ++++- .../server/alert_data_client/tests/get.test.ts | 2 ++ .../server/routes/get_alert_by_id.test.ts | 4 ++-- .../detection_engine/rule_response_actions/types.ts | 1 + 13 files changed, 34 insertions(+), 14 deletions(-) diff --git a/x-pack/plugins/observability_solution/observability/public/hooks/use_fetch_alert_detail.test.ts b/x-pack/plugins/observability_solution/observability/public/hooks/use_fetch_alert_detail.test.ts index e8e25fc5cbc57..a35299bfb1033 100644 --- a/x-pack/plugins/observability_solution/observability/public/hooks/use_fetch_alert_detail.test.ts +++ b/x-pack/plugins/observability_solution/observability/public/hooks/use_fetch_alert_detail.test.ts @@ -43,6 +43,7 @@ describe('useFetchAlertDetail', () => { 'event.action': 'active', 'kibana.version': '8.1.0', tags: [], + _index: 'alert-index', }; const id = '123'; @@ -115,6 +116,7 @@ describe('useFetchAlertDetail', () => { "active": true, "fields": Object { "@timestamp": "2022-01-31T18:20:57.204Z", + "_index": "alert-index", "event.action": "active", "event.kind": "signal", "kibana.alert.duration.us": 13793555000, @@ -146,6 +148,7 @@ describe('useFetchAlertDetail', () => { }, "raw": Object { "@timestamp": "2022-01-31T18:20:57.204Z", + "_index": "alert-index", "event.action": "active", "event.kind": "signal", "kibana.alert.duration.us": 13793555000, diff --git a/x-pack/plugins/observability_solution/observability/public/pages/alert_details/alert_details.tsx b/x-pack/plugins/observability_solution/observability/public/pages/alert_details/alert_details.tsx index 6e003664804ff..4dd23f30aefb4 100644 --- a/x-pack/plugins/observability_solution/observability/public/pages/alert_details/alert_details.tsx +++ b/x-pack/plugins/observability_solution/observability/public/pages/alert_details/alert_details.tsx @@ -240,6 +240,7 @@ export function AlertDetails() { > diff --git a/x-pack/plugins/observability_solution/observability/public/pages/alert_details/components/header_actions.test.tsx b/x-pack/plugins/observability_solution/observability/public/pages/alert_details/components/header_actions.test.tsx index f719a37237240..6c07c54f60454 100644 --- a/x-pack/plugins/observability_solution/observability/public/pages/alert_details/components/header_actions.test.tsx +++ b/x-pack/plugins/observability_solution/observability/public/pages/alert_details/components/header_actions.test.tsx @@ -110,6 +110,7 @@ describe('Header Actions', () => { const { getByTestId, findByTestId } = render( @@ -122,7 +123,7 @@ describe('Header Actions', () => { expect(attachments).toEqual([ { alertId: mockAlertUuid, - index: '.internal.alerts-observability.metrics.alerts-*', + index: 'alert-index', rule: { id: mockRuleId, name: mockRuleName, diff --git a/x-pack/plugins/observability_solution/observability/public/pages/alert_details/components/header_actions.tsx b/x-pack/plugins/observability_solution/observability/public/pages/alert_details/components/header_actions.tsx index 88418530eb757..3d47e34002945 100644 --- a/x-pack/plugins/observability_solution/observability/public/pages/alert_details/components/header_actions.tsx +++ b/x-pack/plugins/observability_solution/observability/public/pages/alert_details/components/header_actions.tsx @@ -35,11 +35,17 @@ import { useBulkUntrackAlerts } from '../hooks/use_bulk_untrack_alerts'; export interface HeaderActionsProps { alert: TopAlert | null; + alertIndex?: string; alertStatus?: AlertStatus; onUntrackAlert: () => void; } -export function HeaderActions({ alert, alertStatus, onUntrackAlert }: HeaderActionsProps) { +export function HeaderActions({ + alert, + alertIndex, + alertStatus, + onUntrackAlert, +}: HeaderActionsProps) { const { cases: { hooks: { useCasesAddToExistingCaseModal }, @@ -78,7 +84,7 @@ export function HeaderActions({ alert, alertStatus, onUntrackAlert }: HeaderActi ? [ { alertId: alert?.fields[ALERT_UUID] || '', - index: '.internal.alerts-observability.metrics.alerts-*', + index: alertIndex || '', rule: { id: rule.id, name: rule.name, diff --git a/x-pack/plugins/osquery/server/handlers/action/create_action_handler.ts b/x-pack/plugins/osquery/server/handlers/action/create_action_handler.ts index 42612b25a673d..2d6c47cdb8f54 100644 --- a/x-pack/plugins/osquery/server/handlers/action/create_action_handler.ts +++ b/x-pack/plugins/osquery/server/handlers/action/create_action_handler.ts @@ -29,7 +29,7 @@ interface Metadata { interface CreateActionHandlerOptions { soClient?: SavedObjectsClientContract; metadata?: Metadata; - alertData?: ParsedTechnicalFields; + alertData?: ParsedTechnicalFields & { _index: string }; error?: string; } diff --git a/x-pack/plugins/osquery/server/handlers/action/create_action_service.ts b/x-pack/plugins/osquery/server/handlers/action/create_action_service.ts index 1ec052e0bbb77..e5e54e40c382a 100644 --- a/x-pack/plugins/osquery/server/handlers/action/create_action_service.ts +++ b/x-pack/plugins/osquery/server/handlers/action/create_action_service.ts @@ -23,7 +23,7 @@ export const createActionService = (osqueryContext: OsqueryAppContext) => { const create = async ( params: CreateLiveQueryRequestBodySchema, - alertData?: ParsedTechnicalFields + alertData?: ParsedTechnicalFields & { _index: string } ) => { const error = validateLicense(licenses); diff --git a/x-pack/plugins/osquery/server/handlers/action/create_queries.test.ts b/x-pack/plugins/osquery/server/handlers/action/create_queries.test.ts index 29386c3db90db..6d6924fb8017e 100644 --- a/x-pack/plugins/osquery/server/handlers/action/create_queries.test.ts +++ b/x-pack/plugins/osquery/server/handlers/action/create_queries.test.ts @@ -60,7 +60,7 @@ describe('create queries', () => { process: { pid, }, - } as unknown as ParsedTechnicalFields, + } as unknown as ParsedTechnicalFields & { _index: string }, osqueryContext: {} as OsqueryAppContext, }); expect(queries[0].query).toBe(`SELECT * FROM processes where pid=${pid};`); @@ -77,7 +77,7 @@ describe('create queries', () => { agents: [TEST_AGENT], alertData: { process: { pid }, - } as unknown as ParsedTechnicalFields, + } as unknown as ParsedTechnicalFields & { _index: string }, osqueryContext: {} as OsqueryAppContext, }); expect(queries[0].query).toBe(`SELECT * FROM processes where pid=${pid};`); @@ -89,7 +89,7 @@ describe('create queries', () => { agents: [TEST_AGENT], alertData: { process: {}, - } as unknown as ParsedTechnicalFields, + } as unknown as ParsedTechnicalFields & { _index: string }, osqueryContext: {} as OsqueryAppContext, }); expect(queries[0].query).toBe('SELECT * FROM processes where pid={{process.pid}};'); diff --git a/x-pack/plugins/osquery/server/handlers/action/create_queries.ts b/x-pack/plugins/osquery/server/handlers/action/create_queries.ts index cf7f2563b3fbb..b71dd503db283 100644 --- a/x-pack/plugins/osquery/server/handlers/action/create_queries.ts +++ b/x-pack/plugins/osquery/server/handlers/action/create_queries.ts @@ -17,7 +17,7 @@ import { isSavedQueryPrebuilt } from '../../routes/saved_query/utils'; interface CreateDynamicQueriesParams { params: CreateLiveQueryRequestBodySchema; - alertData?: ParsedTechnicalFields; + alertData?: ParsedTechnicalFields & { _index: string }; agents: string[]; osqueryContext: OsqueryAppContext; error?: string; @@ -71,7 +71,7 @@ export const createDynamicQueries = async ({ export const replacedQueries = ( query: string | undefined, - alertData?: ParsedTechnicalFields + alertData?: ParsedTechnicalFields & { _index: string } ): { query: string | undefined; error?: string } => { if (alertData && query) { const { result, skipped } = replaceParamsQuery(query, alertData); diff --git a/x-pack/plugins/osquery/server/routes/live_query/create_live_query_route.ts b/x-pack/plugins/osquery/server/routes/live_query/create_live_query_route.ts index fff242db7475c..c93b58cf5af73 100644 --- a/x-pack/plugins/osquery/server/routes/live_query/create_live_query_route.ts +++ b/x-pack/plugins/osquery/server/routes/live_query/create_live_query_route.ts @@ -11,6 +11,7 @@ import markdown from 'remark-parse-no-trim'; import { some, filter } from 'lodash'; import deepEqual from 'fast-deep-equal'; import type { ECSMappingOrUndefined } from '@kbn/osquery-io-ts-types'; +import type { ParsedTechnicalFields } from '@kbn/rule-registry-plugin/common'; import type { CreateLiveQueryRequestBodySchema } from '../../../common/api'; import { createLiveQueryRequestBodySchema } from '../../../common/api'; import { API_VERSIONS } from '../../../common/constants'; @@ -59,7 +60,9 @@ export const createLiveQueryRoute = (router: IRouter, osqueryContext: OsqueryApp ?.getRacClientWithRequest(request); const alertData = request.body.alert_ids?.length - ? await client?.get({ id: request.body.alert_ids[0] }) + ? ((await client?.get({ id: request.body.alert_ids[0] })) as ParsedTechnicalFields & { + _index: string; + }) : undefined; if (isInvalid) { diff --git a/x-pack/plugins/rule_registry/server/alert_data_client/alerts_client.ts b/x-pack/plugins/rule_registry/server/alert_data_client/alerts_client.ts index f395ddb4b75f7..0c449d4f4126a 100644 --- a/x-pack/plugins/rule_registry/server/alert_data_client/alerts_client.ts +++ b/x-pack/plugins/rule_registry/server/alert_data_client/alerts_client.ts @@ -620,7 +620,10 @@ export class AlertsClient { } // move away from pulling data from _source in the future - return alert.hits.hits[0]._source; + return { + ...alert.hits.hits[0]._source, + _index: alert.hits.hits[0]._index, + }; } catch (error) { this.logger.error(`get threw an error: ${error}`); throw error; diff --git a/x-pack/plugins/rule_registry/server/alert_data_client/tests/get.test.ts b/x-pack/plugins/rule_registry/server/alert_data_client/tests/get.test.ts index 4185fb7e83eb6..1526e209e40c0 100644 --- a/x-pack/plugins/rule_registry/server/alert_data_client/tests/get.test.ts +++ b/x-pack/plugins/rule_registry/server/alert_data_client/tests/get.test.ts @@ -112,6 +112,7 @@ describe('get()', () => { const result = await alertsClient.get({ id: '1', index: '.alerts-observability.apm.alerts' }); expect(result).toMatchInlineSnapshot(` Object { + "_index": ".alerts-observability.apm.alerts", "kibana.alert.rule.consumer": "apm", "kibana.alert.rule.rule_type_id": "apm.error_rate", "kibana.alert.status": "active", @@ -346,6 +347,7 @@ describe('get()', () => { expect(result).toMatchInlineSnapshot(` Object { + "_index": ".alerts-observability.apm.alerts", "kibana.alert.rule.consumer": "apm", "kibana.alert.rule.rule_type_id": "apm.error_rate", "kibana.alert.status": "active", diff --git a/x-pack/plugins/rule_registry/server/routes/get_alert_by_id.test.ts b/x-pack/plugins/rule_registry/server/routes/get_alert_by_id.test.ts index 809a5167870a1..b4e94cc3b20b2 100644 --- a/x-pack/plugins/rule_registry/server/routes/get_alert_by_id.test.ts +++ b/x-pack/plugins/rule_registry/server/routes/get_alert_by_id.test.ts @@ -25,13 +25,12 @@ import { } from '@kbn/rule-data-utils'; import { BASE_RAC_ALERTS_API_PATH } from '../../common/constants'; import { ParsedTechnicalFields } from '../../common/parse_technical_fields'; -import { ParsedExperimentalFields } from '../../common/parse_experimental_fields'; import { getAlertByIdRoute } from './get_alert_by_id'; import { requestContextMock } from './__mocks__/request_context'; import { getReadRequest } from './__mocks__/request_responses'; import { requestMock, serverMock } from './__mocks__/server'; -const getMockAlert = (): ParsedTechnicalFields & ParsedExperimentalFields => ({ +const getMockAlert = (): ParsedTechnicalFields & { _index: string } => ({ [ALERT_INSTANCE_ID]: 'fake-alert-id', [ALERT_RULE_CATEGORY]: 'apm.error_rate', [ALERT_RULE_CONSUMER]: 'apm', @@ -47,6 +46,7 @@ const getMockAlert = (): ParsedTechnicalFields & ParsedExperimentalFields => ({ [SPACE_IDS]: ['fake-space-id'], [TIMESTAMP]: '2021-06-21T21:33:05.713Z', [VERSION]: '7.13.0', + _index: 'fake-alert-index', }); describe('getAlertByIdRoute', () => { diff --git a/x-pack/plugins/security_solution/server/lib/detection_engine/rule_response_actions/types.ts b/x-pack/plugins/security_solution/server/lib/detection_engine/rule_response_actions/types.ts index 9d8f4b0246129..d34d2eba9e5ab 100644 --- a/x-pack/plugins/security_solution/server/lib/detection_engine/rule_response_actions/types.ts +++ b/x-pack/plugins/security_solution/server/lib/detection_engine/rule_response_actions/types.ts @@ -11,6 +11,7 @@ import type { CommonResponseActionMethodOptions } from '../../../endpoint/servic export type Alert = ParsedTechnicalFields & { _id: string; + _index: string; agent?: AlertAgent; host?: { name: string; From 2a29bde7630fc87cd5688d308a8a0b871bb6a164 Mon Sep 17 00:00:00 2001 From: Tim Sullivan Date: Tue, 7 May 2024 08:59:44 -0700 Subject: [PATCH 34/86] [Mgmt] Remove usage of deprecated modules for mounting React, Part II (#182043) ## Summary Partially addresses https://github.com/elastic/kibana-team/issues/805 These changes come up from searching in the code and finding where certain kinds of deprecated AppEx-SharedUX modules are imported. **Reviewers: Please interact with critical paths through the UI components touched in this PR, ESPECIALLY in terms of testing dark mode and i18n.** This is the **2nd** PR to focus on code within **Kibana Management**, following https://github.com/elastic/kibana/pull/180331. image Note: this also makes inclusion of `i18n` and `analytics` dependencies consistent. Analytics is an optional dependency for the SharedUX modules, which wrap `KibanaErrorBoundaryProvider` and is designed to capture telemetry about errors that are caught in the error boundary. ### Checklist Delete any items that are not applicable to this PR. - [x] [Unit or functional tests](https://www.elastic.co/guide/en/kibana/master/development-tests.html) were updated or added to match the most common scenarios - [ ] This renders correctly on smaller devices using a responsive layout. (You can test this [in your browser](https://www.browserstack.com/guide/responsive-testing-on-local-server)) - [ ] This was checked for [cross-browser compatibility](https://www.elastic.co/support/matrix#matrix_browsers) --------- Co-authored-by: kibanamachine <42973632+kibanamachine@users.noreply.github.com> --- src/plugins/console/kibana.jsonc | 1 - .../containers/embeddable/console_wrapper.tsx | 5 +- .../contexts/services_context.mock.ts | 6 +- .../application/contexts/services_context.tsx | 7 +- .../use_send_current_request.ts | 6 +- .../console/public/application/index.tsx | 78 ++++++++----------- src/plugins/console/public/plugin.ts | 7 +- src/plugins/console/public/shared_imports.ts | 4 +- .../public/types/plugin_dependencies.ts | 7 ++ src/plugins/console/tsconfig.json | 4 +- src/plugins/dev_tools/kibana.jsonc | 4 +- src/plugins/dev_tools/public/application.tsx | 76 +++++++++--------- src/plugins/dev_tools/public/dev_tool.ts | 7 +- src/plugins/dev_tools/public/plugin.ts | 8 +- src/plugins/dev_tools/public/types.ts | 8 ++ src/plugins/dev_tools/tsconfig.json | 3 +- .../public/shared_imports.ts | 2 +- .../plugins/grokdebugger/public/render_app.js | 23 +++--- .../grokdebugger/public/shared_imports.ts | 4 +- x-pack/plugins/grokdebugger/tsconfig.json | 1 + .../helpers/setup_environment.tsx | 24 +++--- .../use_datastreams_rollover.test.tsx | 16 ++-- .../use_datastreams_rollover.tsx | 10 ++- .../component_templates_context.tsx | 9 ++- .../public/application/index.tsx | 13 +++- .../plugins/index_management/public/types.ts | 13 ++++ x-pack/plugins/index_management/tsconfig.json | 3 +- .../ingest_pipelines/public/shared_imports.ts | 7 +- x-pack/plugins/ingest_pipelines/tsconfig.json | 3 +- .../painless_lab/public/application/index.tsx | 34 ++++---- x-pack/plugins/painless_lab/public/plugin.tsx | 7 +- .../painless_lab/public/shared_imports.ts | 4 +- x-pack/plugins/painless_lab/public/types.ts | 7 ++ x-pack/plugins/painless_lab/tsconfig.json | 1 + .../runtime_fields/public/load_editor.tsx | 2 +- .../runtime_fields/public/plugin.test.ts | 4 +- .../runtime_fields/public/shared_imports.ts | 4 +- x-pack/plugins/runtime_fields/tsconfig.json | 1 + x-pack/plugins/searchprofiler/kibana.jsonc | 3 +- .../public/application/index.tsx | 28 +++---- .../plugins/searchprofiler/public/plugin.ts | 7 +- .../searchprofiler/public/shared_imports.ts | 2 +- x-pack/plugins/searchprofiler/public/types.ts | 7 ++ x-pack/plugins/searchprofiler/tsconfig.json | 2 +- 44 files changed, 256 insertions(+), 216 deletions(-) diff --git a/src/plugins/console/kibana.jsonc b/src/plugins/console/kibana.jsonc index 2dc047ebb661d..ae0cac514b67d 100644 --- a/src/plugins/console/kibana.jsonc +++ b/src/plugins/console/kibana.jsonc @@ -20,7 +20,6 @@ ], "requiredBundles": [ "esUiShared", - "kibanaReact", "kibanaUtils" ] } diff --git a/src/plugins/console/public/application/containers/embeddable/console_wrapper.tsx b/src/plugins/console/public/application/containers/embeddable/console_wrapper.tsx index 53c75706b9da0..db3624db41f68 100644 --- a/src/plugins/console/public/application/containers/embeddable/console_wrapper.tsx +++ b/src/plugins/console/public/application/containers/embeddable/console_wrapper.tsx @@ -112,6 +112,8 @@ interface ConsoleWrapperProps export const ConsoleWrapper = (props: ConsoleWrapperProps) => { const [dependencies, setDependencies] = useState(null); const { core, usageCollection, onKeyDown, isMonacoEnabled } = props; + const { analytics, i18n, theme } = core; + const startServices = { analytics, i18n, theme }; useEffect(() => { if (dependencies === null) { @@ -142,7 +144,6 @@ export const ConsoleWrapper = (props: ConsoleWrapperProps) => { objectStorageClient, settings, storage, - theme$, trackUiMetric, } = dependencies; return ( @@ -162,10 +163,10 @@ export const ConsoleWrapper = (props: ConsoleWrapperProps) => { http, autocompleteInfo, }, - theme$, config: { isMonacoEnabled, }, + startServices, }} > diff --git a/src/plugins/console/public/application/contexts/services_context.mock.ts b/src/plugins/console/public/application/contexts/services_context.mock.ts index f02a6df5ff996..fc22676b9f72d 100644 --- a/src/plugins/console/public/application/contexts/services_context.mock.ts +++ b/src/plugins/console/public/application/contexts/services_context.mock.ts @@ -7,9 +7,9 @@ */ import { + coreMock, notificationServiceMock, httpServiceMock, - themeServiceMock, docLinksServiceMock, } from '@kbn/core/public/mocks'; @@ -22,6 +22,8 @@ import { createApi, createEsHostService } from '../lib'; import { ContextValue } from './services_context'; +const coreStart = coreMock.createStart(); + export const serviceContextMock = { create: (): ContextValue => { const storage = new StorageMock({} as unknown as Storage, 'test'); @@ -42,11 +44,11 @@ export const serviceContextMock = { autocompleteInfo: new AutocompleteInfoMock(), }, docLinkVersion: 'NA', - theme$: themeServiceMock.create().start().theme$, docLinks: docLinksServiceMock.createStartContract().links, config: { isMonacoEnabled: false, }, + startServices: coreStart, }; }, }; diff --git a/src/plugins/console/public/application/contexts/services_context.tsx b/src/plugins/console/public/application/contexts/services_context.tsx index d2c91e7c73604..49bc4d4afec9b 100644 --- a/src/plugins/console/public/application/contexts/services_context.tsx +++ b/src/plugins/console/public/application/contexts/services_context.tsx @@ -7,12 +7,11 @@ */ import React, { createContext, useContext, useEffect } from 'react'; -import { Observable } from 'rxjs'; -import type { NotificationsSetup, CoreTheme, DocLinksStart, HttpSetup } from '@kbn/core/public'; +import type { NotificationsSetup, DocLinksStart, HttpSetup } from '@kbn/core/public'; import type { AutocompleteInfo, History, Settings, Storage } from '../../services'; import { ObjectStorageClient } from '../../../common/types'; -import { MetricsTracker } from '../../types'; +import { ConsoleStartServices, MetricsTracker } from '../../types'; import { EsHostService } from '../lib'; interface ContextServices { @@ -30,11 +29,11 @@ interface ContextServices { export interface ContextValue { services: ContextServices; docLinkVersion: string; - theme$: Observable; docLinks: DocLinksStart['links']; config?: { isMonacoEnabled: boolean; }; + startServices: ConsoleStartServices; } interface ContextProps { diff --git a/src/plugins/console/public/application/hooks/use_send_current_request/use_send_current_request.ts b/src/plugins/console/public/application/hooks/use_send_current_request/use_send_current_request.ts index 28d875c246ca3..69f9042edd76d 100644 --- a/src/plugins/console/public/application/hooks/use_send_current_request/use_send_current_request.ts +++ b/src/plugins/console/public/application/hooks/use_send_current_request/use_send_current_request.ts @@ -23,7 +23,7 @@ import { DEFAULT_VARIABLES } from '../../../../common/constants'; export const useSendCurrentRequest = () => { const { services: { history, settings, notifications, trackUiMetric, http, autocompleteInfo, storage }, - theme$, + startServices, } = useServicesContext(); const dispatch = useRequestActionContext(); @@ -88,7 +88,7 @@ export const useSendCurrentRequest = () => { notifications.toasts.remove(toast); }, }), - { theme$ } + startServices ), }); } else { @@ -140,7 +140,7 @@ export const useSendCurrentRequest = () => { notifications.toasts, trackUiMetric, history, - theme$, autocompleteInfo, + startServices, ]); }; diff --git a/src/plugins/console/public/application/index.tsx b/src/plugins/console/public/application/index.tsx index e211e1557476a..a2d8cfb0cab18 100644 --- a/src/plugins/console/public/application/index.tsx +++ b/src/plugins/console/public/application/index.tsx @@ -8,17 +8,10 @@ import React from 'react'; import { render, unmountComponentAtNode } from 'react-dom'; -import { Observable } from 'rxjs'; -import { - HttpSetup, - NotificationsSetup, - I18nStart, - CoreTheme, - DocLinksStart, -} from '@kbn/core/public'; -import { KibanaThemeProvider } from '@kbn/react-kibana-context-theme'; +import { HttpSetup, NotificationsSetup, DocLinksStart } from '@kbn/core/public'; import { UsageCollectionSetup } from '@kbn/usage-collection-plugin/public'; +import { KibanaRenderContextProvider } from '@kbn/react-kibana-context-render'; import { createStorage, createHistory, @@ -32,31 +25,30 @@ import * as localStorageObjectClient from '../lib/local_storage_object_client'; import { Main } from './containers'; import { ServicesContextProvider, EditorContextProvider, RequestContextProvider } from './contexts'; import { createApi, createEsHostService } from './lib'; +import { ConsoleStartServices } from '../types'; export interface BootDependencies { http: HttpSetup; docLinkVersion: string; - I18nContext: I18nStart['Context']; notifications: NotificationsSetup; usageCollection?: UsageCollectionSetup; element: HTMLElement; - theme$: Observable; docLinks: DocLinksStart['links']; autocompleteInfo: AutocompleteInfo; isMonacoEnabled: boolean; + startServices: ConsoleStartServices; } export async function renderApp({ - I18nContext, notifications, docLinkVersion, usageCollection, element, http, - theme$, docLinks, autocompleteInfo, isMonacoEnabled, + startServices, }: BootDependencies) { const trackUiMetric = createUsageTracker(usageCollection); trackUiMetric.load('opened_app'); @@ -76,37 +68,35 @@ export async function renderApp({ autocompleteInfo.mapping.setup(http, settings); render( - - - - - -
- - - - - , + + + + +
+ + + + , element ); diff --git a/src/plugins/console/public/plugin.ts b/src/plugins/console/public/plugin.ts index 54d8d1db97bc7..f1cae7206ea4d 100644 --- a/src/plugins/console/public/plugin.ts +++ b/src/plugins/console/public/plugin.ts @@ -79,12 +79,12 @@ export class ConsoleUIPlugin defaultMessage: 'Console', }), enableRouting: false, - mount: async ({ element, theme$ }) => { + mount: async ({ element }) => { const [core] = await getStartServices(); const { - i18n: { Context: I18nContext }, docLinks: { DOC_LINK_VERSION, links }, + ...startServices } = core; const { renderApp } = await import('./application'); @@ -93,13 +93,12 @@ export class ConsoleUIPlugin http, docLinkVersion: DOC_LINK_VERSION, docLinks: links, - I18nContext, notifications, usageCollection, element, - theme$, autocompleteInfo: this.autocompleteInfo, isMonacoEnabled, + startServices, }); }, }); diff --git a/src/plugins/console/public/shared_imports.ts b/src/plugins/console/public/shared_imports.ts index 95b96b565e27f..779a2b9ee1c0a 100644 --- a/src/plugins/console/public/shared_imports.ts +++ b/src/plugins/console/public/shared_imports.ts @@ -12,4 +12,6 @@ const { collapseLiteralStrings, expandLiteralStrings } = XJson; export { sendRequest, collapseLiteralStrings, expandLiteralStrings }; -export { KibanaThemeProvider, toMountPoint } from '@kbn/kibana-react-plugin/public'; +export { KibanaThemeProvider } from '@kbn/react-kibana-context-theme'; + +export { toMountPoint } from '@kbn/react-kibana-mount'; diff --git a/src/plugins/console/public/types/plugin_dependencies.ts b/src/plugins/console/public/types/plugin_dependencies.ts index 63446135e7f3c..39b82939619ec 100644 --- a/src/plugins/console/public/types/plugin_dependencies.ts +++ b/src/plugins/console/public/types/plugin_dependencies.ts @@ -7,6 +7,7 @@ */ import type { FC } from 'react'; +import type { AnalyticsServiceStart, I18nStart, ThemeServiceStart } from '@kbn/core/public'; import { HomePublicPluginSetup, HomePublicPluginStart } from '@kbn/home-plugin/public'; import { DevToolsSetup } from '@kbn/dev-tools-plugin/public'; import { UsageCollectionSetup, UsageCollectionStart } from '@kbn/usage-collection-plugin/public'; @@ -15,6 +16,12 @@ import { SharePluginSetup, SharePluginStart, LocatorPublic } from '@kbn/share-pl import { ConsoleUILocatorParams } from './locator'; import { EmbeddedConsoleView } from './embeddable_console'; +export interface ConsoleStartServices { + analytics: Pick; + i18n: I18nStart; + theme: Pick; +} + export interface AppSetupUIPluginDependencies { home?: HomePublicPluginSetup; devTools: DevToolsSetup; diff --git a/src/plugins/console/tsconfig.json b/src/plugins/console/tsconfig.json index 06adc91f994db..88b6216cbde66 100644 --- a/src/plugins/console/tsconfig.json +++ b/src/plugins/console/tsconfig.json @@ -9,7 +9,6 @@ "@kbn/dev-tools-plugin", "@kbn/es-ui-shared-plugin", "@kbn/home-plugin", - "@kbn/kibana-react-plugin", "@kbn/kibana-utils-plugin", "@kbn/share-plugin", "@kbn/usage-collection-plugin", @@ -31,7 +30,8 @@ "@kbn/monaco", "@kbn/cloud-plugin", "@kbn/core-notifications-browser", - "@kbn/react-kibana-context-render" + "@kbn/react-kibana-context-render", + "@kbn/react-kibana-mount" ], "exclude": [ "target/**/*", diff --git a/src/plugins/dev_tools/kibana.jsonc b/src/plugins/dev_tools/kibana.jsonc index 9665ca223ca1d..c269b74918619 100644 --- a/src/plugins/dev_tools/kibana.jsonc +++ b/src/plugins/dev_tools/kibana.jsonc @@ -9,8 +9,6 @@ "requiredPlugins": [ "urlForwarding" ], - "requiredBundles": [ - "kibanaReact" - ] + "requiredBundles": [] } } diff --git a/src/plugins/dev_tools/public/application.tsx b/src/plugins/dev_tools/public/application.tsx index 3beb133ab3f5d..840a99c06cf19 100644 --- a/src/plugins/dev_tools/public/application.tsx +++ b/src/plugins/dev_tools/public/application.tsx @@ -7,12 +7,10 @@ */ import React, { useEffect, useRef } from 'react'; -import { Observable } from 'rxjs'; import ReactDOM from 'react-dom'; import { Redirect, RouteComponentProps } from 'react-router-dom'; import { HashRouter as Router, Routes, Route } from '@kbn/shared-ux-router'; import { EuiTab, EuiTabs, EuiToolTip, EuiBetaBadge } from '@elastic/eui'; -import { I18nProvider } from '@kbn/i18n-react'; import { i18n } from '@kbn/i18n'; import { euiThemeVars } from '@kbn/ui-theme'; @@ -20,13 +18,13 @@ import type { ApplicationStart, ChromeStart, ScopedHistory, - CoreTheme, ExecutionContextStart, } from '@kbn/core/public'; -import { KibanaThemeProvider } from '@kbn/kibana-react-plugin/public'; +import { KibanaRenderContextProvider } from '@kbn/react-kibana-context-render'; import type { DocTitleService, BreadcrumbService } from './services'; import { DevToolApp } from './dev_tool'; +import { DevToolsStartServices } from './types'; export interface AppServices { docTitleService: DocTitleService; @@ -38,9 +36,9 @@ interface DevToolsWrapperProps { devTools: readonly DevToolApp[]; activeDevTool: DevToolApp; updateRoute: (newRoute: string) => void; - theme$: Observable; appServices: AppServices; location: RouteComponentProps['location']; + startServices: DevToolsStartServices; } interface MountedDevToolDescriptor { @@ -53,9 +51,9 @@ function DevToolsWrapper({ devTools, activeDevTool, updateRoute, - theme$, appServices, location, + startServices, }: DevToolsWrapperProps) { const { docTitleService, breadcrumbService } = appServices; const mountedTool = useRef(null); @@ -123,7 +121,7 @@ function DevToolsWrapper({ const params = { element, location, - theme$, + ...startServices, }; const unmountHandler = await activeDevTool.mount(params); @@ -169,9 +167,9 @@ export function renderApp( application: ApplicationStart, chrome: ChromeStart, history: ScopedHistory, - theme$: Observable, devTools: readonly DevToolApp[], - appServices: AppServices + appServices: AppServices, + startServices: DevToolsStartServices ) { if (redirectOnMissingCapabilities(application)) { return () => {}; @@ -180,37 +178,35 @@ export function renderApp( setBadge(application, chrome); ReactDOM.render( - - - - - {devTools - // Only create routes for devtools that are not disabled - .filter((devTool) => !devTool.isDisabled()) - .map((devTool) => ( - ( - - )} - /> - ))} - - - - - - - , + + + + {devTools + // Only create routes for devtools that are not disabled + .filter((devTool) => !devTool.isDisabled()) + .map((devTool) => ( + ( + + )} + /> + ))} + + + + + + , element ); diff --git a/src/plugins/dev_tools/public/dev_tool.ts b/src/plugins/dev_tools/public/dev_tool.ts index 53f79ad686c43..4a33092f43334 100644 --- a/src/plugins/dev_tools/public/dev_tool.ts +++ b/src/plugins/dev_tools/public/dev_tool.ts @@ -6,10 +6,10 @@ * Side Public License, v 1. */ -import { Observable } from 'rxjs'; import { RouteComponentProps } from 'react-router-dom'; -import { AppUnmount, CoreTheme } from '@kbn/core/public'; +import { AppUnmount } from '@kbn/core/public'; +import { DevToolsStartServices } from './types'; /** * Descriptor for a dev tool. A dev tool works similar to an application @@ -19,10 +19,9 @@ export type CreateDevToolArgs = Omit; } export class DevToolApp { diff --git a/src/plugins/dev_tools/public/plugin.ts b/src/plugins/dev_tools/public/plugin.ts index 8b50538af2d4f..de007e570be6a 100644 --- a/src/plugins/dev_tools/public/plugin.ts +++ b/src/plugins/dev_tools/public/plugin.ts @@ -60,11 +60,13 @@ export class DevToolsPlugin implements Plugin { order: 9010, category: DEFAULT_APP_CATEGORIES.management, mount: async (params: AppMountParameters) => { - const { element, history, theme$ } = params; + const { element, history } = params; element.classList.add('devAppWrapper'); const [core] = await getStartServices(); const { application, chrome, executionContext } = core; + const { analytics, i18n: i18nStart, theme } = core; + const startServices = { analytics, i18n: i18nStart, theme }; this.docTitleService.setup(chrome.docTitle.change); this.breadcrumbService.setup(chrome.setBreadcrumbs); @@ -81,9 +83,9 @@ export class DevToolsPlugin implements Plugin { application, chrome, history, - theme$, this.getSortedDevTools(), - appServices + appServices, + startServices ); }, }); diff --git a/src/plugins/dev_tools/public/types.ts b/src/plugins/dev_tools/public/types.ts index 972afe5763205..7432b8fb5dc49 100644 --- a/src/plugins/dev_tools/public/types.ts +++ b/src/plugins/dev_tools/public/types.ts @@ -6,8 +6,16 @@ * Side Public License, v 1. */ +import { AnalyticsServiceStart, I18nStart, ThemeServiceStart } from '@kbn/core/public'; + export interface ConfigSchema { deeplinks: { navLinkStatus: 'default' | 'visible'; }; } + +export interface DevToolsStartServices { + analytics: Pick; + i18n: I18nStart; + theme: Pick; +} diff --git a/src/plugins/dev_tools/tsconfig.json b/src/plugins/dev_tools/tsconfig.json index 13e30f92c8d6e..102e44488a7eb 100644 --- a/src/plugins/dev_tools/tsconfig.json +++ b/src/plugins/dev_tools/tsconfig.json @@ -8,14 +8,13 @@ "@kbn/core", "@kbn/url-forwarding-plugin", "@kbn/management-plugin", - "@kbn/i18n-react", "@kbn/i18n", "@kbn/ui-theme", - "@kbn/kibana-react-plugin", "@kbn/shared-ux-router", "@kbn/deeplinks-devtools", "@kbn/config-schema", "@kbn/core-plugins-server", + "@kbn/react-kibana-context-render", ], "exclude": [ "target/**/*", diff --git a/x-pack/plugins/cross_cluster_replication/public/shared_imports.ts b/x-pack/plugins/cross_cluster_replication/public/shared_imports.ts index 6a6f968627a65..f96a1d4804746 100644 --- a/x-pack/plugins/cross_cluster_replication/public/shared_imports.ts +++ b/x-pack/plugins/cross_cluster_replication/public/shared_imports.ts @@ -13,7 +13,7 @@ export { PageLoading, } from '@kbn/es-ui-shared-plugin/public'; -export { KibanaThemeProvider, useExecutionContext } from '@kbn/kibana-react-plugin/public'; +export { useExecutionContext } from '@kbn/kibana-react-plugin/public'; export { KibanaRenderContextProvider } from '@kbn/react-kibana-context-render'; diff --git a/x-pack/plugins/grokdebugger/public/render_app.js b/x-pack/plugins/grokdebugger/public/render_app.js index bcb2560a3c0b7..43af7b9e6213a 100644 --- a/x-pack/plugins/grokdebugger/public/render_app.js +++ b/x-pack/plugins/grokdebugger/public/render_app.js @@ -7,28 +7,23 @@ import React from 'react'; import { render, unmountComponentAtNode } from 'react-dom'; -import { I18nProvider } from '@kbn/i18n-react'; -import { KibanaContextProvider, KibanaThemeProvider } from './shared_imports'; +import { KibanaContextProvider, KibanaRenderContextProvider } from './shared_imports'; import { GrokDebugger } from './components/grok_debugger'; import { GrokdebuggerService } from './services/grokdebugger/grokdebugger_service'; import { InactiveLicenseSlate } from './components/inactive_license'; export function renderApp(license, element, coreStart, theme$) { const content = license.isActive ? ( - - - - - - - + + + + + ) : ( - - - - - + + + ); render(content, element); diff --git a/x-pack/plugins/grokdebugger/public/shared_imports.ts b/x-pack/plugins/grokdebugger/public/shared_imports.ts index 0bfbb3e05f933..7496817e21ed6 100644 --- a/x-pack/plugins/grokdebugger/public/shared_imports.ts +++ b/x-pack/plugins/grokdebugger/public/shared_imports.ts @@ -5,4 +5,6 @@ * 2.0. */ -export { KibanaContextProvider, KibanaThemeProvider } from '@kbn/kibana-react-plugin/public'; +export { KibanaContextProvider } from '@kbn/kibana-react-plugin/public'; + +export { KibanaRenderContextProvider } from '@kbn/react-kibana-context-render'; diff --git a/x-pack/plugins/grokdebugger/tsconfig.json b/x-pack/plugins/grokdebugger/tsconfig.json index b80579da2cea7..f2df02467d71c 100644 --- a/x-pack/plugins/grokdebugger/tsconfig.json +++ b/x-pack/plugins/grokdebugger/tsconfig.json @@ -19,6 +19,7 @@ "@kbn/i18n-react", "@kbn/config-schema", "@kbn/code-editor", + "@kbn/react-kibana-context-render", ], "exclude": [ "target/**/*", diff --git a/x-pack/plugins/index_management/public/application/components/component_templates/__jest__/client_integration/helpers/setup_environment.tsx b/x-pack/plugins/index_management/public/application/components/component_templates/__jest__/client_integration/helpers/setup_environment.tsx index 826ef0b103447..ee3c359a8195a 100644 --- a/x-pack/plugins/index_management/public/application/components/component_templates/__jest__/client_integration/helpers/setup_environment.tsx +++ b/x-pack/plugins/index_management/public/application/components/component_templates/__jest__/client_integration/helpers/setup_environment.tsx @@ -29,16 +29,20 @@ const appDependencies = { plugins: { ml: {} as any }, } as any; -export const componentTemplatesDependencies = (httpSetup: HttpSetup, coreStart?: CoreStart) => ({ - overlays: coreStart?.overlays ?? coreMock.createStart().overlays, - httpClient: httpSetup, - apiBasePath: API_BASE_PATH, - trackMetric: () => {}, - docLinks: docLinksServiceMock.createStartContract(), - toasts: notificationServiceMock.createSetupContract().toasts, - getUrlForApp: applicationServiceMock.createStartContract().getUrlForApp, - executionContext: executionContextServiceMock.createInternalStartContract(), -}); +export const componentTemplatesDependencies = (httpSetup: HttpSetup, coreStart?: CoreStart) => { + const coreMockStart = coreMock.createStart(); + return { + overlays: coreStart?.overlays ?? coreMockStart.overlays, + httpClient: httpSetup, + apiBasePath: API_BASE_PATH, + trackMetric: () => {}, + docLinks: docLinksServiceMock.createStartContract(), + toasts: notificationServiceMock.createSetupContract().toasts, + getUrlForApp: applicationServiceMock.createStartContract().getUrlForApp, + executionContext: executionContextServiceMock.createInternalStartContract(), + startServices: coreStart ?? coreMockStart, + }; +}; export const setupEnvironment = () => { breadcrumbService.setup(() => undefined); diff --git a/x-pack/plugins/index_management/public/application/components/component_templates/component_template_wizard/component_template_datastreams_rollover/use_datastreams_rollover.test.tsx b/x-pack/plugins/index_management/public/application/components/component_templates/component_template_wizard/component_template_datastreams_rollover/use_datastreams_rollover.test.tsx index 5a16c8837dc3f..903a9187a7335 100644 --- a/x-pack/plugins/index_management/public/application/components/component_templates/component_template_wizard/component_template_datastreams_rollover/use_datastreams_rollover.test.tsx +++ b/x-pack/plugins/index_management/public/application/components/component_templates/component_template_wizard/component_template_datastreams_rollover/use_datastreams_rollover.test.tsx @@ -20,7 +20,9 @@ describe('useStepFromQueryString', () => { getComponentTemplateDatastreams: jest.fn(), postDataStreamMappingsFromTemplate: jest.fn(), }, - overlays: { openModal: jest.fn() } as any, + startServices: { + overlays: { openModal: jest.fn() }, + }, } as any); }); it('should do nothing if there no impacted data_streams', async () => { @@ -38,7 +40,7 @@ describe('useStepFromQueryString', () => { }); it('should try to update mappings if there is impacted data_streams', async () => { - const { api, overlays } = jest.mocked(useComponentTemplatesContext()); + const { api, startServices } = jest.mocked(useComponentTemplatesContext()); api.getComponentTemplateDatastreams.mockResolvedValue({ data: { data_streams: ['logs-test.data-default'] }, @@ -51,7 +53,7 @@ describe('useStepFromQueryString', () => { }); jest - .mocked(useComponentTemplatesContext().overlays.openModal) + .mocked(useComponentTemplatesContext().startServices.overlays.openModal) .mockReturnValue({ onClose: jest.fn() } as any); const { @@ -63,11 +65,11 @@ describe('useStepFromQueryString', () => { await showDatastreamRolloverModal('logs-test.data@custom'); expect(api.postDataStreamMappingsFromTemplate).toBeCalledTimes(1); - expect(overlays.openModal).not.toBeCalled(); + expect(startServices.overlays.openModal).not.toBeCalled(); }); it('should show datastream rollover modal if there is an error when updating mappings', async () => { - const { api, overlays } = jest.mocked(useComponentTemplatesContext()); + const { api, startServices } = jest.mocked(useComponentTemplatesContext()); api.getComponentTemplateDatastreams.mockResolvedValue({ data: { data_streams: ['logs-test.data-default'] }, @@ -80,7 +82,7 @@ describe('useStepFromQueryString', () => { }); jest - .mocked(useComponentTemplatesContext().overlays.openModal) + .mocked(useComponentTemplatesContext().startServices.overlays.openModal) .mockReturnValue({ onClose: jest.fn() } as any); const { @@ -90,6 +92,6 @@ describe('useStepFromQueryString', () => { } = renderHook(() => useDatastreamsRollover()); await showDatastreamRolloverModal('logs-test.data@custom'); - expect(overlays.openModal).toBeCalled(); + expect(startServices.overlays.openModal).toBeCalled(); }); }); diff --git a/x-pack/plugins/index_management/public/application/components/component_templates/component_template_wizard/component_template_datastreams_rollover/use_datastreams_rollover.tsx b/x-pack/plugins/index_management/public/application/components/component_templates/component_template_wizard/component_template_datastreams_rollover/use_datastreams_rollover.tsx index ebb85f2bfa3f2..6ea2e7c1b114d 100644 --- a/x-pack/plugins/index_management/public/application/components/component_templates/component_template_wizard/component_template_datastreams_rollover/use_datastreams_rollover.tsx +++ b/x-pack/plugins/index_management/public/application/components/component_templates/component_template_wizard/component_template_datastreams_rollover/use_datastreams_rollover.tsx @@ -6,7 +6,7 @@ */ import React, { useCallback } from 'react'; -import { toMountPoint } from '@kbn/kibana-react-plugin/public'; +import { toMountPoint } from '@kbn/react-kibana-mount'; import { useComponentTemplatesContext } from '../../component_templates_context'; import { MappingsDatastreamRolloverModal } from './mappings_datastreams_rollover_modal'; @@ -14,7 +14,7 @@ import { MappingsDatastreamRolloverModal } from './mappings_datastreams_rollover export const test = {}; export function useDatastreamsRollover() { - const { api, overlays } = useComponentTemplatesContext(); + const { api, startServices } = useComponentTemplatesContext(); const showDatastreamRolloverModal = useCallback( async (componentTemplateName: string) => { @@ -38,6 +38,7 @@ export function useDatastreamsRollover() { } if (dataStreamsToRollover.length) { + const { overlays, ...mountServices } = startServices; const ref = overlays.openModal( toMountPoint( { ref.close(); }} - /> + />, + mountServices ) ); await ref.onClose; } }, - [api, overlays] + [api, startServices] ); return { diff --git a/x-pack/plugins/index_management/public/application/components/component_templates/component_templates_context.tsx b/x-pack/plugins/index_management/public/application/components/component_templates/component_templates_context.tsx index ade11c3a1b600..bf42735068db5 100644 --- a/x-pack/plugins/index_management/public/application/components/component_templates/component_templates_context.tsx +++ b/x-pack/plugins/index_management/public/application/components/component_templates/component_templates_context.tsx @@ -15,6 +15,7 @@ import { CoreStart, ExecutionContextStart, } from '@kbn/core/public'; +import { IndexManagementStartServices } from '../../../types'; import { getApi, getUseRequest, getSendRequest, getDocumentation } from './lib'; const ComponentTemplatesContext = createContext(undefined); @@ -27,7 +28,7 @@ interface Props { toasts: NotificationsSetup['toasts']; getUrlForApp: CoreStart['application']['getUrlForApp']; executionContext: ExecutionContextStart; - overlays: CoreStart['overlays']; + startServices: IndexManagementStartServices; } interface Context { @@ -37,9 +38,9 @@ interface Context { documentation: ReturnType; trackMetric: (type: UiCounterMetricType, eventName: string) => void; toasts: NotificationsSetup['toasts']; - overlays: CoreStart['overlays']; getUrlForApp: CoreStart['application']['getUrlForApp']; executionContext: ExecutionContextStart; + startServices: IndexManagementStartServices; } export const ComponentTemplatesProvider = ({ @@ -50,7 +51,6 @@ export const ComponentTemplatesProvider = ({ children: React.ReactNode; }) => { const { - overlays, httpClient, apiBasePath, trackMetric, @@ -58,6 +58,7 @@ export const ComponentTemplatesProvider = ({ toasts, getUrlForApp, executionContext, + startServices, } = value; const useRequest = getUseRequest(httpClient); @@ -69,7 +70,6 @@ export const ComponentTemplatesProvider = ({ return ( {children} diff --git a/x-pack/plugins/index_management/public/application/index.tsx b/x-pack/plugins/index_management/public/application/index.tsx index 43dd90e5bc1e8..48a19f58bbfa5 100644 --- a/x-pack/plugins/index_management/public/application/index.tsx +++ b/x-pack/plugins/index_management/public/application/index.tsx @@ -38,7 +38,17 @@ export const IndexManagementAppContext: React.FC core, dependencies, }) => { - const { docLinks, notifications, application, executionContext, overlays, theme } = core; + const { + docLinks, + notifications, + application, + executionContext, + overlays, + analytics, + i18n, + theme, + } = core; + const startServices = { analytics, i18n, overlays, theme }; const { services, setBreadcrumbs, uiSettings, settings, kibanaVersion } = dependencies; // theme is required by the CodeEditor component used to edit runtime field Painless scripts. @@ -63,6 +73,7 @@ export const IndexManagementAppContext: React.FC setBreadcrumbs, getUrlForApp: application.getUrlForApp, executionContext, + startServices, }; return ( diff --git a/x-pack/plugins/index_management/public/types.ts b/x-pack/plugins/index_management/public/types.ts index 6cbca148c4795..e6a3b9a611026 100644 --- a/x-pack/plugins/index_management/public/types.ts +++ b/x-pack/plugins/index_management/public/types.ts @@ -5,6 +5,12 @@ * 2.0. */ +import { + AnalyticsServiceStart, + I18nStart, + OverlayStart, + ThemeServiceStart, +} from '@kbn/core/public'; import { CloudSetup } from '@kbn/cloud-plugin/public'; import { ConsolePluginStart } from '@kbn/console-plugin/public'; import { ManagementSetup } from '@kbn/management-plugin/public'; @@ -12,6 +18,13 @@ import { MlPluginStart } from '@kbn/ml-plugin/public'; import { SharePluginSetup, SharePluginStart } from '@kbn/share-plugin/public'; import { UsageCollectionSetup } from '@kbn/usage-collection-plugin/public'; +export interface IndexManagementStartServices { + analytics: Pick; + i18n: I18nStart; + overlays: OverlayStart; + theme: Pick; +} + export interface SetupDependencies { fleet?: unknown; usageCollection: UsageCollectionSetup; diff --git a/x-pack/plugins/index_management/tsconfig.json b/x-pack/plugins/index_management/tsconfig.json index 0707ea02a0fe8..202a755a8b21d 100644 --- a/x-pack/plugins/index_management/tsconfig.json +++ b/x-pack/plugins/index_management/tsconfig.json @@ -50,7 +50,8 @@ "@kbn/inference_integration_flyout", "@kbn/ml-plugin", "@kbn/ml-error-utils", - "@kbn/react-kibana-context-render" + "@kbn/react-kibana-context-render", + "@kbn/react-kibana-mount" ], "exclude": ["target/**/*"] } diff --git a/x-pack/plugins/ingest_pipelines/public/shared_imports.ts b/x-pack/plugins/ingest_pipelines/public/shared_imports.ts index 5880bff1d3dae..420da38be6c54 100644 --- a/x-pack/plugins/ingest_pipelines/public/shared_imports.ts +++ b/x-pack/plugins/ingest_pipelines/public/shared_imports.ts @@ -82,11 +82,8 @@ export { export { isJSON, isEmptyString } from '@kbn/es-ui-shared-plugin/static/validators/string'; -export { - KibanaContextProvider, - KibanaThemeProvider, - useExecutionContext, -} from '@kbn/kibana-react-plugin/public'; +export { KibanaContextProvider, useExecutionContext } from '@kbn/kibana-react-plugin/public'; +export { KibanaThemeProvider } from '@kbn/react-kibana-context-theme'; export { KibanaRenderContextProvider } from '@kbn/react-kibana-context-render'; diff --git a/x-pack/plugins/ingest_pipelines/tsconfig.json b/x-pack/plugins/ingest_pipelines/tsconfig.json index 71f0cb792a92c..8d14d5f11412d 100644 --- a/x-pack/plugins/ingest_pipelines/tsconfig.json +++ b/x-pack/plugins/ingest_pipelines/tsconfig.json @@ -32,7 +32,8 @@ "@kbn/core-ui-settings-browser", "@kbn/code-editor", "@kbn/react-kibana-context-render", - "@kbn/console-plugin" + "@kbn/console-plugin", + "@kbn/react-kibana-context-theme" ], "exclude": [ "target/**/*", diff --git a/x-pack/plugins/painless_lab/public/application/index.tsx b/x-pack/plugins/painless_lab/public/application/index.tsx index a4e795b2d7839..251f797ee0d86 100644 --- a/x-pack/plugins/painless_lab/public/application/index.tsx +++ b/x-pack/plugins/painless_lab/public/application/index.tsx @@ -7,33 +7,27 @@ import React from 'react'; import { render, unmountComponentAtNode } from 'react-dom'; -import type { - CoreSetup, - CoreStart, - HttpSetup, - ChromeStart, - ThemeServiceStart, -} from '@kbn/core/public'; +import type { CoreSetup, CoreStart, HttpSetup, ChromeStart } from '@kbn/core/public'; -import { createKibanaReactContext, KibanaThemeProvider } from '../shared_imports'; +import { createKibanaReactContext, KibanaRenderContextProvider } from '../shared_imports'; import { Links } from '../links'; import { AppContextProvider } from './context'; import { Main } from './components/main'; +import { PainlessLabStartServices } from '../types'; interface AppDependencies { http: HttpSetup; - I18nContext: CoreStart['i18n']['Context']; uiSettings: CoreSetup['uiSettings']; settings: CoreStart['settings']; links: Links; chrome: ChromeStart; - theme: ThemeServiceStart; + startServices: PainlessLabStartServices; } export function renderApp( element: HTMLElement | null, - { http, I18nContext, uiSettings, links, chrome, theme, settings }: AppDependencies + { http, uiSettings, links, chrome, settings, startServices }: AppDependencies ) { if (!element) { return () => undefined; @@ -41,18 +35,16 @@ export function renderApp( const { Provider: KibanaReactContextProvider } = createKibanaReactContext({ uiSettings, settings, - theme, }); render( - - - - -
- - - - , + + + +
+ + + , + element ); return () => unmountComponentAtNode(element); diff --git a/x-pack/plugins/painless_lab/public/plugin.tsx b/x-pack/plugins/painless_lab/public/plugin.tsx index 61a89791b76d7..02ff77d5a862d 100644 --- a/x-pack/plugins/painless_lab/public/plugin.tsx +++ b/x-pack/plugins/painless_lab/public/plugin.tsx @@ -52,13 +52,15 @@ export class PainlessLabUIPlugin implements Plugin { diff --git a/x-pack/plugins/painless_lab/public/shared_imports.ts b/x-pack/plugins/painless_lab/public/shared_imports.ts index 20a5ade3ca7c2..bf0e1fcaffda3 100644 --- a/x-pack/plugins/painless_lab/public/shared_imports.ts +++ b/x-pack/plugins/painless_lab/public/shared_imports.ts @@ -5,4 +5,6 @@ * 2.0. */ -export { createKibanaReactContext, KibanaThemeProvider } from '@kbn/kibana-react-plugin/public'; +export { createKibanaReactContext } from '@kbn/kibana-react-plugin/public'; + +export { KibanaRenderContextProvider } from '@kbn/react-kibana-context-render'; diff --git a/x-pack/plugins/painless_lab/public/types.ts b/x-pack/plugins/painless_lab/public/types.ts index afdc1e8c11b3d..693488860aff0 100644 --- a/x-pack/plugins/painless_lab/public/types.ts +++ b/x-pack/plugins/painless_lab/public/types.ts @@ -8,9 +8,16 @@ import { HomePublicPluginSetup } from '@kbn/home-plugin/public'; import { DevToolsSetup } from '@kbn/dev-tools-plugin/public'; import { LicensingPluginSetup } from '@kbn/licensing-plugin/public'; +import { AnalyticsServiceStart, I18nStart, ThemeServiceStart } from '@kbn/core/public'; export interface PluginDependencies { licensing: LicensingPluginSetup; home: HomePublicPluginSetup; devTools: DevToolsSetup; } + +export interface PainlessLabStartServices { + analytics: Pick; + i18n: I18nStart; + theme: Pick; +} diff --git a/x-pack/plugins/painless_lab/tsconfig.json b/x-pack/plugins/painless_lab/tsconfig.json index 1b993284dea64..857711e8da847 100644 --- a/x-pack/plugins/painless_lab/tsconfig.json +++ b/x-pack/plugins/painless_lab/tsconfig.json @@ -20,6 +20,7 @@ "@kbn/i18n-react", "@kbn/config-schema", "@kbn/code-editor", + "@kbn/react-kibana-context-render", ], "exclude": [ "target/**/*", diff --git a/x-pack/plugins/runtime_fields/public/load_editor.tsx b/x-pack/plugins/runtime_fields/public/load_editor.tsx index b9c8b8983eb01..d04a8e0707ada 100644 --- a/x-pack/plugins/runtime_fields/public/load_editor.tsx +++ b/x-pack/plugins/runtime_fields/public/load_editor.tsx @@ -55,7 +55,7 @@ export const getRuntimeFieldEditorLoader = ctx={ctx} /> , - { theme$: theme.theme$ } + core ) ); diff --git a/x-pack/plugins/runtime_fields/public/plugin.test.ts b/x-pack/plugins/runtime_fields/public/plugin.test.ts index 38a37839145d6..b911f211638e5 100644 --- a/x-pack/plugins/runtime_fields/public/plugin.test.ts +++ b/x-pack/plugins/runtime_fields/public/plugin.test.ts @@ -8,8 +8,8 @@ import { CoreSetup } from '@kbn/core/public'; import { coreMock, themeServiceMock } from '@kbn/core/public/mocks'; -jest.mock('@kbn/kibana-react-plugin/public', () => { - const original = jest.requireActual('@kbn/kibana-react-plugin/public'); +jest.mock('@kbn/react-kibana-mount', () => { + const original = jest.requireActual('@kbn/react-kibana-mount'); return { ...original, diff --git a/x-pack/plugins/runtime_fields/public/shared_imports.ts b/x-pack/plugins/runtime_fields/public/shared_imports.ts index 98f62f3ffbb71..0794e0c9f55a0 100644 --- a/x-pack/plugins/runtime_fields/public/shared_imports.ts +++ b/x-pack/plugins/runtime_fields/public/shared_imports.ts @@ -22,6 +22,8 @@ export { fieldValidators } from '@kbn/es-ui-shared-plugin/static/forms/helpers'; export { TextField } from '@kbn/es-ui-shared-plugin/static/forms/components'; -export { toMountPoint, createKibanaReactContext } from '@kbn/kibana-react-plugin/public'; +export { createKibanaReactContext } from '@kbn/kibana-react-plugin/public'; + +export { toMountPoint } from '@kbn/react-kibana-mount'; export { CodeEditor } from '@kbn/code-editor'; diff --git a/x-pack/plugins/runtime_fields/tsconfig.json b/x-pack/plugins/runtime_fields/tsconfig.json index 4127b838a70f6..f2f2a6e27e6c1 100644 --- a/x-pack/plugins/runtime_fields/tsconfig.json +++ b/x-pack/plugins/runtime_fields/tsconfig.json @@ -17,6 +17,7 @@ "@kbn/monaco", "@kbn/code-editor", "@kbn/code-editor-mock", + "@kbn/react-kibana-mount", ], "exclude": [ "target/**/*", diff --git a/x-pack/plugins/searchprofiler/kibana.jsonc b/x-pack/plugins/searchprofiler/kibana.jsonc index cce2712681b31..3c2b0909cef2b 100644 --- a/x-pack/plugins/searchprofiler/kibana.jsonc +++ b/x-pack/plugins/searchprofiler/kibana.jsonc @@ -17,8 +17,7 @@ "share" ], "requiredBundles": [ - "esUiShared", - "kibanaReact" + "esUiShared" ] } } diff --git a/x-pack/plugins/searchprofiler/public/application/index.tsx b/x-pack/plugins/searchprofiler/public/application/index.tsx index 644a2764e85c7..273f65dcb5380 100644 --- a/x-pack/plugins/searchprofiler/public/application/index.tsx +++ b/x-pack/plugins/searchprofiler/public/application/index.tsx @@ -7,45 +7,41 @@ import React from 'react'; import { render, unmountComponentAtNode } from 'react-dom'; -import { Observable } from 'rxjs'; -import { HttpStart as Http, ToastsSetup, CoreTheme } from '@kbn/core/public'; +import { HttpStart as Http, ToastsSetup } from '@kbn/core/public'; import { RouteComponentProps } from 'react-router-dom'; import { LicenseStatus } from '../../common'; -import { KibanaThemeProvider } from '../shared_imports'; +import { KibanaRenderContextProvider } from '../shared_imports'; import { App } from './app'; import { AppContextProvider } from './contexts/app_context'; import { ProfileContextProvider } from './contexts/profiler_context'; +import { SearchProfilerStartServices } from '../types'; interface AppDependencies { el: HTMLElement; http: Http; - I18nContext: any; notifications: ToastsSetup; initialLicenseStatus: LicenseStatus; - theme$: Observable; location: RouteComponentProps['location']; + startServices: SearchProfilerStartServices; } export const renderApp = ({ el, http, - I18nContext, notifications, initialLicenseStatus, - theme$, location, + startServices, }: AppDependencies) => { render( - - - - - - - - - , + + + + + + + , el ); diff --git a/x-pack/plugins/searchprofiler/public/plugin.ts b/x-pack/plugins/searchprofiler/public/plugin.ts index a039de9fa0f66..4d8cecaf31381 100644 --- a/x-pack/plugins/searchprofiler/public/plugin.ts +++ b/x-pack/plugins/searchprofiler/public/plugin.ts @@ -47,7 +47,9 @@ export class SearchProfilerUIPlugin implements Plugin { const [coreStart] = await getStartServices(); - const { notifications, i18n: i18nDep } = coreStart; + const { notifications, analytics, i18n: i18nStart, theme } = coreStart; + const startServices = { analytics, i18n: i18nStart, theme }; + const { renderApp } = await import('./application'); const license = await firstValueFrom(licensing.license$); @@ -57,10 +59,9 @@ export class SearchProfilerUIPlugin implements Plugin; + i18n: I18nStart; + theme: Pick; +} export interface AppPublicPluginDependencies { licensing: LicensingPluginSetup; diff --git a/x-pack/plugins/searchprofiler/tsconfig.json b/x-pack/plugins/searchprofiler/tsconfig.json index b5aff5d6214fc..b99b0962e39fc 100644 --- a/x-pack/plugins/searchprofiler/tsconfig.json +++ b/x-pack/plugins/searchprofiler/tsconfig.json @@ -16,13 +16,13 @@ "@kbn/licensing-plugin", "@kbn/i18n", "@kbn/share-plugin", - "@kbn/kibana-react-plugin", "@kbn/utility-types", "@kbn/expect", "@kbn/test-jest-helpers", "@kbn/i18n-react", "@kbn/ace", "@kbn/config-schema", + "@kbn/react-kibana-context-render", ], "exclude": [ "target/**/*", From 0b663154978406ce500b705a785406845258957b Mon Sep 17 00:00:00 2001 From: Gloria Hornero Date: Tue, 7 May 2024 19:41:47 +0200 Subject: [PATCH 35/86] [Security Solution] Skips `Investigation fields actions` tests on MKI environments. (#182836) ## Summary The `Investigation fields actions` actions tests are failing on MKI environments because they need a FF to be activated (bulkCustomHighlightedFieldsEnabled). As we currently not support FF on MKI environments, the test has been skipped by adding the `skipInServerlessMKI` label. i.e.: https://buildkite.com/elastic/kibana-serverless-security-solution-quality-gate-rule-management/builds/114 --- .../rule_actions/bulk_actions/bulk_edit_rules.cy.ts | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/x-pack/test/security_solution_cypress/cypress/e2e/detection_response/rule_management/rule_actions/bulk_actions/bulk_edit_rules.cy.ts b/x-pack/test/security_solution_cypress/cypress/e2e/detection_response/rule_management/rule_actions/bulk_actions/bulk_edit_rules.cy.ts index 4584c0d5719e5..1c7bb46c4cbc1 100644 --- a/x-pack/test/security_solution_cypress/cypress/e2e/detection_response/rule_management/rule_actions/bulk_actions/bulk_edit_rules.cy.ts +++ b/x-pack/test/security_solution_cypress/cypress/e2e/detection_response/rule_management/rule_actions/bulk_actions/bulk_edit_rules.cy.ts @@ -578,7 +578,8 @@ describe('Detection rules, bulk edit', { tags: ['@ess', '@serverless'] }, () => }); }); - describe('Investigation fields actions', () => { + // https://github.com/elastic/kibana/issues/182834 + describe('Investigation fields actions', { tags: ['@skipInServerlessMKI'] }, () => { it('Add investigation fields to custom rules', () => { getRulesManagementTableRows().then((rows) => { const fieldsToBeAdded = ['source.ip', 'destination.ip']; From e75737abebdd20fb24efae38c75c3b9676ac6e57 Mon Sep 17 00:00:00 2001 From: Liam Thompson <32779855+leemthompo@users.noreply.github.com> Date: Tue, 7 May 2024 19:44:10 +0200 Subject: [PATCH 36/86] [Search] Reword some connectors copy (#182843) Minor PR to fix some confusing wording, because if you're using Docker you don't need to clone repo. --- .../components/connector_detail/connector_configuration.tsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/components/connector_detail/connector_configuration.tsx b/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/components/connector_detail/connector_configuration.tsx index 0d114f7cd4191..3f2c7e2978985 100644 --- a/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/components/connector_detail/connector_configuration.tsx +++ b/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/components/connector_detail/connector_configuration.tsx @@ -133,7 +133,7 @@ export const ConnectorConfiguration: React.FC = () => { Date: Tue, 7 May 2024 12:09:57 -0600 Subject: [PATCH 37/86] [Reporting] add delete reports to svl tests (#180479) ## Summary Closes https://github.com/elastic/kibana/issues/179456 There are resource already exists errors that only occur in MKI environments. This PR adds the deleteAllReports function to the svlReportingAPI to clean up after tests to avoid this problem. ### Checklist - [x] [Unit or functional tests](https://www.elastic.co/guide/en/kibana/master/development-tests.html) were updated or added to match the most common scenarios --- .../reporting_and_security/generate_csv_discover.ts | 2 ++ .../test_suites/common/reporting/generate_csv_discover.ts | 3 +-- x-pack/test_serverless/shared/services/svl_reporting.ts | 8 ++++++++ 3 files changed, 11 insertions(+), 2 deletions(-) diff --git a/x-pack/test/reporting_api_integration/reporting_and_security/generate_csv_discover.ts b/x-pack/test/reporting_api_integration/reporting_and_security/generate_csv_discover.ts index 2313a9f1ed7d6..b93bd8d5560eb 100644 --- a/x-pack/test/reporting_api_integration/reporting_and_security/generate_csv_discover.ts +++ b/x-pack/test/reporting_api_integration/reporting_and_security/generate_csv_discover.ts @@ -84,6 +84,7 @@ export default function ({ getService }: FtrProviderContext) { }); after(async () => { + await reportingAPI.deleteAllReports(); await esArchiver.unload(archives.ecommerce.data); await kibanaServer.importExport.unload(archives.ecommerce.savedObjects); }); @@ -684,6 +685,7 @@ export default function ({ getService }: FtrProviderContext) { }); after(async () => { + await reportingAPI.deleteAllReports(); await esArchiver.unload(archives.ecommerce.data); await kibanaServer.importExport.unload(archives.ecommerce.savedObjects); }); diff --git a/x-pack/test_serverless/api_integration/test_suites/common/reporting/generate_csv_discover.ts b/x-pack/test_serverless/api_integration/test_suites/common/reporting/generate_csv_discover.ts index 9aafefdff51ce..89e5f5a0de4a7 100644 --- a/x-pack/test_serverless/api_integration/test_suites/common/reporting/generate_csv_discover.ts +++ b/x-pack/test_serverless/api_integration/test_suites/common/reporting/generate_csv_discover.ts @@ -68,8 +68,6 @@ export default function ({ getService }: FtrProviderContext) { * Tests */ describe('Generate CSV from SearchSource', function () { - // failsOnMKI, see https://github.com/elastic/kibana/issues/179456 - this.tags(['failsOnMKI']); beforeEach(async () => { await kibanaServer.uiSettings.update({ 'csv:quoteValues': true, @@ -84,6 +82,7 @@ export default function ({ getService }: FtrProviderContext) { }); after(async () => { + await reportingAPI.deleteAllReports(); await esArchiver.unload(archives.ecommerce.data); await kibanaServer.importExport.unload(archives.ecommerce.savedObjects); }); diff --git a/x-pack/test_serverless/shared/services/svl_reporting.ts b/x-pack/test_serverless/shared/services/svl_reporting.ts index 4fc6da28f082e..2f5742b57d07e 100644 --- a/x-pack/test_serverless/shared/services/svl_reporting.ts +++ b/x-pack/test_serverless/shared/services/svl_reporting.ts @@ -109,5 +109,13 @@ export function SvlReportingServiceProvider({ getService }: FtrProviderContext) .auth(username, password); return response.text as unknown; }, + async deleteAllReports() { + log.debug('ReportingAPI.deleteAllReports'); + + // ignores 409 errs and keeps retrying + await retry.tryForTime(5000, async () => { + await supertest.post('/.reporting*/_delete_by_query').send({ query: { match_all: {} } }); + }); + }, }; } From 43db7a6e55b059ad4b89c7914eb9eb1304f35f15 Mon Sep 17 00:00:00 2001 From: Marta Bondyra <4283304+mbondyra@users.noreply.github.com> Date: Tue, 7 May 2024 20:24:45 +0200 Subject: [PATCH 38/86] [Lens] [Unified Search] [Maps] [Dashboard] Adds wildcard matching to field pickers across Kibana (#182631) ## Summary Users can now utilize '*' or spaces to effectively search through various comboboxes or selectables. The change has been done for field pickers across Lens, Unified Search, Dashboard controls, Maps and Discover. Fixes https://github.com/elastic/kibana/issues/179898 Places where it is added: 1. All field pickers in lens Screenshot 2024-05-05 at 23 25 41 2. Field picker in Unified Search Screenshot 2024-05-05 at 23 26 00 3. Maps Screenshot 2024-05-05 at 23 27 13 4. presentations Screenshot 2024-05-05 at 23 28 03 5. Discover breakdown field Screenshot 2024-05-05 at 23 29 06 --- packages/kbn-field-utils/index.ts | 1 + .../src/utils/field_name_wildcard_matcher.ts | 13 +++++++++++++ .../components/field_picker/field_picker.tsx | 2 ++ .../public/components/field_picker/field_picker.tsx | 3 +++ .../public/chart/breakdown_field_selector.tsx | 4 +++- .../public/chart/toolbar_selector.tsx | 3 +++ .../filters_builder/filter_item/field_input.tsx | 3 +++ src/plugins/unified_search/tsconfig.json | 3 ++- .../styles/vector/components/field_select.tsx | 3 +++ .../maps/public/components/single_field_select.tsx | 3 +++ .../add_tooltip_field_popover.test.tsx.snap | 4 ++++ .../tooltip_selector/add_tooltip_field_popover.tsx | 3 +++ x-pack/plugins/maps/tsconfig.json | 3 ++- 13 files changed, 45 insertions(+), 3 deletions(-) diff --git a/packages/kbn-field-utils/index.ts b/packages/kbn-field-utils/index.ts index 643e22ce6450a..d631c51c757a4 100644 --- a/packages/kbn-field-utils/index.ts +++ b/packages/kbn-field-utils/index.ts @@ -21,6 +21,7 @@ export { getFieldTypeDescription } from './src/utils/get_field_type_description' export { getFieldTypeName, UNKNOWN_FIELD_TYPE_MESSAGE } from './src/utils/get_field_type_name'; export { fieldNameWildcardMatcher, + comboBoxFieldOptionMatcher, getFieldSearchMatchingHighlight, } from './src/utils/field_name_wildcard_matcher'; diff --git a/packages/kbn-field-utils/src/utils/field_name_wildcard_matcher.ts b/packages/kbn-field-utils/src/utils/field_name_wildcard_matcher.ts index 063ca3a16e01a..ba06e36e95c9f 100644 --- a/packages/kbn-field-utils/src/utils/field_name_wildcard_matcher.ts +++ b/packages/kbn-field-utils/src/utils/field_name_wildcard_matcher.ts @@ -42,6 +42,19 @@ export const fieldNameWildcardMatcher = ( return (!!field.displayName && regExp.test(field.displayName)) || regExp.test(field.name); }; +/** + * Adapts fieldNameWildcardMatcher to combobox props. + * @param field + * @param fieldSearchHighlight + */ +export const comboBoxFieldOptionMatcher = ({ + option: { name, label }, + searchValue, +}: { + option: { name?: string; label: string }; + searchValue: string; +}) => fieldNameWildcardMatcher({ name: name || label, displayName: label }, searchValue); + /** * Get `highlight` string to be used together with `EuiHighlight` * @param displayName diff --git a/packages/kbn-visualization-ui-components/components/field_picker/field_picker.tsx b/packages/kbn-visualization-ui-components/components/field_picker/field_picker.tsx index 94b3977c8b031..414b17ccd908d 100644 --- a/packages/kbn-visualization-ui-components/components/field_picker/field_picker.tsx +++ b/packages/kbn-visualization-ui-components/components/field_picker/field_picker.tsx @@ -10,6 +10,7 @@ import './field_picker.scss'; import React from 'react'; import { i18n } from '@kbn/i18n'; import classNames from 'classnames'; +import { comboBoxFieldOptionMatcher } from '@kbn/field-utils'; import { EuiComboBox, EuiComboBoxOptionOption, EuiComboBoxProps } from '@elastic/eui'; import { FieldIcon } from '@kbn/field-utils/src/components/field_icon'; import { calculateWidthFromCharCount } from '@kbn/calculate-width-from-char-count'; @@ -91,6 +92,7 @@ export function FieldPicker( placeholder={i18n.translate('visualizationUiComponents.fieldPicker.fieldPlaceholder', { defaultMessage: 'Select a field', })} + optionMatcher={comboBoxFieldOptionMatcher} options={styledOptions} isInvalid={fieldIsInvalid} selectedOptions={selectedOption ? [selectedOption] : []} diff --git a/src/plugins/presentation_util/public/components/field_picker/field_picker.tsx b/src/plugins/presentation_util/public/components/field_picker/field_picker.tsx index ef14a6c88dcb7..c65b6be13674e 100644 --- a/src/plugins/presentation_util/public/components/field_picker/field_picker.tsx +++ b/src/plugins/presentation_util/public/components/field_picker/field_picker.tsx @@ -8,6 +8,7 @@ import classNames from 'classnames'; import { sortBy, uniq } from 'lodash'; +import { comboBoxFieldOptionMatcher } from '@kbn/field-utils'; import React, { useCallback, useEffect, useMemo, useRef, useState } from 'react'; import { i18n } from '@kbn/i18n'; @@ -63,6 +64,7 @@ export const FieldPicker = ({ const options: EuiSelectableOption[] = (availableFields ?? []).map((field) => { return { key: field.name, + name: field.name, label: field.displayName ?? field.name, className: 'presFieldPicker__fieldButton', checked: field.name === selectedFieldName ? 'on' : undefined, @@ -129,6 +131,7 @@ export const FieldPicker = ({ const field = dataView.getFieldByName(changedOption.key); if (field) onSelectField?.(field); }} + optionMatcher={comboBoxFieldOptionMatcher} searchProps={{ 'data-test-subj': 'field-search-input', placeholder: i18n.translate('presentationUtil.fieldSearch.searchPlaceHolder', { diff --git a/src/plugins/unified_histogram/public/chart/breakdown_field_selector.tsx b/src/plugins/unified_histogram/public/chart/breakdown_field_selector.tsx index b52ba919ecff1..06ee853ee89eb 100644 --- a/src/plugins/unified_histogram/public/chart/breakdown_field_selector.tsx +++ b/src/plugins/unified_histogram/public/chart/breakdown_field_selector.tsx @@ -8,7 +8,7 @@ import React, { useCallback, useMemo } from 'react'; import { EuiSelectableOption } from '@elastic/eui'; -import { FieldIcon, getFieldIconProps } from '@kbn/field-utils'; +import { FieldIcon, getFieldIconProps, comboBoxFieldOptionMatcher } from '@kbn/field-utils'; import { css } from '@emotion/react'; import type { DataView, DataViewField } from '@kbn/data-views-plugin/common'; import { i18n } from '@kbn/i18n'; @@ -37,6 +37,7 @@ export const BreakdownFieldSelector = ({ .filter(fieldSupportsBreakdown) .map((field) => ({ key: field.name, + name: field.name, label: field.displayName, value: field.name, checked: @@ -102,6 +103,7 @@ export const BreakdownFieldSelector = ({ defaultMessage: 'Select breakdown field', } )} + optionMatcher={comboBoxFieldOptionMatcher} options={fieldOptions} onChange={onChange} /> diff --git a/src/plugins/unified_histogram/public/chart/toolbar_selector.tsx b/src/plugins/unified_histogram/public/chart/toolbar_selector.tsx index 025e599c0dfad..b9115847b7b03 100644 --- a/src/plugins/unified_histogram/public/chart/toolbar_selector.tsx +++ b/src/plugins/unified_histogram/public/chart/toolbar_selector.tsx @@ -35,6 +35,7 @@ export interface ToolbarSelectorProps { options: SelectableEntry[]; searchable: boolean; onChange?: (chosenOption: SelectableEntry | undefined) => void; + optionMatcher?: EuiSelectableProps['optionMatcher']; } export const ToolbarSelector: React.FC = ({ @@ -45,6 +46,7 @@ export const ToolbarSelector: React.FC = ({ options, searchable, onChange, + optionMatcher, }) => { const { euiTheme } = useEuiTheme(); const [isOpen, setIsOpen] = useState(false); @@ -144,6 +146,7 @@ export const ToolbarSelector: React.FC = ({ data-test-subj={`${dataTestSubj}Selectable`} options={options} onChange={onSelectionChange} + optionMatcher={optionMatcher} listProps={{ truncationProps: { truncation: 'middle' }, isVirtualized: searchable, diff --git a/src/plugins/unified_search/public/filters_builder/filter_item/field_input.tsx b/src/plugins/unified_search/public/filters_builder/filter_item/field_input.tsx index cc87c3de78936..15437b24ab480 100644 --- a/src/plugins/unified_search/public/filters_builder/filter_item/field_input.tsx +++ b/src/plugins/unified_search/public/filters_builder/filter_item/field_input.tsx @@ -8,6 +8,7 @@ import React, { useCallback, useContext, useRef } from 'react'; import { i18n } from '@kbn/i18n'; +import { comboBoxFieldOptionMatcher } from '@kbn/field-utils'; import { FieldIcon } from '@kbn/react-field'; import { KBN_FIELD_TYPES } from '@kbn/field-types'; import type { DataView, DataViewField } from '@kbn/data-views-plugin/common'; @@ -54,6 +55,7 @@ export function FieldInput({ field, dataView, onHandleField }: FieldInputProps) } return { label, + name: dataViewField.name, value: dataViewField.type as KBN_FIELD_TYPES, prepend: , }; @@ -82,6 +84,7 @@ export function FieldInput({ field, dataView, onHandleField }: FieldInputProps) inputRef={(ref) => { inputRef.current = ref; }} + optionMatcher={comboBoxFieldOptionMatcher} options={euiOptions} selectedOptions={selectedEuiOptions} onChange={onComboBoxChange} diff --git a/src/plugins/unified_search/tsconfig.json b/src/plugins/unified_search/tsconfig.json index d3dfaff1ef6bb..82df1ffe507cf 100644 --- a/src/plugins/unified_search/tsconfig.json +++ b/src/plugins/unified_search/tsconfig.json @@ -47,7 +47,8 @@ "@kbn/react-kibana-context-render", "@kbn/data-view-utils", "@kbn/esql-utils", - "@kbn/react-kibana-mount" + "@kbn/react-kibana-mount", + "@kbn/field-utils" ], "exclude": [ "target/**/*", diff --git a/x-pack/plugins/maps/public/classes/styles/vector/components/field_select.tsx b/x-pack/plugins/maps/public/classes/styles/vector/components/field_select.tsx index a2c5f69e55e68..72e55b2564e35 100644 --- a/x-pack/plugins/maps/public/classes/styles/vector/components/field_select.tsx +++ b/x-pack/plugins/maps/public/classes/styles/vector/components/field_select.tsx @@ -10,6 +10,7 @@ import { calculateWidthFromEntries } from '@kbn/calculate-width-from-char-count' import { EuiComboBox, EuiComboBoxProps, EuiComboBoxOptionOption } from '@elastic/eui'; import { i18n } from '@kbn/i18n'; import { FieldIcon } from '@kbn/react-field'; +import { comboBoxFieldOptionMatcher } from '@kbn/field-utils'; import { FIELD_ORIGIN, MIDDLE_TRUNCATION_PROPS, @@ -35,6 +36,7 @@ function groupFieldsByOrigin(fields: StyleField[]) { .map((field) => { return { value: field, + name: field.name, label: field.label, disabled: field.isUnsupported, title: field.unsupportedMsg, @@ -132,6 +134,7 @@ export function FieldSelect({ fields, selectedFieldName, onChange, styleName, .. singleSelection={SINGLE_SELECTION_AS_TEXT_PROPS} truncationProps={MIDDLE_TRUNCATION_PROPS} inputPopoverProps={{ panelMinWidth }} + optionMatcher={comboBoxFieldOptionMatcher} {...rest} /> ); diff --git a/x-pack/plugins/maps/public/components/single_field_select.tsx b/x-pack/plugins/maps/public/components/single_field_select.tsx index 5a2a8f35755aa..325779cd50d0f 100644 --- a/x-pack/plugins/maps/public/components/single_field_select.tsx +++ b/x-pack/plugins/maps/public/components/single_field_select.tsx @@ -12,6 +12,7 @@ import { EuiComboBox, EuiComboBoxProps, EuiComboBoxOptionOption, EuiToolTip } fr import { FieldIcon } from '@kbn/react-field'; import { DataViewField } from '@kbn/data-views-plugin/public'; import { calculateWidthFromEntries } from '@kbn/calculate-width-from-char-count'; +import { comboBoxFieldOptionMatcher } from '@kbn/field-utils'; import { MIDDLE_TRUNCATION_PROPS } from '../../common/constants'; function fieldsToOptions( @@ -32,6 +33,7 @@ function fieldsToOptions( value: field, label: field.displayName ? field.displayName : field.name, prepend: FieldTypeIcon, + name: field.name, }; if (isFieldDisabled && isFieldDisabled(field)) { option.disabled = true; @@ -119,6 +121,7 @@ export function SingleFieldSelect({ isDisabled={!fields || fields.length === 0} truncationProps={MIDDLE_TRUNCATION_PROPS} inputPopoverProps={{ panelMinWidth }} + optionMatcher={comboBoxFieldOptionMatcher} {...rest} /> ); diff --git a/x-pack/plugins/maps/public/components/tooltip_selector/__snapshots__/add_tooltip_field_popover.test.tsx.snap b/x-pack/plugins/maps/public/components/tooltip_selector/__snapshots__/add_tooltip_field_popover.test.tsx.snap index 6592d6d4ef1fe..02152efb6ac83 100644 --- a/x-pack/plugins/maps/public/components/tooltip_selector/__snapshots__/add_tooltip_field_popover.test.tsx.snap +++ b/x-pack/plugins/maps/public/components/tooltip_selector/__snapshots__/add_tooltip_field_popover.test.tsx.snap @@ -34,6 +34,7 @@ exports[`Should remove selected fields from selectable 1`] = ` Array [ Object { "label": "@timestamp-label", + "name": "@timestamp", "prepend": { return { value: field.name, + name: field.name, prepend: 'type' in field ? ( @@ -161,6 +163,7 @@ export class AddTooltipFieldPopover extends Component { searchProps={{ compressed: true }} options={this.state.options} onChange={this._onSelect} + optionMatcher={comboBoxFieldOptionMatcher} > {(list, search) => (
diff --git a/x-pack/plugins/maps/tsconfig.json b/x-pack/plugins/maps/tsconfig.json index 3e4cd8a1210f7..c88f728749ab8 100644 --- a/x-pack/plugins/maps/tsconfig.json +++ b/x-pack/plugins/maps/tsconfig.json @@ -89,7 +89,8 @@ "@kbn/esql-utils", "@kbn/apm-data-view", "@kbn/shared-ux-utility", - "@kbn/react-kibana-context-render" + "@kbn/react-kibana-context-render", + "@kbn/field-utils" ], "exclude": [ "target/**/*", From 9ffe1df25e85af8f3450bfe04bcf3c1b68ef5df0 Mon Sep 17 00:00:00 2001 From: Tomasz Ciecierski Date: Tue, 7 May 2024 20:26:26 +0200 Subject: [PATCH 39/86] [JAMF] Add JAMF integration's datasets and module type to enable analyzer (#180628) --- .../security_solution/common/experimental_features.ts | 5 +++++ .../timeline_actions/investigate_in_resolver.tsx | 9 ++++++++- .../routes/resolver/entity/utils/supported_schemas.ts | 8 +++++++- .../endpoint/routes/resolver/tree/queries/descendants.ts | 4 ++-- .../endpoint/routes/resolver/tree/queries/lifecycle.ts | 4 ++-- 5 files changed, 24 insertions(+), 6 deletions(-) diff --git a/x-pack/plugins/security_solution/common/experimental_features.ts b/x-pack/plugins/security_solution/common/experimental_features.ts index 1f46816c52dd2..f21f9e82ad92f 100644 --- a/x-pack/plugins/security_solution/common/experimental_features.ts +++ b/x-pack/plugins/security_solution/common/experimental_features.ts @@ -208,6 +208,11 @@ export const allowedExperimentalValues = Object.freeze({ */ crowdstrikeDataInAnalyzerEnabled: false, + /** + * Enables experimental JAMF integration data to be available in Analyzer + */ + jamfDataInAnalyzerEnabled: false, + /** * Enables experimental "Updates" tab in the prebuilt rule upgrade flyout. * This tab shows the JSON diff between the installed prebuilt rule diff --git a/x-pack/plugins/security_solution/public/detections/components/alerts_table/timeline_actions/investigate_in_resolver.tsx b/x-pack/plugins/security_solution/public/detections/components/alerts_table/timeline_actions/investigate_in_resolver.tsx index 553abf36e2d5c..f16a2c98311ff 100644 --- a/x-pack/plugins/security_solution/public/detections/components/alerts_table/timeline_actions/investigate_in_resolver.tsx +++ b/x-pack/plugins/security_solution/public/detections/components/alerts_table/timeline_actions/investigate_in_resolver.tsx @@ -17,10 +17,12 @@ export const useIsInvestigateInResolverActionEnabled = (ecsData?: Ecs) => { const crowdstrikeDataInAnalyzerEnabled = useIsExperimentalFeatureEnabled( 'crowdstrikeDataInAnalyzerEnabled' ); + const jamfDataInAnalyzerEnabled = useIsExperimentalFeatureEnabled('jamfDataInAnalyzerEnabled'); return useMemo(() => { const fileBeatModules = [ ...(sentinelOneDataInAnalyzerEnabled ? ['sentinel_one_cloud_funnel', 'sentinel_one'] : []), ...(crowdstrikeDataInAnalyzerEnabled ? ['crowdstrike'] : []), + ...(jamfDataInAnalyzerEnabled ? ['jamf_protect'] : []), ] as const; const agentType = get(['agent', 'type', 0], ecsData); @@ -40,5 +42,10 @@ export const useIsInvestigateInResolverActionEnabled = (ecsData?: Ecs) => { processEntityIds != null && processEntityIds.length === 1 && firstProcessEntityId !== ''; return isAcceptedAgentType && hasProcessEntityId; - }, [crowdstrikeDataInAnalyzerEnabled, ecsData, sentinelOneDataInAnalyzerEnabled]); + }, [ + crowdstrikeDataInAnalyzerEnabled, + ecsData, + sentinelOneDataInAnalyzerEnabled, + jamfDataInAnalyzerEnabled, + ]); }; diff --git a/x-pack/plugins/security_solution/server/endpoint/routes/resolver/entity/utils/supported_schemas.ts b/x-pack/plugins/security_solution/server/endpoint/routes/resolver/entity/utils/supported_schemas.ts index 766a92904f4bc..ba3c9b64ea32c 100644 --- a/x-pack/plugins/security_solution/server/endpoint/routes/resolver/entity/utils/supported_schemas.ts +++ b/x-pack/plugins/security_solution/server/endpoint/routes/resolver/entity/utils/supported_schemas.ts @@ -36,12 +36,18 @@ export const getSupportedSchemas = ( ): SupportedSchema[] => { const sentinelOneDataInAnalyzerEnabled = experimentalFeatures?.sentinelOneDataInAnalyzerEnabled; const crowdstrikeDataInAnalyzerEnabled = experimentalFeatures?.crowdstrikeDataInAnalyzerEnabled; + const jamfDataInAnalyzerEnabled = experimentalFeatures?.jamfDataInAnalyzerEnabled; const supportedFileBeatDataSets = [ ...(sentinelOneDataInAnalyzerEnabled ? ['sentinel_one_cloud_funnel.event', 'sentinel_one.alert'] : []), - ...(crowdstrikeDataInAnalyzerEnabled ? ['crowdstrike.falcon', 'crowdstrike.fdr'] : []), + ...(crowdstrikeDataInAnalyzerEnabled + ? ['crowdstrike.falcon', 'crowdstrike.fdr', 'crowdstrike.alert'] + : []), + ...(jamfDataInAnalyzerEnabled + ? ['jamf_protect.alerts', 'jamf_protect.web-threat-events', 'jamf_protect.web-traffic-events'] + : []), ]; return [ diff --git a/x-pack/plugins/security_solution/server/endpoint/routes/resolver/tree/queries/descendants.ts b/x-pack/plugins/security_solution/server/endpoint/routes/resolver/tree/queries/descendants.ts index aa6547506b366..58eda02ee9289 100644 --- a/x-pack/plugins/security_solution/server/endpoint/routes/resolver/tree/queries/descendants.ts +++ b/x-pack/plugins/security_solution/server/endpoint/routes/resolver/tree/queries/descendants.ts @@ -65,10 +65,10 @@ export class DescendantsQuery extends BaseResolverQuery { }, }, { - term: { 'event.category': 'process' }, + terms: { 'event.category': ['process'] }, }, { - term: { 'event.kind': 'event' }, + terms: { 'event.kind': ['event', 'alert'] }, }, ], }, diff --git a/x-pack/plugins/security_solution/server/endpoint/routes/resolver/tree/queries/lifecycle.ts b/x-pack/plugins/security_solution/server/endpoint/routes/resolver/tree/queries/lifecycle.ts index 84ebd8b4ae532..ca1578e071626 100644 --- a/x-pack/plugins/security_solution/server/endpoint/routes/resolver/tree/queries/lifecycle.ts +++ b/x-pack/plugins/security_solution/server/endpoint/routes/resolver/tree/queries/lifecycle.ts @@ -58,10 +58,10 @@ export class LifecycleQuery extends BaseResolverQuery { }, }, { - term: { 'event.category': 'process' }, + terms: { 'event.category': ['process'] }, }, { - term: { 'event.kind': 'event' }, + terms: { 'event.kind': ['event', 'alert'] }, }, ], }, From 8c20433bd038d74a3742e4c118c6d48ded317c30 Mon Sep 17 00:00:00 2001 From: Nathan Reese Date: Tue, 7 May 2024 14:18:50 -0600 Subject: [PATCH 40/86] [ML] decouple ML plugin from Map embeddable (#182409) Part of https://github.com/elastic/kibana/issues/182020 --------- Co-authored-by: Kibana Machine <42973632+kibanamachine@users.noreply.github.com> --- x-pack/plugins/maps/public/index.ts | 1 + .../components/ml_embedded_map/index.ts | 8 - .../ml_embedded_map/ml_embedded_map.tsx | 154 ------------------ .../application/explorer/anomalies_map.tsx | 13 +- .../explorer_chart_embedded_map.tsx | 20 ++- .../new_job/common/map_loader/map_loader.ts | 6 +- .../components/geo_view/geo_map_examples.tsx | 22 ++- .../components/geo_view/metric_selection.tsx | 6 +- .../geo_view/metric_selection_summary.tsx | 6 +- .../functional/services/ml/job_wizard_geo.ts | 2 +- 10 files changed, 53 insertions(+), 185 deletions(-) delete mode 100644 x-pack/plugins/ml/public/application/components/ml_embedded_map/index.ts delete mode 100644 x-pack/plugins/ml/public/application/components/ml_embedded_map/ml_embedded_map.tsx diff --git a/x-pack/plugins/maps/public/index.ts b/x-pack/plugins/maps/public/index.ts index d0281537e7a02..4f8a1090436fe 100644 --- a/x-pack/plugins/maps/public/index.ts +++ b/x-pack/plugins/maps/public/index.ts @@ -26,6 +26,7 @@ export type { } from './classes/tooltips/tooltip_property'; export type { MapsSetupApi, MapsStartApi } from './api'; +export type { CreateLayerDescriptorParams } from './classes/sources/es_search_source/create_layer_descriptor'; export type { MapEmbeddable, MapEmbeddableInput, MapEmbeddableOutput } from './embeddable'; export { type MapApi, isMapApi } from './embeddable/map_api'; diff --git a/x-pack/plugins/ml/public/application/components/ml_embedded_map/index.ts b/x-pack/plugins/ml/public/application/components/ml_embedded_map/index.ts deleted file mode 100644 index 3829e98450d73..0000000000000 --- a/x-pack/plugins/ml/public/application/components/ml_embedded_map/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 { MlEmbeddedMapComponent } from './ml_embedded_map'; diff --git a/x-pack/plugins/ml/public/application/components/ml_embedded_map/ml_embedded_map.tsx b/x-pack/plugins/ml/public/application/components/ml_embedded_map/ml_embedded_map.tsx deleted file mode 100644 index 02a713af1b7ae..0000000000000 --- a/x-pack/plugins/ml/public/application/components/ml_embedded_map/ml_embedded_map.tsx +++ /dev/null @@ -1,154 +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, useRef, useState } from 'react'; - -import { htmlIdGenerator } from '@elastic/eui'; -import type { LayerDescriptor } from '@kbn/maps-plugin/common'; -import { INITIAL_LOCATION, MAP_SAVED_OBJECT_TYPE } from '@kbn/maps-plugin/common'; -import type { - MapEmbeddable, - MapEmbeddableInput, - MapEmbeddableOutput, - RenderTooltipContentParams, -} from '@kbn/maps-plugin/public'; - -import type { EmbeddableFactory, ErrorEmbeddable } from '@kbn/embeddable-plugin/public'; -import { isErrorEmbeddable, ViewMode } from '@kbn/embeddable-plugin/public'; -import { useMlKibana } from '../../contexts/kibana'; - -export function MlEmbeddedMapComponent({ - layerList, - mapEmbeddableInput, - renderTooltipContent, -}: { - layerList: LayerDescriptor[]; - mapEmbeddableInput?: MapEmbeddableInput; - renderTooltipContent?: (params: RenderTooltipContentParams) => JSX.Element; -}) { - const [embeddable, setEmbeddable] = useState(); - - const embeddableRoot: React.RefObject = useRef(null); - const baseLayers = useRef(); - - const { - services: { embeddable: embeddablePlugin, maps: mapsPlugin }, - } = useMlKibana(); - - const factory: - | EmbeddableFactory - | undefined = embeddablePlugin - ? embeddablePlugin.getEmbeddableFactory(MAP_SAVED_OBJECT_TYPE) - : undefined; - - // Update the layer list with updated geo points upon refresh - useEffect(() => { - async function updateIndexPatternSearchLayer() { - if ( - embeddable && - !isErrorEmbeddable(embeddable) && - Array.isArray(layerList) && - Array.isArray(baseLayers.current) - ) { - embeddable.setLayerList([...baseLayers.current, ...layerList]); - } - } - updateIndexPatternSearchLayer(); - }, [embeddable, layerList]); - - useEffect(() => { - async function setupEmbeddable() { - if (!factory) { - // eslint-disable-next-line no-console - console.error('Map embeddable not found.'); - return; - } - const input: MapEmbeddableInput = { - id: htmlIdGenerator()(), - attributes: { title: '' }, - filters: [], - hidePanelTitles: true, - viewMode: ViewMode.VIEW, - isLayerTOCOpen: false, - hideFilterActions: true, - // can use mapSettings to center map on anomalies - mapSettings: { - disableInteractive: false, - hideToolbarOverlay: false, - hideLayerControl: false, - hideViewControl: false, - initialLocation: INITIAL_LOCATION.AUTO_FIT_TO_BOUNDS, // this will startup based on data-extent - autoFitToDataBounds: true, // this will auto-fit when there are changes to the filter and/or query - }, - }; - - const embeddableObject = await factory.create(input); - - if (embeddableObject && !isErrorEmbeddable(embeddableObject)) { - const basemapLayerDescriptor = mapsPlugin - ? await mapsPlugin.createLayerDescriptors.createBasemapLayerDescriptor() - : null; - - if (basemapLayerDescriptor) { - baseLayers.current = [basemapLayerDescriptor]; - await embeddableObject.setLayerList(baseLayers.current); - } - } - - setEmbeddable(embeddableObject); - } - - setupEmbeddable(); - // we want this effect to execute exactly once after the component mounts - // eslint-disable-next-line react-hooks/exhaustive-deps - }, []); - - useEffect(() => { - if (embeddable && !isErrorEmbeddable(embeddable) && mapEmbeddableInput !== undefined) { - embeddable.updateInput(mapEmbeddableInput); - } - }, [embeddable, mapEmbeddableInput]); - - useEffect(() => { - if (embeddable && !isErrorEmbeddable(embeddable) && renderTooltipContent !== undefined) { - embeddable.setRenderTooltipContent(renderTooltipContent); - } - }, [embeddable, renderTooltipContent]); - - // We can only render after embeddable has already initialized - useEffect(() => { - if (embeddableRoot.current && embeddable) { - embeddable.render(embeddableRoot.current); - } - }, [embeddable, embeddableRoot]); - - if (!embeddablePlugin) { - // eslint-disable-next-line no-console - console.error('Embeddable start plugin not found'); - return null; - } - if (!mapsPlugin) { - // eslint-disable-next-line no-console - console.error('Maps start plugin not found'); - return null; - } - - return ( -
- ); -} diff --git a/x-pack/plugins/ml/public/application/explorer/anomalies_map.tsx b/x-pack/plugins/ml/public/application/explorer/anomalies_map.tsx index 60dbe1f6e845f..74da9e66ca6fa 100644 --- a/x-pack/plugins/ml/public/application/explorer/anomalies_map.tsx +++ b/x-pack/plugins/ml/public/application/explorer/anomalies_map.tsx @@ -18,6 +18,7 @@ import { htmlIdGenerator, } from '@elastic/eui'; import type { VectorLayerDescriptor } from '@kbn/maps-plugin/common'; +import { INITIAL_LOCATION } from '@kbn/maps-plugin/common'; import { FIELD_ORIGIN, LAYER_TYPE, @@ -29,7 +30,6 @@ import type { EMSTermJoinConfig } from '@kbn/maps-plugin/public'; import { isDefined } from '@kbn/ml-is-defined'; import type { MlAnomaliesTableRecord } from '@kbn/ml-anomaly-utils'; import { useMlKibana } from '../contexts/kibana'; -import { MlEmbeddedMapComponent } from '../components/ml_embedded_map'; const MAX_ENTITY_VALUES = 3; @@ -253,7 +253,16 @@ export const AnomaliesMap: FC = ({ anomalies, jobIds }) => { data-test-subj="mlAnomalyExplorerAnomaliesMap" style={{ width: '100%', height: 300 }} > - + {mapsPlugin && ( + + )}
diff --git a/x-pack/plugins/ml/public/application/explorer/explorer_charts/explorer_chart_embedded_map.tsx b/x-pack/plugins/ml/public/application/explorer/explorer_charts/explorer_chart_embedded_map.tsx index 5d2946358eb74..ac8b080fb8d8c 100644 --- a/x-pack/plugins/ml/public/application/explorer/explorer_charts/explorer_chart_embedded_map.tsx +++ b/x-pack/plugins/ml/public/application/explorer/explorer_charts/explorer_chart_embedded_map.tsx @@ -7,14 +7,19 @@ import React, { useState, useEffect } from 'react'; import type { LayerDescriptor } from '@kbn/maps-plugin/common'; +import { INITIAL_LOCATION } from '@kbn/maps-plugin/common'; import type { Dictionary } from '../../../../common/types/common'; import { getMLAnomaliesActualLayer, getMLAnomaliesTypicalLayer } from './map_config'; -import { MlEmbeddedMapComponent } from '../../components/ml_embedded_map'; +import { useMlKibana } from '../../contexts/kibana'; interface Props { seriesConfig: Dictionary; } export function EmbeddedMapComponentWrapper({ seriesConfig }: Props) { + const { + services: { maps: mapsPlugin }, + } = useMlKibana(); + const [layerList, setLayerList] = useState([]); useEffect(() => { @@ -26,9 +31,16 @@ export function EmbeddedMapComponentWrapper({ seriesConfig }: Props) { } }, [seriesConfig]); - return ( + return mapsPlugin ? (
- +
- ); + ) : null; } diff --git a/x-pack/plugins/ml/public/application/jobs/new_job/common/map_loader/map_loader.ts b/x-pack/plugins/ml/public/application/jobs/new_job/common/map_loader/map_loader.ts index aefedb6a11f22..242ce9d472495 100644 --- a/x-pack/plugins/ml/public/application/jobs/new_job/common/map_loader/map_loader.ts +++ b/x-pack/plugins/ml/public/application/jobs/new_job/common/map_loader/map_loader.ts @@ -9,7 +9,7 @@ import memoizeOne from 'memoize-one'; import { isEqual } from 'lodash'; import type { DataView } from '@kbn/data-views-plugin/common'; import type { ES_GEO_FIELD_TYPE, LayerDescriptor } from '@kbn/maps-plugin/common'; -import type { MapsStartApi } from '@kbn/maps-plugin/public'; +import type { CreateLayerDescriptorParams, MapsStartApi } from '@kbn/maps-plugin/public'; import type { Query } from '@kbn/es-query'; import type { Field, SplitField } from '@kbn/ml-anomaly-utils'; import { ChartLoader } from '../chart_loader'; @@ -30,7 +30,6 @@ export class MapLoader extends ChartLoader { geoField: Field, splitField: SplitField, fieldValues: string[], - filters?: any[], savedSearchQuery?: Query ) { const layerList: LayerDescriptor[] = []; @@ -41,11 +40,10 @@ export class MapLoader extends ChartLoader { ? `${splitField.name}:${fieldValues[0]} ${query ? `and ${query}` : ''}` : `${query ? query : ''}`; - const params: any = { + const params: CreateLayerDescriptorParams = { indexPatternId: this._dataView.id, geoFieldName: geoField.name, geoFieldType: geoField.type as unknown as ES_GEO_FIELD_TYPE, - filters: filters ?? [], query: { query: queryString, language: 'kuery' }, }; diff --git a/x-pack/plugins/ml/public/application/jobs/new_job/pages/components/pick_fields_step/components/geo_view/geo_map_examples.tsx b/x-pack/plugins/ml/public/application/jobs/new_job/pages/components/pick_fields_step/components/geo_view/geo_map_examples.tsx index 4e2722e46e41b..da95646665ffc 100644 --- a/x-pack/plugins/ml/public/application/jobs/new_job/pages/components/pick_fields_step/components/geo_view/geo_map_examples.tsx +++ b/x-pack/plugins/ml/public/application/jobs/new_job/pages/components/pick_fields_step/components/geo_view/geo_map_examples.tsx @@ -9,9 +9,10 @@ import type { FC } from 'react'; import React from 'react'; import { EuiFlexGrid, EuiFlexItem, EuiSpacer } from '@elastic/eui'; import type { LayerDescriptor } from '@kbn/maps-plugin/common'; +import { INITIAL_LOCATION } from '@kbn/maps-plugin/common'; import type { Aggregation, Field, SplitField } from '@kbn/ml-anomaly-utils'; import { SplitCards, useAnimateSplit } from '../split_cards'; -import { MlEmbeddedMapComponent } from '../../../../../../../components/ml_embedded_map'; +import { useMlKibana } from '../../../../../../../contexts/kibana'; import { JOB_TYPE } from '../../../../../../../../../common/constants/new_job'; import { DetectorTitle } from '../detector_title'; @@ -31,6 +32,10 @@ export const GeoMapExamples: FC = ({ geoAgg, layerList, }) => { + const { + services: { maps: mapsPlugin }, + } = useMlKibana(); + const animateSplit = useAnimateSplit(); return ( @@ -46,9 +51,18 @@ export const GeoMapExamples: FC = ({ <> {geoAgg && geoField ? : null} - - - + {mapsPlugin && ( + + + + )} diff --git a/x-pack/plugins/ml/public/application/jobs/new_job/pages/components/pick_fields_step/components/geo_view/metric_selection.tsx b/x-pack/plugins/ml/public/application/jobs/new_job/pages/components/pick_fields_step/components/geo_view/metric_selection.tsx index 1938eefc99611..9d8a6edabe583 100644 --- a/x-pack/plugins/ml/public/application/jobs/new_job/pages/components/pick_fields_step/components/geo_view/metric_selection.tsx +++ b/x-pack/plugins/ml/public/application/jobs/new_job/pages/components/pick_fields_step/components/geo_view/metric_selection.tsx @@ -29,7 +29,7 @@ export const GeoDetector: FC = ({ setIsValid }) => { const [layerList, setLayerList] = useState([]); const { - services: { data, notifications: toasts }, + services: { notifications: toasts }, } = useMlKibana(); const { mapLoader } = useContext(JobCreatorContext); @@ -72,14 +72,12 @@ export const GeoDetector: FC = ({ setIsValid }) => { useEffect(() => { async function getMapLayersForGeoJob() { if (jobCreator.geoField) { - const { filter, query } = jobCreator.savedSearchQuery ?? {}; - const filters = [...data.query.filterManager.getFilters(), ...(filter ?? [])]; + const { query } = jobCreator.savedSearchQuery ?? {}; const layers = await mapLoader.getMapLayersForGeoJob( jobCreator.geoField, jobCreator.splitField, fieldValues, - filters, query ); setLayerList(layers); diff --git a/x-pack/plugins/ml/public/application/jobs/new_job/pages/components/pick_fields_step/components/geo_view/metric_selection_summary.tsx b/x-pack/plugins/ml/public/application/jobs/new_job/pages/components/pick_fields_step/components/geo_view/metric_selection_summary.tsx index 7845a62496d8c..58ff259897381 100644 --- a/x-pack/plugins/ml/public/application/jobs/new_job/pages/components/pick_fields_step/components/geo_view/metric_selection_summary.tsx +++ b/x-pack/plugins/ml/public/application/jobs/new_job/pages/components/pick_fields_step/components/geo_view/metric_selection_summary.tsx @@ -24,7 +24,7 @@ export const GeoDetectorsSummary: FC = () => { const splitField = jobCreator.splitField; const { - services: { data, notifications }, + services: { notifications }, } = useMlKibana(); // Load example field values for summary view @@ -56,14 +56,12 @@ export const GeoDetectorsSummary: FC = () => { useEffect(() => { async function getMapLayersForGeoJob() { if (geoField) { - const { filter, query } = jobCreator.savedSearchQuery ?? {}; - const filters = [...data.query.filterManager.getFilters(), ...(filter ?? [])]; + const { query } = jobCreator.savedSearchQuery ?? {}; const layers = await mapLoader.getMapLayersForGeoJob( geoField, splitField, fieldValues, - filters, query ); setLayerList(layers); diff --git a/x-pack/test/functional/services/ml/job_wizard_geo.ts b/x-pack/test/functional/services/ml/job_wizard_geo.ts index 3920212566932..be2848985a6a2 100644 --- a/x-pack/test/functional/services/ml/job_wizard_geo.ts +++ b/x-pack/test/functional/services/ml/job_wizard_geo.ts @@ -46,7 +46,7 @@ export function MachineLearningJobWizardGeoProvider({ getService }: FtrProviderC ); await testSubjects.existOrFail('mlGeoJobWizardMap'); - await testSubjects.existOrFail('mlEmbeddedMapContent'); + await testSubjects.existOrFail('mapContainer'); }, }; } From 7536b91e3394e25c1309d8cbc6fecec7b3019e26 Mon Sep 17 00:00:00 2001 From: Panagiota Mitsopoulou Date: Tue, 7 May 2024 22:25:47 +0200 Subject: [PATCH 41/86] [SLO] Write functional tests for slo embeddables (#182568) Fixes https://github.com/elastic/kibana/issues/182637 ## Summary This PR introduces our first functional tests for the SLO Overview Embeddable with a bunch of helper functions to interact with the different UI elements. Here are the basic scenarios that have been covered: - Add a single SLO Overview panel - Verify the configuration flyout opens - Verify the SLO selection dropdown exists - Verify the Save button is enabled - Verify an SLO Overview panel is added - Verify the title is present - Add a group SLO Overview panel - Verify the overview mode selector exists and opens the group configuration screen - Verify the Group by dropdown exists - Verify the Group dropdown exists - Verify the KQL bar exists - Verify an SLO Group Overview panel is added Here's a list of scenarios that need to be covered in a follow up PR (I will create a separate ticket with following acceptance criteria): - Check that clicking on the SLO card item opens the SLO details flyout - Check that clicking on the group expands the accordion and shows the respective SLOs - Check that `Edit criteria` link exists in the Group embeddable - Interact with edit criteria link - Check that selected group by is shown - Check that selected group is shown - Check that custom filter is shown in the kql bar - With Remote enabled ## How to test ``` node scripts/functional_tests_server.js --config x-pack/test/functional/apps/slo/embeddables/config.ts node scripts/functional_test_runner --config=x-pack/test/functional/apps/slo/embeddables/config.ts ``` --- .buildkite/ftr_configs.yml | 1 + .../overview/group_view/slo_group_filters.tsx | 5 +- .../slo/overview/overview_mode_selector.tsx | 1 + .../slo/overview/slo_configuration.tsx | 6 +- .../slo/overview/slo_embeddable_factory.tsx | 3 +- .../embeddable/slo/overview/slo_overview.tsx | 2 +- .../functional/apps/slo/embeddables/config.ts | 17 +++ .../slo/embeddables/overview_embeddable.ts | 95 ++++++++++++ x-pack/test/functional/services/index.ts | 5 +- x-pack/test/functional/services/slo/common.ts | 138 ++++++++++++++++++ x-pack/test/functional/services/slo/index.ts | 15 ++ 11 files changed, 280 insertions(+), 8 deletions(-) create mode 100644 x-pack/test/functional/apps/slo/embeddables/config.ts create mode 100644 x-pack/test/functional/apps/slo/embeddables/overview_embeddable.ts create mode 100644 x-pack/test/functional/services/slo/common.ts create mode 100644 x-pack/test/functional/services/slo/index.ts diff --git a/.buildkite/ftr_configs.yml b/.buildkite/ftr_configs.yml index ac9ccb04c68e2..c731227f3b53a 100644 --- a/.buildkite/ftr_configs.yml +++ b/.buildkite/ftr_configs.yml @@ -321,6 +321,7 @@ enabled: - x-pack/test/functional/apps/saved_objects_management/config.ts - x-pack/test/functional/apps/saved_query_management/config.ts - x-pack/test/functional/apps/security/config.ts + - x-pack/test/functional/apps/slo/embeddables/config.ts - x-pack/test/functional/apps/snapshot_restore/config.ts - x-pack/test/functional/apps/spaces/config.ts - x-pack/test/functional/apps/spaces/in_solution_navigation/config.ts diff --git a/x-pack/plugins/observability_solution/slo/public/embeddable/slo/overview/group_view/slo_group_filters.tsx b/x-pack/plugins/observability_solution/slo/public/embeddable/slo/overview/group_view/slo_group_filters.tsx index 48b9df92c73a6..ebc1a671405c6 100644 --- a/x-pack/plugins/observability_solution/slo/public/embeddable/slo/overview/group_view/slo_group_filters.tsx +++ b/x-pack/plugins/observability_solution/slo/public/embeddable/slo/overview/group_view/slo_group_filters.tsx @@ -171,7 +171,7 @@ export function SloGroupFilters({ selectedFilters, onSelected }: Props) { > { @@ -207,7 +207,7 @@ export function SloGroupFilters({ selectedFilters, onSelected }: Props) { defaultMessage: 'Select a {selectedGroupByLabel}', values: { selectedGroupByLabel }, })} - data-test-subj="sloGroup" + data-test-subj="sloGroupOverviewConfigurationGroup" options={groupOptions} selectedOptions={selectedGroupOptions} async @@ -233,6 +233,7 @@ export function SloGroupFilters({ selectedFilters, onSelected }: Props) { } > - + - + @@ -200,7 +200,7 @@ export function SloConfiguration({ initialInput, onCreate, onCancel }: SloConfig ); return ( - + diff --git a/x-pack/plugins/observability_solution/slo/public/embeddable/slo/overview/slo_embeddable_factory.tsx b/x-pack/plugins/observability_solution/slo/public/embeddable/slo/overview/slo_embeddable_factory.tsx index 08d0876bfe5ae..a4f26679dd1dd 100644 --- a/x-pack/plugins/observability_solution/slo/public/embeddable/slo/overview/slo_embeddable_factory.tsx +++ b/x-pack/plugins/observability_solution/slo/public/embeddable/slo/overview/slo_embeddable_factory.tsx @@ -138,6 +138,7 @@ export const getOverviewEmbeddableFactory = (deps: SloEmbeddableDeps) => { return ( { embeddable: api, } as ActionExecutionContext); }} - data-test-subj="o11ySloAlertsWrapperSlOsIncludedLink" + data-test-subj="o11ySloOverviewEditCriteriaLink" > {i18n.translate('xpack.slo.overviewEmbeddable.editCriteriaLabel', { defaultMessage: 'Edit criteria', diff --git a/x-pack/plugins/observability_solution/slo/public/embeddable/slo/overview/slo_overview.tsx b/x-pack/plugins/observability_solution/slo/public/embeddable/slo/overview/slo_overview.tsx index 5d2ca2597f69e..72a0b57be723b 100644 --- a/x-pack/plugins/observability_solution/slo/public/embeddable/slo/overview/slo_overview.tsx +++ b/x-pack/plugins/observability_solution/slo/public/embeddable/slo/overview/slo_overview.tsx @@ -105,7 +105,7 @@ export function SloOverview({ sloId, sloInstanceId, remoteName, reloadSubject }: const historicalSliData = formatHistoricalData(historicalSummary, 'sli_value'); return ( -
+
{ + await loadTestData(getService); + await slo.deleteAllSLOs(); + await slo.create(sloData); + await PageObjects.dashboard.navigateToApp(); + await PageObjects.dashboard.clickNewDashboard(); + await PageObjects.dashboard.switchToEditMode(); + }); + + after(async () => { + await slo.deleteAllSLOs(); + await cleanup({ esClient, logger }); + await sloEsClient.deleteTestSourceData(); + }); + + describe('Single SLO', function () { + it('should open SLO configuration flyout', async () => { + await dashboardAddPanel.clickEditorMenuButton(); + await dashboardAddPanel.clickEmbeddableFactoryGroupButton('slos'); + await dashboardAddPanel.clickAddNewPanelFromUIActionLink('SLO Overview'); + await sloUi.common.assertSloOverviewConfigurationExists(); + }); + + it('should have an overview mode selector', async () => { + await sloUi.common.assertOverviewModeSelectorExists(); + }); + + it('can select an SLO', async () => { + await sloUi.common.assertOverviewSloSelectorExists(); + await sloUi.common.setComboBoxSloSelection(); + await sloUi.common.clickOverviewCofigurationSaveButton(); + }); + + it('creates an overview panel', async () => { + await sloUi.common.assertSingleOverviewPanelExists(); + await sloUi.common.dismissAllToasts(); + }); + + it('renders SLO card item chart', async () => { + await sloUi.common.assertSingleOverviewPanelContentExists(); + }); + }); + + describe('Group of SLOs', function () { + it('can select Group Overview mode in the Flyout configuration', async () => { + await dashboardAddPanel.clickEditorMenuButton(); + await dashboardAddPanel.clickEmbeddableFactoryGroupButton('slos'); + await dashboardAddPanel.clickAddNewPanelFromUIActionLink('SLO Overview'); + await sloUi.common.clickOverviewMode(); + await sloUi.common.assertSloConfigurationGroupOverviewModeIsSelected(); + }); + + it('can select a group by', async () => { + await sloUi.common.assertGroupOverviewConfigurationGroupByExists(); + }); + + it('can optionally select a group', async () => { + await sloUi.common.assertGroupOverviewConfigurationGroupExists(); + }); + + it('can optionally search for custom query', async () => { + await sloUi.common.assertGroupOverviewConfigurationKqlBarExists(); + }); + + it('creates a group overview panel', async () => { + await sloUi.common.clickOverviewCofigurationSaveButton(); + await sloUi.common.assertGroupOverviewPanelExists(); + await sloUi.common.dismissAllToasts(); + }); + }); + }); +} diff --git a/x-pack/test/functional/services/index.ts b/x-pack/test/functional/services/index.ts index 03ad1ea2361e3..d7aab70c44cbc 100644 --- a/x-pack/test/functional/services/index.ts +++ b/x-pack/test/functional/services/index.ts @@ -69,7 +69,7 @@ import { RulesServiceProvider } from './rules'; import { AiopsProvider } from './aiops'; import { SampleDataServiceProvider } from './sample_data'; import { DataStreamProvider } from './data_stream'; - +import { SloUiServiceProvider } from './slo'; // define the name and providers for services that should be // available to your tests. If you don't specify anything here // only the built-in services will be available @@ -131,4 +131,7 @@ export const services = { aiops: AiopsProvider, sampleData: SampleDataServiceProvider, dataStreams: DataStreamProvider, + slo: kibanaXPackApiIntegrationServices.slo, + dataViewApi: kibanaXPackApiIntegrationServices.dataViewApi, + sloUi: SloUiServiceProvider, }; diff --git a/x-pack/test/functional/services/slo/common.ts b/x-pack/test/functional/services/slo/common.ts new file mode 100644 index 0000000000000..b46284c915c3a --- /dev/null +++ b/x-pack/test/functional/services/slo/common.ts @@ -0,0 +1,138 @@ +/* + * Copyright 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 { sloData } from '../../../api_integration/apis/slos/fixtures/create_slo'; + +const OVERVIEW_MODE_SELECTOR = 'sloOverviewModeSelector'; +const SLO_CONFIRM_BUTTON = 'sloConfirmButton'; +const SINGLE_SLO_SELECTOR = 'singleSloSelector'; +const SLO_SINGLE_OVERVIEW_CONFIGURATION = 'sloSingleOverviewConfiguration'; +const SLO_GROUP_OVERVIEW_CONFIGURATION = 'sloGroupOverviewConfiguration'; +const SLO_GROUP_OVERVIEW_CONFIGURATION_GROUP_BY = 'sloGroupOverviewConfigurationGroupBy'; +const SLO_GROUP_OVERVIEW_CONFIGURATION_GROUP = 'sloGroupOverviewConfigurationGroup'; +const SLO_GROUP_OVERVIEW_CONFIGURATION_KQLBAR = 'sloGroupOverviewConfigurationKqlBar'; +const SLO_SINGLE_OVERVIEW_PANEL = 'sloSingleOverviewPanel'; +const SLO_GROUP_OVERVIEW_PANEL = 'sloGroupOverviewPanel'; + +export function SloUiCommonServiceProvider({ getService }: FtrProviderContext) { + const testSubjects = getService('testSubjects'); + const comboBox = getService('comboBox'); + const find = getService('find'); + const toasts = getService('toasts'); + const retry = getService('retry'); + + return { + async assertSloOverviewConfigurationExists() { + await retry.tryForTime(60 * 1000, async () => { + await testSubjects.existOrFail(SLO_SINGLE_OVERVIEW_CONFIGURATION); + }); + }, + async assertOverviewSloSelectorExists() { + await retry.tryForTime(60 * 1000, async () => { + await testSubjects.existOrFail(SINGLE_SLO_SELECTOR); + }); + }, + async setComboBoxSloSelection() { + await retry.tryForTime(60 * 1000, async () => { + await testSubjects.click('sloSelector'); + await comboBox.set('sloSelector > comboBoxInput', sloData.name); + }); + }, + async assertOverviewConfigurationSaveButtonIsEnabled(subj: string) { + await retry.tryForTime(60 * 1000, async () => { + await testSubjects.existOrFail(subj); + await testSubjects.isEnabled(subj); + }); + }, + async clickOverviewCofigurationSaveButton() { + await retry.tryForTime(60 * 1000, async () => { + await this.assertOverviewConfigurationSaveButtonIsEnabled(SLO_CONFIRM_BUTTON); + await testSubjects.clickWhenNotDisabledWithoutRetry(SLO_CONFIRM_BUTTON); + }); + }, + + async assertOverviewModeSelectorExists() { + await retry.tryForTime(60 * 1000, async () => { + await testSubjects.existOrFail(OVERVIEW_MODE_SELECTOR); + }); + }, + + async clickOverviewMode() { + await retry.tryForTime(60 * 1000, async () => { + await this.assertOverviewModeSelectorExists(); + await testSubjects.click(OVERVIEW_MODE_SELECTOR); + }); + }, + + async assertSloConfigurationGroupOverviewModeIsSelected() { + await retry.tryForTime(60 * 1000, async () => { + await testSubjects.existOrFail(SLO_GROUP_OVERVIEW_CONFIGURATION); + }); + }, + + async assertGroupOverviewConfigurationGroupByExists() { + await retry.tryForTime(60 * 1000, async () => { + await testSubjects.existOrFail(SLO_GROUP_OVERVIEW_CONFIGURATION_GROUP_BY); + }); + }, + + async assertGroupOverviewConfigurationGroupExists() { + await retry.tryForTime(60 * 1000, async () => { + await testSubjects.existOrFail(SLO_GROUP_OVERVIEW_CONFIGURATION_GROUP); + }); + }, + + async assertGroupOverviewConfigurationKqlBarExists() { + await retry.tryForTime(60 * 1000, async () => { + await testSubjects.existOrFail(SLO_GROUP_OVERVIEW_CONFIGURATION_KQLBAR); + }); + }, + + async dismissAllToasts() { + await retry.tryForTime(60 * 1000, async () => { + await toasts.dismissAll(); + }); + }, + + async assertSingleOverviewPanelExists() { + await retry.tryForTime(60 * 1000, async () => { + await testSubjects.existOrFail(SLO_SINGLE_OVERVIEW_PANEL); + }); + }, + + async getSloCardTitle() { + const container = await testSubjects.find(SLO_SINGLE_OVERVIEW_PANEL); + return await (await container.findByClassName('echMetricText__title')).getVisibleText(); + }, + + async assertSingleOverviewPanelContentExists() { + await retry.tryForTime(2000, async () => { + expect( + await find.existsByCssSelector( + `[data-test-subj="${SLO_SINGLE_OVERVIEW_PANEL}"] .echChart` + ) + ).to.eql(true); + + expect( + await find.existsByCssSelector( + `[data-test-subj="${SLO_SINGLE_OVERVIEW_PANEL}"] .echMetricText__title` + ) + ).to.eql(true); + + expect(await this.getSloCardTitle()).to.eql(sloData.name); + }); + }, + + async assertGroupOverviewPanelExists() { + await retry.tryForTime(60 * 1000, async () => { + await testSubjects.existOrFail(SLO_GROUP_OVERVIEW_PANEL); + }); + }, + }; +} diff --git a/x-pack/test/functional/services/slo/index.ts b/x-pack/test/functional/services/slo/index.ts new file mode 100644 index 0000000000000..75339f41dfe3a --- /dev/null +++ b/x-pack/test/functional/services/slo/index.ts @@ -0,0 +1,15 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import { FtrProviderContext } from '../../ftr_provider_context'; +import { SloUiCommonServiceProvider } from './common'; + +export function SloUiServiceProvider(context: FtrProviderContext) { + return { + common: SloUiCommonServiceProvider(context), + }; +} From a98dda0f0672a5a373142bcdbcfcc9e72bb4209c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Alejandro=20Fern=C3=A1ndez=20Haro?= Date: Tue, 7 May 2024 23:27:01 +0200 Subject: [PATCH 42/86] [Telemetry Collection Manager] Use top-level `cluster_uuid` (#182857) --- .../telemetry_collection_manager/server/plugin.test.ts | 4 +--- src/plugins/telemetry_collection_manager/server/plugin.ts | 5 +---- 2 files changed, 2 insertions(+), 7 deletions(-) diff --git a/src/plugins/telemetry_collection_manager/server/plugin.test.ts b/src/plugins/telemetry_collection_manager/server/plugin.test.ts index adfe2c64a4916..a19f203c154fd 100644 --- a/src/plugins/telemetry_collection_manager/server/plugin.test.ts +++ b/src/plugins/telemetry_collection_manager/server/plugin.test.ts @@ -94,9 +94,7 @@ describe('Telemetry Collection Manager', () => { cluster_uuid: 'clusterUuid', cluster_name: 'clusterName', timestamp: new Date().toISOString(), - cluster_stats: { - cluster_uuid: 'clusterUuid', - }, + cluster_stats: {}, stack_stats: {}, version: 'version', }; diff --git a/src/plugins/telemetry_collection_manager/server/plugin.ts b/src/plugins/telemetry_collection_manager/server/plugin.ts index f4685576c1ef8..958d7439b5936 100644 --- a/src/plugins/telemetry_collection_manager/server/plugin.ts +++ b/src/plugins/telemetry_collection_manager/server/plugin.ts @@ -285,10 +285,7 @@ export class TelemetryCollectionManagerPlugin retrieveSnapshotTelemetryTransaction.startSpan('Prepare response'); const results = await Promise.all( usageData.map(async (clusterStats) => { - const { cluster_uuid: clusterUuid } = clusterStats.cluster_stats as Record< - string, - string - >; + const { cluster_uuid: clusterUuid } = clusterStats; return { clusterUuid, From 0a355aa0494739af9655f7786381d7eb84202f5c Mon Sep 17 00:00:00 2001 From: Philippe Oberti Date: Tue, 7 May 2024 16:31:59 -0500 Subject: [PATCH 43/86] [Security Solution][Timeline] - fix ESQL tab full screen showing unwanted UI elements (#182876) --- .../timelines/components/timeline/tabs/esql/styles.tsx | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/x-pack/plugins/security_solution/public/timelines/components/timeline/tabs/esql/styles.tsx b/x-pack/plugins/security_solution/public/timelines/components/timeline/tabs/esql/styles.tsx index 0a779a3b8e3a9..6e82809231828 100644 --- a/x-pack/plugins/security_solution/public/timelines/components/timeline/tabs/esql/styles.tsx +++ b/x-pack/plugins/security_solution/public/timelines/components/timeline/tabs/esql/styles.tsx @@ -21,4 +21,9 @@ export const TimelineESQLGlobalStyles = createGlobalStyle` body:has(.timeline-portal-overlay-mask) .DiscoverFlyout { z-index: 1002; // For its usage in the Security Solution timeline, we need Discover flyout to be above the timeline flyout (which has a z-index of 1001) } + + // TODO this should be removed when we change the ES|QL tab to be our own component instead of Discover (hopefully 8.15) + .unifiedDataTable__fullScreen .dscPageBody * { + z-index: unset !important; + } `; From 64a4c6dfaa3d174ffc2ab7120fbdf8bb0c372b2b Mon Sep 17 00:00:00 2001 From: Samiul Monir <150824886+Samiul-TheSoccerFan@users.noreply.github.com> Date: Tue, 7 May 2024 17:36:20 -0400 Subject: [PATCH 44/86] Loading playground test file (#182880) ## Summary Loading test file for playground ### Checklist Delete any items that are not applicable to this PR. - [ ] Any text added follows [EUI's writing guidelines](https://elastic.github.io/eui/#/guidelines/writing), uses sentence case text and includes [i18n support](https://github.com/elastic/kibana/blob/main/packages/kbn-i18n/README.md) - [ ] [Documentation](https://www.elastic.co/guide/en/kibana/master/development-documentation.html) was added for features that require explanation or tutorials - [ ] [Unit or functional tests](https://www.elastic.co/guide/en/kibana/master/development-tests.html) were updated or added to match the most common scenarios - [ ] [Flaky Test Runner](https://ci-stats.kibana.dev/trigger_flaky_test_runner/1) was used on any tests changed - [ ] Any UI touched in this PR is usable by keyboard only (learn more about [keyboard accessibility](https://webaim.org/techniques/keyboard/)) - [ ] Any UI touched in this PR does not create any new axe failures (run axe in browser: [FF](https://addons.mozilla.org/en-US/firefox/addon/axe-devtools/), [Chrome](https://chrome.google.com/webstore/detail/axe-web-accessibility-tes/lhdoppojpmngadmnindnejefpokejbdd?hl=en-US)) - [ ] If a plugin configuration key changed, check if it needs to be allowlisted in the cloud and added to the [docker list](https://github.com/elastic/kibana/blob/main/src/dev/build/tasks/os_packages/docker_generator/resources/base/bin/kibana-docker) - [ ] This renders correctly on smaller devices using a responsive layout. (You can test this [in your browser](https://www.browserstack.com/guide/responsive-testing-on-local-server)) - [ ] This was checked for [cross-browser compatibility](https://www.elastic.co/support/matrix#matrix_browsers) ### For maintainers - [ ] This was checked for breaking API changes and was [labeled appropriately](https://www.elastic.co/guide/en/kibana/master/contributing.html#kibana-release-notes-process) --- x-pack/test_serverless/functional/test_suites/search/index.ts | 1 + 1 file changed, 1 insertion(+) diff --git a/x-pack/test_serverless/functional/test_suites/search/index.ts b/x-pack/test_serverless/functional/test_suites/search/index.ts index 2e62cf4fbee38..455acc0404429 100644 --- a/x-pack/test_serverless/functional/test_suites/search/index.ts +++ b/x-pack/test_serverless/functional/test_suites/search/index.ts @@ -20,6 +20,7 @@ export default function ({ loadTestFile }: FtrProviderContext) { loadTestFile(require.resolve('./advanced_settings')); loadTestFile(require.resolve('./rules/rule_details')); loadTestFile(require.resolve('./console_notebooks')); + loadTestFile(require.resolve('./playground_overview')); loadTestFile(require.resolve('./ml')); }); From 3f7731c8b79dc349111a843e39247f11b946b228 Mon Sep 17 00:00:00 2001 From: Ying Mao Date: Tue, 7 May 2024 22:58:19 -0400 Subject: [PATCH 45/86] [Response Ops][Alerting] Fixing bug with agg building for ES query rule when there are multi-terms and a group by field (#182865) --- .../common/data/lib/build_agg.test.ts | 45 +++++++++++++++++++ .../common/data/lib/build_agg.ts | 20 ++++++--- 2 files changed, 58 insertions(+), 7 deletions(-) diff --git a/x-pack/plugins/triggers_actions_ui/common/data/lib/build_agg.test.ts b/x-pack/plugins/triggers_actions_ui/common/data/lib/build_agg.test.ts index 08c43eb9f8c0f..3656fb9ea3469 100644 --- a/x-pack/plugins/triggers_actions_ui/common/data/lib/build_agg.test.ts +++ b/x-pack/plugins/triggers_actions_ui/common/data/lib/build_agg.test.ts @@ -793,6 +793,51 @@ describe('buildAgg', () => { }); }); + it('should create correct aggregation when condition params are defined and multi terms selected', async () => { + expect( + buildAggregation({ + aggType: 'sum', + aggField: 'avg-field', + termField: ['the-term', 'second-term'], + termSize: 100, + condition: { + resultLimit: 1000, + conditionScript: `params.compareValue <= 0`, + }, + }) + ).toEqual({ + groupAgg: { + multi_terms: { + size: 100, + terms: [{ field: 'the-term' }, { field: 'second-term' }], + order: { + metricAgg: 'desc', + }, + }, + aggs: { + conditionSelector: { + bucket_selector: { + buckets_path: { + compareValue: 'metricAgg', + }, + script: `params.compareValue <= 0`, + }, + }, + metricAgg: { + sum: { + field: 'avg-field', + }, + }, + }, + }, + groupAggCount: { + stats_bucket: { + buckets_path: 'groupAgg._count', + }, + }, + }); + }); + it('should add topHitsAgg if topHitsSize is defined', () => { expect( buildAggregation({ diff --git a/x-pack/plugins/triggers_actions_ui/common/data/lib/build_agg.ts b/x-pack/plugins/triggers_actions_ui/common/data/lib/build_agg.ts index dfb141554a9fd..3c61368543b8c 100644 --- a/x-pack/plugins/triggers_actions_ui/common/data/lib/build_agg.ts +++ b/x-pack/plugins/triggers_actions_ui/common/data/lib/build_agg.ts @@ -46,7 +46,7 @@ export const buildAggregation = ({ condition, topHitsSize, }: BuildAggregationOpts): Record => { - const aggContainer = { + const aggContainer: AggregationsAggregationContainer = { aggs: {}, }; const isCountAgg = isCountAggregation(aggType); @@ -78,7 +78,7 @@ export const buildAggregation = ({ : terms : terms; - let aggParent: any = aggContainer; + let aggParent: AggregationsAggregationContainer = aggContainer; const getAggName = () => (isDateAgg ? 'sortValueAgg' : 'metricAgg'); @@ -114,9 +114,15 @@ export const buildAggregation = ({ // if not count add an order if (!isCountAgg) { const sortOrder = aggType === 'min' ? 'asc' : 'desc'; - aggParent.aggs.groupAgg.terms!.order = { - [getAggName()]: sortOrder, - }; + if (isMultiTerms && aggParent.aggs.groupAgg.multi_terms) { + aggParent.aggs.groupAgg.multi_terms.order = { + [getAggName()]: sortOrder, + }; + } else if (aggParent.aggs.groupAgg.terms) { + aggParent.aggs.groupAgg.terms.order = { + [getAggName()]: sortOrder, + }; + } } else if (includeConditionInQuery) { aggParent.aggs.groupAgg.aggs = { conditionSelector: { @@ -193,7 +199,7 @@ export const buildAggregation = ({ } if (timeSeries && dateRangeInfo) { - aggParent = aggParent.aggs.dateAgg; + aggParent = aggParent?.aggs?.dateAgg ?? {}; // finally, the metric aggregation, if requested if (!isCountAgg) { @@ -207,5 +213,5 @@ export const buildAggregation = ({ } } - return aggContainer.aggs; + return aggContainer.aggs ?? {}; }; From 719980554543b7bb4cae67cbef4029c3dd60b47e Mon Sep 17 00:00:00 2001 From: Kibana Machine <42973632+kibanamachine@users.noreply.github.com> Date: Wed, 8 May 2024 00:54:00 -0400 Subject: [PATCH 46/86] [api-docs] 2024-05-08 Daily api_docs build (#182900) Generated by https://buildkite.com/elastic/kibana-api-docs-daily/builds/700 --- api_docs/actions.mdx | 2 +- api_docs/advanced_settings.mdx | 2 +- .../ai_assistant_management_selection.mdx | 2 +- api_docs/aiops.mdx | 2 +- api_docs/alerting.mdx | 2 +- api_docs/apm.devdocs.json | 22 ++- api_docs/apm.mdx | 4 +- api_docs/apm_data_access.mdx | 2 +- api_docs/asset_manager.mdx | 2 +- api_docs/assets_data_access.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_data_migration.mdx | 2 +- api_docs/cloud_defend.mdx | 2 +- api_docs/cloud_experiments.mdx | 2 +- api_docs/cloud_security_posture.mdx | 2 +- api_docs/console.mdx | 2 +- api_docs/content_management.mdx | 2 +- api_docs/controls.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/dataset_quality.mdx | 2 +- api_docs/deprecations_by_api.mdx | 7 +- api_docs/deprecations_by_plugin.mdx | 56 ++------ api_docs/deprecations_by_team.mdx | 4 +- api_docs/dev_tools.mdx | 2 +- api_docs/discover.mdx | 2 +- api_docs/discover_enhanced.mdx | 2 +- api_docs/discover_shared.mdx | 2 +- api_docs/ecs_data_quality_dashboard.mdx | 2 +- api_docs/elastic_assistant.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_annotation_listing.mdx | 2 +- api_docs/event_log.mdx | 2 +- api_docs/exploratory_view.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/files_management.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/image_embeddable.mdx | 2 +- api_docs/index_lifecycle_management.mdx | 2 +- api_docs/index_management.mdx | 2 +- api_docs/infra.mdx | 2 +- api_docs/ingest_pipelines.mdx | 2 +- api_docs/inspector.mdx | 2 +- api_docs/interactive_setup.mdx | 2 +- api_docs/kbn_ace.mdx | 2 +- api_docs/kbn_actions_types.mdx | 2 +- api_docs/kbn_aiops_components.mdx | 2 +- api_docs/kbn_aiops_log_pattern_analysis.mdx | 2 +- api_docs/kbn_aiops_log_rate_analysis.mdx | 2 +- .../kbn_alerting_api_integration_helpers.mdx | 2 +- api_docs/kbn_alerting_state_types.mdx | 2 +- api_docs/kbn_alerting_types.mdx | 2 +- api_docs/kbn_alerts_as_data_utils.mdx | 2 +- api_docs/kbn_alerts_ui_shared.mdx | 2 +- api_docs/kbn_analytics.mdx | 2 +- api_docs/kbn_analytics_client.mdx | 2 +- api_docs/kbn_analytics_collection_utils.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_data_view.mdx | 2 +- api_docs/kbn_apm_synthtrace.devdocs.json | 105 ++++++++++++++- api_docs/kbn_apm_synthtrace.mdx | 4 +- api_docs/kbn_apm_synthtrace_client.mdx | 2 +- api_docs/kbn_apm_utils.mdx | 2 +- api_docs/kbn_axe_config.mdx | 2 +- api_docs/kbn_bfetch_error.mdx | 2 +- api_docs/kbn_calculate_auto.mdx | 2 +- .../kbn_calculate_width_from_char_count.mdx | 2 +- api_docs/kbn_cases_components.mdx | 2 +- api_docs/kbn_cell_actions.mdx | 2 +- api_docs/kbn_chart_expressions_common.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_code_editor.mdx | 2 +- api_docs/kbn_code_editor_mock.mdx | 2 +- api_docs/kbn_code_owners.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.devdocs.json | 2 +- api_docs/kbn_config_schema.mdx | 2 +- .../kbn_content_management_content_editor.mdx | 2 +- ...tent_management_tabbed_table_list_view.mdx | 2 +- ...kbn_content_management_table_list_view.mdx | 2 +- ...tent_management_table_list_view_common.mdx | 2 +- ...ntent_management_table_list_view_table.mdx | 2 +- api_docs/kbn_content_management_utils.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_apps_server_internal.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_custom_branding_browser.mdx | 2 +- ..._core_custom_branding_browser_internal.mdx | 2 +- ...kbn_core_custom_branding_browser_mocks.mdx | 2 +- api_docs/kbn_core_custom_branding_common.mdx | 2 +- api_docs/kbn_core_custom_branding_server.mdx | 2 +- ...n_core_custom_branding_server_internal.mdx | 2 +- .../kbn_core_custom_branding_server_mocks.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 +- api_docs/kbn_core_http_resources_server.mdx | 2 +- ...bn_core_http_resources_server_internal.mdx | 2 +- .../kbn_core_http_resources_server_mocks.mdx | 2 +- .../kbn_core_http_router_server_internal.mdx | 2 +- .../kbn_core_http_router_server_mocks.mdx | 2 +- api_docs/kbn_core_http_server.devdocs.json | 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 +- ...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_lifecycle_server.mdx | 2 +- api_docs/kbn_core_lifecycle_server_mocks.mdx | 2 +- api_docs/kbn_core_logging_browser_mocks.mdx | 2 +- api_docs/kbn_core_logging_common_internal.mdx | 2 +- api_docs/kbn_core_logging_server.devdocs.json | 126 +++++++++++++++++- api_docs/kbn_core_logging_server.mdx | 4 +- ..._core_logging_server_internal.devdocs.json | 10 +- 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 +- .../kbn_core_plugins_contracts_browser.mdx | 2 +- .../kbn_core_plugins_contracts_server.mdx | 2 +- api_docs/kbn_core_plugins_server.mdx | 2 +- api_docs/kbn_core_plugins_server_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_rendering_server_internal.mdx | 2 +- api_docs/kbn_core_rendering_server_mocks.mdx | 2 +- api_docs/kbn_core_root_server_internal.mdx | 2 +- .../kbn_core_saved_objects_api_browser.mdx | 2 +- .../kbn_core_saved_objects_api_server.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_security_browser.mdx | 2 +- .../kbn_core_security_browser_internal.mdx | 2 +- api_docs/kbn_core_security_browser_mocks.mdx | 2 +- api_docs/kbn_core_security_common.mdx | 2 +- api_docs/kbn_core_security_server.mdx | 2 +- .../kbn_core_security_server_internal.mdx | 2 +- api_docs/kbn_core_security_server_mocks.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_test_helpers_kbn_server.mdx | 2 +- .../kbn_core_test_helpers_model_versions.mdx | 2 +- ...n_core_test_helpers_so_type_serializer.mdx | 2 +- api_docs/kbn_core_test_helpers_test_utils.mdx | 2 +- api_docs/kbn_core_theme_browser.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_core_user_profile_browser.mdx | 2 +- ...kbn_core_user_profile_browser_internal.mdx | 2 +- .../kbn_core_user_profile_browser_mocks.mdx | 2 +- api_docs/kbn_core_user_profile_common.mdx | 2 +- api_docs/kbn_core_user_profile_server.mdx | 2 +- .../kbn_core_user_profile_server_internal.mdx | 2 +- .../kbn_core_user_profile_server_mocks.mdx | 2 +- api_docs/kbn_core_user_settings_server.mdx | 2 +- .../kbn_core_user_settings_server_mocks.mdx | 2 +- api_docs/kbn_crypto.mdx | 2 +- api_docs/kbn_crypto_browser.mdx | 2 +- api_docs/kbn_custom_icons.mdx | 2 +- api_docs/kbn_custom_integrations.mdx | 2 +- api_docs/kbn_cypress_config.mdx | 2 +- api_docs/kbn_data_forge.mdx | 2 +- api_docs/kbn_data_service.mdx | 2 +- api_docs/kbn_data_stream_adapter.mdx | 2 +- api_docs/kbn_data_view_utils.mdx | 2 +- api_docs/kbn_datemath.mdx | 2 +- api_docs/kbn_deeplinks_analytics.mdx | 2 +- api_docs/kbn_deeplinks_devtools.mdx | 2 +- api_docs/kbn_deeplinks_fleet.mdx | 2 +- api_docs/kbn_deeplinks_management.mdx | 2 +- api_docs/kbn_deeplinks_ml.mdx | 2 +- api_docs/kbn_deeplinks_observability.mdx | 2 +- api_docs/kbn_deeplinks_search.mdx | 2 +- api_docs/kbn_deeplinks_security.mdx | 2 +- api_docs/kbn_deeplinks_shared.mdx | 2 +- api_docs/kbn_default_nav_analytics.mdx | 2 +- api_docs/kbn_default_nav_devtools.mdx | 2 +- api_docs/kbn_default_nav_management.mdx | 2 +- api_docs/kbn_default_nav_ml.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_discover_utils.mdx | 2 +- api_docs/kbn_doc_links.mdx | 2 +- api_docs/kbn_docs_utils.mdx | 2 +- api_docs/kbn_dom_drag_drop.mdx | 2 +- api_docs/kbn_ebt_tools.mdx | 2 +- api_docs/kbn_ecs_data_quality_dashboard.mdx | 2 +- api_docs/kbn_elastic_agent_utils.mdx | 2 +- api_docs/kbn_elastic_assistant.mdx | 2 +- api_docs/kbn_elastic_assistant_common.mdx | 2 +- api_docs/kbn_es.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_esql_ast.mdx | 2 +- api_docs/kbn_esql_utils.mdx | 2 +- ..._esql_validation_autocomplete.devdocs.json | 6 +- api_docs/kbn_esql_validation_autocomplete.mdx | 2 +- api_docs/kbn_event_annotation_common.mdx | 2 +- api_docs/kbn_event_annotation_components.mdx | 2 +- api_docs/kbn_expandable_flyout.mdx | 2 +- api_docs/kbn_field_types.mdx | 2 +- api_docs/kbn_field_utils.devdocs.json | 58 ++++++++ api_docs/kbn_field_utils.mdx | 4 +- api_docs/kbn_find_used_node_modules.mdx | 2 +- api_docs/kbn_formatters.mdx | 2 +- .../kbn_ftr_common_functional_services.mdx | 2 +- .../kbn_ftr_common_functional_ui_services.mdx | 2 +- api_docs/kbn_generate.mdx | 2 +- api_docs/kbn_generate_console_definitions.mdx | 2 +- api_docs/kbn_generate_csv.mdx | 2 +- api_docs/kbn_guided_onboarding.mdx | 2 +- api_docs/kbn_handlebars.mdx | 2 +- api_docs/kbn_hapi_mocks.mdx | 2 +- api_docs/kbn_health_gateway_server.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_i18n_react.mdx | 2 +- api_docs/kbn_import_resolver.mdx | 2 +- api_docs/kbn_index_management.mdx | 2 +- api_docs/kbn_inference_integration_flyout.mdx | 2 +- api_docs/kbn_infra_forge.mdx | 2 +- api_docs/kbn_interpreter.mdx | 2 +- api_docs/kbn_io_ts_utils.mdx | 2 +- api_docs/kbn_ipynb.mdx | 2 +- api_docs/kbn_jest_serializers.mdx | 2 +- api_docs/kbn_journeys.mdx | 2 +- api_docs/kbn_json_ast.mdx | 2 +- api_docs/kbn_kibana_manifest_schema.mdx | 2 +- .../kbn_language_documentation_popover.mdx | 2 +- api_docs/kbn_lens_embeddable_utils.mdx | 2 +- api_docs/kbn_lens_formula_docs.mdx | 2 +- api_docs/kbn_logging.mdx | 2 +- api_docs/kbn_logging_mocks.mdx | 2 +- api_docs/kbn_managed_content_badge.mdx | 2 +- api_docs/kbn_managed_vscode_config.mdx | 2 +- api_docs/kbn_management_cards_navigation.mdx | 2 +- .../kbn_management_settings_application.mdx | 2 +- ...ent_settings_components_field_category.mdx | 2 +- ...gement_settings_components_field_input.mdx | 2 +- ...nagement_settings_components_field_row.mdx | 2 +- ...bn_management_settings_components_form.mdx | 2 +- ...n_management_settings_field_definition.mdx | 2 +- api_docs/kbn_management_settings_ids.mdx | 2 +- ...n_management_settings_section_registry.mdx | 2 +- api_docs/kbn_management_settings_types.mdx | 2 +- .../kbn_management_settings_utilities.mdx | 2 +- api_docs/kbn_management_storybook_config.mdx | 2 +- api_docs/kbn_mapbox_gl.mdx | 2 +- api_docs/kbn_maps_vector_tile_utils.mdx | 2 +- api_docs/kbn_ml_agg_utils.mdx | 2 +- api_docs/kbn_ml_anomaly_utils.mdx | 2 +- api_docs/kbn_ml_cancellable_search.mdx | 2 +- api_docs/kbn_ml_category_validator.mdx | 2 +- api_docs/kbn_ml_chi2test.mdx | 2 +- .../kbn_ml_data_frame_analytics_utils.mdx | 2 +- api_docs/kbn_ml_data_grid.mdx | 2 +- api_docs/kbn_ml_date_picker.mdx | 2 +- api_docs/kbn_ml_date_utils.mdx | 2 +- api_docs/kbn_ml_error_utils.mdx | 2 +- api_docs/kbn_ml_in_memory_table.mdx | 2 +- api_docs/kbn_ml_is_defined.mdx | 2 +- api_docs/kbn_ml_is_populated_object.mdx | 2 +- api_docs/kbn_ml_kibana_theme.mdx | 2 +- api_docs/kbn_ml_local_storage.mdx | 2 +- api_docs/kbn_ml_nested_property.mdx | 2 +- api_docs/kbn_ml_number_utils.mdx | 2 +- api_docs/kbn_ml_query_utils.mdx | 2 +- api_docs/kbn_ml_random_sampler_utils.mdx | 2 +- api_docs/kbn_ml_route_utils.mdx | 2 +- api_docs/kbn_ml_runtime_field_utils.mdx | 2 +- api_docs/kbn_ml_string_hash.mdx | 2 +- api_docs/kbn_ml_time_buckets.mdx | 2 +- api_docs/kbn_ml_trained_models_utils.mdx | 2 +- api_docs/kbn_ml_ui_actions.mdx | 2 +- api_docs/kbn_ml_url_state.mdx | 2 +- api_docs/kbn_mock_idp_utils.mdx | 2 +- api_docs/kbn_monaco.mdx | 2 +- api_docs/kbn_object_versioning.mdx | 2 +- ...n_observability_alert_details.devdocs.json | 4 +- api_docs/kbn_observability_alert_details.mdx | 2 +- .../kbn_observability_alerting_test_data.mdx | 2 +- ...ility_get_padded_alert_time_range_util.mdx | 2 +- api_docs/kbn_openapi_bundler.mdx | 2 +- api_docs/kbn_openapi_generator.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_panel_loader.mdx | 2 +- ..._performance_testing_dataset_extractor.mdx | 2 +- api_docs/kbn_plugin_check.mdx | 2 +- api_docs/kbn_plugin_generator.mdx | 2 +- api_docs/kbn_plugin_helpers.mdx | 2 +- api_docs/kbn_presentation_containers.mdx | 2 +- api_docs/kbn_presentation_publishing.mdx | 2 +- api_docs/kbn_profiling_utils.mdx | 2 +- api_docs/kbn_random_sampling.mdx | 2 +- api_docs/kbn_react_field.mdx | 2 +- api_docs/kbn_react_hooks.mdx | 2 +- api_docs/kbn_react_kibana_context_common.mdx | 2 +- api_docs/kbn_react_kibana_context_render.mdx | 2 +- api_docs/kbn_react_kibana_context_root.mdx | 2 +- api_docs/kbn_react_kibana_context_styled.mdx | 2 +- api_docs/kbn_react_kibana_context_theme.mdx | 2 +- api_docs/kbn_react_kibana_mount.mdx | 2 +- api_docs/kbn_repo_file_maps.mdx | 2 +- api_docs/kbn_repo_linter.mdx | 2 +- api_docs/kbn_repo_path.mdx | 2 +- api_docs/kbn_repo_source_classifier.mdx | 2 +- api_docs/kbn_reporting_common.mdx | 2 +- api_docs/kbn_reporting_csv_share_panel.mdx | 2 +- api_docs/kbn_reporting_export_types_csv.mdx | 2 +- .../kbn_reporting_export_types_csv_common.mdx | 2 +- api_docs/kbn_reporting_export_types_pdf.mdx | 2 +- .../kbn_reporting_export_types_pdf_common.mdx | 2 +- api_docs/kbn_reporting_export_types_png.mdx | 2 +- .../kbn_reporting_export_types_png_common.mdx | 2 +- api_docs/kbn_reporting_mocks_server.mdx | 2 +- api_docs/kbn_reporting_public.mdx | 2 +- api_docs/kbn_reporting_server.mdx | 2 +- api_docs/kbn_resizable_layout.mdx | 2 +- api_docs/kbn_rison.mdx | 2 +- api_docs/kbn_router_to_openapispec.mdx | 2 +- api_docs/kbn_router_utils.mdx | 2 +- api_docs/kbn_rrule.mdx | 2 +- api_docs/kbn_rule_data_utils.mdx | 2 +- api_docs/kbn_saved_objects_settings.mdx | 2 +- api_docs/kbn_search_api_panels.mdx | 2 +- api_docs/kbn_search_connectors.mdx | 2 +- api_docs/kbn_search_errors.mdx | 2 +- api_docs/kbn_search_index_documents.mdx | 2 +- api_docs/kbn_search_response_warnings.mdx | 2 +- api_docs/kbn_search_types.mdx | 2 +- api_docs/kbn_security_hardening.mdx | 2 +- api_docs/kbn_security_plugin_types_common.mdx | 2 +- api_docs/kbn_security_plugin_types_public.mdx | 2 +- api_docs/kbn_security_plugin_types_server.mdx | 2 +- api_docs/kbn_security_solution_features.mdx | 2 +- api_docs/kbn_security_solution_navigation.mdx | 2 +- api_docs/kbn_security_solution_side_nav.mdx | 2 +- ...kbn_security_solution_storybook_config.mdx | 2 +- .../kbn_securitysolution_autocomplete.mdx | 2 +- api_docs/kbn_securitysolution_data_table.mdx | 2 +- api_docs/kbn_securitysolution_ecs.mdx | 2 +- api_docs/kbn_securitysolution_es_utils.mdx | 2 +- ...ritysolution_exception_list_components.mdx | 2 +- api_docs/kbn_securitysolution_grouping.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_serverless_common_settings.mdx | 2 +- .../kbn_serverless_observability_settings.mdx | 2 +- api_docs/kbn_serverless_project_switcher.mdx | 2 +- api_docs/kbn_serverless_search_settings.mdx | 2 +- api_docs/kbn_serverless_security_settings.mdx | 2 +- api_docs/kbn_serverless_storybook_config.mdx | 2 +- api_docs/kbn_shared_svg.mdx | 2 +- api_docs/kbn_shared_ux_avatar_solution.mdx | 2 +- .../kbn_shared_ux_button_exit_full_screen.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_chrome_navigation.mdx | 2 +- api_docs/kbn_shared_ux_error_boundary.mdx | 2 +- api_docs/kbn_shared_ux_file_context.mdx | 2 +- api_docs/kbn_shared_ux_file_image.mdx | 2 +- api_docs/kbn_shared_ux_file_image_mocks.mdx | 2 +- api_docs/kbn_shared_ux_file_mocks.mdx | 2 +- api_docs/kbn_shared_ux_file_picker.mdx | 2 +- api_docs/kbn_shared_ux_file_types.mdx | 2 +- api_docs/kbn_shared_ux_file_upload.mdx | 2 +- api_docs/kbn_shared_ux_file_util.mdx | 2 +- api_docs/kbn_shared_ux_link_redirect_app.mdx | 2 +- .../kbn_shared_ux_link_redirect_app_mocks.mdx | 2 +- api_docs/kbn_shared_ux_markdown.mdx | 2 +- api_docs/kbn_shared_ux_markdown_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_prompt_not_found.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_tabbed_modal.mdx | 2 +- api_docs/kbn_shared_ux_utility.mdx | 2 +- api_docs/kbn_slo_schema.mdx | 2 +- api_docs/kbn_solution_nav_es.mdx | 2 +- api_docs/kbn_solution_nav_oblt.mdx | 2 +- api_docs/kbn_some_dev_log.mdx | 2 +- api_docs/kbn_sort_predicates.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_eui_helpers.mdx | 2 +- api_docs/kbn_test_jest_helpers.mdx | 2 +- api_docs/kbn_test_subj_selector.mdx | 2 +- api_docs/kbn_text_based_editor.mdx | 2 +- api_docs/kbn_timerange.mdx | 2 +- api_docs/kbn_tooling_log.mdx | 2 +- api_docs/kbn_triggers_actions_ui_types.mdx | 2 +- api_docs/kbn_ts_projects.mdx | 2 +- api_docs/kbn_typed_react_router_config.mdx | 2 +- api_docs/kbn_ui_actions_browser.mdx | 2 +- api_docs/kbn_ui_shared_deps_src.mdx | 2 +- api_docs/kbn_ui_theme.mdx | 2 +- api_docs/kbn_unified_data_table.mdx | 2 +- api_docs/kbn_unified_doc_viewer.mdx | 2 +- api_docs/kbn_unified_field_list.mdx | 2 +- api_docs/kbn_unsaved_changes_badge.mdx | 2 +- api_docs/kbn_use_tracked_promise.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_visualization_ui_components.mdx | 2 +- api_docs/kbn_visualization_utils.mdx | 2 +- api_docs/kbn_xstate_utils.mdx | 2 +- api_docs/kbn_yarn_lock_validator.mdx | 2 +- api_docs/kbn_zod_helpers.mdx | 2 +- api_docs/kibana_overview.mdx | 2 +- api_docs/kibana_react.devdocs.json | 92 ------------- 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/links.mdx | 2 +- api_docs/lists.mdx | 2 +- api_docs/logs_explorer.mdx | 2 +- api_docs/logs_shared.mdx | 2 +- api_docs/management.mdx | 2 +- api_docs/maps.devdocs.json | 85 +++++++++++- api_docs/maps.mdx | 4 +- api_docs/maps_ems.mdx | 2 +- api_docs/metrics_data_access.mdx | 2 +- api_docs/ml.mdx | 2 +- api_docs/mock_idp_plugin.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/no_data_page.mdx | 2 +- api_docs/notifications.mdx | 2 +- api_docs/observability.mdx | 2 +- .../observability_a_i_assistant.devdocs.json | 4 +- api_docs/observability_a_i_assistant.mdx | 2 +- api_docs/observability_a_i_assistant_app.mdx | 2 +- .../observability_ai_assistant_management.mdx | 2 +- api_docs/observability_logs_explorer.mdx | 2 +- api_docs/observability_onboarding.mdx | 2 +- api_docs/observability_shared.mdx | 2 +- api_docs/osquery.devdocs.json | 4 +- api_docs/osquery.mdx | 2 +- api_docs/painless_lab.mdx | 2 +- api_docs/plugin_directory.mdx | 14 +- api_docs/presentation_panel.mdx | 2 +- api_docs/presentation_util.mdx | 2 +- api_docs/profiling.mdx | 2 +- api_docs/profiling_data_access.mdx | 2 +- api_docs/remote_clusters.mdx | 2 +- api_docs/reporting.mdx | 2 +- api_docs/rollup.mdx | 2 +- api_docs/rule_registry.devdocs.json | 10 +- 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/search_connectors.mdx | 2 +- api_docs/search_notebooks.mdx | 2 +- api_docs/search_playground.mdx | 2 +- api_docs/security.mdx | 2 +- api_docs/security_solution.devdocs.json | 12 +- api_docs/security_solution.mdx | 2 +- api_docs/security_solution_ess.mdx | 2 +- api_docs/security_solution_serverless.mdx | 2 +- api_docs/serverless.mdx | 2 +- api_docs/serverless_observability.mdx | 2 +- api_docs/serverless_search.mdx | 2 +- api_docs/session_view.mdx | 2 +- api_docs/share.mdx | 2 +- api_docs/slo.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/text_based_languages.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_doc_viewer.mdx | 2 +- api_docs/unified_histogram.mdx | 2 +- api_docs/unified_search.mdx | 2 +- api_docs/unified_search_autocomplete.mdx | 2 +- api_docs/uptime.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 +- 704 files changed, 1123 insertions(+), 880 deletions(-) diff --git a/api_docs/actions.mdx b/api_docs/actions.mdx index 0024b7036c12d..c97a28a953e22 100644 --- a/api_docs/actions.mdx +++ b/api_docs/actions.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/actions title: "actions" image: https://source.unsplash.com/400x175/?github description: API docs for the actions plugin -date: 2024-05-07 +date: 2024-05-08 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 40537f6bc3efa..472ab50fccc8e 100644 --- a/api_docs/advanced_settings.mdx +++ b/api_docs/advanced_settings.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/advancedSettings title: "advancedSettings" image: https://source.unsplash.com/400x175/?github description: API docs for the advancedSettings plugin -date: 2024-05-07 +date: 2024-05-08 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'advancedSettings'] --- import advancedSettingsObj from './advanced_settings.devdocs.json'; diff --git a/api_docs/ai_assistant_management_selection.mdx b/api_docs/ai_assistant_management_selection.mdx index 9c66f645d9e99..19cf332deff9a 100644 --- a/api_docs/ai_assistant_management_selection.mdx +++ b/api_docs/ai_assistant_management_selection.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/aiAssistantManagementSelection title: "aiAssistantManagementSelection" image: https://source.unsplash.com/400x175/?github description: API docs for the aiAssistantManagementSelection plugin -date: 2024-05-07 +date: 2024-05-08 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'aiAssistantManagementSelection'] --- import aiAssistantManagementSelectionObj from './ai_assistant_management_selection.devdocs.json'; diff --git a/api_docs/aiops.mdx b/api_docs/aiops.mdx index 535eaf0b3c3d6..9c0942af8f184 100644 --- a/api_docs/aiops.mdx +++ b/api_docs/aiops.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/aiops title: "aiops" image: https://source.unsplash.com/400x175/?github description: API docs for the aiops plugin -date: 2024-05-07 +date: 2024-05-08 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 e90c347a9bcd1..4f331e34794a4 100644 --- a/api_docs/alerting.mdx +++ b/api_docs/alerting.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/alerting title: "alerting" image: https://source.unsplash.com/400x175/?github description: API docs for the alerting plugin -date: 2024-05-07 +date: 2024-05-08 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'alerting'] --- import alertingObj from './alerting.devdocs.json'; diff --git a/api_docs/apm.devdocs.json b/api_docs/apm.devdocs.json index 284c66b4eb5c9..d7cac23f6082c 100644 --- a/api_docs/apm.devdocs.json +++ b/api_docs/apm.devdocs.json @@ -418,7 +418,7 @@ "label": "APIEndpoint", "description": [], "signature": [ - "\"POST /internal/apm/data_view/static\" | \"GET /internal/apm/data_view/index_pattern\" | \"GET /internal/apm/environments\" | \"GET /internal/apm/services/{serviceName}/errors/groups/main_statistics\" | \"GET /internal/apm/services/{serviceName}/errors/groups/main_statistics_by_transaction_name\" | \"POST /internal/apm/services/{serviceName}/errors/groups/detailed_statistics\" | \"GET /internal/apm/services/{serviceName}/errors/{groupId}/samples\" | \"GET /internal/apm/services/{serviceName}/errors/{groupId}/error/{errorId}\" | \"GET /internal/apm/services/{serviceName}/errors/distribution\" | \"GET /internal/apm/services/{serviceName}/errors/{groupId}/top_erroneous_transactions\" | \"POST /internal/apm/latency/overall_distribution/transactions\" | \"GET /internal/apm/services/{serviceName}/metrics/charts\" | \"GET /internal/apm/services/{serviceName}/metrics/nodes\" | \"GET /internal/apm/services/{serviceName}/metrics/serverless/charts\" | \"GET /internal/apm/services/{serviceName}/metrics/serverless/summary\" | \"GET /internal/apm/services/{serviceName}/metrics/serverless/functions_overview\" | \"GET /internal/apm/services/{serviceName}/metrics/serverless/active_instances\" | \"GET /internal/apm/observability_overview\" | \"GET /internal/apm/observability_overview/has_data\" | \"GET /internal/apm/service-map\" | \"GET /internal/apm/service-map/service/{serviceName}\" | \"GET /internal/apm/service-map/dependency\" | \"GET /internal/apm/services\" | \"POST /internal/apm/services/detailed_statistics\" | \"GET /internal/apm/services/{serviceName}/metadata/details\" | \"GET /internal/apm/services/{serviceName}/metadata/icons\" | \"GET /internal/apm/services/{serviceName}/agent\" | \"GET /internal/apm/services/{serviceName}/transaction_types\" | \"GET /internal/apm/services/{serviceName}/node/{serviceNodeName}/metadata\" | \"GET /api/apm/services/{serviceName}/annotation/search 2023-10-31\" | \"POST /api/apm/services/{serviceName}/annotation 2023-10-31\" | \"GET /internal/apm/services/{serviceName}/service_overview_instances/details/{serviceNodeName}\" | \"GET /internal/apm/services/{serviceName}/throughput\" | \"GET /internal/apm/services/{serviceName}/service_overview_instances/main_statistics\" | \"GET /internal/apm/services/{serviceName}/service_overview_instances/detailed_statistics\" | \"GET /internal/apm/services/{serviceName}/dependencies\" | \"GET /internal/apm/services/{serviceName}/dependencies/breakdown\" | \"GET /internal/apm/services/{serviceName}/anomaly_charts\" | \"GET /internal/apm/services/{serviceName}/alerts_count\" | \"GET /internal/apm/service-groups\" | \"GET /internal/apm/service-group\" | \"POST /internal/apm/service-group\" | \"DELETE /internal/apm/service-group\" | \"GET /internal/apm/service-group/services\" | \"GET /internal/apm/service-group/counts\" | \"GET /internal/apm/suggestions\" | \"GET /internal/apm/traces/{traceId}\" | \"GET /internal/apm/traces\" | \"GET /internal/apm/traces/{traceId}/root_transaction\" | \"GET /internal/apm/transactions/{transactionId}\" | \"GET /internal/apm/traces/find\" | \"POST /internal/apm/traces/aggregated_critical_path\" | \"GET /internal/apm/traces/{traceId}/transactions/{transactionId}\" | \"GET /internal/apm/traces/{traceId}/spans/{spanId}\" | \"GET /internal/apm/transactions\" | \"GET /internal/apm/services/{serviceName}/transactions/groups/main_statistics\" | \"GET /internal/apm/services/{serviceName}/transactions/groups/detailed_statistics\" | \"GET /internal/apm/services/{serviceName}/transactions/charts/latency\" | \"GET /internal/apm/services/{serviceName}/transactions/traces/samples\" | \"GET /internal/apm/services/{serviceName}/transaction/charts/breakdown\" | \"GET /internal/apm/services/{serviceName}/transactions/charts/error_rate\" | \"GET /internal/apm/services/{serviceName}/transactions/charts/coldstart_rate\" | \"GET /internal/apm/services/{serviceName}/transactions/charts/coldstart_rate_by_transaction_name\" | \"GET /internal/apm/rule_types/transaction_error_rate/chart_preview\" | \"GET /internal/apm/rule_types/error_count/chart_preview\" | \"GET /internal/apm/rule_types/transaction_duration/chart_preview\" | \"GET /api/apm/settings/agent-configuration 2023-10-31\" | \"GET /api/apm/settings/agent-configuration/view 2023-10-31\" | \"DELETE /api/apm/settings/agent-configuration 2023-10-31\" | \"PUT /api/apm/settings/agent-configuration 2023-10-31\" | \"POST /api/apm/settings/agent-configuration/search 2023-10-31\" | \"GET /api/apm/settings/agent-configuration/environments 2023-10-31\" | \"GET /api/apm/settings/agent-configuration/agent_name 2023-10-31\" | \"GET /internal/apm/settings/anomaly-detection/jobs\" | \"POST /internal/apm/settings/anomaly-detection/jobs\" | \"GET /internal/apm/settings/anomaly-detection/environments\" | \"POST /internal/apm/settings/anomaly-detection/update_to_v3\" | \"GET /internal/apm/settings/apm-index-settings\" | \"GET /internal/apm/settings/apm-indices\" | \"POST /internal/apm/settings/apm-indices/save\" | \"GET /internal/apm/settings/custom_links/transaction\" | \"GET /internal/apm/settings/custom_links\" | \"POST /internal/apm/settings/custom_links\" | \"PUT /internal/apm/settings/custom_links/{id}\" | \"DELETE /internal/apm/settings/custom_links/{id}\" | \"GET /api/apm/sourcemaps 2023-10-31\" | \"POST /api/apm/sourcemaps 2023-10-31\" | \"DELETE /api/apm/sourcemaps/{id} 2023-10-31\" | \"POST /internal/apm/sourcemaps/migrate_fleet_artifacts\" | \"GET /internal/apm/fleet/has_apm_policies\" | \"GET /internal/apm/fleet/agents\" | \"POST /api/apm/fleet/apm_server_schema 2023-10-31\" | \"GET /internal/apm/fleet/apm_server_schema/unsupported\" | \"GET /internal/apm/fleet/migration_check\" | \"POST /internal/apm/fleet/cloud_apm_package_policy\" | \"GET /internal/apm/fleet/java_agent_versions\" | \"GET /internal/apm/dependencies/top_dependencies\" | \"GET /internal/apm/dependencies/upstream_services\" | \"GET /internal/apm/dependencies/metadata\" | \"GET /internal/apm/dependencies/charts/latency\" | \"GET /internal/apm/dependencies/charts/throughput\" | \"GET /internal/apm/dependencies/charts/error_rate\" | \"GET /internal/apm/dependencies/operations\" | \"GET /internal/apm/dependencies/charts/distribution\" | \"GET /internal/apm/dependencies/operations/spans\" | \"GET /internal/apm/correlations/field_candidates/transactions\" | \"GET /internal/apm/correlations/field_value_stats/transactions\" | \"POST /internal/apm/correlations/field_value_pairs/transactions\" | \"POST /internal/apm/correlations/significant_correlations/transactions\" | \"POST /internal/apm/correlations/p_values/transactions\" | \"GET /internal/apm/fallback_to_transactions\" | \"GET /internal/apm/has_data\" | \"GET /internal/apm/event_metadata/{processorEvent}/{id}\" | \"GET /internal/apm/agent_keys\" | \"GET /internal/apm/agent_keys/privileges\" | \"POST /internal/apm/api_key/invalidate\" | \"POST /api/apm/agent_keys 2023-10-31\" | \"GET /internal/apm/storage_explorer\" | \"GET /internal/apm/services/{serviceName}/storage_details\" | \"GET /internal/apm/storage_chart\" | \"GET /internal/apm/storage_explorer/privileges\" | \"GET /internal/apm/storage_explorer_summary_stats\" | \"GET /internal/apm/storage_explorer/is_cross_cluster_search\" | \"GET /internal/apm/storage_explorer/get_services\" | \"GET /internal/apm/traces/{traceId}/span_links/{spanId}/parents\" | \"GET /internal/apm/traces/{traceId}/span_links/{spanId}/children\" | \"GET /internal/apm/services/{serviceName}/infrastructure_attributes\" | \"GET /internal/apm/debug-telemetry\" | \"GET /internal/apm/time_range_metadata\" | \"GET /internal/apm/settings/labs\" | \"GET /internal/apm/get_agents_per_service\" | \"GET /internal/apm/get_latest_agent_versions\" | \"GET /internal/apm/services/{serviceName}/agent_instances\" | \"GET /internal/apm/mobile-services/{serviceName}/error/http_error_rate\" | \"GET /internal/apm/mobile-services/{serviceName}/errors/groups/main_statistics\" | \"POST /internal/apm/mobile-services/{serviceName}/errors/groups/detailed_statistics\" | \"GET /internal/apm/mobile-services/{serviceName}/error_terms\" | \"POST /internal/apm/mobile-services/{serviceName}/crashes/groups/detailed_statistics\" | \"GET /internal/apm/mobile-services/{serviceName}/crashes/groups/main_statistics\" | \"GET /internal/apm/mobile-services/{serviceName}/crashes/distribution\" | \"GET /internal/apm/services/{serviceName}/mobile/filters\" | \"GET /internal/apm/mobile-services/{serviceName}/most_used_charts\" | \"GET /internal/apm/mobile-services/{serviceName}/transactions/charts/sessions\" | \"GET /internal/apm/mobile-services/{serviceName}/transactions/charts/http_requests\" | \"GET /internal/apm/mobile-services/{serviceName}/stats\" | \"GET /internal/apm/mobile-services/{serviceName}/location/stats\" | \"GET /internal/apm/mobile-services/{serviceName}/terms\" | \"GET /internal/apm/mobile-services/{serviceName}/main_statistics\" | \"GET /internal/apm/mobile-services/{serviceName}/detailed_statistics\" | \"GET /internal/apm/diagnostics\" | \"POST /internal/apm/assistant/get_apm_timeseries\" | \"GET /internal/apm/assistant/get_downstream_dependencies\" | \"GET /internal/apm/services/{serviceName}/profiling/flamegraph\" | \"GET /internal/apm/profiling/status\" | \"GET /internal/apm/services/{serviceName}/profiling/functions\" | \"GET /internal/apm/services/{serviceName}/profiling/hosts/flamegraph\" | \"GET /internal/apm/services/{serviceName}/profiling/hosts/functions\" | \"POST /internal/apm/custom-dashboard\" | \"DELETE /internal/apm/custom-dashboard\" | \"GET /internal/apm/services/{serviceName}/dashboards\"" + "\"POST /internal/apm/data_view/static\" | \"GET /internal/apm/data_view/index_pattern\" | \"GET /internal/apm/environments\" | \"GET /internal/apm/services/{serviceName}/errors/groups/main_statistics\" | \"GET /internal/apm/services/{serviceName}/errors/groups/main_statistics_by_transaction_name\" | \"POST /internal/apm/services/{serviceName}/errors/groups/detailed_statistics\" | \"GET /internal/apm/services/{serviceName}/errors/{groupId}/samples\" | \"GET /internal/apm/services/{serviceName}/errors/{groupId}/error/{errorId}\" | \"GET /internal/apm/services/{serviceName}/errors/distribution\" | \"GET /internal/apm/services/{serviceName}/errors/{groupId}/top_erroneous_transactions\" | \"POST /internal/apm/latency/overall_distribution/transactions\" | \"GET /internal/apm/services/{serviceName}/metrics/charts\" | \"GET /internal/apm/services/{serviceName}/metrics/nodes\" | \"GET /internal/apm/services/{serviceName}/metrics/serverless/charts\" | \"GET /internal/apm/services/{serviceName}/metrics/serverless/summary\" | \"GET /internal/apm/services/{serviceName}/metrics/serverless/functions_overview\" | \"GET /internal/apm/services/{serviceName}/metrics/serverless/active_instances\" | \"GET /internal/apm/observability_overview\" | \"GET /internal/apm/observability_overview/has_data\" | \"GET /internal/apm/service-map\" | \"GET /internal/apm/service-map/service/{serviceName}\" | \"GET /internal/apm/service-map/dependency\" | \"GET /internal/apm/services\" | \"POST /internal/apm/services/detailed_statistics\" | \"GET /internal/apm/services/{serviceName}/metadata/details\" | \"GET /internal/apm/services/{serviceName}/metadata/icons\" | \"GET /internal/apm/services/{serviceName}/agent\" | \"GET /internal/apm/services/{serviceName}/transaction_types\" | \"GET /internal/apm/services/{serviceName}/node/{serviceNodeName}/metadata\" | \"GET /api/apm/services/{serviceName}/annotation/search 2023-10-31\" | \"POST /api/apm/services/{serviceName}/annotation 2023-10-31\" | \"GET /internal/apm/services/{serviceName}/service_overview_instances/details/{serviceNodeName}\" | \"GET /internal/apm/services/{serviceName}/throughput\" | \"GET /internal/apm/services/{serviceName}/service_overview_instances/main_statistics\" | \"GET /internal/apm/services/{serviceName}/service_overview_instances/detailed_statistics\" | \"GET /internal/apm/services/{serviceName}/dependencies\" | \"GET /internal/apm/services/{serviceName}/dependencies/breakdown\" | \"GET /internal/apm/services/{serviceName}/anomaly_charts\" | \"GET /internal/apm/services/{serviceName}/alerts_count\" | \"GET /internal/apm/assets/services\" | \"GET /internal/apm/service-groups\" | \"GET /internal/apm/service-group\" | \"POST /internal/apm/service-group\" | \"DELETE /internal/apm/service-group\" | \"GET /internal/apm/service-group/services\" | \"GET /internal/apm/service-group/counts\" | \"GET /internal/apm/suggestions\" | \"GET /internal/apm/traces/{traceId}\" | \"GET /internal/apm/traces\" | \"GET /internal/apm/traces/{traceId}/root_transaction\" | \"GET /internal/apm/transactions/{transactionId}\" | \"GET /internal/apm/traces/find\" | \"POST /internal/apm/traces/aggregated_critical_path\" | \"GET /internal/apm/traces/{traceId}/transactions/{transactionId}\" | \"GET /internal/apm/traces/{traceId}/spans/{spanId}\" | \"GET /internal/apm/transactions\" | \"GET /internal/apm/services/{serviceName}/transactions/groups/main_statistics\" | \"GET /internal/apm/services/{serviceName}/transactions/groups/detailed_statistics\" | \"GET /internal/apm/services/{serviceName}/transactions/charts/latency\" | \"GET /internal/apm/services/{serviceName}/transactions/traces/samples\" | \"GET /internal/apm/services/{serviceName}/transaction/charts/breakdown\" | \"GET /internal/apm/services/{serviceName}/transactions/charts/error_rate\" | \"GET /internal/apm/services/{serviceName}/transactions/charts/coldstart_rate\" | \"GET /internal/apm/services/{serviceName}/transactions/charts/coldstart_rate_by_transaction_name\" | \"GET /internal/apm/rule_types/transaction_error_rate/chart_preview\" | \"GET /internal/apm/rule_types/error_count/chart_preview\" | \"GET /internal/apm/rule_types/transaction_duration/chart_preview\" | \"GET /api/apm/settings/agent-configuration 2023-10-31\" | \"GET /api/apm/settings/agent-configuration/view 2023-10-31\" | \"DELETE /api/apm/settings/agent-configuration 2023-10-31\" | \"PUT /api/apm/settings/agent-configuration 2023-10-31\" | \"POST /api/apm/settings/agent-configuration/search 2023-10-31\" | \"GET /api/apm/settings/agent-configuration/environments 2023-10-31\" | \"GET /api/apm/settings/agent-configuration/agent_name 2023-10-31\" | \"GET /internal/apm/settings/anomaly-detection/jobs\" | \"POST /internal/apm/settings/anomaly-detection/jobs\" | \"GET /internal/apm/settings/anomaly-detection/environments\" | \"POST /internal/apm/settings/anomaly-detection/update_to_v3\" | \"GET /internal/apm/settings/apm-index-settings\" | \"GET /internal/apm/settings/apm-indices\" | \"POST /internal/apm/settings/apm-indices/save\" | \"GET /internal/apm/settings/custom_links/transaction\" | \"GET /internal/apm/settings/custom_links\" | \"POST /internal/apm/settings/custom_links\" | \"PUT /internal/apm/settings/custom_links/{id}\" | \"DELETE /internal/apm/settings/custom_links/{id}\" | \"GET /api/apm/sourcemaps 2023-10-31\" | \"POST /api/apm/sourcemaps 2023-10-31\" | \"DELETE /api/apm/sourcemaps/{id} 2023-10-31\" | \"POST /internal/apm/sourcemaps/migrate_fleet_artifacts\" | \"GET /internal/apm/fleet/has_apm_policies\" | \"GET /internal/apm/fleet/agents\" | \"POST /api/apm/fleet/apm_server_schema 2023-10-31\" | \"GET /internal/apm/fleet/apm_server_schema/unsupported\" | \"GET /internal/apm/fleet/migration_check\" | \"POST /internal/apm/fleet/cloud_apm_package_policy\" | \"GET /internal/apm/fleet/java_agent_versions\" | \"GET /internal/apm/dependencies/top_dependencies\" | \"GET /internal/apm/dependencies/upstream_services\" | \"GET /internal/apm/dependencies/metadata\" | \"GET /internal/apm/dependencies/charts/latency\" | \"GET /internal/apm/dependencies/charts/throughput\" | \"GET /internal/apm/dependencies/charts/error_rate\" | \"GET /internal/apm/dependencies/operations\" | \"GET /internal/apm/dependencies/charts/distribution\" | \"GET /internal/apm/dependencies/operations/spans\" | \"GET /internal/apm/correlations/field_candidates/transactions\" | \"GET /internal/apm/correlations/field_value_stats/transactions\" | \"POST /internal/apm/correlations/field_value_pairs/transactions\" | \"POST /internal/apm/correlations/significant_correlations/transactions\" | \"POST /internal/apm/correlations/p_values/transactions\" | \"GET /internal/apm/fallback_to_transactions\" | \"GET /internal/apm/has_data\" | \"GET /internal/apm/event_metadata/{processorEvent}/{id}\" | \"GET /internal/apm/agent_keys\" | \"GET /internal/apm/agent_keys/privileges\" | \"POST /internal/apm/api_key/invalidate\" | \"POST /api/apm/agent_keys 2023-10-31\" | \"GET /internal/apm/storage_explorer\" | \"GET /internal/apm/services/{serviceName}/storage_details\" | \"GET /internal/apm/storage_chart\" | \"GET /internal/apm/storage_explorer/privileges\" | \"GET /internal/apm/storage_explorer_summary_stats\" | \"GET /internal/apm/storage_explorer/is_cross_cluster_search\" | \"GET /internal/apm/storage_explorer/get_services\" | \"GET /internal/apm/traces/{traceId}/span_links/{spanId}/parents\" | \"GET /internal/apm/traces/{traceId}/span_links/{spanId}/children\" | \"GET /internal/apm/services/{serviceName}/infrastructure_attributes\" | \"GET /internal/apm/debug-telemetry\" | \"GET /internal/apm/time_range_metadata\" | \"GET /internal/apm/settings/labs\" | \"GET /internal/apm/get_agents_per_service\" | \"GET /internal/apm/get_latest_agent_versions\" | \"GET /internal/apm/services/{serviceName}/agent_instances\" | \"GET /internal/apm/mobile-services/{serviceName}/error/http_error_rate\" | \"GET /internal/apm/mobile-services/{serviceName}/errors/groups/main_statistics\" | \"POST /internal/apm/mobile-services/{serviceName}/errors/groups/detailed_statistics\" | \"GET /internal/apm/mobile-services/{serviceName}/error_terms\" | \"POST /internal/apm/mobile-services/{serviceName}/crashes/groups/detailed_statistics\" | \"GET /internal/apm/mobile-services/{serviceName}/crashes/groups/main_statistics\" | \"GET /internal/apm/mobile-services/{serviceName}/crashes/distribution\" | \"GET /internal/apm/services/{serviceName}/mobile/filters\" | \"GET /internal/apm/mobile-services/{serviceName}/most_used_charts\" | \"GET /internal/apm/mobile-services/{serviceName}/transactions/charts/sessions\" | \"GET /internal/apm/mobile-services/{serviceName}/transactions/charts/http_requests\" | \"GET /internal/apm/mobile-services/{serviceName}/stats\" | \"GET /internal/apm/mobile-services/{serviceName}/location/stats\" | \"GET /internal/apm/mobile-services/{serviceName}/terms\" | \"GET /internal/apm/mobile-services/{serviceName}/main_statistics\" | \"GET /internal/apm/mobile-services/{serviceName}/detailed_statistics\" | \"GET /internal/apm/diagnostics\" | \"POST /internal/apm/assistant/get_apm_timeseries\" | \"GET /internal/apm/assistant/get_downstream_dependencies\" | \"GET /internal/apm/services/{serviceName}/profiling/flamegraph\" | \"GET /internal/apm/profiling/status\" | \"GET /internal/apm/services/{serviceName}/profiling/functions\" | \"GET /internal/apm/services/{serviceName}/profiling/hosts/flamegraph\" | \"GET /internal/apm/services/{serviceName}/profiling/hosts/functions\" | \"POST /internal/apm/custom-dashboard\" | \"DELETE /internal/apm/custom-dashboard\" | \"GET /internal/apm/services/{serviceName}/dashboards\"" ], "path": "x-pack/plugins/observability_solution/apm/server/routes/apm_routes/get_global_apm_server_route_repository.ts", "deprecated": false, @@ -5661,6 +5661,26 @@ "SavedServiceGroup", "[]; }>; } & ", "APMRouteCreateOptions", + "; \"GET /internal/apm/assets/services\": { endpoint: \"GET /internal/apm/assets/services\"; params?: ", + "TypeC", + "<{ query: ", + "IntersectionC", + "<[", + "TypeC", + "<{ kuery: ", + "StringC", + "; }>, ", + "TypeC", + "<{ start: ", + "Type", + "; end: ", + "Type", + "; }>]>; }> | undefined; handler: ({}: ", + "APMRouteHandlerResources", + " & { params: { query: { kuery: string; } & { start: number; end: number; }; }; }) => Promise<", + "AssetServicesResponse", + ">; } & ", + "APMRouteCreateOptions", "; \"GET /internal/apm/services/{serviceName}/alerts_count\": { endpoint: \"GET /internal/apm/services/{serviceName}/alerts_count\"; params?: ", "TypeC", "<{ path: ", diff --git a/api_docs/apm.mdx b/api_docs/apm.mdx index 7c4c49462a8c6..591a7433debbe 100644 --- a/api_docs/apm.mdx +++ b/api_docs/apm.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/apm title: "apm" image: https://source.unsplash.com/400x175/?github description: API docs for the apm plugin -date: 2024-05-07 +date: 2024-05-08 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'apm'] --- import apmObj from './apm.devdocs.json'; @@ -21,7 +21,7 @@ Contact [@elastic/obs-ux-infra_services-team](https://github.com/orgs/elastic/te | Public API count | Any count | Items lacking comments | Missing exports | |-------------------|-----------|------------------------|-----------------| -| 29 | 0 | 29 | 122 | +| 29 | 0 | 29 | 123 | ## Client diff --git a/api_docs/apm_data_access.mdx b/api_docs/apm_data_access.mdx index 80a6fc8e95c48..b7e3d32e9a8d7 100644 --- a/api_docs/apm_data_access.mdx +++ b/api_docs/apm_data_access.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/apmDataAccess title: "apmDataAccess" image: https://source.unsplash.com/400x175/?github description: API docs for the apmDataAccess plugin -date: 2024-05-07 +date: 2024-05-08 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'apmDataAccess'] --- import apmDataAccessObj from './apm_data_access.devdocs.json'; diff --git a/api_docs/asset_manager.mdx b/api_docs/asset_manager.mdx index 256d8489bc172..cac5994e90206 100644 --- a/api_docs/asset_manager.mdx +++ b/api_docs/asset_manager.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/assetManager title: "assetManager" image: https://source.unsplash.com/400x175/?github description: API docs for the assetManager plugin -date: 2024-05-07 +date: 2024-05-08 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'assetManager'] --- import assetManagerObj from './asset_manager.devdocs.json'; diff --git a/api_docs/assets_data_access.mdx b/api_docs/assets_data_access.mdx index 0f888ef73cfb6..c58d9cfdda075 100644 --- a/api_docs/assets_data_access.mdx +++ b/api_docs/assets_data_access.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/assetsDataAccess title: "assetsDataAccess" image: https://source.unsplash.com/400x175/?github description: API docs for the assetsDataAccess plugin -date: 2024-05-07 +date: 2024-05-08 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'assetsDataAccess'] --- import assetsDataAccessObj from './assets_data_access.devdocs.json'; diff --git a/api_docs/banners.mdx b/api_docs/banners.mdx index 06162e4d0bdbc..da393cc648c8d 100644 --- a/api_docs/banners.mdx +++ b/api_docs/banners.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/banners title: "banners" image: https://source.unsplash.com/400x175/?github description: API docs for the banners plugin -date: 2024-05-07 +date: 2024-05-08 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 8568d66cc91a1..49fb07a7fb3e5 100644 --- a/api_docs/bfetch.mdx +++ b/api_docs/bfetch.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/bfetch title: "bfetch" image: https://source.unsplash.com/400x175/?github description: API docs for the bfetch plugin -date: 2024-05-07 +date: 2024-05-08 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 c81333834a486..9a1d982a312c9 100644 --- a/api_docs/canvas.mdx +++ b/api_docs/canvas.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/canvas title: "canvas" image: https://source.unsplash.com/400x175/?github description: API docs for the canvas plugin -date: 2024-05-07 +date: 2024-05-08 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 7405871ccccf6..073d6a34d86f4 100644 --- a/api_docs/cases.mdx +++ b/api_docs/cases.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/cases title: "cases" image: https://source.unsplash.com/400x175/?github description: API docs for the cases plugin -date: 2024-05-07 +date: 2024-05-08 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 dc1b676960da1..eef9ad6abc7d9 100644 --- a/api_docs/charts.mdx +++ b/api_docs/charts.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/charts title: "charts" image: https://source.unsplash.com/400x175/?github description: API docs for the charts plugin -date: 2024-05-07 +date: 2024-05-08 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 8230a1bbd091d..0db5f19b9d05f 100644 --- a/api_docs/cloud.mdx +++ b/api_docs/cloud.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/cloud title: "cloud" image: https://source.unsplash.com/400x175/?github description: API docs for the cloud plugin -date: 2024-05-07 +date: 2024-05-08 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'cloud'] --- import cloudObj from './cloud.devdocs.json'; diff --git a/api_docs/cloud_data_migration.mdx b/api_docs/cloud_data_migration.mdx index 98be65ddae27d..29262e6a30e50 100644 --- a/api_docs/cloud_data_migration.mdx +++ b/api_docs/cloud_data_migration.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/cloudDataMigration title: "cloudDataMigration" image: https://source.unsplash.com/400x175/?github description: API docs for the cloudDataMigration plugin -date: 2024-05-07 +date: 2024-05-08 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'cloudDataMigration'] --- import cloudDataMigrationObj from './cloud_data_migration.devdocs.json'; diff --git a/api_docs/cloud_defend.mdx b/api_docs/cloud_defend.mdx index 1fbdc26f79c5f..542cb320910d3 100644 --- a/api_docs/cloud_defend.mdx +++ b/api_docs/cloud_defend.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/cloudDefend title: "cloudDefend" image: https://source.unsplash.com/400x175/?github description: API docs for the cloudDefend plugin -date: 2024-05-07 +date: 2024-05-08 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'cloudDefend'] --- import cloudDefendObj from './cloud_defend.devdocs.json'; diff --git a/api_docs/cloud_experiments.mdx b/api_docs/cloud_experiments.mdx index a3b9f713ad2e4..2a64d3e8903ad 100644 --- a/api_docs/cloud_experiments.mdx +++ b/api_docs/cloud_experiments.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/cloudExperiments title: "cloudExperiments" image: https://source.unsplash.com/400x175/?github description: API docs for the cloudExperiments plugin -date: 2024-05-07 +date: 2024-05-08 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 f48b7e99397fb..3ba3b360af9ee 100644 --- a/api_docs/cloud_security_posture.mdx +++ b/api_docs/cloud_security_posture.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/cloudSecurityPosture title: "cloudSecurityPosture" image: https://source.unsplash.com/400x175/?github description: API docs for the cloudSecurityPosture plugin -date: 2024-05-07 +date: 2024-05-08 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 b17be506e6f25..e0a13c396ad4a 100644 --- a/api_docs/console.mdx +++ b/api_docs/console.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/console title: "console" image: https://source.unsplash.com/400x175/?github description: API docs for the console plugin -date: 2024-05-07 +date: 2024-05-08 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'console'] --- import consoleObj from './console.devdocs.json'; diff --git a/api_docs/content_management.mdx b/api_docs/content_management.mdx index 61241131bc759..c1aa80a071032 100644 --- a/api_docs/content_management.mdx +++ b/api_docs/content_management.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/contentManagement title: "contentManagement" image: https://source.unsplash.com/400x175/?github description: API docs for the contentManagement plugin -date: 2024-05-07 +date: 2024-05-08 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'contentManagement'] --- import contentManagementObj from './content_management.devdocs.json'; diff --git a/api_docs/controls.mdx b/api_docs/controls.mdx index 26d83121fe660..67f2a9474ccfe 100644 --- a/api_docs/controls.mdx +++ b/api_docs/controls.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/controls title: "controls" image: https://source.unsplash.com/400x175/?github description: API docs for the controls plugin -date: 2024-05-07 +date: 2024-05-08 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'controls'] --- import controlsObj from './controls.devdocs.json'; diff --git a/api_docs/custom_integrations.mdx b/api_docs/custom_integrations.mdx index 5ff6bb57966ff..c5fe080ae2ce2 100644 --- a/api_docs/custom_integrations.mdx +++ b/api_docs/custom_integrations.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/customIntegrations title: "customIntegrations" image: https://source.unsplash.com/400x175/?github description: API docs for the customIntegrations plugin -date: 2024-05-07 +date: 2024-05-08 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 e84bbaaba214c..9d1a5e549842b 100644 --- a/api_docs/dashboard.mdx +++ b/api_docs/dashboard.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/dashboard title: "dashboard" image: https://source.unsplash.com/400x175/?github description: API docs for the dashboard plugin -date: 2024-05-07 +date: 2024-05-08 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 fd432d385317a..79301bce42404 100644 --- a/api_docs/dashboard_enhanced.mdx +++ b/api_docs/dashboard_enhanced.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/dashboardEnhanced title: "dashboardEnhanced" image: https://source.unsplash.com/400x175/?github description: API docs for the dashboardEnhanced plugin -date: 2024-05-07 +date: 2024-05-08 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 929ad09c59515..db1c02fd0f7fe 100644 --- a/api_docs/data.mdx +++ b/api_docs/data.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/data title: "data" image: https://source.unsplash.com/400x175/?github description: API docs for the data plugin -date: 2024-05-07 +date: 2024-05-08 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 fba801c23db31..3d90c12fc736a 100644 --- a/api_docs/data_query.mdx +++ b/api_docs/data_query.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/data-query title: "data.query" image: https://source.unsplash.com/400x175/?github description: API docs for the data.query plugin -date: 2024-05-07 +date: 2024-05-08 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 8d97225e9c340..5f92e6832115b 100644 --- a/api_docs/data_search.mdx +++ b/api_docs/data_search.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/data-search title: "data.search" image: https://source.unsplash.com/400x175/?github description: API docs for the data.search plugin -date: 2024-05-07 +date: 2024-05-08 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 62ee6a25e60c3..6e3792506141f 100644 --- a/api_docs/data_view_editor.mdx +++ b/api_docs/data_view_editor.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/dataViewEditor title: "dataViewEditor" image: https://source.unsplash.com/400x175/?github description: API docs for the dataViewEditor plugin -date: 2024-05-07 +date: 2024-05-08 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 b5d9c46d50411..c7b5f38dcf75c 100644 --- a/api_docs/data_view_field_editor.mdx +++ b/api_docs/data_view_field_editor.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/dataViewFieldEditor title: "dataViewFieldEditor" image: https://source.unsplash.com/400x175/?github description: API docs for the dataViewFieldEditor plugin -date: 2024-05-07 +date: 2024-05-08 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 cae57f617679c..455a22b35ee63 100644 --- a/api_docs/data_view_management.mdx +++ b/api_docs/data_view_management.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/dataViewManagement title: "dataViewManagement" image: https://source.unsplash.com/400x175/?github description: API docs for the dataViewManagement plugin -date: 2024-05-07 +date: 2024-05-08 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 843bcf1faa316..743ccc7638e35 100644 --- a/api_docs/data_views.mdx +++ b/api_docs/data_views.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/dataViews title: "dataViews" image: https://source.unsplash.com/400x175/?github description: API docs for the dataViews plugin -date: 2024-05-07 +date: 2024-05-08 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 9cf018297f500..839abc15f799c 100644 --- a/api_docs/data_visualizer.mdx +++ b/api_docs/data_visualizer.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/dataVisualizer title: "dataVisualizer" image: https://source.unsplash.com/400x175/?github description: API docs for the dataVisualizer plugin -date: 2024-05-07 +date: 2024-05-08 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'dataVisualizer'] --- import dataVisualizerObj from './data_visualizer.devdocs.json'; diff --git a/api_docs/dataset_quality.mdx b/api_docs/dataset_quality.mdx index dcfc00e706997..dcd924fde95e4 100644 --- a/api_docs/dataset_quality.mdx +++ b/api_docs/dataset_quality.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/datasetQuality title: "datasetQuality" image: https://source.unsplash.com/400x175/?github description: API docs for the datasetQuality plugin -date: 2024-05-07 +date: 2024-05-08 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'datasetQuality'] --- import datasetQualityObj from './dataset_quality.devdocs.json'; diff --git a/api_docs/deprecations_by_api.mdx b/api_docs/deprecations_by_api.mdx index 7adb51c6f54a2..849e0ca6b4d29 100644 --- a/api_docs/deprecations_by_api.mdx +++ b/api_docs/deprecations_by_api.mdx @@ -7,7 +7,7 @@ id: kibDevDocsDeprecationsByApi slug: /kibana-dev-docs/api-meta/deprecated-api-list-by-api title: Deprecated API usage by API description: A list of deprecated APIs, which plugins are still referencing them, and when they need to be removed by. -date: 2024-05-07 +date: 2024-05-08 tags: ['contributor', 'dev', 'apidocs', 'kibana'] --- @@ -129,9 +129,10 @@ tags: ['contributor', 'dev', 'apidocs', 'kibana'] | | canvas | - | | | canvas | - | | | canvas | - | +| | @kbn/core-logging-server-internal, security | - | | | spaces, savedObjectsManagement | - | -| | devTools, console, crossClusterReplication, grokdebugger, ingestPipelines, infra, painlessLab, searchprofiler, metricsDataAccess, apm, observabilityOnboarding | - | -| | observabilityShared, console, runtimeFields, indexManagement | - | +| | infra, metricsDataAccess, apm, observabilityOnboarding | - | +| | observabilityShared | - | | | @kbn/core-elasticsearch-server-internal, @kbn/core-plugins-server-internal, enterpriseSearch, observabilityOnboarding, console | - | | | @kbn/react-kibana-context-styled, kibanaReact | - | | | enterpriseSearch | - | diff --git a/api_docs/deprecations_by_plugin.mdx b/api_docs/deprecations_by_plugin.mdx index 75ca802622d62..20a6c5bee834a 100644 --- a/api_docs/deprecations_by_plugin.mdx +++ b/api_docs/deprecations_by_plugin.mdx @@ -7,7 +7,7 @@ id: kibDevDocsDeprecationsByPlugin slug: /kibana-dev-docs/api-meta/deprecated-api-list-by-plugin title: Deprecated API usage by plugin description: A list of deprecated APIs, which plugins are still referencing them, and when they need to be removed by. -date: 2024-05-07 +date: 2024-05-08 tags: ['contributor', 'dev', 'apidocs', 'kibana'] --- @@ -91,6 +91,14 @@ tags: ['contributor', 'dev', 'apidocs', 'kibana'] +## @kbn/core-logging-server-internal + +| Deprecated API | Reference location(s) | Remove By | +| ---------------|-----------|-----------| +| | [index.ts](https://github.com/elastic/kibana/tree/main/packages/core/logging/core-logging-server-internal/src/appenders/rolling_file/strategies/index.ts#:~:text=max), [create_retention_policy.ts](https://github.com/elastic/kibana/tree/main/packages/core/logging/core-logging-server-internal/src/appenders/rolling_file/retention/create_retention_policy.ts#:~:text=max), [appenders.test.ts](https://github.com/elastic/kibana/tree/main/packages/core/logging/core-logging-server-internal/src/appenders/appenders.test.ts#:~:text=max), [rolling_file_appender.test.ts](https://github.com/elastic/kibana/tree/main/packages/core/logging/core-logging-server-internal/src/appenders/rolling_file/rolling_file_appender.test.ts#:~:text=max), [create_retention_policy.test.ts](https://github.com/elastic/kibana/tree/main/packages/core/logging/core-logging-server-internal/src/appenders/rolling_file/retention/create_retention_policy.test.ts#:~:text=max), [numeric_strategy.test.ts](https://github.com/elastic/kibana/tree/main/packages/core/logging/core-logging-server-internal/src/appenders/rolling_file/strategies/numeric/numeric_strategy.test.ts#:~:text=max) | - | + + + ## @kbn/core-plugins-browser-internal | Deprecated API | Reference location(s) | Remove By | @@ -507,8 +515,6 @@ tags: ['contributor', 'dev', 'apidocs', 'kibana'] | Deprecated API | Reference location(s) | Remove By | | ---------------|-----------|-----------| -| | [shared_imports.ts](https://github.com/elastic/kibana/tree/main/src/plugins/console/public/shared_imports.ts#:~:text=toMountPoint), [use_send_current_request.ts](https://github.com/elastic/kibana/tree/main/src/plugins/console/public/application/hooks/use_send_current_request/use_send_current_request.ts#:~:text=toMountPoint), [use_send_current_request.ts](https://github.com/elastic/kibana/tree/main/src/plugins/console/public/application/hooks/use_send_current_request/use_send_current_request.ts#:~:text=toMountPoint) | - | -| | [shared_imports.ts](https://github.com/elastic/kibana/tree/main/src/plugins/console/public/shared_imports.ts#:~:text=KibanaThemeProvider) | - | | | [plugin.ts](https://github.com/elastic/kibana/tree/main/src/plugins/console/server/plugin.ts#:~:text=legacy) | - | @@ -525,7 +531,6 @@ tags: ['contributor', 'dev', 'apidocs', 'kibana'] | Deprecated API | Reference location(s) | Remove By | | ---------------|-----------|-----------| -| | [shared_imports.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/cross_cluster_replication/public/shared_imports.ts#:~:text=KibanaThemeProvider) | - | | | [plugin.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/cross_cluster_replication/public/plugin.ts#:~:text=license%24) | 8.8.0 | @@ -618,14 +623,6 @@ tags: ['contributor', 'dev', 'apidocs', 'kibana'] -## devTools - -| Deprecated API | Reference location(s) | Remove By | -| ---------------|-----------|-----------| -| | [application.tsx](https://github.com/elastic/kibana/tree/main/src/plugins/dev_tools/public/application.tsx#:~:text=KibanaThemeProvider), [application.tsx](https://github.com/elastic/kibana/tree/main/src/plugins/dev_tools/public/application.tsx#:~:text=KibanaThemeProvider), [application.tsx](https://github.com/elastic/kibana/tree/main/src/plugins/dev_tools/public/application.tsx#:~:text=KibanaThemeProvider) | - | - - - ## discover | Deprecated API | Reference location(s) | Remove By | @@ -776,14 +773,6 @@ tags: ['contributor', 'dev', 'apidocs', 'kibana'] -## grokdebugger - -| Deprecated API | Reference location(s) | Remove By | -| ---------------|-----------|-----------| -| | [shared_imports.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/grokdebugger/public/shared_imports.ts#:~:text=KibanaThemeProvider) | - | - - - ## home | Deprecated API | Reference location(s) | Remove By | @@ -811,14 +800,6 @@ tags: ['contributor', 'dev', 'apidocs', 'kibana'] -## indexManagement - -| Deprecated API | Reference location(s) | Remove By | -| ---------------|-----------|-----------| -| | [use_datastreams_rollover.tsx](https://github.com/elastic/kibana/tree/main/x-pack/plugins/index_management/public/application/components/component_templates/component_template_wizard/component_template_datastreams_rollover/use_datastreams_rollover.tsx#:~:text=toMountPoint), [use_datastreams_rollover.tsx](https://github.com/elastic/kibana/tree/main/x-pack/plugins/index_management/public/application/components/component_templates/component_template_wizard/component_template_datastreams_rollover/use_datastreams_rollover.tsx#:~:text=toMountPoint) | - | - - - ## infra | Deprecated API | Reference location(s) | Remove By | @@ -828,14 +809,6 @@ tags: ['contributor', 'dev', 'apidocs', 'kibana'] -## ingestPipelines - -| Deprecated API | Reference location(s) | Remove By | -| ---------------|-----------|-----------| -| | [shared_imports.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/ingest_pipelines/public/shared_imports.ts#:~:text=KibanaThemeProvider) | - | - - - ## inputControlVis | Deprecated API | Reference location(s) | Remove By | @@ -1031,7 +1004,6 @@ tags: ['contributor', 'dev', 'apidocs', 'kibana'] | Deprecated API | Reference location(s) | Remove By | | ---------------|-----------|-----------| -| | [shared_imports.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/painless_lab/public/shared_imports.ts#:~:text=KibanaThemeProvider), [index.tsx](https://github.com/elastic/kibana/tree/main/x-pack/plugins/painless_lab/public/application/index.tsx#:~:text=KibanaThemeProvider), [index.tsx](https://github.com/elastic/kibana/tree/main/x-pack/plugins/painless_lab/public/application/index.tsx#:~:text=KibanaThemeProvider), [index.tsx](https://github.com/elastic/kibana/tree/main/x-pack/plugins/painless_lab/public/application/index.tsx#:~:text=KibanaThemeProvider) | - | | | [plugin.tsx](https://github.com/elastic/kibana/tree/main/x-pack/plugins/painless_lab/public/plugin.tsx#:~:text=license%24), [plugin.tsx](https://github.com/elastic/kibana/tree/main/x-pack/plugins/painless_lab/public/plugin.tsx#:~:text=license%24) | 8.8.0 | | | [license.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/painless_lab/server/services/license.ts#:~:text=license%24) | 8.8.0 | @@ -1090,14 +1062,6 @@ tags: ['contributor', 'dev', 'apidocs', 'kibana'] -## runtimeFields - -| Deprecated API | Reference location(s) | Remove By | -| ---------------|-----------|-----------| -| | [shared_imports.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/runtime_fields/public/shared_imports.ts#:~:text=toMountPoint), [load_editor.tsx](https://github.com/elastic/kibana/tree/main/x-pack/plugins/runtime_fields/public/load_editor.tsx#:~:text=toMountPoint), [load_editor.tsx](https://github.com/elastic/kibana/tree/main/x-pack/plugins/runtime_fields/public/load_editor.tsx#:~:text=toMountPoint) | - | - - - ## savedObjects | Deprecated API | Reference location(s) | Remove By | @@ -1169,7 +1133,6 @@ tags: ['contributor', 'dev', 'apidocs', 'kibana'] | Deprecated API | Reference location(s) | Remove By | | ---------------|-----------|-----------| -| | [shared_imports.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/searchprofiler/public/shared_imports.ts#:~:text=KibanaThemeProvider), [index.tsx](https://github.com/elastic/kibana/tree/main/x-pack/plugins/searchprofiler/public/application/index.tsx#:~:text=KibanaThemeProvider), [index.tsx](https://github.com/elastic/kibana/tree/main/x-pack/plugins/searchprofiler/public/application/index.tsx#:~:text=KibanaThemeProvider), [index.tsx](https://github.com/elastic/kibana/tree/main/x-pack/plugins/searchprofiler/public/application/index.tsx#:~:text=KibanaThemeProvider) | - | | | [plugin.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/searchprofiler/public/plugin.ts#:~:text=license%24), [plugin.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/searchprofiler/public/plugin.ts#:~:text=license%24) | 8.8.0 | | | [plugin.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/searchprofiler/server/plugin.ts#:~:text=license%24) | 8.8.0 | @@ -1194,6 +1157,7 @@ migrates to using the Kibana Privilege model: https://github.com/elastic/kibana/ | | [license_service.test.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/security/common/licensing/license_service.test.ts#:~:text=mode), [license_service.test.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/security/common/licensing/license_service.test.ts#:~:text=mode), [license_service.test.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/security/common/licensing/license_service.test.ts#:~:text=mode) | 8.8.0 | | | [plugin.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/security/server/plugin.ts#:~:text=license%24) | 8.8.0 | | | [logout_app.test.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/security/public/authentication/logout/logout_app.test.ts#:~:text=appBasePath) | 8.8.0 | +| | [config.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/security/server/config.ts#:~:text=max) | - | diff --git a/api_docs/deprecations_by_team.mdx b/api_docs/deprecations_by_team.mdx index 42ba2230557dc..ea903eef3797f 100644 --- a/api_docs/deprecations_by_team.mdx +++ b/api_docs/deprecations_by_team.mdx @@ -7,7 +7,7 @@ id: kibDevDocsDeprecationsDueByTeam slug: /kibana-dev-docs/api-meta/deprecations-due-by-team title: Deprecated APIs due to be removed, by team description: Lists the teams that are referencing deprecated APIs with a remove by date. -date: 2024-05-07 +date: 2024-05-08 tags: ['contributor', 'dev', 'apidocs', 'kibana'] --- @@ -61,7 +61,7 @@ tags: ['contributor', 'dev', 'apidocs', 'kibana'] | Plugin | Deprecated API | Reference location(s) | Remove By | | --------|-------|-----------|-----------| -| crossClusterReplication | | [plugin.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/cross_cluster_replication/public/plugin.ts#:~:text=license%24), [plugin.tsx](https://github.com/elastic/kibana/tree/main/x-pack/plugins/painless_lab/public/plugin.tsx#:~:text=license%24), [plugin.tsx](https://github.com/elastic/kibana/tree/main/x-pack/plugins/painless_lab/public/plugin.tsx#:~:text=license%24), [plugin.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/searchprofiler/public/plugin.ts#:~:text=license%24), [plugin.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/searchprofiler/public/plugin.ts#:~:text=license%24), [plugin.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/license_management/public/plugin.ts#:~:text=license%24), [plugin.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/watcher/public/plugin.ts#:~:text=license%24), [plugin.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/watcher/public/plugin.ts#:~:text=license%24) | 8.8.0 | +| licenseManagement | | [plugin.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/license_management/public/plugin.ts#:~:text=license%24), [plugin.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/cross_cluster_replication/public/plugin.ts#:~:text=license%24), [plugin.tsx](https://github.com/elastic/kibana/tree/main/x-pack/plugins/painless_lab/public/plugin.tsx#:~:text=license%24), [plugin.tsx](https://github.com/elastic/kibana/tree/main/x-pack/plugins/painless_lab/public/plugin.tsx#:~:text=license%24), [plugin.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/searchprofiler/public/plugin.ts#:~:text=license%24), [plugin.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/searchprofiler/public/plugin.ts#:~:text=license%24), [plugin.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/watcher/public/plugin.ts#:~:text=license%24), [plugin.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/watcher/public/plugin.ts#:~:text=license%24) | 8.8.0 | | painlessLab | | [license.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/painless_lab/server/services/license.ts#:~:text=license%24), [plugin.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/searchprofiler/server/plugin.ts#:~:text=license%24), [plugin.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/remote_clusters/server/plugin.ts#:~:text=license%24), [license.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/index_lifecycle_management/server/services/license.ts#:~:text=license%24), [license.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/rollup/server/services/license.ts#:~:text=license%24), [license.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/snapshot_restore/server/services/license.ts#:~:text=license%24), [reindex_service.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/upgrade_assistant/server/lib/reindexing/reindex_service.ts#:~:text=license%24), [reindex_service.test.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/upgrade_assistant/server/lib/reindexing/reindex_service.test.ts#:~:text=license%24), [reindex_service.test.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/upgrade_assistant/server/lib/reindexing/reindex_service.test.ts#:~:text=license%24) | 8.8.0 | | management | | [application.tsx](https://github.com/elastic/kibana/tree/main/src/plugins/management/public/application.tsx#:~:text=appBasePath) | 8.8.0 | diff --git a/api_docs/dev_tools.mdx b/api_docs/dev_tools.mdx index 4e7b2e4e17609..b9671fc89977e 100644 --- a/api_docs/dev_tools.mdx +++ b/api_docs/dev_tools.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/devTools title: "devTools" image: https://source.unsplash.com/400x175/?github description: API docs for the devTools plugin -date: 2024-05-07 +date: 2024-05-08 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 7084e624d8f4e..7f12b2a105ddd 100644 --- a/api_docs/discover.mdx +++ b/api_docs/discover.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/discover title: "discover" image: https://source.unsplash.com/400x175/?github description: API docs for the discover plugin -date: 2024-05-07 +date: 2024-05-08 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 fa64182133a50..c8309e656840a 100644 --- a/api_docs/discover_enhanced.mdx +++ b/api_docs/discover_enhanced.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/discoverEnhanced title: "discoverEnhanced" image: https://source.unsplash.com/400x175/?github description: API docs for the discoverEnhanced plugin -date: 2024-05-07 +date: 2024-05-08 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'discoverEnhanced'] --- import discoverEnhancedObj from './discover_enhanced.devdocs.json'; diff --git a/api_docs/discover_shared.mdx b/api_docs/discover_shared.mdx index 778eb248ae077..f67f46321371b 100644 --- a/api_docs/discover_shared.mdx +++ b/api_docs/discover_shared.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/discoverShared title: "discoverShared" image: https://source.unsplash.com/400x175/?github description: API docs for the discoverShared plugin -date: 2024-05-07 +date: 2024-05-08 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'discoverShared'] --- import discoverSharedObj from './discover_shared.devdocs.json'; diff --git a/api_docs/ecs_data_quality_dashboard.mdx b/api_docs/ecs_data_quality_dashboard.mdx index 7b2bfc47994a2..336c702ea79a8 100644 --- a/api_docs/ecs_data_quality_dashboard.mdx +++ b/api_docs/ecs_data_quality_dashboard.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/ecsDataQualityDashboard title: "ecsDataQualityDashboard" image: https://source.unsplash.com/400x175/?github description: API docs for the ecsDataQualityDashboard plugin -date: 2024-05-07 +date: 2024-05-08 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'ecsDataQualityDashboard'] --- import ecsDataQualityDashboardObj from './ecs_data_quality_dashboard.devdocs.json'; diff --git a/api_docs/elastic_assistant.mdx b/api_docs/elastic_assistant.mdx index 11443315bc7ff..263909e2786be 100644 --- a/api_docs/elastic_assistant.mdx +++ b/api_docs/elastic_assistant.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/elasticAssistant title: "elasticAssistant" image: https://source.unsplash.com/400x175/?github description: API docs for the elasticAssistant plugin -date: 2024-05-07 +date: 2024-05-08 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'elasticAssistant'] --- import elasticAssistantObj from './elastic_assistant.devdocs.json'; diff --git a/api_docs/embeddable.mdx b/api_docs/embeddable.mdx index 2f80903482f49..6d6901072ec3e 100644 --- a/api_docs/embeddable.mdx +++ b/api_docs/embeddable.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/embeddable title: "embeddable" image: https://source.unsplash.com/400x175/?github description: API docs for the embeddable plugin -date: 2024-05-07 +date: 2024-05-08 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 b6c4a626657b0..bb3ae41eb7873 100644 --- a/api_docs/embeddable_enhanced.mdx +++ b/api_docs/embeddable_enhanced.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/embeddableEnhanced title: "embeddableEnhanced" image: https://source.unsplash.com/400x175/?github description: API docs for the embeddableEnhanced plugin -date: 2024-05-07 +date: 2024-05-08 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 9955fccd14fff..216cf2ce92fd6 100644 --- a/api_docs/encrypted_saved_objects.mdx +++ b/api_docs/encrypted_saved_objects.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/encryptedSavedObjects title: "encryptedSavedObjects" image: https://source.unsplash.com/400x175/?github description: API docs for the encryptedSavedObjects plugin -date: 2024-05-07 +date: 2024-05-08 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 4dd9f4f3eafa5..dd3d6df6cb9e0 100644 --- a/api_docs/enterprise_search.mdx +++ b/api_docs/enterprise_search.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/enterpriseSearch title: "enterpriseSearch" image: https://source.unsplash.com/400x175/?github description: API docs for the enterpriseSearch plugin -date: 2024-05-07 +date: 2024-05-08 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 9fc31cc8dd1d5..ed5a406497685 100644 --- a/api_docs/es_ui_shared.mdx +++ b/api_docs/es_ui_shared.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/esUiShared title: "esUiShared" image: https://source.unsplash.com/400x175/?github description: API docs for the esUiShared plugin -date: 2024-05-07 +date: 2024-05-08 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 7c0e973cc27a5..b21006a989db5 100644 --- a/api_docs/event_annotation.mdx +++ b/api_docs/event_annotation.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/eventAnnotation title: "eventAnnotation" image: https://source.unsplash.com/400x175/?github description: API docs for the eventAnnotation plugin -date: 2024-05-07 +date: 2024-05-08 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'eventAnnotation'] --- import eventAnnotationObj from './event_annotation.devdocs.json'; diff --git a/api_docs/event_annotation_listing.mdx b/api_docs/event_annotation_listing.mdx index ff430d7d2a99c..de2416c53a370 100644 --- a/api_docs/event_annotation_listing.mdx +++ b/api_docs/event_annotation_listing.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/eventAnnotationListing title: "eventAnnotationListing" image: https://source.unsplash.com/400x175/?github description: API docs for the eventAnnotationListing plugin -date: 2024-05-07 +date: 2024-05-08 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'eventAnnotationListing'] --- import eventAnnotationListingObj from './event_annotation_listing.devdocs.json'; diff --git a/api_docs/event_log.mdx b/api_docs/event_log.mdx index 7fdb95fa42cb4..24757d53aa566 100644 --- a/api_docs/event_log.mdx +++ b/api_docs/event_log.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/eventLog title: "eventLog" image: https://source.unsplash.com/400x175/?github description: API docs for the eventLog plugin -date: 2024-05-07 +date: 2024-05-08 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'eventLog'] --- import eventLogObj from './event_log.devdocs.json'; diff --git a/api_docs/exploratory_view.mdx b/api_docs/exploratory_view.mdx index 06907d5023e57..f08168b0e528e 100644 --- a/api_docs/exploratory_view.mdx +++ b/api_docs/exploratory_view.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/exploratoryView title: "exploratoryView" image: https://source.unsplash.com/400x175/?github description: API docs for the exploratoryView plugin -date: 2024-05-07 +date: 2024-05-08 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'exploratoryView'] --- import exploratoryViewObj from './exploratory_view.devdocs.json'; diff --git a/api_docs/expression_error.mdx b/api_docs/expression_error.mdx index 9caa4bc5fe4c6..45d19f2b97eb8 100644 --- a/api_docs/expression_error.mdx +++ b/api_docs/expression_error.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/expressionError title: "expressionError" image: https://source.unsplash.com/400x175/?github description: API docs for the expressionError plugin -date: 2024-05-07 +date: 2024-05-08 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 36b6311ae7faa..b992b80510546 100644 --- a/api_docs/expression_gauge.mdx +++ b/api_docs/expression_gauge.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/expressionGauge title: "expressionGauge" image: https://source.unsplash.com/400x175/?github description: API docs for the expressionGauge plugin -date: 2024-05-07 +date: 2024-05-08 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 140f70583de20..687b6dd01d7ea 100644 --- a/api_docs/expression_heatmap.mdx +++ b/api_docs/expression_heatmap.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/expressionHeatmap title: "expressionHeatmap" image: https://source.unsplash.com/400x175/?github description: API docs for the expressionHeatmap plugin -date: 2024-05-07 +date: 2024-05-08 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 6d0463df51c2c..fadcf806b1264 100644 --- a/api_docs/expression_image.mdx +++ b/api_docs/expression_image.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/expressionImage title: "expressionImage" image: https://source.unsplash.com/400x175/?github description: API docs for the expressionImage plugin -date: 2024-05-07 +date: 2024-05-08 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 4ac4755a2491e..f82ce405874c1 100644 --- a/api_docs/expression_legacy_metric_vis.mdx +++ b/api_docs/expression_legacy_metric_vis.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/expressionLegacyMetricVis title: "expressionLegacyMetricVis" image: https://source.unsplash.com/400x175/?github description: API docs for the expressionLegacyMetricVis plugin -date: 2024-05-07 +date: 2024-05-08 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 b177ba24403a7..5827c08fd0239 100644 --- a/api_docs/expression_metric.mdx +++ b/api_docs/expression_metric.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/expressionMetric title: "expressionMetric" image: https://source.unsplash.com/400x175/?github description: API docs for the expressionMetric plugin -date: 2024-05-07 +date: 2024-05-08 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 916b3ec32dd3a..1710d1f090a2e 100644 --- a/api_docs/expression_metric_vis.mdx +++ b/api_docs/expression_metric_vis.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/expressionMetricVis title: "expressionMetricVis" image: https://source.unsplash.com/400x175/?github description: API docs for the expressionMetricVis plugin -date: 2024-05-07 +date: 2024-05-08 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 e95acec85247b..d043276cff4a9 100644 --- a/api_docs/expression_partition_vis.mdx +++ b/api_docs/expression_partition_vis.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/expressionPartitionVis title: "expressionPartitionVis" image: https://source.unsplash.com/400x175/?github description: API docs for the expressionPartitionVis plugin -date: 2024-05-07 +date: 2024-05-08 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 87be212eaf098..02b75736e37b2 100644 --- a/api_docs/expression_repeat_image.mdx +++ b/api_docs/expression_repeat_image.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/expressionRepeatImage title: "expressionRepeatImage" image: https://source.unsplash.com/400x175/?github description: API docs for the expressionRepeatImage plugin -date: 2024-05-07 +date: 2024-05-08 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 358da93c8b325..49e2413a490a5 100644 --- a/api_docs/expression_reveal_image.mdx +++ b/api_docs/expression_reveal_image.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/expressionRevealImage title: "expressionRevealImage" image: https://source.unsplash.com/400x175/?github description: API docs for the expressionRevealImage plugin -date: 2024-05-07 +date: 2024-05-08 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 0c877c394eb60..ed1139853e276 100644 --- a/api_docs/expression_shape.mdx +++ b/api_docs/expression_shape.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/expressionShape title: "expressionShape" image: https://source.unsplash.com/400x175/?github description: API docs for the expressionShape plugin -date: 2024-05-07 +date: 2024-05-08 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 82823542a32bc..1290430d4804c 100644 --- a/api_docs/expression_tagcloud.mdx +++ b/api_docs/expression_tagcloud.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/expressionTagcloud title: "expressionTagcloud" image: https://source.unsplash.com/400x175/?github description: API docs for the expressionTagcloud plugin -date: 2024-05-07 +date: 2024-05-08 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 0f2758ff69406..5d0bc5a5670a2 100644 --- a/api_docs/expression_x_y.mdx +++ b/api_docs/expression_x_y.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/expressionXY title: "expressionXY" image: https://source.unsplash.com/400x175/?github description: API docs for the expressionXY plugin -date: 2024-05-07 +date: 2024-05-08 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 b1fd799c327e2..6cd603f4a1079 100644 --- a/api_docs/expressions.mdx +++ b/api_docs/expressions.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/expressions title: "expressions" image: https://source.unsplash.com/400x175/?github description: API docs for the expressions plugin -date: 2024-05-07 +date: 2024-05-08 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 904389d85b6a9..4129c9a81368e 100644 --- a/api_docs/features.mdx +++ b/api_docs/features.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/features title: "features" image: https://source.unsplash.com/400x175/?github description: API docs for the features plugin -date: 2024-05-07 +date: 2024-05-08 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 20886b7bda8d8..6fdd0c2b08fd4 100644 --- a/api_docs/field_formats.mdx +++ b/api_docs/field_formats.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/fieldFormats title: "fieldFormats" image: https://source.unsplash.com/400x175/?github description: API docs for the fieldFormats plugin -date: 2024-05-07 +date: 2024-05-08 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 b8da4309bd71c..2166ae9f94064 100644 --- a/api_docs/file_upload.mdx +++ b/api_docs/file_upload.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/fileUpload title: "fileUpload" image: https://source.unsplash.com/400x175/?github description: API docs for the fileUpload plugin -date: 2024-05-07 +date: 2024-05-08 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 54cc3e0acbfb9..83103692b6c9b 100644 --- a/api_docs/files.mdx +++ b/api_docs/files.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/files title: "files" image: https://source.unsplash.com/400x175/?github description: API docs for the files plugin -date: 2024-05-07 +date: 2024-05-08 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'files'] --- import filesObj from './files.devdocs.json'; diff --git a/api_docs/files_management.mdx b/api_docs/files_management.mdx index 658c969a85975..cab4b5531acde 100644 --- a/api_docs/files_management.mdx +++ b/api_docs/files_management.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/filesManagement title: "filesManagement" image: https://source.unsplash.com/400x175/?github description: API docs for the filesManagement plugin -date: 2024-05-07 +date: 2024-05-08 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'filesManagement'] --- import filesManagementObj from './files_management.devdocs.json'; diff --git a/api_docs/fleet.mdx b/api_docs/fleet.mdx index 565976b07e9ce..473c2cc3baa33 100644 --- a/api_docs/fleet.mdx +++ b/api_docs/fleet.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/fleet title: "fleet" image: https://source.unsplash.com/400x175/?github description: API docs for the fleet plugin -date: 2024-05-07 +date: 2024-05-08 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 04072d42c72a5..c1ddab4229876 100644 --- a/api_docs/global_search.mdx +++ b/api_docs/global_search.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/globalSearch title: "globalSearch" image: https://source.unsplash.com/400x175/?github description: API docs for the globalSearch plugin -date: 2024-05-07 +date: 2024-05-08 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 a2b022670178b..2ceb4069b3829 100644 --- a/api_docs/guided_onboarding.mdx +++ b/api_docs/guided_onboarding.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/guidedOnboarding title: "guidedOnboarding" image: https://source.unsplash.com/400x175/?github description: API docs for the guidedOnboarding plugin -date: 2024-05-07 +date: 2024-05-08 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 3e534604dc13e..d4768e196cd02 100644 --- a/api_docs/home.mdx +++ b/api_docs/home.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/home title: "home" image: https://source.unsplash.com/400x175/?github description: API docs for the home plugin -date: 2024-05-07 +date: 2024-05-08 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'home'] --- import homeObj from './home.devdocs.json'; diff --git a/api_docs/image_embeddable.mdx b/api_docs/image_embeddable.mdx index 9df973212a34b..6083cda50f495 100644 --- a/api_docs/image_embeddable.mdx +++ b/api_docs/image_embeddable.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/imageEmbeddable title: "imageEmbeddable" image: https://source.unsplash.com/400x175/?github description: API docs for the imageEmbeddable plugin -date: 2024-05-07 +date: 2024-05-08 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'imageEmbeddable'] --- import imageEmbeddableObj from './image_embeddable.devdocs.json'; diff --git a/api_docs/index_lifecycle_management.mdx b/api_docs/index_lifecycle_management.mdx index 9208878c79c7b..098f957e148f0 100644 --- a/api_docs/index_lifecycle_management.mdx +++ b/api_docs/index_lifecycle_management.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/indexLifecycleManagement title: "indexLifecycleManagement" image: https://source.unsplash.com/400x175/?github description: API docs for the indexLifecycleManagement plugin -date: 2024-05-07 +date: 2024-05-08 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 ef7b6a3d6f684..f56a9a99eac78 100644 --- a/api_docs/index_management.mdx +++ b/api_docs/index_management.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/indexManagement title: "indexManagement" image: https://source.unsplash.com/400x175/?github description: API docs for the indexManagement plugin -date: 2024-05-07 +date: 2024-05-08 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 142d9f70eb126..fd2c12aea6168 100644 --- a/api_docs/infra.mdx +++ b/api_docs/infra.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/infra title: "infra" image: https://source.unsplash.com/400x175/?github description: API docs for the infra plugin -date: 2024-05-07 +date: 2024-05-08 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'infra'] --- import infraObj from './infra.devdocs.json'; diff --git a/api_docs/ingest_pipelines.mdx b/api_docs/ingest_pipelines.mdx index bb6edb2dbbc68..4968ea8189e6b 100644 --- a/api_docs/ingest_pipelines.mdx +++ b/api_docs/ingest_pipelines.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/ingestPipelines title: "ingestPipelines" image: https://source.unsplash.com/400x175/?github description: API docs for the ingestPipelines plugin -date: 2024-05-07 +date: 2024-05-08 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'ingestPipelines'] --- import ingestPipelinesObj from './ingest_pipelines.devdocs.json'; diff --git a/api_docs/inspector.mdx b/api_docs/inspector.mdx index 81ee2077a0ff6..847d11c8667c7 100644 --- a/api_docs/inspector.mdx +++ b/api_docs/inspector.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/inspector title: "inspector" image: https://source.unsplash.com/400x175/?github description: API docs for the inspector plugin -date: 2024-05-07 +date: 2024-05-08 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 21c050cca81a2..531870a1e9ed3 100644 --- a/api_docs/interactive_setup.mdx +++ b/api_docs/interactive_setup.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/interactiveSetup title: "interactiveSetup" image: https://source.unsplash.com/400x175/?github description: API docs for the interactiveSetup plugin -date: 2024-05-07 +date: 2024-05-08 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 27e5a41474beb..c7b0aa9ef57f4 100644 --- a/api_docs/kbn_ace.mdx +++ b/api_docs/kbn_ace.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-ace title: "@kbn/ace" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/ace plugin -date: 2024-05-07 +date: 2024-05-08 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/ace'] --- import kbnAceObj from './kbn_ace.devdocs.json'; diff --git a/api_docs/kbn_actions_types.mdx b/api_docs/kbn_actions_types.mdx index f52be74d588e2..db7abeac39fca 100644 --- a/api_docs/kbn_actions_types.mdx +++ b/api_docs/kbn_actions_types.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-actions-types title: "@kbn/actions-types" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/actions-types plugin -date: 2024-05-07 +date: 2024-05-08 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/actions-types'] --- import kbnActionsTypesObj from './kbn_actions_types.devdocs.json'; diff --git a/api_docs/kbn_aiops_components.mdx b/api_docs/kbn_aiops_components.mdx index 355562e336752..f5e4be2325036 100644 --- a/api_docs/kbn_aiops_components.mdx +++ b/api_docs/kbn_aiops_components.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-aiops-components title: "@kbn/aiops-components" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/aiops-components plugin -date: 2024-05-07 +date: 2024-05-08 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/aiops-components'] --- import kbnAiopsComponentsObj from './kbn_aiops_components.devdocs.json'; diff --git a/api_docs/kbn_aiops_log_pattern_analysis.mdx b/api_docs/kbn_aiops_log_pattern_analysis.mdx index 638072377c243..28241065347a8 100644 --- a/api_docs/kbn_aiops_log_pattern_analysis.mdx +++ b/api_docs/kbn_aiops_log_pattern_analysis.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-aiops-log-pattern-analysis title: "@kbn/aiops-log-pattern-analysis" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/aiops-log-pattern-analysis plugin -date: 2024-05-07 +date: 2024-05-08 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/aiops-log-pattern-analysis'] --- import kbnAiopsLogPatternAnalysisObj from './kbn_aiops_log_pattern_analysis.devdocs.json'; diff --git a/api_docs/kbn_aiops_log_rate_analysis.mdx b/api_docs/kbn_aiops_log_rate_analysis.mdx index bd8739ec02409..b493e068f3462 100644 --- a/api_docs/kbn_aiops_log_rate_analysis.mdx +++ b/api_docs/kbn_aiops_log_rate_analysis.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-aiops-log-rate-analysis title: "@kbn/aiops-log-rate-analysis" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/aiops-log-rate-analysis plugin -date: 2024-05-07 +date: 2024-05-08 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/aiops-log-rate-analysis'] --- import kbnAiopsLogRateAnalysisObj from './kbn_aiops_log_rate_analysis.devdocs.json'; diff --git a/api_docs/kbn_alerting_api_integration_helpers.mdx b/api_docs/kbn_alerting_api_integration_helpers.mdx index 97e2b2204f3e9..e876794a0a29d 100644 --- a/api_docs/kbn_alerting_api_integration_helpers.mdx +++ b/api_docs/kbn_alerting_api_integration_helpers.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-alerting-api-integration-helpers title: "@kbn/alerting-api-integration-helpers" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/alerting-api-integration-helpers plugin -date: 2024-05-07 +date: 2024-05-08 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/alerting-api-integration-helpers'] --- import kbnAlertingApiIntegrationHelpersObj from './kbn_alerting_api_integration_helpers.devdocs.json'; diff --git a/api_docs/kbn_alerting_state_types.mdx b/api_docs/kbn_alerting_state_types.mdx index 047c8d5400c71..5b75a4b87ba7f 100644 --- a/api_docs/kbn_alerting_state_types.mdx +++ b/api_docs/kbn_alerting_state_types.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-alerting-state-types title: "@kbn/alerting-state-types" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/alerting-state-types plugin -date: 2024-05-07 +date: 2024-05-08 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/alerting-state-types'] --- import kbnAlertingStateTypesObj from './kbn_alerting_state_types.devdocs.json'; diff --git a/api_docs/kbn_alerting_types.mdx b/api_docs/kbn_alerting_types.mdx index 58c544500ea2d..ec4ee14a23f20 100644 --- a/api_docs/kbn_alerting_types.mdx +++ b/api_docs/kbn_alerting_types.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-alerting-types title: "@kbn/alerting-types" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/alerting-types plugin -date: 2024-05-07 +date: 2024-05-08 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/alerting-types'] --- import kbnAlertingTypesObj from './kbn_alerting_types.devdocs.json'; diff --git a/api_docs/kbn_alerts_as_data_utils.mdx b/api_docs/kbn_alerts_as_data_utils.mdx index 1c430d15fd5f2..a33b141872cbd 100644 --- a/api_docs/kbn_alerts_as_data_utils.mdx +++ b/api_docs/kbn_alerts_as_data_utils.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-alerts-as-data-utils title: "@kbn/alerts-as-data-utils" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/alerts-as-data-utils plugin -date: 2024-05-07 +date: 2024-05-08 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/alerts-as-data-utils'] --- import kbnAlertsAsDataUtilsObj from './kbn_alerts_as_data_utils.devdocs.json'; diff --git a/api_docs/kbn_alerts_ui_shared.mdx b/api_docs/kbn_alerts_ui_shared.mdx index 9c57fb0c42a21..17170cd2e8b96 100644 --- a/api_docs/kbn_alerts_ui_shared.mdx +++ b/api_docs/kbn_alerts_ui_shared.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-alerts-ui-shared title: "@kbn/alerts-ui-shared" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/alerts-ui-shared plugin -date: 2024-05-07 +date: 2024-05-08 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/alerts-ui-shared'] --- import kbnAlertsUiSharedObj from './kbn_alerts_ui_shared.devdocs.json'; diff --git a/api_docs/kbn_analytics.mdx b/api_docs/kbn_analytics.mdx index 22ea159ed7ca6..24ee3a3cd2a27 100644 --- a/api_docs/kbn_analytics.mdx +++ b/api_docs/kbn_analytics.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-analytics title: "@kbn/analytics" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/analytics plugin -date: 2024-05-07 +date: 2024-05-08 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 8f21b60642264..76d5690b927c7 100644 --- a/api_docs/kbn_analytics_client.mdx +++ b/api_docs/kbn_analytics_client.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-analytics-client title: "@kbn/analytics-client" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/analytics-client plugin -date: 2024-05-07 +date: 2024-05-08 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/analytics-client'] --- import kbnAnalyticsClientObj from './kbn_analytics_client.devdocs.json'; diff --git a/api_docs/kbn_analytics_collection_utils.mdx b/api_docs/kbn_analytics_collection_utils.mdx index 04e2782354ab5..ef1d4eebe2f3b 100644 --- a/api_docs/kbn_analytics_collection_utils.mdx +++ b/api_docs/kbn_analytics_collection_utils.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-analytics-collection-utils title: "@kbn/analytics-collection-utils" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/analytics-collection-utils plugin -date: 2024-05-07 +date: 2024-05-08 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/analytics-collection-utils'] --- import kbnAnalyticsCollectionUtilsObj from './kbn_analytics_collection_utils.devdocs.json'; diff --git a/api_docs/kbn_analytics_shippers_elastic_v3_browser.mdx b/api_docs/kbn_analytics_shippers_elastic_v3_browser.mdx index 739d8d3b105cf..a9ecb02d5ba04 100644 --- a/api_docs/kbn_analytics_shippers_elastic_v3_browser.mdx +++ b/api_docs/kbn_analytics_shippers_elastic_v3_browser.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-analytics-shippers-elastic-v3-browser title: "@kbn/analytics-shippers-elastic-v3-browser" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/analytics-shippers-elastic-v3-browser plugin -date: 2024-05-07 +date: 2024-05-08 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 7011c16301bf3..cd51da8cd6dff 100644 --- a/api_docs/kbn_analytics_shippers_elastic_v3_common.mdx +++ b/api_docs/kbn_analytics_shippers_elastic_v3_common.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-analytics-shippers-elastic-v3-common title: "@kbn/analytics-shippers-elastic-v3-common" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/analytics-shippers-elastic-v3-common plugin -date: 2024-05-07 +date: 2024-05-08 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 f673a97ae8549..b91df3bfe873c 100644 --- a/api_docs/kbn_analytics_shippers_elastic_v3_server.mdx +++ b/api_docs/kbn_analytics_shippers_elastic_v3_server.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-analytics-shippers-elastic-v3-server title: "@kbn/analytics-shippers-elastic-v3-server" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/analytics-shippers-elastic-v3-server plugin -date: 2024-05-07 +date: 2024-05-08 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 97c1f3ab1b5ee..bc674e4e8c6b8 100644 --- a/api_docs/kbn_analytics_shippers_fullstory.mdx +++ b/api_docs/kbn_analytics_shippers_fullstory.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-analytics-shippers-fullstory title: "@kbn/analytics-shippers-fullstory" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/analytics-shippers-fullstory plugin -date: 2024-05-07 +date: 2024-05-08 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 504b2462befc6..a98af1191d8a2 100644 --- a/api_docs/kbn_apm_config_loader.mdx +++ b/api_docs/kbn_apm_config_loader.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-apm-config-loader title: "@kbn/apm-config-loader" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/apm-config-loader plugin -date: 2024-05-07 +date: 2024-05-08 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/apm-config-loader'] --- import kbnApmConfigLoaderObj from './kbn_apm_config_loader.devdocs.json'; diff --git a/api_docs/kbn_apm_data_view.mdx b/api_docs/kbn_apm_data_view.mdx index 6d98bf6a2a14e..67e3d4aa33309 100644 --- a/api_docs/kbn_apm_data_view.mdx +++ b/api_docs/kbn_apm_data_view.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-apm-data-view title: "@kbn/apm-data-view" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/apm-data-view plugin -date: 2024-05-07 +date: 2024-05-08 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/apm-data-view'] --- import kbnApmDataViewObj from './kbn_apm_data_view.devdocs.json'; diff --git a/api_docs/kbn_apm_synthtrace.devdocs.json b/api_docs/kbn_apm_synthtrace.devdocs.json index d0025a57d215c..26ccc25ade717 100644 --- a/api_docs/kbn_apm_synthtrace.devdocs.json +++ b/api_docs/kbn_apm_synthtrace.devdocs.json @@ -142,7 +142,7 @@ "label": "getDefaultPipeline", "description": [], "signature": [ - "(includeSerialization?: boolean) => (base: ", + "({ includeSerialization, versionOverride, }?: { includeSerialization?: boolean | undefined; versionOverride?: string | undefined; }) => (base: ", "Readable", ") => NodeJS.WritableStream" ], @@ -153,17 +153,43 @@ { "parentPluginId": "@kbn/apm-synthtrace", "id": "def-server.ApmSynthtraceEsClient.getDefaultPipeline.$1", - "type": "boolean", + "type": "Object", "tags": [], - "label": "includeSerialization", + "label": "{\n includeSerialization,\n versionOverride,\n }", "description": [], - "signature": [ - "boolean" - ], "path": "packages/kbn-apm-synthtrace/src/lib/apm/client/apm_synthtrace_es_client/index.ts", "deprecated": false, "trackAdoption": false, - "isRequired": true + "children": [ + { + "parentPluginId": "@kbn/apm-synthtrace", + "id": "def-server.ApmSynthtraceEsClient.getDefaultPipeline.$1.includeSerialization", + "type": "CompoundType", + "tags": [], + "label": "includeSerialization", + "description": [], + "signature": [ + "boolean | undefined" + ], + "path": "packages/kbn-apm-synthtrace/src/lib/apm/client/apm_synthtrace_es_client/index.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/apm-synthtrace", + "id": "def-server.ApmSynthtraceEsClient.getDefaultPipeline.$1.versionOverride", + "type": "string", + "tags": [], + "label": "versionOverride", + "description": [], + "signature": [ + "string | undefined" + ], + "path": "packages/kbn-apm-synthtrace/src/lib/apm/client/apm_synthtrace_es_client/index.ts", + "deprecated": false, + "trackAdoption": false + } + ] } ], "returnComment": [] @@ -336,6 +362,71 @@ ], "initialIsOpen": false }, + { + "parentPluginId": "@kbn/apm-synthtrace", + "id": "def-server.AssetsSynthtraceEsClient", + "type": "Class", + "tags": [], + "label": "AssetsSynthtraceEsClient", + "description": [], + "signature": [ + { + "pluginId": "@kbn/apm-synthtrace", + "scope": "server", + "docId": "kibKbnApmSynthtracePluginApi", + "section": "def-server.AssetsSynthtraceEsClient", + "text": "AssetsSynthtraceEsClient" + }, + " extends ", + "SynthtraceEsClient", + "<", + "ServiceAssetDocument", + ">" + ], + "path": "packages/kbn-apm-synthtrace/src/lib/assets/assets_synthtrace_es_client.ts", + "deprecated": false, + "trackAdoption": false, + "children": [ + { + "parentPluginId": "@kbn/apm-synthtrace", + "id": "def-server.AssetsSynthtraceEsClient.Unnamed", + "type": "Function", + "tags": [], + "label": "Constructor", + "description": [], + "signature": [ + "any" + ], + "path": "packages/kbn-apm-synthtrace/src/lib/assets/assets_synthtrace_es_client.ts", + "deprecated": false, + "trackAdoption": false, + "children": [ + { + "parentPluginId": "@kbn/apm-synthtrace", + "id": "def-server.AssetsSynthtraceEsClient.Unnamed.$1", + "type": "CompoundType", + "tags": [], + "label": "options", + "description": [], + "signature": [ + "{ client: ", + "default", + "; logger: ", + "Logger", + "; } & ", + "AssetsSynthtraceEsClientOptions" + ], + "path": "packages/kbn-apm-synthtrace/src/lib/assets/assets_synthtrace_es_client.ts", + "deprecated": false, + "trackAdoption": false, + "isRequired": true + } + ], + "returnComment": [] + } + ], + "initialIsOpen": false + }, { "parentPluginId": "@kbn/apm-synthtrace", "id": "def-server.InfraSynthtraceEsClient", diff --git a/api_docs/kbn_apm_synthtrace.mdx b/api_docs/kbn_apm_synthtrace.mdx index 05418059279f8..5b66e7754096e 100644 --- a/api_docs/kbn_apm_synthtrace.mdx +++ b/api_docs/kbn_apm_synthtrace.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-apm-synthtrace title: "@kbn/apm-synthtrace" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/apm-synthtrace plugin -date: 2024-05-07 +date: 2024-05-08 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/apm-synthtrace'] --- import kbnApmSynthtraceObj from './kbn_apm_synthtrace.devdocs.json'; @@ -21,7 +21,7 @@ Contact [@elastic/obs-ux-infra_services-team](https://github.com/orgs/elastic/te | Public API count | Any count | Items lacking comments | Missing exports | |-------------------|-----------|------------------------|-----------------| -| 44 | 0 | 44 | 7 | +| 49 | 0 | 49 | 8 | ## Server diff --git a/api_docs/kbn_apm_synthtrace_client.mdx b/api_docs/kbn_apm_synthtrace_client.mdx index caa4cd14b39f7..cd9c1ce15472e 100644 --- a/api_docs/kbn_apm_synthtrace_client.mdx +++ b/api_docs/kbn_apm_synthtrace_client.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-apm-synthtrace-client title: "@kbn/apm-synthtrace-client" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/apm-synthtrace-client plugin -date: 2024-05-07 +date: 2024-05-08 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/apm-synthtrace-client'] --- import kbnApmSynthtraceClientObj from './kbn_apm_synthtrace_client.devdocs.json'; diff --git a/api_docs/kbn_apm_utils.mdx b/api_docs/kbn_apm_utils.mdx index c8e47128ef8a6..298d3e1e811fa 100644 --- a/api_docs/kbn_apm_utils.mdx +++ b/api_docs/kbn_apm_utils.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-apm-utils title: "@kbn/apm-utils" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/apm-utils plugin -date: 2024-05-07 +date: 2024-05-08 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 45871652bfa04..f0c4637577970 100644 --- a/api_docs/kbn_axe_config.mdx +++ b/api_docs/kbn_axe_config.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-axe-config title: "@kbn/axe-config" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/axe-config plugin -date: 2024-05-07 +date: 2024-05-08 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/axe-config'] --- import kbnAxeConfigObj from './kbn_axe_config.devdocs.json'; diff --git a/api_docs/kbn_bfetch_error.mdx b/api_docs/kbn_bfetch_error.mdx index 649620f5135e4..89b12c9528fbf 100644 --- a/api_docs/kbn_bfetch_error.mdx +++ b/api_docs/kbn_bfetch_error.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-bfetch-error title: "@kbn/bfetch-error" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/bfetch-error plugin -date: 2024-05-07 +date: 2024-05-08 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/bfetch-error'] --- import kbnBfetchErrorObj from './kbn_bfetch_error.devdocs.json'; diff --git a/api_docs/kbn_calculate_auto.mdx b/api_docs/kbn_calculate_auto.mdx index 1dea9352f47f2..fbe7211a59441 100644 --- a/api_docs/kbn_calculate_auto.mdx +++ b/api_docs/kbn_calculate_auto.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-calculate-auto title: "@kbn/calculate-auto" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/calculate-auto plugin -date: 2024-05-07 +date: 2024-05-08 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/calculate-auto'] --- import kbnCalculateAutoObj from './kbn_calculate_auto.devdocs.json'; diff --git a/api_docs/kbn_calculate_width_from_char_count.mdx b/api_docs/kbn_calculate_width_from_char_count.mdx index fa2439bbaea1f..9f5689d279914 100644 --- a/api_docs/kbn_calculate_width_from_char_count.mdx +++ b/api_docs/kbn_calculate_width_from_char_count.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-calculate-width-from-char-count title: "@kbn/calculate-width-from-char-count" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/calculate-width-from-char-count plugin -date: 2024-05-07 +date: 2024-05-08 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/calculate-width-from-char-count'] --- import kbnCalculateWidthFromCharCountObj from './kbn_calculate_width_from_char_count.devdocs.json'; diff --git a/api_docs/kbn_cases_components.mdx b/api_docs/kbn_cases_components.mdx index c4b952f504d18..ee14f8f017141 100644 --- a/api_docs/kbn_cases_components.mdx +++ b/api_docs/kbn_cases_components.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-cases-components title: "@kbn/cases-components" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/cases-components plugin -date: 2024-05-07 +date: 2024-05-08 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/cases-components'] --- import kbnCasesComponentsObj from './kbn_cases_components.devdocs.json'; diff --git a/api_docs/kbn_cell_actions.mdx b/api_docs/kbn_cell_actions.mdx index b62a4b7330e49..05536c9c82e71 100644 --- a/api_docs/kbn_cell_actions.mdx +++ b/api_docs/kbn_cell_actions.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-cell-actions title: "@kbn/cell-actions" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/cell-actions plugin -date: 2024-05-07 +date: 2024-05-08 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/cell-actions'] --- import kbnCellActionsObj from './kbn_cell_actions.devdocs.json'; diff --git a/api_docs/kbn_chart_expressions_common.mdx b/api_docs/kbn_chart_expressions_common.mdx index d60b559f97ba1..06e4db887f2d1 100644 --- a/api_docs/kbn_chart_expressions_common.mdx +++ b/api_docs/kbn_chart_expressions_common.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-chart-expressions-common title: "@kbn/chart-expressions-common" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/chart-expressions-common plugin -date: 2024-05-07 +date: 2024-05-08 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/chart-expressions-common'] --- import kbnChartExpressionsCommonObj from './kbn_chart_expressions_common.devdocs.json'; diff --git a/api_docs/kbn_chart_icons.mdx b/api_docs/kbn_chart_icons.mdx index 45c8c62ff2e12..56696648ce6a1 100644 --- a/api_docs/kbn_chart_icons.mdx +++ b/api_docs/kbn_chart_icons.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-chart-icons title: "@kbn/chart-icons" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/chart-icons plugin -date: 2024-05-07 +date: 2024-05-08 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 b828230139dbc..c074588f46d40 100644 --- a/api_docs/kbn_ci_stats_core.mdx +++ b/api_docs/kbn_ci_stats_core.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-ci-stats-core title: "@kbn/ci-stats-core" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/ci-stats-core plugin -date: 2024-05-07 +date: 2024-05-08 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 f5184158b6b56..50a954803bd3a 100644 --- a/api_docs/kbn_ci_stats_performance_metrics.mdx +++ b/api_docs/kbn_ci_stats_performance_metrics.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-ci-stats-performance-metrics title: "@kbn/ci-stats-performance-metrics" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/ci-stats-performance-metrics plugin -date: 2024-05-07 +date: 2024-05-08 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 47c0e9853fb05..7f65cbb3eb8e3 100644 --- a/api_docs/kbn_ci_stats_reporter.mdx +++ b/api_docs/kbn_ci_stats_reporter.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-ci-stats-reporter title: "@kbn/ci-stats-reporter" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/ci-stats-reporter plugin -date: 2024-05-07 +date: 2024-05-08 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 81c59c1d8658e..a5cb4f3b07c83 100644 --- a/api_docs/kbn_cli_dev_mode.mdx +++ b/api_docs/kbn_cli_dev_mode.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-cli-dev-mode title: "@kbn/cli-dev-mode" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/cli-dev-mode plugin -date: 2024-05-07 +date: 2024-05-08 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/cli-dev-mode'] --- import kbnCliDevModeObj from './kbn_cli_dev_mode.devdocs.json'; diff --git a/api_docs/kbn_code_editor.mdx b/api_docs/kbn_code_editor.mdx index 78cbf871b1dc1..86d408c78601a 100644 --- a/api_docs/kbn_code_editor.mdx +++ b/api_docs/kbn_code_editor.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-code-editor title: "@kbn/code-editor" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/code-editor plugin -date: 2024-05-07 +date: 2024-05-08 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/code-editor'] --- import kbnCodeEditorObj from './kbn_code_editor.devdocs.json'; diff --git a/api_docs/kbn_code_editor_mock.mdx b/api_docs/kbn_code_editor_mock.mdx index 82ce6d2ce0201..c5181c7c77308 100644 --- a/api_docs/kbn_code_editor_mock.mdx +++ b/api_docs/kbn_code_editor_mock.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-code-editor-mock title: "@kbn/code-editor-mock" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/code-editor-mock plugin -date: 2024-05-07 +date: 2024-05-08 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/code-editor-mock'] --- import kbnCodeEditorMockObj from './kbn_code_editor_mock.devdocs.json'; diff --git a/api_docs/kbn_code_owners.mdx b/api_docs/kbn_code_owners.mdx index 08d5b567e91b0..19bb0be97f739 100644 --- a/api_docs/kbn_code_owners.mdx +++ b/api_docs/kbn_code_owners.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-code-owners title: "@kbn/code-owners" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/code-owners plugin -date: 2024-05-07 +date: 2024-05-08 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/code-owners'] --- import kbnCodeOwnersObj from './kbn_code_owners.devdocs.json'; diff --git a/api_docs/kbn_coloring.mdx b/api_docs/kbn_coloring.mdx index 5ed2f613a869e..26540a0351fe7 100644 --- a/api_docs/kbn_coloring.mdx +++ b/api_docs/kbn_coloring.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-coloring title: "@kbn/coloring" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/coloring plugin -date: 2024-05-07 +date: 2024-05-08 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 afaf3fbe4fdb0..ac0a9ae50a4fd 100644 --- a/api_docs/kbn_config.mdx +++ b/api_docs/kbn_config.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-config title: "@kbn/config" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/config plugin -date: 2024-05-07 +date: 2024-05-08 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 007540d8b986f..84fe63900433a 100644 --- a/api_docs/kbn_config_mocks.mdx +++ b/api_docs/kbn_config_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-config-mocks title: "@kbn/config-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/config-mocks plugin -date: 2024-05-07 +date: 2024-05-08 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/config-mocks'] --- import kbnConfigMocksObj from './kbn_config_mocks.devdocs.json'; diff --git a/api_docs/kbn_config_schema.devdocs.json b/api_docs/kbn_config_schema.devdocs.json index 3df7fa2d9f311..2c82087ed0c2e 100644 --- a/api_docs/kbn_config_schema.devdocs.json +++ b/api_docs/kbn_config_schema.devdocs.json @@ -2646,7 +2646,7 @@ "label": "metaFields", "description": [], "signature": [ - "{ readonly META_FIELD_X_OAS_REF_ID: \"x-oas-ref-id\"; readonly META_FIELD_X_OAS_OPTIONAL: \"x-oas-optional\"; readonly META_FIELD_X_OAS_DEPRECATED: \"x-oas-deprecated\"; readonly META_FIELD_X_OAS_MAX_LENGTH: \"x-oas-max-length\"; readonly META_FIELD_X_OAS_MIN_LENGTH: \"x-oas-min-length\"; readonly META_FIELD_X_OAS_GET_ADDITIONAL_PROPERTIES: \"x-oas-get-additional-properties\"; }" + "{ readonly META_FIELD_X_OAS_ANY: \"x-oas-any-type\"; readonly META_FIELD_X_OAS_REF_ID: \"x-oas-ref-id\"; readonly META_FIELD_X_OAS_OPTIONAL: \"x-oas-optional\"; readonly META_FIELD_X_OAS_DEPRECATED: \"x-oas-deprecated\"; readonly META_FIELD_X_OAS_MAX_LENGTH: \"x-oas-max-length\"; readonly META_FIELD_X_OAS_MIN_LENGTH: \"x-oas-min-length\"; readonly META_FIELD_X_OAS_GET_ADDITIONAL_PROPERTIES: \"x-oas-get-additional-properties\"; }" ], "path": "packages/kbn-config-schema/index.ts", "deprecated": false, diff --git a/api_docs/kbn_config_schema.mdx b/api_docs/kbn_config_schema.mdx index bbbe36d4bd85f..2b17857f3c023 100644 --- a/api_docs/kbn_config_schema.mdx +++ b/api_docs/kbn_config_schema.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-config-schema title: "@kbn/config-schema" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/config-schema plugin -date: 2024-05-07 +date: 2024-05-08 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/config-schema'] --- import kbnConfigSchemaObj from './kbn_config_schema.devdocs.json'; diff --git a/api_docs/kbn_content_management_content_editor.mdx b/api_docs/kbn_content_management_content_editor.mdx index b9e0d2959be5f..75d0a599435aa 100644 --- a/api_docs/kbn_content_management_content_editor.mdx +++ b/api_docs/kbn_content_management_content_editor.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-content-management-content-editor title: "@kbn/content-management-content-editor" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/content-management-content-editor plugin -date: 2024-05-07 +date: 2024-05-08 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/content-management-content-editor'] --- import kbnContentManagementContentEditorObj from './kbn_content_management_content_editor.devdocs.json'; diff --git a/api_docs/kbn_content_management_tabbed_table_list_view.mdx b/api_docs/kbn_content_management_tabbed_table_list_view.mdx index bdda37790a9fb..b3b9f2ce79c87 100644 --- a/api_docs/kbn_content_management_tabbed_table_list_view.mdx +++ b/api_docs/kbn_content_management_tabbed_table_list_view.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-content-management-tabbed-table-list-view title: "@kbn/content-management-tabbed-table-list-view" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/content-management-tabbed-table-list-view plugin -date: 2024-05-07 +date: 2024-05-08 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/content-management-tabbed-table-list-view'] --- import kbnContentManagementTabbedTableListViewObj from './kbn_content_management_tabbed_table_list_view.devdocs.json'; diff --git a/api_docs/kbn_content_management_table_list_view.mdx b/api_docs/kbn_content_management_table_list_view.mdx index f1fb4af0a9b37..e4c9f92c29f1d 100644 --- a/api_docs/kbn_content_management_table_list_view.mdx +++ b/api_docs/kbn_content_management_table_list_view.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-content-management-table-list-view title: "@kbn/content-management-table-list-view" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/content-management-table-list-view plugin -date: 2024-05-07 +date: 2024-05-08 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/content-management-table-list-view'] --- import kbnContentManagementTableListViewObj from './kbn_content_management_table_list_view.devdocs.json'; diff --git a/api_docs/kbn_content_management_table_list_view_common.mdx b/api_docs/kbn_content_management_table_list_view_common.mdx index 198f3a0728826..ed4826eaffe90 100644 --- a/api_docs/kbn_content_management_table_list_view_common.mdx +++ b/api_docs/kbn_content_management_table_list_view_common.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-content-management-table-list-view-common title: "@kbn/content-management-table-list-view-common" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/content-management-table-list-view-common plugin -date: 2024-05-07 +date: 2024-05-08 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/content-management-table-list-view-common'] --- import kbnContentManagementTableListViewCommonObj from './kbn_content_management_table_list_view_common.devdocs.json'; diff --git a/api_docs/kbn_content_management_table_list_view_table.mdx b/api_docs/kbn_content_management_table_list_view_table.mdx index 7d9e734fb0c6f..6b0bdcec8df93 100644 --- a/api_docs/kbn_content_management_table_list_view_table.mdx +++ b/api_docs/kbn_content_management_table_list_view_table.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-content-management-table-list-view-table title: "@kbn/content-management-table-list-view-table" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/content-management-table-list-view-table plugin -date: 2024-05-07 +date: 2024-05-08 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/content-management-table-list-view-table'] --- import kbnContentManagementTableListViewTableObj from './kbn_content_management_table_list_view_table.devdocs.json'; diff --git a/api_docs/kbn_content_management_utils.mdx b/api_docs/kbn_content_management_utils.mdx index 67fcab0f2fb1b..e7af9490d99bc 100644 --- a/api_docs/kbn_content_management_utils.mdx +++ b/api_docs/kbn_content_management_utils.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-content-management-utils title: "@kbn/content-management-utils" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/content-management-utils plugin -date: 2024-05-07 +date: 2024-05-08 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/content-management-utils'] --- import kbnContentManagementUtilsObj from './kbn_content_management_utils.devdocs.json'; diff --git a/api_docs/kbn_core_analytics_browser.mdx b/api_docs/kbn_core_analytics_browser.mdx index 390b3613c52ad..0126509e2afe3 100644 --- a/api_docs/kbn_core_analytics_browser.mdx +++ b/api_docs/kbn_core_analytics_browser.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-analytics-browser title: "@kbn/core-analytics-browser" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-analytics-browser plugin -date: 2024-05-07 +date: 2024-05-08 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 516e770be8644..dc799588417b7 100644 --- a/api_docs/kbn_core_analytics_browser_internal.mdx +++ b/api_docs/kbn_core_analytics_browser_internal.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-analytics-browser-internal title: "@kbn/core-analytics-browser-internal" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-analytics-browser-internal plugin -date: 2024-05-07 +date: 2024-05-08 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 1039ca58feeb7..43dc492a3f313 100644 --- a/api_docs/kbn_core_analytics_browser_mocks.mdx +++ b/api_docs/kbn_core_analytics_browser_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-analytics-browser-mocks title: "@kbn/core-analytics-browser-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-analytics-browser-mocks plugin -date: 2024-05-07 +date: 2024-05-08 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 09efab12cb2d2..c6b27d7b4eea7 100644 --- a/api_docs/kbn_core_analytics_server.mdx +++ b/api_docs/kbn_core_analytics_server.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-analytics-server title: "@kbn/core-analytics-server" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-analytics-server plugin -date: 2024-05-07 +date: 2024-05-08 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 b94cd5f3f8e0a..88d5e6395fcbc 100644 --- a/api_docs/kbn_core_analytics_server_internal.mdx +++ b/api_docs/kbn_core_analytics_server_internal.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-analytics-server-internal title: "@kbn/core-analytics-server-internal" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-analytics-server-internal plugin -date: 2024-05-07 +date: 2024-05-08 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 0556a7e806da7..1d0afbbe4e8de 100644 --- a/api_docs/kbn_core_analytics_server_mocks.mdx +++ b/api_docs/kbn_core_analytics_server_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-analytics-server-mocks title: "@kbn/core-analytics-server-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-analytics-server-mocks plugin -date: 2024-05-07 +date: 2024-05-08 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 a5a3cf6e6f04f..d0d1890b5cec1 100644 --- a/api_docs/kbn_core_application_browser.mdx +++ b/api_docs/kbn_core_application_browser.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-application-browser title: "@kbn/core-application-browser" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-application-browser plugin -date: 2024-05-07 +date: 2024-05-08 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 ef0675c702f15..7ae6f74c06313 100644 --- a/api_docs/kbn_core_application_browser_internal.mdx +++ b/api_docs/kbn_core_application_browser_internal.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-application-browser-internal title: "@kbn/core-application-browser-internal" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-application-browser-internal plugin -date: 2024-05-07 +date: 2024-05-08 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 545c07055a738..aca9944b8b3bd 100644 --- a/api_docs/kbn_core_application_browser_mocks.mdx +++ b/api_docs/kbn_core_application_browser_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-application-browser-mocks title: "@kbn/core-application-browser-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-application-browser-mocks plugin -date: 2024-05-07 +date: 2024-05-08 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 d1116c9a45086..182fd67da3945 100644 --- a/api_docs/kbn_core_application_common.mdx +++ b/api_docs/kbn_core_application_common.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-application-common title: "@kbn/core-application-common" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-application-common plugin -date: 2024-05-07 +date: 2024-05-08 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 f269be4656e37..d1a73257cf2ae 100644 --- a/api_docs/kbn_core_apps_browser_internal.mdx +++ b/api_docs/kbn_core_apps_browser_internal.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-apps-browser-internal title: "@kbn/core-apps-browser-internal" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-apps-browser-internal plugin -date: 2024-05-07 +date: 2024-05-08 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 851911b746ad5..0773097b21dc9 100644 --- a/api_docs/kbn_core_apps_browser_mocks.mdx +++ b/api_docs/kbn_core_apps_browser_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-apps-browser-mocks title: "@kbn/core-apps-browser-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-apps-browser-mocks plugin -date: 2024-05-07 +date: 2024-05-08 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-apps-browser-mocks'] --- import kbnCoreAppsBrowserMocksObj from './kbn_core_apps_browser_mocks.devdocs.json'; diff --git a/api_docs/kbn_core_apps_server_internal.mdx b/api_docs/kbn_core_apps_server_internal.mdx index d9c3e43ae9058..d88648d8ecfe0 100644 --- a/api_docs/kbn_core_apps_server_internal.mdx +++ b/api_docs/kbn_core_apps_server_internal.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-apps-server-internal title: "@kbn/core-apps-server-internal" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-apps-server-internal plugin -date: 2024-05-07 +date: 2024-05-08 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-apps-server-internal'] --- import kbnCoreAppsServerInternalObj from './kbn_core_apps_server_internal.devdocs.json'; diff --git a/api_docs/kbn_core_base_browser_mocks.mdx b/api_docs/kbn_core_base_browser_mocks.mdx index 66406ea34f7f0..292c9aed89e8a 100644 --- a/api_docs/kbn_core_base_browser_mocks.mdx +++ b/api_docs/kbn_core_base_browser_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-base-browser-mocks title: "@kbn/core-base-browser-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-base-browser-mocks plugin -date: 2024-05-07 +date: 2024-05-08 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 523dc8fb52a20..744e6ad46d85e 100644 --- a/api_docs/kbn_core_base_common.mdx +++ b/api_docs/kbn_core_base_common.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-base-common title: "@kbn/core-base-common" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-base-common plugin -date: 2024-05-07 +date: 2024-05-08 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 70f177efe6301..2b0f7b8f03fa5 100644 --- a/api_docs/kbn_core_base_server_internal.mdx +++ b/api_docs/kbn_core_base_server_internal.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-base-server-internal title: "@kbn/core-base-server-internal" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-base-server-internal plugin -date: 2024-05-07 +date: 2024-05-08 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 5befe25252e90..356d0f5cb264d 100644 --- a/api_docs/kbn_core_base_server_mocks.mdx +++ b/api_docs/kbn_core_base_server_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-base-server-mocks title: "@kbn/core-base-server-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-base-server-mocks plugin -date: 2024-05-07 +date: 2024-05-08 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 f1d53d7a05f58..20e800550fc34 100644 --- a/api_docs/kbn_core_capabilities_browser_mocks.mdx +++ b/api_docs/kbn_core_capabilities_browser_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-capabilities-browser-mocks title: "@kbn/core-capabilities-browser-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-capabilities-browser-mocks plugin -date: 2024-05-07 +date: 2024-05-08 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 98f0cd95bdb6b..38416df7af8c8 100644 --- a/api_docs/kbn_core_capabilities_common.mdx +++ b/api_docs/kbn_core_capabilities_common.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-capabilities-common title: "@kbn/core-capabilities-common" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-capabilities-common plugin -date: 2024-05-07 +date: 2024-05-08 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 95291065ce45f..caa21412e6017 100644 --- a/api_docs/kbn_core_capabilities_server.mdx +++ b/api_docs/kbn_core_capabilities_server.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-capabilities-server title: "@kbn/core-capabilities-server" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-capabilities-server plugin -date: 2024-05-07 +date: 2024-05-08 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 7a084fc1f8e09..36e5dd62b8bf1 100644 --- a/api_docs/kbn_core_capabilities_server_mocks.mdx +++ b/api_docs/kbn_core_capabilities_server_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-capabilities-server-mocks title: "@kbn/core-capabilities-server-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-capabilities-server-mocks plugin -date: 2024-05-07 +date: 2024-05-08 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 284b0784a3763..8efc9d567203e 100644 --- a/api_docs/kbn_core_chrome_browser.mdx +++ b/api_docs/kbn_core_chrome_browser.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-chrome-browser title: "@kbn/core-chrome-browser" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-chrome-browser plugin -date: 2024-05-07 +date: 2024-05-08 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 1d6b6ec2a3498..f5f6973f08a72 100644 --- a/api_docs/kbn_core_chrome_browser_mocks.mdx +++ b/api_docs/kbn_core_chrome_browser_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-chrome-browser-mocks title: "@kbn/core-chrome-browser-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-chrome-browser-mocks plugin -date: 2024-05-07 +date: 2024-05-08 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 6b6da0e70fe15..bc952f16110ab 100644 --- a/api_docs/kbn_core_config_server_internal.mdx +++ b/api_docs/kbn_core_config_server_internal.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-config-server-internal title: "@kbn/core-config-server-internal" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-config-server-internal plugin -date: 2024-05-07 +date: 2024-05-08 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-config-server-internal'] --- import kbnCoreConfigServerInternalObj from './kbn_core_config_server_internal.devdocs.json'; diff --git a/api_docs/kbn_core_custom_branding_browser.mdx b/api_docs/kbn_core_custom_branding_browser.mdx index b745ba9695ca5..da0c09e5b2251 100644 --- a/api_docs/kbn_core_custom_branding_browser.mdx +++ b/api_docs/kbn_core_custom_branding_browser.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-custom-branding-browser title: "@kbn/core-custom-branding-browser" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-custom-branding-browser plugin -date: 2024-05-07 +date: 2024-05-08 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-custom-branding-browser'] --- import kbnCoreCustomBrandingBrowserObj from './kbn_core_custom_branding_browser.devdocs.json'; diff --git a/api_docs/kbn_core_custom_branding_browser_internal.mdx b/api_docs/kbn_core_custom_branding_browser_internal.mdx index dd7ce22ded0f6..63857fc79896d 100644 --- a/api_docs/kbn_core_custom_branding_browser_internal.mdx +++ b/api_docs/kbn_core_custom_branding_browser_internal.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-custom-branding-browser-internal title: "@kbn/core-custom-branding-browser-internal" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-custom-branding-browser-internal plugin -date: 2024-05-07 +date: 2024-05-08 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-custom-branding-browser-internal'] --- import kbnCoreCustomBrandingBrowserInternalObj from './kbn_core_custom_branding_browser_internal.devdocs.json'; diff --git a/api_docs/kbn_core_custom_branding_browser_mocks.mdx b/api_docs/kbn_core_custom_branding_browser_mocks.mdx index 6f1282da05669..57e8143bad792 100644 --- a/api_docs/kbn_core_custom_branding_browser_mocks.mdx +++ b/api_docs/kbn_core_custom_branding_browser_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-custom-branding-browser-mocks title: "@kbn/core-custom-branding-browser-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-custom-branding-browser-mocks plugin -date: 2024-05-07 +date: 2024-05-08 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-custom-branding-browser-mocks'] --- import kbnCoreCustomBrandingBrowserMocksObj from './kbn_core_custom_branding_browser_mocks.devdocs.json'; diff --git a/api_docs/kbn_core_custom_branding_common.mdx b/api_docs/kbn_core_custom_branding_common.mdx index 5a0eb1d1e9828..3eddae0f7e3b5 100644 --- a/api_docs/kbn_core_custom_branding_common.mdx +++ b/api_docs/kbn_core_custom_branding_common.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-custom-branding-common title: "@kbn/core-custom-branding-common" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-custom-branding-common plugin -date: 2024-05-07 +date: 2024-05-08 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-custom-branding-common'] --- import kbnCoreCustomBrandingCommonObj from './kbn_core_custom_branding_common.devdocs.json'; diff --git a/api_docs/kbn_core_custom_branding_server.mdx b/api_docs/kbn_core_custom_branding_server.mdx index 22a2258837a8c..96f4a17b02d69 100644 --- a/api_docs/kbn_core_custom_branding_server.mdx +++ b/api_docs/kbn_core_custom_branding_server.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-custom-branding-server title: "@kbn/core-custom-branding-server" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-custom-branding-server plugin -date: 2024-05-07 +date: 2024-05-08 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-custom-branding-server'] --- import kbnCoreCustomBrandingServerObj from './kbn_core_custom_branding_server.devdocs.json'; diff --git a/api_docs/kbn_core_custom_branding_server_internal.mdx b/api_docs/kbn_core_custom_branding_server_internal.mdx index 7ed901dcb0e04..0aeb19fa34abc 100644 --- a/api_docs/kbn_core_custom_branding_server_internal.mdx +++ b/api_docs/kbn_core_custom_branding_server_internal.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-custom-branding-server-internal title: "@kbn/core-custom-branding-server-internal" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-custom-branding-server-internal plugin -date: 2024-05-07 +date: 2024-05-08 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-custom-branding-server-internal'] --- import kbnCoreCustomBrandingServerInternalObj from './kbn_core_custom_branding_server_internal.devdocs.json'; diff --git a/api_docs/kbn_core_custom_branding_server_mocks.mdx b/api_docs/kbn_core_custom_branding_server_mocks.mdx index 43de0b144e401..579abaac9d310 100644 --- a/api_docs/kbn_core_custom_branding_server_mocks.mdx +++ b/api_docs/kbn_core_custom_branding_server_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-custom-branding-server-mocks title: "@kbn/core-custom-branding-server-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-custom-branding-server-mocks plugin -date: 2024-05-07 +date: 2024-05-08 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-custom-branding-server-mocks'] --- import kbnCoreCustomBrandingServerMocksObj from './kbn_core_custom_branding_server_mocks.devdocs.json'; diff --git a/api_docs/kbn_core_deprecations_browser.mdx b/api_docs/kbn_core_deprecations_browser.mdx index 5fe94635256c0..d789d30249b8e 100644 --- a/api_docs/kbn_core_deprecations_browser.mdx +++ b/api_docs/kbn_core_deprecations_browser.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-deprecations-browser title: "@kbn/core-deprecations-browser" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-deprecations-browser plugin -date: 2024-05-07 +date: 2024-05-08 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 f61c1857fdf42..5d471bfca41be 100644 --- a/api_docs/kbn_core_deprecations_browser_internal.mdx +++ b/api_docs/kbn_core_deprecations_browser_internal.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-deprecations-browser-internal title: "@kbn/core-deprecations-browser-internal" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-deprecations-browser-internal plugin -date: 2024-05-07 +date: 2024-05-08 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 4ec550282062e..6c149581238fe 100644 --- a/api_docs/kbn_core_deprecations_browser_mocks.mdx +++ b/api_docs/kbn_core_deprecations_browser_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-deprecations-browser-mocks title: "@kbn/core-deprecations-browser-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-deprecations-browser-mocks plugin -date: 2024-05-07 +date: 2024-05-08 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 58e9c6ff54de2..959bdf23d5fe9 100644 --- a/api_docs/kbn_core_deprecations_common.mdx +++ b/api_docs/kbn_core_deprecations_common.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-deprecations-common title: "@kbn/core-deprecations-common" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-deprecations-common plugin -date: 2024-05-07 +date: 2024-05-08 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 45221cb46655e..d40a6f6905ade 100644 --- a/api_docs/kbn_core_deprecations_server.mdx +++ b/api_docs/kbn_core_deprecations_server.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-deprecations-server title: "@kbn/core-deprecations-server" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-deprecations-server plugin -date: 2024-05-07 +date: 2024-05-08 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 a90de14827350..afddd87a7174a 100644 --- a/api_docs/kbn_core_deprecations_server_internal.mdx +++ b/api_docs/kbn_core_deprecations_server_internal.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-deprecations-server-internal title: "@kbn/core-deprecations-server-internal" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-deprecations-server-internal plugin -date: 2024-05-07 +date: 2024-05-08 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 67188bc7ed692..6cf2b6f4eee76 100644 --- a/api_docs/kbn_core_deprecations_server_mocks.mdx +++ b/api_docs/kbn_core_deprecations_server_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-deprecations-server-mocks title: "@kbn/core-deprecations-server-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-deprecations-server-mocks plugin -date: 2024-05-07 +date: 2024-05-08 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 c0c732a77eb82..ed5d10ceed6c3 100644 --- a/api_docs/kbn_core_doc_links_browser.mdx +++ b/api_docs/kbn_core_doc_links_browser.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-doc-links-browser title: "@kbn/core-doc-links-browser" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-doc-links-browser plugin -date: 2024-05-07 +date: 2024-05-08 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 5d59b4e63994b..04d8197c262ad 100644 --- a/api_docs/kbn_core_doc_links_browser_mocks.mdx +++ b/api_docs/kbn_core_doc_links_browser_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-doc-links-browser-mocks title: "@kbn/core-doc-links-browser-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-doc-links-browser-mocks plugin -date: 2024-05-07 +date: 2024-05-08 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 87feb21601208..39625f7070c59 100644 --- a/api_docs/kbn_core_doc_links_server.mdx +++ b/api_docs/kbn_core_doc_links_server.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-doc-links-server title: "@kbn/core-doc-links-server" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-doc-links-server plugin -date: 2024-05-07 +date: 2024-05-08 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 110627c9d497f..3663be3a829e6 100644 --- a/api_docs/kbn_core_doc_links_server_mocks.mdx +++ b/api_docs/kbn_core_doc_links_server_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-doc-links-server-mocks title: "@kbn/core-doc-links-server-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-doc-links-server-mocks plugin -date: 2024-05-07 +date: 2024-05-08 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 f2307ac78610f..2343eebc3a2c0 100644 --- a/api_docs/kbn_core_elasticsearch_client_server_internal.mdx +++ b/api_docs/kbn_core_elasticsearch_client_server_internal.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-elasticsearch-client-server-internal title: "@kbn/core-elasticsearch-client-server-internal" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-elasticsearch-client-server-internal plugin -date: 2024-05-07 +date: 2024-05-08 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 a4742f0b146ae..081a3802319bf 100644 --- a/api_docs/kbn_core_elasticsearch_client_server_mocks.mdx +++ b/api_docs/kbn_core_elasticsearch_client_server_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-elasticsearch-client-server-mocks title: "@kbn/core-elasticsearch-client-server-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-elasticsearch-client-server-mocks plugin -date: 2024-05-07 +date: 2024-05-08 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 bbbecdc2b700d..cc2abc79f2f56 100644 --- a/api_docs/kbn_core_elasticsearch_server.mdx +++ b/api_docs/kbn_core_elasticsearch_server.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-elasticsearch-server title: "@kbn/core-elasticsearch-server" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-elasticsearch-server plugin -date: 2024-05-07 +date: 2024-05-08 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 a1d8dfb5dfa5e..983f6d8ec4530 100644 --- a/api_docs/kbn_core_elasticsearch_server_internal.mdx +++ b/api_docs/kbn_core_elasticsearch_server_internal.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-elasticsearch-server-internal title: "@kbn/core-elasticsearch-server-internal" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-elasticsearch-server-internal plugin -date: 2024-05-07 +date: 2024-05-08 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 75343b2932aa8..b8be0e3df7d73 100644 --- a/api_docs/kbn_core_elasticsearch_server_mocks.mdx +++ b/api_docs/kbn_core_elasticsearch_server_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-elasticsearch-server-mocks title: "@kbn/core-elasticsearch-server-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-elasticsearch-server-mocks plugin -date: 2024-05-07 +date: 2024-05-08 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 9c6748418d79c..5c93b6efc449d 100644 --- a/api_docs/kbn_core_environment_server_internal.mdx +++ b/api_docs/kbn_core_environment_server_internal.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-environment-server-internal title: "@kbn/core-environment-server-internal" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-environment-server-internal plugin -date: 2024-05-07 +date: 2024-05-08 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 c5e88e4d8a5d7..27de00226eca1 100644 --- a/api_docs/kbn_core_environment_server_mocks.mdx +++ b/api_docs/kbn_core_environment_server_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-environment-server-mocks title: "@kbn/core-environment-server-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-environment-server-mocks plugin -date: 2024-05-07 +date: 2024-05-08 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 6b3ff46a69ad1..16c483e81a231 100644 --- a/api_docs/kbn_core_execution_context_browser.mdx +++ b/api_docs/kbn_core_execution_context_browser.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-execution-context-browser title: "@kbn/core-execution-context-browser" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-execution-context-browser plugin -date: 2024-05-07 +date: 2024-05-08 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 bd3fb3d7b9346..2ec143d0e726d 100644 --- a/api_docs/kbn_core_execution_context_browser_internal.mdx +++ b/api_docs/kbn_core_execution_context_browser_internal.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-execution-context-browser-internal title: "@kbn/core-execution-context-browser-internal" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-execution-context-browser-internal plugin -date: 2024-05-07 +date: 2024-05-08 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 1d1df8fbe8740..8105db63625a9 100644 --- a/api_docs/kbn_core_execution_context_browser_mocks.mdx +++ b/api_docs/kbn_core_execution_context_browser_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-execution-context-browser-mocks title: "@kbn/core-execution-context-browser-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-execution-context-browser-mocks plugin -date: 2024-05-07 +date: 2024-05-08 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 bc05b4efc60d8..471eb19a560fa 100644 --- a/api_docs/kbn_core_execution_context_common.mdx +++ b/api_docs/kbn_core_execution_context_common.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-execution-context-common title: "@kbn/core-execution-context-common" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-execution-context-common plugin -date: 2024-05-07 +date: 2024-05-08 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 3af3a533c38e2..8ec2742997d67 100644 --- a/api_docs/kbn_core_execution_context_server.mdx +++ b/api_docs/kbn_core_execution_context_server.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-execution-context-server title: "@kbn/core-execution-context-server" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-execution-context-server plugin -date: 2024-05-07 +date: 2024-05-08 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 74642173b5b56..d996ec932a761 100644 --- a/api_docs/kbn_core_execution_context_server_internal.mdx +++ b/api_docs/kbn_core_execution_context_server_internal.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-execution-context-server-internal title: "@kbn/core-execution-context-server-internal" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-execution-context-server-internal plugin -date: 2024-05-07 +date: 2024-05-08 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 c9fa04e37ff64..0c81e68f609c1 100644 --- a/api_docs/kbn_core_execution_context_server_mocks.mdx +++ b/api_docs/kbn_core_execution_context_server_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-execution-context-server-mocks title: "@kbn/core-execution-context-server-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-execution-context-server-mocks plugin -date: 2024-05-07 +date: 2024-05-08 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 709bad3c9ef99..ff0e4fcf80efb 100644 --- a/api_docs/kbn_core_fatal_errors_browser.mdx +++ b/api_docs/kbn_core_fatal_errors_browser.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-fatal-errors-browser title: "@kbn/core-fatal-errors-browser" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-fatal-errors-browser plugin -date: 2024-05-07 +date: 2024-05-08 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 ec2a5eb064a7f..40115683515f4 100644 --- a/api_docs/kbn_core_fatal_errors_browser_mocks.mdx +++ b/api_docs/kbn_core_fatal_errors_browser_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-fatal-errors-browser-mocks title: "@kbn/core-fatal-errors-browser-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-fatal-errors-browser-mocks plugin -date: 2024-05-07 +date: 2024-05-08 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 7c667de386921..08508488a882d 100644 --- a/api_docs/kbn_core_http_browser.mdx +++ b/api_docs/kbn_core_http_browser.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-http-browser title: "@kbn/core-http-browser" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-http-browser plugin -date: 2024-05-07 +date: 2024-05-08 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 086b28a0340d7..aec2bcd38e876 100644 --- a/api_docs/kbn_core_http_browser_internal.mdx +++ b/api_docs/kbn_core_http_browser_internal.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-http-browser-internal title: "@kbn/core-http-browser-internal" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-http-browser-internal plugin -date: 2024-05-07 +date: 2024-05-08 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 e60c30d9b5867..5449ee21814ed 100644 --- a/api_docs/kbn_core_http_browser_mocks.mdx +++ b/api_docs/kbn_core_http_browser_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-http-browser-mocks title: "@kbn/core-http-browser-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-http-browser-mocks plugin -date: 2024-05-07 +date: 2024-05-08 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 4e41084d85ed6..27ab0060f3a1e 100644 --- a/api_docs/kbn_core_http_common.mdx +++ b/api_docs/kbn_core_http_common.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-http-common title: "@kbn/core-http-common" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-http-common plugin -date: 2024-05-07 +date: 2024-05-08 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 29bb658986a05..b95be25068fa5 100644 --- a/api_docs/kbn_core_http_context_server_mocks.mdx +++ b/api_docs/kbn_core_http_context_server_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-http-context-server-mocks title: "@kbn/core-http-context-server-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-http-context-server-mocks plugin -date: 2024-05-07 +date: 2024-05-08 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 93c9bc6a42370..990df98d68829 100644 --- a/api_docs/kbn_core_http_request_handler_context_server.mdx +++ b/api_docs/kbn_core_http_request_handler_context_server.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-http-request-handler-context-server title: "@kbn/core-http-request-handler-context-server" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-http-request-handler-context-server plugin -date: 2024-05-07 +date: 2024-05-08 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-http-request-handler-context-server'] --- import kbnCoreHttpRequestHandlerContextServerObj from './kbn_core_http_request_handler_context_server.devdocs.json'; diff --git a/api_docs/kbn_core_http_resources_server.mdx b/api_docs/kbn_core_http_resources_server.mdx index 69b07132e6dc0..b00bdb75ddc5f 100644 --- a/api_docs/kbn_core_http_resources_server.mdx +++ b/api_docs/kbn_core_http_resources_server.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-http-resources-server title: "@kbn/core-http-resources-server" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-http-resources-server plugin -date: 2024-05-07 +date: 2024-05-08 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-http-resources-server'] --- import kbnCoreHttpResourcesServerObj from './kbn_core_http_resources_server.devdocs.json'; diff --git a/api_docs/kbn_core_http_resources_server_internal.mdx b/api_docs/kbn_core_http_resources_server_internal.mdx index bd07407dc8e2b..d676745502b7c 100644 --- a/api_docs/kbn_core_http_resources_server_internal.mdx +++ b/api_docs/kbn_core_http_resources_server_internal.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-http-resources-server-internal title: "@kbn/core-http-resources-server-internal" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-http-resources-server-internal plugin -date: 2024-05-07 +date: 2024-05-08 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-http-resources-server-internal'] --- import kbnCoreHttpResourcesServerInternalObj from './kbn_core_http_resources_server_internal.devdocs.json'; diff --git a/api_docs/kbn_core_http_resources_server_mocks.mdx b/api_docs/kbn_core_http_resources_server_mocks.mdx index 69be18716ddbe..151d290017216 100644 --- a/api_docs/kbn_core_http_resources_server_mocks.mdx +++ b/api_docs/kbn_core_http_resources_server_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-http-resources-server-mocks title: "@kbn/core-http-resources-server-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-http-resources-server-mocks plugin -date: 2024-05-07 +date: 2024-05-08 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-http-resources-server-mocks'] --- import kbnCoreHttpResourcesServerMocksObj from './kbn_core_http_resources_server_mocks.devdocs.json'; diff --git a/api_docs/kbn_core_http_router_server_internal.mdx b/api_docs/kbn_core_http_router_server_internal.mdx index df114b2c609ac..9726326b3558f 100644 --- a/api_docs/kbn_core_http_router_server_internal.mdx +++ b/api_docs/kbn_core_http_router_server_internal.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-http-router-server-internal title: "@kbn/core-http-router-server-internal" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-http-router-server-internal plugin -date: 2024-05-07 +date: 2024-05-08 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 e04a26dc799ab..5f912403a2588 100644 --- a/api_docs/kbn_core_http_router_server_mocks.mdx +++ b/api_docs/kbn_core_http_router_server_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-http-router-server-mocks title: "@kbn/core-http-router-server-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-http-router-server-mocks plugin -date: 2024-05-07 +date: 2024-05-08 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-http-router-server-mocks'] --- import kbnCoreHttpRouterServerMocksObj from './kbn_core_http_router_server_mocks.devdocs.json'; diff --git a/api_docs/kbn_core_http_server.devdocs.json b/api_docs/kbn_core_http_server.devdocs.json index 74a728d7294c4..2b48cd4c4d9da 100644 --- a/api_docs/kbn_core_http_server.devdocs.json +++ b/api_docs/kbn_core_http_server.devdocs.json @@ -12522,7 +12522,7 @@ "tags": [], "label": "description", "description": [ - "Human-friendly description of this endpoint" + "A short, human-friendly description of this endpoint" ], "signature": [ "string | undefined" diff --git a/api_docs/kbn_core_http_server.mdx b/api_docs/kbn_core_http_server.mdx index 1c275ae6b771d..e224ad9a6035f 100644 --- a/api_docs/kbn_core_http_server.mdx +++ b/api_docs/kbn_core_http_server.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-http-server title: "@kbn/core-http-server" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-http-server plugin -date: 2024-05-07 +date: 2024-05-08 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 f380f09c68fdc..c69d5b90084e5 100644 --- a/api_docs/kbn_core_http_server_internal.mdx +++ b/api_docs/kbn_core_http_server_internal.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-http-server-internal title: "@kbn/core-http-server-internal" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-http-server-internal plugin -date: 2024-05-07 +date: 2024-05-08 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 c4cac44b95787..d76c0bc89d77a 100644 --- a/api_docs/kbn_core_http_server_mocks.mdx +++ b/api_docs/kbn_core_http_server_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-http-server-mocks title: "@kbn/core-http-server-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-http-server-mocks plugin -date: 2024-05-07 +date: 2024-05-08 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 a5df4593cee14..32c0d38bcfcf9 100644 --- a/api_docs/kbn_core_i18n_browser.mdx +++ b/api_docs/kbn_core_i18n_browser.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-i18n-browser title: "@kbn/core-i18n-browser" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-i18n-browser plugin -date: 2024-05-07 +date: 2024-05-08 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 7957b22820633..eb761476f0830 100644 --- a/api_docs/kbn_core_i18n_browser_mocks.mdx +++ b/api_docs/kbn_core_i18n_browser_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-i18n-browser-mocks title: "@kbn/core-i18n-browser-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-i18n-browser-mocks plugin -date: 2024-05-07 +date: 2024-05-08 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 3a952ee57a131..bc81df8420ef1 100644 --- a/api_docs/kbn_core_i18n_server.mdx +++ b/api_docs/kbn_core_i18n_server.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-i18n-server title: "@kbn/core-i18n-server" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-i18n-server plugin -date: 2024-05-07 +date: 2024-05-08 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 e32580693f4cc..7d5183a45b681 100644 --- a/api_docs/kbn_core_i18n_server_internal.mdx +++ b/api_docs/kbn_core_i18n_server_internal.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-i18n-server-internal title: "@kbn/core-i18n-server-internal" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-i18n-server-internal plugin -date: 2024-05-07 +date: 2024-05-08 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 71eff66fb0005..bec1ac40ae6ca 100644 --- a/api_docs/kbn_core_i18n_server_mocks.mdx +++ b/api_docs/kbn_core_i18n_server_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-i18n-server-mocks title: "@kbn/core-i18n-server-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-i18n-server-mocks plugin -date: 2024-05-07 +date: 2024-05-08 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-i18n-server-mocks'] --- import kbnCoreI18nServerMocksObj from './kbn_core_i18n_server_mocks.devdocs.json'; diff --git a/api_docs/kbn_core_injected_metadata_browser_mocks.mdx b/api_docs/kbn_core_injected_metadata_browser_mocks.mdx index 0bcd9ec519e7a..f689b2fc48671 100644 --- a/api_docs/kbn_core_injected_metadata_browser_mocks.mdx +++ b/api_docs/kbn_core_injected_metadata_browser_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-injected-metadata-browser-mocks title: "@kbn/core-injected-metadata-browser-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-injected-metadata-browser-mocks plugin -date: 2024-05-07 +date: 2024-05-08 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 158bff429478a..845e53a0f33ac 100644 --- a/api_docs/kbn_core_integrations_browser_internal.mdx +++ b/api_docs/kbn_core_integrations_browser_internal.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-integrations-browser-internal title: "@kbn/core-integrations-browser-internal" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-integrations-browser-internal plugin -date: 2024-05-07 +date: 2024-05-08 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 7d241333f1f9e..13170bbff73bd 100644 --- a/api_docs/kbn_core_integrations_browser_mocks.mdx +++ b/api_docs/kbn_core_integrations_browser_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-integrations-browser-mocks title: "@kbn/core-integrations-browser-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-integrations-browser-mocks plugin -date: 2024-05-07 +date: 2024-05-08 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 7071be09ff389..33da1ee92153e 100644 --- a/api_docs/kbn_core_lifecycle_browser.mdx +++ b/api_docs/kbn_core_lifecycle_browser.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-lifecycle-browser title: "@kbn/core-lifecycle-browser" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-lifecycle-browser plugin -date: 2024-05-07 +date: 2024-05-08 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 bba0ed1f8b13b..007fbb2a1f029 100644 --- a/api_docs/kbn_core_lifecycle_browser_mocks.mdx +++ b/api_docs/kbn_core_lifecycle_browser_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-lifecycle-browser-mocks title: "@kbn/core-lifecycle-browser-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-lifecycle-browser-mocks plugin -date: 2024-05-07 +date: 2024-05-08 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-lifecycle-browser-mocks'] --- import kbnCoreLifecycleBrowserMocksObj from './kbn_core_lifecycle_browser_mocks.devdocs.json'; diff --git a/api_docs/kbn_core_lifecycle_server.mdx b/api_docs/kbn_core_lifecycle_server.mdx index 5c666b9423a1d..d1fc7449d1ffd 100644 --- a/api_docs/kbn_core_lifecycle_server.mdx +++ b/api_docs/kbn_core_lifecycle_server.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-lifecycle-server title: "@kbn/core-lifecycle-server" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-lifecycle-server plugin -date: 2024-05-07 +date: 2024-05-08 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-lifecycle-server'] --- import kbnCoreLifecycleServerObj from './kbn_core_lifecycle_server.devdocs.json'; diff --git a/api_docs/kbn_core_lifecycle_server_mocks.mdx b/api_docs/kbn_core_lifecycle_server_mocks.mdx index c00f3b8c6c0b1..7cd88b481829e 100644 --- a/api_docs/kbn_core_lifecycle_server_mocks.mdx +++ b/api_docs/kbn_core_lifecycle_server_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-lifecycle-server-mocks title: "@kbn/core-lifecycle-server-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-lifecycle-server-mocks plugin -date: 2024-05-07 +date: 2024-05-08 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-lifecycle-server-mocks'] --- import kbnCoreLifecycleServerMocksObj from './kbn_core_lifecycle_server_mocks.devdocs.json'; diff --git a/api_docs/kbn_core_logging_browser_mocks.mdx b/api_docs/kbn_core_logging_browser_mocks.mdx index fa8e3a132ddea..d0204543b18e5 100644 --- a/api_docs/kbn_core_logging_browser_mocks.mdx +++ b/api_docs/kbn_core_logging_browser_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-logging-browser-mocks title: "@kbn/core-logging-browser-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-logging-browser-mocks plugin -date: 2024-05-07 +date: 2024-05-08 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-logging-browser-mocks'] --- import kbnCoreLoggingBrowserMocksObj from './kbn_core_logging_browser_mocks.devdocs.json'; diff --git a/api_docs/kbn_core_logging_common_internal.mdx b/api_docs/kbn_core_logging_common_internal.mdx index cb4880a69e9e0..ef9e4035ec842 100644 --- a/api_docs/kbn_core_logging_common_internal.mdx +++ b/api_docs/kbn_core_logging_common_internal.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-logging-common-internal title: "@kbn/core-logging-common-internal" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-logging-common-internal plugin -date: 2024-05-07 +date: 2024-05-08 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-logging-common-internal'] --- import kbnCoreLoggingCommonInternalObj from './kbn_core_logging_common_internal.devdocs.json'; diff --git a/api_docs/kbn_core_logging_server.devdocs.json b/api_docs/kbn_core_logging_server.devdocs.json index 1fa70ad1480c0..d65947d07dd66 100644 --- a/api_docs/kbn_core_logging_server.devdocs.json +++ b/api_docs/kbn_core_logging_server.devdocs.json @@ -516,14 +516,46 @@ "parentPluginId": "@kbn/core-logging-server", "id": "def-common.NumericRollingStrategyConfig.max", "type": "number", - "tags": [], + "tags": [ + "deprecated" + ], "label": "max", "description": [ - "\nThe maximum number of files to keep. Once this number is reached, oldest\nfiles will be deleted. Defaults to `7`" + "\nThe maximum number of files to keep. Once this number is reached, oldest\nfiles will be deleted. Defaults to `7`\n" ], "path": "packages/core/logging/core-logging-server/src/appenders/rolling_file.ts", - "deprecated": false, - "trackAdoption": false + "deprecated": true, + "trackAdoption": false, + "references": [ + { + "plugin": "@kbn/core-logging-server-internal", + "path": "packages/core/logging/core-logging-server-internal/src/appenders/rolling_file/strategies/index.ts" + }, + { + "plugin": "@kbn/core-logging-server-internal", + "path": "packages/core/logging/core-logging-server-internal/src/appenders/rolling_file/retention/create_retention_policy.ts" + }, + { + "plugin": "security", + "path": "x-pack/plugins/security/server/config.ts" + }, + { + "plugin": "@kbn/core-logging-server-internal", + "path": "packages/core/logging/core-logging-server-internal/src/appenders/appenders.test.ts" + }, + { + "plugin": "@kbn/core-logging-server-internal", + "path": "packages/core/logging/core-logging-server-internal/src/appenders/rolling_file/rolling_file_appender.test.ts" + }, + { + "plugin": "@kbn/core-logging-server-internal", + "path": "packages/core/logging/core-logging-server-internal/src/appenders/rolling_file/retention/create_retention_policy.test.ts" + }, + { + "plugin": "@kbn/core-logging-server-internal", + "path": "packages/core/logging/core-logging-server-internal/src/appenders/rolling_file/strategies/numeric/numeric_strategy.test.ts" + } + ] } ], "initialIsOpen": false @@ -586,6 +618,69 @@ ], "initialIsOpen": false }, + { + "parentPluginId": "@kbn/core-logging-server", + "id": "def-common.RetentionPolicyConfig", + "type": "Interface", + "tags": [], + "label": "RetentionPolicyConfig", + "description": [], + "path": "packages/core/logging/core-logging-server/src/appenders/rolling_file.ts", + "deprecated": false, + "trackAdoption": false, + "children": [ + { + "parentPluginId": "@kbn/core-logging-server", + "id": "def-common.RetentionPolicyConfig.maxFiles", + "type": "number", + "tags": [], + "label": "maxFiles", + "description": [], + "signature": [ + "number | undefined" + ], + "path": "packages/core/logging/core-logging-server/src/appenders/rolling_file.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/core-logging-server", + "id": "def-common.RetentionPolicyConfig.maxAccumulatedFileSize", + "type": "Object", + "tags": [], + "label": "maxAccumulatedFileSize", + "description": [], + "signature": [ + { + "pluginId": "@kbn/config-schema", + "scope": "common", + "docId": "kibKbnConfigSchemaPluginApi", + "section": "def-common.ByteSizeValue", + "text": "ByteSizeValue" + }, + " | undefined" + ], + "path": "packages/core/logging/core-logging-server/src/appenders/rolling_file.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/core-logging-server", + "id": "def-common.RetentionPolicyConfig.removeOlderThan", + "type": "Object", + "tags": [], + "label": "removeOlderThan", + "description": [], + "signature": [ + "moment.Duration | undefined" + ], + "path": "packages/core/logging/core-logging-server/src/appenders/rolling_file.ts", + "deprecated": false, + "trackAdoption": false + } + ], + "initialIsOpen": false + }, { "parentPluginId": "@kbn/core-logging-server", "id": "def-common.RewriteAppenderConfig", @@ -775,6 +870,29 @@ "path": "packages/core/logging/core-logging-server/src/appenders/rolling_file.ts", "deprecated": false, "trackAdoption": false + }, + { + "parentPluginId": "@kbn/core-logging-server", + "id": "def-common.RollingFileAppenderConfig.retention", + "type": "Object", + "tags": [], + "label": "retention", + "description": [ + "\nThe {@link RetentionPolicy | retention strategy} to use to know which files to keep." + ], + "signature": [ + { + "pluginId": "@kbn/core-logging-server", + "scope": "common", + "docId": "kibKbnCoreLoggingServerPluginApi", + "section": "def-common.RetentionPolicyConfig", + "text": "RetentionPolicyConfig" + }, + " | undefined" + ], + "path": "packages/core/logging/core-logging-server/src/appenders/rolling_file.ts", + "deprecated": false, + "trackAdoption": false } ], "initialIsOpen": false diff --git a/api_docs/kbn_core_logging_server.mdx b/api_docs/kbn_core_logging_server.mdx index 8b98467aefa5d..6e0c449eac193 100644 --- a/api_docs/kbn_core_logging_server.mdx +++ b/api_docs/kbn_core_logging_server.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-logging-server title: "@kbn/core-logging-server" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-logging-server plugin -date: 2024-05-07 +date: 2024-05-08 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-logging-server'] --- import kbnCoreLoggingServerObj from './kbn_core_logging_server.devdocs.json'; @@ -21,7 +21,7 @@ Contact [@elastic/kibana-core](https://github.com/orgs/elastic/teams/kibana-core | Public API count | Any count | Items lacking comments | Missing exports | |-------------------|-----------|------------------------|-----------------| -| 56 | 0 | 30 | 0 | +| 61 | 0 | 34 | 0 | ## Common diff --git a/api_docs/kbn_core_logging_server_internal.devdocs.json b/api_docs/kbn_core_logging_server_internal.devdocs.json index a0af84675aefe..e0f23e8668c97 100644 --- a/api_docs/kbn_core_logging_server_internal.devdocs.json +++ b/api_docs/kbn_core_logging_server_internal.devdocs.json @@ -135,7 +135,15 @@ "section": "def-common.Type", "text": "Type" }, - " | Readonly<{ pattern?: string | undefined; highlight?: boolean | undefined; } & { type: \"pattern\"; }>; }> | Readonly<{} & { type: \"file\"; layout: Readonly<{} & { type: \"json\"; }> | Readonly<{ pattern?: string | undefined; highlight?: boolean | undefined; } & { type: \"pattern\"; }>; fileName: string; }> | Readonly<{} & { type: \"rewrite\"; policy: Readonly<{} & { type: \"meta\"; mode: \"update\" | \"remove\"; properties: Readonly<{ value?: string | number | boolean | null | undefined; } & { path: string; }>[]; }>; appenders: string[]; }> | Readonly<{} & { type: \"rolling-file\"; policy: Readonly<{} & { type: \"size-limit\"; size: ", + " | Readonly<{ pattern?: string | undefined; highlight?: boolean | undefined; } & { type: \"pattern\"; }>; }> | Readonly<{} & { type: \"file\"; layout: Readonly<{} & { type: \"json\"; }> | Readonly<{ pattern?: string | undefined; highlight?: boolean | undefined; } & { type: \"pattern\"; }>; fileName: string; }> | Readonly<{} & { type: \"rewrite\"; policy: Readonly<{} & { type: \"meta\"; mode: \"update\" | \"remove\"; properties: Readonly<{ value?: string | number | boolean | null | undefined; } & { path: string; }>[]; }>; appenders: string[]; }> | Readonly<{ retention?: Readonly<{ maxFiles?: number | undefined; maxAccumulatedFileSize?: ", + { + "pluginId": "@kbn/config-schema", + "scope": "common", + "docId": "kibKbnConfigSchemaPluginApi", + "section": "def-common.ByteSizeValue", + "text": "ByteSizeValue" + }, + " | undefined; removeOlderThan?: moment.Duration | undefined; } & {}> | undefined; } & { type: \"rolling-file\"; policy: Readonly<{} & { type: \"size-limit\"; size: ", { "pluginId": "@kbn/config-schema", "scope": "common", diff --git a/api_docs/kbn_core_logging_server_internal.mdx b/api_docs/kbn_core_logging_server_internal.mdx index 8981344235067..760557105a87c 100644 --- a/api_docs/kbn_core_logging_server_internal.mdx +++ b/api_docs/kbn_core_logging_server_internal.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-logging-server-internal title: "@kbn/core-logging-server-internal" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-logging-server-internal plugin -date: 2024-05-07 +date: 2024-05-08 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 af6eac80fe0d5..b82faa7111ba5 100644 --- a/api_docs/kbn_core_logging_server_mocks.mdx +++ b/api_docs/kbn_core_logging_server_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-logging-server-mocks title: "@kbn/core-logging-server-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-logging-server-mocks plugin -date: 2024-05-07 +date: 2024-05-08 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 36718d3225443..445fcdec86565 100644 --- a/api_docs/kbn_core_metrics_collectors_server_internal.mdx +++ b/api_docs/kbn_core_metrics_collectors_server_internal.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-metrics-collectors-server-internal title: "@kbn/core-metrics-collectors-server-internal" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-metrics-collectors-server-internal plugin -date: 2024-05-07 +date: 2024-05-08 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 563da30ebeaf2..dc3d05b3153d8 100644 --- a/api_docs/kbn_core_metrics_collectors_server_mocks.mdx +++ b/api_docs/kbn_core_metrics_collectors_server_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-metrics-collectors-server-mocks title: "@kbn/core-metrics-collectors-server-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-metrics-collectors-server-mocks plugin -date: 2024-05-07 +date: 2024-05-08 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 ff6e128bba576..1bc8688caa7a7 100644 --- a/api_docs/kbn_core_metrics_server.mdx +++ b/api_docs/kbn_core_metrics_server.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-metrics-server title: "@kbn/core-metrics-server" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-metrics-server plugin -date: 2024-05-07 +date: 2024-05-08 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 d6996a660acbc..1d617f1be6101 100644 --- a/api_docs/kbn_core_metrics_server_internal.mdx +++ b/api_docs/kbn_core_metrics_server_internal.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-metrics-server-internal title: "@kbn/core-metrics-server-internal" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-metrics-server-internal plugin -date: 2024-05-07 +date: 2024-05-08 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 72f7f1e2cdf89..e9c6293b64430 100644 --- a/api_docs/kbn_core_metrics_server_mocks.mdx +++ b/api_docs/kbn_core_metrics_server_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-metrics-server-mocks title: "@kbn/core-metrics-server-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-metrics-server-mocks plugin -date: 2024-05-07 +date: 2024-05-08 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 418eeae8874dd..7b245c5cf780a 100644 --- a/api_docs/kbn_core_mount_utils_browser.mdx +++ b/api_docs/kbn_core_mount_utils_browser.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-mount-utils-browser title: "@kbn/core-mount-utils-browser" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-mount-utils-browser plugin -date: 2024-05-07 +date: 2024-05-08 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 2d997930f420c..b3a41fa67c52e 100644 --- a/api_docs/kbn_core_node_server.mdx +++ b/api_docs/kbn_core_node_server.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-node-server title: "@kbn/core-node-server" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-node-server plugin -date: 2024-05-07 +date: 2024-05-08 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 57428615957b8..8cd0b0260693d 100644 --- a/api_docs/kbn_core_node_server_internal.mdx +++ b/api_docs/kbn_core_node_server_internal.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-node-server-internal title: "@kbn/core-node-server-internal" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-node-server-internal plugin -date: 2024-05-07 +date: 2024-05-08 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 58dbbd12d718a..55ca4f3be1b62 100644 --- a/api_docs/kbn_core_node_server_mocks.mdx +++ b/api_docs/kbn_core_node_server_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-node-server-mocks title: "@kbn/core-node-server-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-node-server-mocks plugin -date: 2024-05-07 +date: 2024-05-08 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 25fce8c4f38fd..60c43cf7a649c 100644 --- a/api_docs/kbn_core_notifications_browser.mdx +++ b/api_docs/kbn_core_notifications_browser.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-notifications-browser title: "@kbn/core-notifications-browser" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-notifications-browser plugin -date: 2024-05-07 +date: 2024-05-08 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 0f4d5e46a350d..7ca68f076f4be 100644 --- a/api_docs/kbn_core_notifications_browser_internal.mdx +++ b/api_docs/kbn_core_notifications_browser_internal.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-notifications-browser-internal title: "@kbn/core-notifications-browser-internal" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-notifications-browser-internal plugin -date: 2024-05-07 +date: 2024-05-08 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 45600dbea3165..7658e594740b4 100644 --- a/api_docs/kbn_core_notifications_browser_mocks.mdx +++ b/api_docs/kbn_core_notifications_browser_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-notifications-browser-mocks title: "@kbn/core-notifications-browser-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-notifications-browser-mocks plugin -date: 2024-05-07 +date: 2024-05-08 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 9ad43cd51fb31..e87a66421f7e8 100644 --- a/api_docs/kbn_core_overlays_browser.mdx +++ b/api_docs/kbn_core_overlays_browser.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-overlays-browser title: "@kbn/core-overlays-browser" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-overlays-browser plugin -date: 2024-05-07 +date: 2024-05-08 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 54e69cb4b3053..98bc840b48c98 100644 --- a/api_docs/kbn_core_overlays_browser_internal.mdx +++ b/api_docs/kbn_core_overlays_browser_internal.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-overlays-browser-internal title: "@kbn/core-overlays-browser-internal" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-overlays-browser-internal plugin -date: 2024-05-07 +date: 2024-05-08 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 e85af2c1abefd..e3c26bed11d6f 100644 --- a/api_docs/kbn_core_overlays_browser_mocks.mdx +++ b/api_docs/kbn_core_overlays_browser_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-overlays-browser-mocks title: "@kbn/core-overlays-browser-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-overlays-browser-mocks plugin -date: 2024-05-07 +date: 2024-05-08 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 7f6204408a0a9..90c11f14a1bdf 100644 --- a/api_docs/kbn_core_plugins_browser.mdx +++ b/api_docs/kbn_core_plugins_browser.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-plugins-browser title: "@kbn/core-plugins-browser" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-plugins-browser plugin -date: 2024-05-07 +date: 2024-05-08 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 ade37cc3113e1..839614d42e4d3 100644 --- a/api_docs/kbn_core_plugins_browser_mocks.mdx +++ b/api_docs/kbn_core_plugins_browser_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-plugins-browser-mocks title: "@kbn/core-plugins-browser-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-plugins-browser-mocks plugin -date: 2024-05-07 +date: 2024-05-08 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-plugins-browser-mocks'] --- import kbnCorePluginsBrowserMocksObj from './kbn_core_plugins_browser_mocks.devdocs.json'; diff --git a/api_docs/kbn_core_plugins_contracts_browser.mdx b/api_docs/kbn_core_plugins_contracts_browser.mdx index dd36d5022e058..2c3880639fe58 100644 --- a/api_docs/kbn_core_plugins_contracts_browser.mdx +++ b/api_docs/kbn_core_plugins_contracts_browser.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-plugins-contracts-browser title: "@kbn/core-plugins-contracts-browser" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-plugins-contracts-browser plugin -date: 2024-05-07 +date: 2024-05-08 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-plugins-contracts-browser'] --- import kbnCorePluginsContractsBrowserObj from './kbn_core_plugins_contracts_browser.devdocs.json'; diff --git a/api_docs/kbn_core_plugins_contracts_server.mdx b/api_docs/kbn_core_plugins_contracts_server.mdx index 57ce91ae0e4d9..c60007d70b375 100644 --- a/api_docs/kbn_core_plugins_contracts_server.mdx +++ b/api_docs/kbn_core_plugins_contracts_server.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-plugins-contracts-server title: "@kbn/core-plugins-contracts-server" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-plugins-contracts-server plugin -date: 2024-05-07 +date: 2024-05-08 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-plugins-contracts-server'] --- import kbnCorePluginsContractsServerObj from './kbn_core_plugins_contracts_server.devdocs.json'; diff --git a/api_docs/kbn_core_plugins_server.mdx b/api_docs/kbn_core_plugins_server.mdx index 26c802e93d312..35db2858409ad 100644 --- a/api_docs/kbn_core_plugins_server.mdx +++ b/api_docs/kbn_core_plugins_server.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-plugins-server title: "@kbn/core-plugins-server" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-plugins-server plugin -date: 2024-05-07 +date: 2024-05-08 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-plugins-server'] --- import kbnCorePluginsServerObj from './kbn_core_plugins_server.devdocs.json'; diff --git a/api_docs/kbn_core_plugins_server_mocks.mdx b/api_docs/kbn_core_plugins_server_mocks.mdx index 63256fcde9daf..54aa75555c9d9 100644 --- a/api_docs/kbn_core_plugins_server_mocks.mdx +++ b/api_docs/kbn_core_plugins_server_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-plugins-server-mocks title: "@kbn/core-plugins-server-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-plugins-server-mocks plugin -date: 2024-05-07 +date: 2024-05-08 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-plugins-server-mocks'] --- import kbnCorePluginsServerMocksObj from './kbn_core_plugins_server_mocks.devdocs.json'; diff --git a/api_docs/kbn_core_preboot_server.mdx b/api_docs/kbn_core_preboot_server.mdx index 91e9ca68ce61d..c88919959e2fb 100644 --- a/api_docs/kbn_core_preboot_server.mdx +++ b/api_docs/kbn_core_preboot_server.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-preboot-server title: "@kbn/core-preboot-server" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-preboot-server plugin -date: 2024-05-07 +date: 2024-05-08 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 3f3e2c3d33de8..0ed8711e1a1b2 100644 --- a/api_docs/kbn_core_preboot_server_mocks.mdx +++ b/api_docs/kbn_core_preboot_server_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-preboot-server-mocks title: "@kbn/core-preboot-server-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-preboot-server-mocks plugin -date: 2024-05-07 +date: 2024-05-08 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 12bf72a718b45..4eb54c651a446 100644 --- a/api_docs/kbn_core_rendering_browser_mocks.mdx +++ b/api_docs/kbn_core_rendering_browser_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-rendering-browser-mocks title: "@kbn/core-rendering-browser-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-rendering-browser-mocks plugin -date: 2024-05-07 +date: 2024-05-08 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-rendering-browser-mocks'] --- import kbnCoreRenderingBrowserMocksObj from './kbn_core_rendering_browser_mocks.devdocs.json'; diff --git a/api_docs/kbn_core_rendering_server_internal.mdx b/api_docs/kbn_core_rendering_server_internal.mdx index 1be26734e441b..436a3836e9d79 100644 --- a/api_docs/kbn_core_rendering_server_internal.mdx +++ b/api_docs/kbn_core_rendering_server_internal.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-rendering-server-internal title: "@kbn/core-rendering-server-internal" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-rendering-server-internal plugin -date: 2024-05-07 +date: 2024-05-08 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-rendering-server-internal'] --- import kbnCoreRenderingServerInternalObj from './kbn_core_rendering_server_internal.devdocs.json'; diff --git a/api_docs/kbn_core_rendering_server_mocks.mdx b/api_docs/kbn_core_rendering_server_mocks.mdx index 47eb336e59c5f..025dc4d6e1b2a 100644 --- a/api_docs/kbn_core_rendering_server_mocks.mdx +++ b/api_docs/kbn_core_rendering_server_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-rendering-server-mocks title: "@kbn/core-rendering-server-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-rendering-server-mocks plugin -date: 2024-05-07 +date: 2024-05-08 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-rendering-server-mocks'] --- import kbnCoreRenderingServerMocksObj from './kbn_core_rendering_server_mocks.devdocs.json'; diff --git a/api_docs/kbn_core_root_server_internal.mdx b/api_docs/kbn_core_root_server_internal.mdx index 60d21e5d11b1a..bc16a26267810 100644 --- a/api_docs/kbn_core_root_server_internal.mdx +++ b/api_docs/kbn_core_root_server_internal.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-root-server-internal title: "@kbn/core-root-server-internal" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-root-server-internal plugin -date: 2024-05-07 +date: 2024-05-08 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-root-server-internal'] --- import kbnCoreRootServerInternalObj from './kbn_core_root_server_internal.devdocs.json'; diff --git a/api_docs/kbn_core_saved_objects_api_browser.mdx b/api_docs/kbn_core_saved_objects_api_browser.mdx index 8cfb5551e4319..9f29959ed0c21 100644 --- a/api_docs/kbn_core_saved_objects_api_browser.mdx +++ b/api_docs/kbn_core_saved_objects_api_browser.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-saved-objects-api-browser title: "@kbn/core-saved-objects-api-browser" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-saved-objects-api-browser plugin -date: 2024-05-07 +date: 2024-05-08 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 bff3e351aacf1..2100a394cefc6 100644 --- a/api_docs/kbn_core_saved_objects_api_server.mdx +++ b/api_docs/kbn_core_saved_objects_api_server.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-saved-objects-api-server title: "@kbn/core-saved-objects-api-server" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-saved-objects-api-server plugin -date: 2024-05-07 +date: 2024-05-08 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-saved-objects-api-server'] --- import kbnCoreSavedObjectsApiServerObj from './kbn_core_saved_objects_api_server.devdocs.json'; diff --git a/api_docs/kbn_core_saved_objects_api_server_mocks.mdx b/api_docs/kbn_core_saved_objects_api_server_mocks.mdx index 5b6252a72eb7b..37fa387eca4ca 100644 --- a/api_docs/kbn_core_saved_objects_api_server_mocks.mdx +++ b/api_docs/kbn_core_saved_objects_api_server_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-saved-objects-api-server-mocks title: "@kbn/core-saved-objects-api-server-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-saved-objects-api-server-mocks plugin -date: 2024-05-07 +date: 2024-05-08 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 6e9dfefc016a9..eeb74d584370a 100644 --- a/api_docs/kbn_core_saved_objects_base_server_internal.mdx +++ b/api_docs/kbn_core_saved_objects_base_server_internal.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-saved-objects-base-server-internal title: "@kbn/core-saved-objects-base-server-internal" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-saved-objects-base-server-internal plugin -date: 2024-05-07 +date: 2024-05-08 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 46153a7c92c50..19bebc9ef34d8 100644 --- a/api_docs/kbn_core_saved_objects_base_server_mocks.mdx +++ b/api_docs/kbn_core_saved_objects_base_server_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-saved-objects-base-server-mocks title: "@kbn/core-saved-objects-base-server-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-saved-objects-base-server-mocks plugin -date: 2024-05-07 +date: 2024-05-08 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 ed96521a7a0fd..0e53013e21a44 100644 --- a/api_docs/kbn_core_saved_objects_browser.mdx +++ b/api_docs/kbn_core_saved_objects_browser.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-saved-objects-browser title: "@kbn/core-saved-objects-browser" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-saved-objects-browser plugin -date: 2024-05-07 +date: 2024-05-08 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 f497c99ebd54d..0b19cbee2153b 100644 --- a/api_docs/kbn_core_saved_objects_browser_internal.mdx +++ b/api_docs/kbn_core_saved_objects_browser_internal.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-saved-objects-browser-internal title: "@kbn/core-saved-objects-browser-internal" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-saved-objects-browser-internal plugin -date: 2024-05-07 +date: 2024-05-08 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 45446d76e681a..c3a4ef433b8bc 100644 --- a/api_docs/kbn_core_saved_objects_browser_mocks.mdx +++ b/api_docs/kbn_core_saved_objects_browser_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-saved-objects-browser-mocks title: "@kbn/core-saved-objects-browser-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-saved-objects-browser-mocks plugin -date: 2024-05-07 +date: 2024-05-08 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 658758ec98cd8..c55f7ffe60544 100644 --- a/api_docs/kbn_core_saved_objects_common.mdx +++ b/api_docs/kbn_core_saved_objects_common.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-saved-objects-common title: "@kbn/core-saved-objects-common" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-saved-objects-common plugin -date: 2024-05-07 +date: 2024-05-08 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 a3107684dd170..65734f8dc89af 100644 --- a/api_docs/kbn_core_saved_objects_import_export_server_internal.mdx +++ b/api_docs/kbn_core_saved_objects_import_export_server_internal.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-saved-objects-import-export-server-internal title: "@kbn/core-saved-objects-import-export-server-internal" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-saved-objects-import-export-server-internal plugin -date: 2024-05-07 +date: 2024-05-08 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 5ae2533ce628c..537f839182955 100644 --- a/api_docs/kbn_core_saved_objects_import_export_server_mocks.mdx +++ b/api_docs/kbn_core_saved_objects_import_export_server_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-saved-objects-import-export-server-mocks title: "@kbn/core-saved-objects-import-export-server-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-saved-objects-import-export-server-mocks plugin -date: 2024-05-07 +date: 2024-05-08 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 bd4c3e6c84740..cec081caa4a88 100644 --- a/api_docs/kbn_core_saved_objects_migration_server_internal.mdx +++ b/api_docs/kbn_core_saved_objects_migration_server_internal.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-saved-objects-migration-server-internal title: "@kbn/core-saved-objects-migration-server-internal" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-saved-objects-migration-server-internal plugin -date: 2024-05-07 +date: 2024-05-08 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 a07cf1a5c663b..c854da3f18a81 100644 --- a/api_docs/kbn_core_saved_objects_migration_server_mocks.mdx +++ b/api_docs/kbn_core_saved_objects_migration_server_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-saved-objects-migration-server-mocks title: "@kbn/core-saved-objects-migration-server-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-saved-objects-migration-server-mocks plugin -date: 2024-05-07 +date: 2024-05-08 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 775198e8d9e16..b096ae1f2fb4e 100644 --- a/api_docs/kbn_core_saved_objects_server.mdx +++ b/api_docs/kbn_core_saved_objects_server.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-saved-objects-server title: "@kbn/core-saved-objects-server" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-saved-objects-server plugin -date: 2024-05-07 +date: 2024-05-08 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 97718171290bb..994913340f0bb 100644 --- a/api_docs/kbn_core_saved_objects_server_internal.mdx +++ b/api_docs/kbn_core_saved_objects_server_internal.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-saved-objects-server-internal title: "@kbn/core-saved-objects-server-internal" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-saved-objects-server-internal plugin -date: 2024-05-07 +date: 2024-05-08 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 30aeaf880df63..4cad47eb2ea47 100644 --- a/api_docs/kbn_core_saved_objects_server_mocks.mdx +++ b/api_docs/kbn_core_saved_objects_server_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-saved-objects-server-mocks title: "@kbn/core-saved-objects-server-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-saved-objects-server-mocks plugin -date: 2024-05-07 +date: 2024-05-08 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 3e290eadd5335..079c840a0575c 100644 --- a/api_docs/kbn_core_saved_objects_utils_server.mdx +++ b/api_docs/kbn_core_saved_objects_utils_server.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-saved-objects-utils-server title: "@kbn/core-saved-objects-utils-server" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-saved-objects-utils-server plugin -date: 2024-05-07 +date: 2024-05-08 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-saved-objects-utils-server'] --- import kbnCoreSavedObjectsUtilsServerObj from './kbn_core_saved_objects_utils_server.devdocs.json'; diff --git a/api_docs/kbn_core_security_browser.mdx b/api_docs/kbn_core_security_browser.mdx index fea553ee4c729..2cb7c25990a94 100644 --- a/api_docs/kbn_core_security_browser.mdx +++ b/api_docs/kbn_core_security_browser.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-security-browser title: "@kbn/core-security-browser" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-security-browser plugin -date: 2024-05-07 +date: 2024-05-08 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-security-browser'] --- import kbnCoreSecurityBrowserObj from './kbn_core_security_browser.devdocs.json'; diff --git a/api_docs/kbn_core_security_browser_internal.mdx b/api_docs/kbn_core_security_browser_internal.mdx index 6d5253870f398..ddc3f058c2d6a 100644 --- a/api_docs/kbn_core_security_browser_internal.mdx +++ b/api_docs/kbn_core_security_browser_internal.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-security-browser-internal title: "@kbn/core-security-browser-internal" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-security-browser-internal plugin -date: 2024-05-07 +date: 2024-05-08 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-security-browser-internal'] --- import kbnCoreSecurityBrowserInternalObj from './kbn_core_security_browser_internal.devdocs.json'; diff --git a/api_docs/kbn_core_security_browser_mocks.mdx b/api_docs/kbn_core_security_browser_mocks.mdx index 90e4e92e72c64..da2262d12f311 100644 --- a/api_docs/kbn_core_security_browser_mocks.mdx +++ b/api_docs/kbn_core_security_browser_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-security-browser-mocks title: "@kbn/core-security-browser-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-security-browser-mocks plugin -date: 2024-05-07 +date: 2024-05-08 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-security-browser-mocks'] --- import kbnCoreSecurityBrowserMocksObj from './kbn_core_security_browser_mocks.devdocs.json'; diff --git a/api_docs/kbn_core_security_common.mdx b/api_docs/kbn_core_security_common.mdx index e3ac95d15116b..a2b59ce4027c2 100644 --- a/api_docs/kbn_core_security_common.mdx +++ b/api_docs/kbn_core_security_common.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-security-common title: "@kbn/core-security-common" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-security-common plugin -date: 2024-05-07 +date: 2024-05-08 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-security-common'] --- import kbnCoreSecurityCommonObj from './kbn_core_security_common.devdocs.json'; diff --git a/api_docs/kbn_core_security_server.mdx b/api_docs/kbn_core_security_server.mdx index f822d67bd3c27..702823d36c75e 100644 --- a/api_docs/kbn_core_security_server.mdx +++ b/api_docs/kbn_core_security_server.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-security-server title: "@kbn/core-security-server" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-security-server plugin -date: 2024-05-07 +date: 2024-05-08 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-security-server'] --- import kbnCoreSecurityServerObj from './kbn_core_security_server.devdocs.json'; diff --git a/api_docs/kbn_core_security_server_internal.mdx b/api_docs/kbn_core_security_server_internal.mdx index 93916c6b37a70..37d008db98cfa 100644 --- a/api_docs/kbn_core_security_server_internal.mdx +++ b/api_docs/kbn_core_security_server_internal.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-security-server-internal title: "@kbn/core-security-server-internal" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-security-server-internal plugin -date: 2024-05-07 +date: 2024-05-08 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-security-server-internal'] --- import kbnCoreSecurityServerInternalObj from './kbn_core_security_server_internal.devdocs.json'; diff --git a/api_docs/kbn_core_security_server_mocks.mdx b/api_docs/kbn_core_security_server_mocks.mdx index 4e81859a099a6..87f1afc656fe0 100644 --- a/api_docs/kbn_core_security_server_mocks.mdx +++ b/api_docs/kbn_core_security_server_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-security-server-mocks title: "@kbn/core-security-server-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-security-server-mocks plugin -date: 2024-05-07 +date: 2024-05-08 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-security-server-mocks'] --- import kbnCoreSecurityServerMocksObj from './kbn_core_security_server_mocks.devdocs.json'; diff --git a/api_docs/kbn_core_status_common.mdx b/api_docs/kbn_core_status_common.mdx index d6894bc522924..6d6984a63e61e 100644 --- a/api_docs/kbn_core_status_common.mdx +++ b/api_docs/kbn_core_status_common.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-status-common title: "@kbn/core-status-common" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-status-common plugin -date: 2024-05-07 +date: 2024-05-08 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 80366eb669e24..f7d53f72c5cc8 100644 --- a/api_docs/kbn_core_status_common_internal.mdx +++ b/api_docs/kbn_core_status_common_internal.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-status-common-internal title: "@kbn/core-status-common-internal" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-status-common-internal plugin -date: 2024-05-07 +date: 2024-05-08 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 ab997b690b3d4..f240e1a37bde7 100644 --- a/api_docs/kbn_core_status_server.mdx +++ b/api_docs/kbn_core_status_server.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-status-server title: "@kbn/core-status-server" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-status-server plugin -date: 2024-05-07 +date: 2024-05-08 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 adae7cfe81e23..bd182f6862096 100644 --- a/api_docs/kbn_core_status_server_internal.mdx +++ b/api_docs/kbn_core_status_server_internal.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-status-server-internal title: "@kbn/core-status-server-internal" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-status-server-internal plugin -date: 2024-05-07 +date: 2024-05-08 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 e42291004607f..072a3c0407348 100644 --- a/api_docs/kbn_core_status_server_mocks.mdx +++ b/api_docs/kbn_core_status_server_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-status-server-mocks title: "@kbn/core-status-server-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-status-server-mocks plugin -date: 2024-05-07 +date: 2024-05-08 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 a3aa65b563a5a..17f97653e96d2 100644 --- a/api_docs/kbn_core_test_helpers_deprecations_getters.mdx +++ b/api_docs/kbn_core_test_helpers_deprecations_getters.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-test-helpers-deprecations-getters title: "@kbn/core-test-helpers-deprecations-getters" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-test-helpers-deprecations-getters plugin -date: 2024-05-07 +date: 2024-05-08 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 68dd6cee71bb0..f41de20ef3ec4 100644 --- a/api_docs/kbn_core_test_helpers_http_setup_browser.mdx +++ b/api_docs/kbn_core_test_helpers_http_setup_browser.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-test-helpers-http-setup-browser title: "@kbn/core-test-helpers-http-setup-browser" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-test-helpers-http-setup-browser plugin -date: 2024-05-07 +date: 2024-05-08 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-test-helpers-http-setup-browser'] --- import kbnCoreTestHelpersHttpSetupBrowserObj from './kbn_core_test_helpers_http_setup_browser.devdocs.json'; diff --git a/api_docs/kbn_core_test_helpers_kbn_server.mdx b/api_docs/kbn_core_test_helpers_kbn_server.mdx index 91f3f12052938..eb94978d41bb8 100644 --- a/api_docs/kbn_core_test_helpers_kbn_server.mdx +++ b/api_docs/kbn_core_test_helpers_kbn_server.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-test-helpers-kbn-server title: "@kbn/core-test-helpers-kbn-server" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-test-helpers-kbn-server plugin -date: 2024-05-07 +date: 2024-05-08 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-test-helpers-kbn-server'] --- import kbnCoreTestHelpersKbnServerObj from './kbn_core_test_helpers_kbn_server.devdocs.json'; diff --git a/api_docs/kbn_core_test_helpers_model_versions.mdx b/api_docs/kbn_core_test_helpers_model_versions.mdx index 2cb0927c100c3..910430d3c00f1 100644 --- a/api_docs/kbn_core_test_helpers_model_versions.mdx +++ b/api_docs/kbn_core_test_helpers_model_versions.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-test-helpers-model-versions title: "@kbn/core-test-helpers-model-versions" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-test-helpers-model-versions plugin -date: 2024-05-07 +date: 2024-05-08 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-test-helpers-model-versions'] --- import kbnCoreTestHelpersModelVersionsObj from './kbn_core_test_helpers_model_versions.devdocs.json'; diff --git a/api_docs/kbn_core_test_helpers_so_type_serializer.mdx b/api_docs/kbn_core_test_helpers_so_type_serializer.mdx index ecacd4381559d..a99bc9987aad7 100644 --- a/api_docs/kbn_core_test_helpers_so_type_serializer.mdx +++ b/api_docs/kbn_core_test_helpers_so_type_serializer.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-test-helpers-so-type-serializer title: "@kbn/core-test-helpers-so-type-serializer" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-test-helpers-so-type-serializer plugin -date: 2024-05-07 +date: 2024-05-08 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-test-helpers-so-type-serializer'] --- import kbnCoreTestHelpersSoTypeSerializerObj from './kbn_core_test_helpers_so_type_serializer.devdocs.json'; diff --git a/api_docs/kbn_core_test_helpers_test_utils.mdx b/api_docs/kbn_core_test_helpers_test_utils.mdx index f443a3ec751fb..d1997051e26d4 100644 --- a/api_docs/kbn_core_test_helpers_test_utils.mdx +++ b/api_docs/kbn_core_test_helpers_test_utils.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-test-helpers-test-utils title: "@kbn/core-test-helpers-test-utils" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-test-helpers-test-utils plugin -date: 2024-05-07 +date: 2024-05-08 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-test-helpers-test-utils'] --- import kbnCoreTestHelpersTestUtilsObj from './kbn_core_test_helpers_test_utils.devdocs.json'; diff --git a/api_docs/kbn_core_theme_browser.mdx b/api_docs/kbn_core_theme_browser.mdx index 04e598d8aaa27..1426fd9790084 100644 --- a/api_docs/kbn_core_theme_browser.mdx +++ b/api_docs/kbn_core_theme_browser.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-theme-browser title: "@kbn/core-theme-browser" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-theme-browser plugin -date: 2024-05-07 +date: 2024-05-08 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-theme-browser'] --- import kbnCoreThemeBrowserObj from './kbn_core_theme_browser.devdocs.json'; diff --git a/api_docs/kbn_core_theme_browser_mocks.mdx b/api_docs/kbn_core_theme_browser_mocks.mdx index ed84d8dcac5c9..74d3ffa972a4d 100644 --- a/api_docs/kbn_core_theme_browser_mocks.mdx +++ b/api_docs/kbn_core_theme_browser_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-theme-browser-mocks title: "@kbn/core-theme-browser-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-theme-browser-mocks plugin -date: 2024-05-07 +date: 2024-05-08 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 b901959b636fb..23a064a18e107 100644 --- a/api_docs/kbn_core_ui_settings_browser.mdx +++ b/api_docs/kbn_core_ui_settings_browser.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-ui-settings-browser title: "@kbn/core-ui-settings-browser" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-ui-settings-browser plugin -date: 2024-05-07 +date: 2024-05-08 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 521e929ad34a7..c3bcf2f4cb839 100644 --- a/api_docs/kbn_core_ui_settings_browser_internal.mdx +++ b/api_docs/kbn_core_ui_settings_browser_internal.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-ui-settings-browser-internal title: "@kbn/core-ui-settings-browser-internal" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-ui-settings-browser-internal plugin -date: 2024-05-07 +date: 2024-05-08 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 3223832c86c00..8e1dd17213070 100644 --- a/api_docs/kbn_core_ui_settings_browser_mocks.mdx +++ b/api_docs/kbn_core_ui_settings_browser_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-ui-settings-browser-mocks title: "@kbn/core-ui-settings-browser-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-ui-settings-browser-mocks plugin -date: 2024-05-07 +date: 2024-05-08 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 5f6fabfda9648..7dc47ed62b266 100644 --- a/api_docs/kbn_core_ui_settings_common.mdx +++ b/api_docs/kbn_core_ui_settings_common.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-ui-settings-common title: "@kbn/core-ui-settings-common" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-ui-settings-common plugin -date: 2024-05-07 +date: 2024-05-08 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 bc00a1294bc20..349774a0ae6bf 100644 --- a/api_docs/kbn_core_ui_settings_server.mdx +++ b/api_docs/kbn_core_ui_settings_server.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-ui-settings-server title: "@kbn/core-ui-settings-server" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-ui-settings-server plugin -date: 2024-05-07 +date: 2024-05-08 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 e3a50f01181b7..5f4e7699e945c 100644 --- a/api_docs/kbn_core_ui_settings_server_internal.mdx +++ b/api_docs/kbn_core_ui_settings_server_internal.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-ui-settings-server-internal title: "@kbn/core-ui-settings-server-internal" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-ui-settings-server-internal plugin -date: 2024-05-07 +date: 2024-05-08 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 2fabb0ab3056e..e4f32e583c914 100644 --- a/api_docs/kbn_core_ui_settings_server_mocks.mdx +++ b/api_docs/kbn_core_ui_settings_server_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-ui-settings-server-mocks title: "@kbn/core-ui-settings-server-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-ui-settings-server-mocks plugin -date: 2024-05-07 +date: 2024-05-08 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 1da8755a95730..7b7f063f5c673 100644 --- a/api_docs/kbn_core_usage_data_server.mdx +++ b/api_docs/kbn_core_usage_data_server.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-usage-data-server title: "@kbn/core-usage-data-server" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-usage-data-server plugin -date: 2024-05-07 +date: 2024-05-08 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 4c7af548bd012..c4705707e829e 100644 --- a/api_docs/kbn_core_usage_data_server_internal.mdx +++ b/api_docs/kbn_core_usage_data_server_internal.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-usage-data-server-internal title: "@kbn/core-usage-data-server-internal" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-usage-data-server-internal plugin -date: 2024-05-07 +date: 2024-05-08 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 f468c07f6f5b2..5733e7e33b5f3 100644 --- a/api_docs/kbn_core_usage_data_server_mocks.mdx +++ b/api_docs/kbn_core_usage_data_server_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-usage-data-server-mocks title: "@kbn/core-usage-data-server-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-usage-data-server-mocks plugin -date: 2024-05-07 +date: 2024-05-08 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-usage-data-server-mocks'] --- import kbnCoreUsageDataServerMocksObj from './kbn_core_usage_data_server_mocks.devdocs.json'; diff --git a/api_docs/kbn_core_user_profile_browser.mdx b/api_docs/kbn_core_user_profile_browser.mdx index 293d453a4c0a9..4160a6ec7a066 100644 --- a/api_docs/kbn_core_user_profile_browser.mdx +++ b/api_docs/kbn_core_user_profile_browser.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-user-profile-browser title: "@kbn/core-user-profile-browser" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-user-profile-browser plugin -date: 2024-05-07 +date: 2024-05-08 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-user-profile-browser'] --- import kbnCoreUserProfileBrowserObj from './kbn_core_user_profile_browser.devdocs.json'; diff --git a/api_docs/kbn_core_user_profile_browser_internal.mdx b/api_docs/kbn_core_user_profile_browser_internal.mdx index f9955e6d69480..5f351efba4b36 100644 --- a/api_docs/kbn_core_user_profile_browser_internal.mdx +++ b/api_docs/kbn_core_user_profile_browser_internal.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-user-profile-browser-internal title: "@kbn/core-user-profile-browser-internal" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-user-profile-browser-internal plugin -date: 2024-05-07 +date: 2024-05-08 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-user-profile-browser-internal'] --- import kbnCoreUserProfileBrowserInternalObj from './kbn_core_user_profile_browser_internal.devdocs.json'; diff --git a/api_docs/kbn_core_user_profile_browser_mocks.mdx b/api_docs/kbn_core_user_profile_browser_mocks.mdx index 014759817f97d..bd8fb5b2c19d2 100644 --- a/api_docs/kbn_core_user_profile_browser_mocks.mdx +++ b/api_docs/kbn_core_user_profile_browser_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-user-profile-browser-mocks title: "@kbn/core-user-profile-browser-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-user-profile-browser-mocks plugin -date: 2024-05-07 +date: 2024-05-08 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-user-profile-browser-mocks'] --- import kbnCoreUserProfileBrowserMocksObj from './kbn_core_user_profile_browser_mocks.devdocs.json'; diff --git a/api_docs/kbn_core_user_profile_common.mdx b/api_docs/kbn_core_user_profile_common.mdx index 8223dd75ed68e..75cb8e8cf1148 100644 --- a/api_docs/kbn_core_user_profile_common.mdx +++ b/api_docs/kbn_core_user_profile_common.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-user-profile-common title: "@kbn/core-user-profile-common" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-user-profile-common plugin -date: 2024-05-07 +date: 2024-05-08 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-user-profile-common'] --- import kbnCoreUserProfileCommonObj from './kbn_core_user_profile_common.devdocs.json'; diff --git a/api_docs/kbn_core_user_profile_server.mdx b/api_docs/kbn_core_user_profile_server.mdx index a5fa7fd756b6d..66277cb1a8de1 100644 --- a/api_docs/kbn_core_user_profile_server.mdx +++ b/api_docs/kbn_core_user_profile_server.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-user-profile-server title: "@kbn/core-user-profile-server" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-user-profile-server plugin -date: 2024-05-07 +date: 2024-05-08 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-user-profile-server'] --- import kbnCoreUserProfileServerObj from './kbn_core_user_profile_server.devdocs.json'; diff --git a/api_docs/kbn_core_user_profile_server_internal.mdx b/api_docs/kbn_core_user_profile_server_internal.mdx index 16640334ae503..fa2fe401989fc 100644 --- a/api_docs/kbn_core_user_profile_server_internal.mdx +++ b/api_docs/kbn_core_user_profile_server_internal.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-user-profile-server-internal title: "@kbn/core-user-profile-server-internal" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-user-profile-server-internal plugin -date: 2024-05-07 +date: 2024-05-08 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-user-profile-server-internal'] --- import kbnCoreUserProfileServerInternalObj from './kbn_core_user_profile_server_internal.devdocs.json'; diff --git a/api_docs/kbn_core_user_profile_server_mocks.mdx b/api_docs/kbn_core_user_profile_server_mocks.mdx index cc8b820894fed..242a27790bf8c 100644 --- a/api_docs/kbn_core_user_profile_server_mocks.mdx +++ b/api_docs/kbn_core_user_profile_server_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-user-profile-server-mocks title: "@kbn/core-user-profile-server-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-user-profile-server-mocks plugin -date: 2024-05-07 +date: 2024-05-08 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-user-profile-server-mocks'] --- import kbnCoreUserProfileServerMocksObj from './kbn_core_user_profile_server_mocks.devdocs.json'; diff --git a/api_docs/kbn_core_user_settings_server.mdx b/api_docs/kbn_core_user_settings_server.mdx index 2bea4cbb475ab..cb08d234122ee 100644 --- a/api_docs/kbn_core_user_settings_server.mdx +++ b/api_docs/kbn_core_user_settings_server.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-user-settings-server title: "@kbn/core-user-settings-server" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-user-settings-server plugin -date: 2024-05-07 +date: 2024-05-08 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-user-settings-server'] --- import kbnCoreUserSettingsServerObj from './kbn_core_user_settings_server.devdocs.json'; diff --git a/api_docs/kbn_core_user_settings_server_mocks.mdx b/api_docs/kbn_core_user_settings_server_mocks.mdx index 4253348adf2a1..26b4c22ca7202 100644 --- a/api_docs/kbn_core_user_settings_server_mocks.mdx +++ b/api_docs/kbn_core_user_settings_server_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-user-settings-server-mocks title: "@kbn/core-user-settings-server-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-user-settings-server-mocks plugin -date: 2024-05-07 +date: 2024-05-08 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-user-settings-server-mocks'] --- import kbnCoreUserSettingsServerMocksObj from './kbn_core_user_settings_server_mocks.devdocs.json'; diff --git a/api_docs/kbn_crypto.mdx b/api_docs/kbn_crypto.mdx index ee8ca515ae636..a311d93e31e01 100644 --- a/api_docs/kbn_crypto.mdx +++ b/api_docs/kbn_crypto.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-crypto title: "@kbn/crypto" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/crypto plugin -date: 2024-05-07 +date: 2024-05-08 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 e4c196f364214..52bb61f369f44 100644 --- a/api_docs/kbn_crypto_browser.mdx +++ b/api_docs/kbn_crypto_browser.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-crypto-browser title: "@kbn/crypto-browser" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/crypto-browser plugin -date: 2024-05-07 +date: 2024-05-08 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/crypto-browser'] --- import kbnCryptoBrowserObj from './kbn_crypto_browser.devdocs.json'; diff --git a/api_docs/kbn_custom_icons.mdx b/api_docs/kbn_custom_icons.mdx index 1934481f20189..ecccd86c12734 100644 --- a/api_docs/kbn_custom_icons.mdx +++ b/api_docs/kbn_custom_icons.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-custom-icons title: "@kbn/custom-icons" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/custom-icons plugin -date: 2024-05-07 +date: 2024-05-08 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/custom-icons'] --- import kbnCustomIconsObj from './kbn_custom_icons.devdocs.json'; diff --git a/api_docs/kbn_custom_integrations.mdx b/api_docs/kbn_custom_integrations.mdx index 93c782565e195..27186905263aa 100644 --- a/api_docs/kbn_custom_integrations.mdx +++ b/api_docs/kbn_custom_integrations.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-custom-integrations title: "@kbn/custom-integrations" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/custom-integrations plugin -date: 2024-05-07 +date: 2024-05-08 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/custom-integrations'] --- import kbnCustomIntegrationsObj from './kbn_custom_integrations.devdocs.json'; diff --git a/api_docs/kbn_cypress_config.mdx b/api_docs/kbn_cypress_config.mdx index c7b5867db054c..275e28e391a07 100644 --- a/api_docs/kbn_cypress_config.mdx +++ b/api_docs/kbn_cypress_config.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-cypress-config title: "@kbn/cypress-config" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/cypress-config plugin -date: 2024-05-07 +date: 2024-05-08 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/cypress-config'] --- import kbnCypressConfigObj from './kbn_cypress_config.devdocs.json'; diff --git a/api_docs/kbn_data_forge.mdx b/api_docs/kbn_data_forge.mdx index 6661861ca3309..f42a92325fd6d 100644 --- a/api_docs/kbn_data_forge.mdx +++ b/api_docs/kbn_data_forge.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-data-forge title: "@kbn/data-forge" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/data-forge plugin -date: 2024-05-07 +date: 2024-05-08 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/data-forge'] --- import kbnDataForgeObj from './kbn_data_forge.devdocs.json'; diff --git a/api_docs/kbn_data_service.mdx b/api_docs/kbn_data_service.mdx index da59b16111878..e62bbe224ae1a 100644 --- a/api_docs/kbn_data_service.mdx +++ b/api_docs/kbn_data_service.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-data-service title: "@kbn/data-service" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/data-service plugin -date: 2024-05-07 +date: 2024-05-08 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/data-service'] --- import kbnDataServiceObj from './kbn_data_service.devdocs.json'; diff --git a/api_docs/kbn_data_stream_adapter.mdx b/api_docs/kbn_data_stream_adapter.mdx index 85f4cc6b3df41..09e1b29a53c35 100644 --- a/api_docs/kbn_data_stream_adapter.mdx +++ b/api_docs/kbn_data_stream_adapter.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-data-stream-adapter title: "@kbn/data-stream-adapter" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/data-stream-adapter plugin -date: 2024-05-07 +date: 2024-05-08 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/data-stream-adapter'] --- import kbnDataStreamAdapterObj from './kbn_data_stream_adapter.devdocs.json'; diff --git a/api_docs/kbn_data_view_utils.mdx b/api_docs/kbn_data_view_utils.mdx index be97f21de2266..20d5016c6d7df 100644 --- a/api_docs/kbn_data_view_utils.mdx +++ b/api_docs/kbn_data_view_utils.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-data-view-utils title: "@kbn/data-view-utils" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/data-view-utils plugin -date: 2024-05-07 +date: 2024-05-08 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/data-view-utils'] --- import kbnDataViewUtilsObj from './kbn_data_view_utils.devdocs.json'; diff --git a/api_docs/kbn_datemath.mdx b/api_docs/kbn_datemath.mdx index 6a85ba8261699..aa0fa31ebf6ff 100644 --- a/api_docs/kbn_datemath.mdx +++ b/api_docs/kbn_datemath.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-datemath title: "@kbn/datemath" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/datemath plugin -date: 2024-05-07 +date: 2024-05-08 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/datemath'] --- import kbnDatemathObj from './kbn_datemath.devdocs.json'; diff --git a/api_docs/kbn_deeplinks_analytics.mdx b/api_docs/kbn_deeplinks_analytics.mdx index c44d5c5bc9acf..7fd70263f9adf 100644 --- a/api_docs/kbn_deeplinks_analytics.mdx +++ b/api_docs/kbn_deeplinks_analytics.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-deeplinks-analytics title: "@kbn/deeplinks-analytics" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/deeplinks-analytics plugin -date: 2024-05-07 +date: 2024-05-08 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/deeplinks-analytics'] --- import kbnDeeplinksAnalyticsObj from './kbn_deeplinks_analytics.devdocs.json'; diff --git a/api_docs/kbn_deeplinks_devtools.mdx b/api_docs/kbn_deeplinks_devtools.mdx index b82ff7391f4d3..c2079b98cdc97 100644 --- a/api_docs/kbn_deeplinks_devtools.mdx +++ b/api_docs/kbn_deeplinks_devtools.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-deeplinks-devtools title: "@kbn/deeplinks-devtools" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/deeplinks-devtools plugin -date: 2024-05-07 +date: 2024-05-08 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/deeplinks-devtools'] --- import kbnDeeplinksDevtoolsObj from './kbn_deeplinks_devtools.devdocs.json'; diff --git a/api_docs/kbn_deeplinks_fleet.mdx b/api_docs/kbn_deeplinks_fleet.mdx index cb67f297f14c3..4aff3270dd8ce 100644 --- a/api_docs/kbn_deeplinks_fleet.mdx +++ b/api_docs/kbn_deeplinks_fleet.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-deeplinks-fleet title: "@kbn/deeplinks-fleet" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/deeplinks-fleet plugin -date: 2024-05-07 +date: 2024-05-08 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/deeplinks-fleet'] --- import kbnDeeplinksFleetObj from './kbn_deeplinks_fleet.devdocs.json'; diff --git a/api_docs/kbn_deeplinks_management.mdx b/api_docs/kbn_deeplinks_management.mdx index f3d12f6c2f38e..d09a87ace569d 100644 --- a/api_docs/kbn_deeplinks_management.mdx +++ b/api_docs/kbn_deeplinks_management.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-deeplinks-management title: "@kbn/deeplinks-management" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/deeplinks-management plugin -date: 2024-05-07 +date: 2024-05-08 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/deeplinks-management'] --- import kbnDeeplinksManagementObj from './kbn_deeplinks_management.devdocs.json'; diff --git a/api_docs/kbn_deeplinks_ml.mdx b/api_docs/kbn_deeplinks_ml.mdx index 71375e0e340d2..474ecf8edf677 100644 --- a/api_docs/kbn_deeplinks_ml.mdx +++ b/api_docs/kbn_deeplinks_ml.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-deeplinks-ml title: "@kbn/deeplinks-ml" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/deeplinks-ml plugin -date: 2024-05-07 +date: 2024-05-08 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/deeplinks-ml'] --- import kbnDeeplinksMlObj from './kbn_deeplinks_ml.devdocs.json'; diff --git a/api_docs/kbn_deeplinks_observability.mdx b/api_docs/kbn_deeplinks_observability.mdx index bef17babdb5ce..c8f3ae1c4c20a 100644 --- a/api_docs/kbn_deeplinks_observability.mdx +++ b/api_docs/kbn_deeplinks_observability.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-deeplinks-observability title: "@kbn/deeplinks-observability" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/deeplinks-observability plugin -date: 2024-05-07 +date: 2024-05-08 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/deeplinks-observability'] --- import kbnDeeplinksObservabilityObj from './kbn_deeplinks_observability.devdocs.json'; diff --git a/api_docs/kbn_deeplinks_search.mdx b/api_docs/kbn_deeplinks_search.mdx index c4a707aa1b263..835e163e103da 100644 --- a/api_docs/kbn_deeplinks_search.mdx +++ b/api_docs/kbn_deeplinks_search.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-deeplinks-search title: "@kbn/deeplinks-search" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/deeplinks-search plugin -date: 2024-05-07 +date: 2024-05-08 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/deeplinks-search'] --- import kbnDeeplinksSearchObj from './kbn_deeplinks_search.devdocs.json'; diff --git a/api_docs/kbn_deeplinks_security.mdx b/api_docs/kbn_deeplinks_security.mdx index f8b42448773ea..0ebd955604ef6 100644 --- a/api_docs/kbn_deeplinks_security.mdx +++ b/api_docs/kbn_deeplinks_security.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-deeplinks-security title: "@kbn/deeplinks-security" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/deeplinks-security plugin -date: 2024-05-07 +date: 2024-05-08 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/deeplinks-security'] --- import kbnDeeplinksSecurityObj from './kbn_deeplinks_security.devdocs.json'; diff --git a/api_docs/kbn_deeplinks_shared.mdx b/api_docs/kbn_deeplinks_shared.mdx index aac62d905e787..885d3321b2210 100644 --- a/api_docs/kbn_deeplinks_shared.mdx +++ b/api_docs/kbn_deeplinks_shared.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-deeplinks-shared title: "@kbn/deeplinks-shared" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/deeplinks-shared plugin -date: 2024-05-07 +date: 2024-05-08 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/deeplinks-shared'] --- import kbnDeeplinksSharedObj from './kbn_deeplinks_shared.devdocs.json'; diff --git a/api_docs/kbn_default_nav_analytics.mdx b/api_docs/kbn_default_nav_analytics.mdx index 4e1422f660776..3dd32b22e818a 100644 --- a/api_docs/kbn_default_nav_analytics.mdx +++ b/api_docs/kbn_default_nav_analytics.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-default-nav-analytics title: "@kbn/default-nav-analytics" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/default-nav-analytics plugin -date: 2024-05-07 +date: 2024-05-08 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/default-nav-analytics'] --- import kbnDefaultNavAnalyticsObj from './kbn_default_nav_analytics.devdocs.json'; diff --git a/api_docs/kbn_default_nav_devtools.mdx b/api_docs/kbn_default_nav_devtools.mdx index 1255037e3c734..039f16fd0191e 100644 --- a/api_docs/kbn_default_nav_devtools.mdx +++ b/api_docs/kbn_default_nav_devtools.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-default-nav-devtools title: "@kbn/default-nav-devtools" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/default-nav-devtools plugin -date: 2024-05-07 +date: 2024-05-08 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/default-nav-devtools'] --- import kbnDefaultNavDevtoolsObj from './kbn_default_nav_devtools.devdocs.json'; diff --git a/api_docs/kbn_default_nav_management.mdx b/api_docs/kbn_default_nav_management.mdx index cfb352467c529..3efdc6df0eff2 100644 --- a/api_docs/kbn_default_nav_management.mdx +++ b/api_docs/kbn_default_nav_management.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-default-nav-management title: "@kbn/default-nav-management" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/default-nav-management plugin -date: 2024-05-07 +date: 2024-05-08 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/default-nav-management'] --- import kbnDefaultNavManagementObj from './kbn_default_nav_management.devdocs.json'; diff --git a/api_docs/kbn_default_nav_ml.mdx b/api_docs/kbn_default_nav_ml.mdx index 2a177fd433180..f662db109b1a3 100644 --- a/api_docs/kbn_default_nav_ml.mdx +++ b/api_docs/kbn_default_nav_ml.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-default-nav-ml title: "@kbn/default-nav-ml" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/default-nav-ml plugin -date: 2024-05-07 +date: 2024-05-08 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/default-nav-ml'] --- import kbnDefaultNavMlObj from './kbn_default_nav_ml.devdocs.json'; diff --git a/api_docs/kbn_dev_cli_errors.mdx b/api_docs/kbn_dev_cli_errors.mdx index b5d4de09efc4d..79b67bd422bc9 100644 --- a/api_docs/kbn_dev_cli_errors.mdx +++ b/api_docs/kbn_dev_cli_errors.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-dev-cli-errors title: "@kbn/dev-cli-errors" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/dev-cli-errors plugin -date: 2024-05-07 +date: 2024-05-08 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 858efcb781cc6..943a776c32b06 100644 --- a/api_docs/kbn_dev_cli_runner.mdx +++ b/api_docs/kbn_dev_cli_runner.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-dev-cli-runner title: "@kbn/dev-cli-runner" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/dev-cli-runner plugin -date: 2024-05-07 +date: 2024-05-08 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 9f884edc2f3b4..2771a2eac3c7e 100644 --- a/api_docs/kbn_dev_proc_runner.mdx +++ b/api_docs/kbn_dev_proc_runner.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-dev-proc-runner title: "@kbn/dev-proc-runner" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/dev-proc-runner plugin -date: 2024-05-07 +date: 2024-05-08 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 fa145b0254209..1eb1aeeaa3cd9 100644 --- a/api_docs/kbn_dev_utils.mdx +++ b/api_docs/kbn_dev_utils.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-dev-utils title: "@kbn/dev-utils" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/dev-utils plugin -date: 2024-05-07 +date: 2024-05-08 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/dev-utils'] --- import kbnDevUtilsObj from './kbn_dev_utils.devdocs.json'; diff --git a/api_docs/kbn_discover_utils.mdx b/api_docs/kbn_discover_utils.mdx index 9a6460e6b0621..3bd620fa58904 100644 --- a/api_docs/kbn_discover_utils.mdx +++ b/api_docs/kbn_discover_utils.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-discover-utils title: "@kbn/discover-utils" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/discover-utils plugin -date: 2024-05-07 +date: 2024-05-08 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/discover-utils'] --- import kbnDiscoverUtilsObj from './kbn_discover_utils.devdocs.json'; diff --git a/api_docs/kbn_doc_links.mdx b/api_docs/kbn_doc_links.mdx index 2b41c1fd52be0..347c8ce6af279 100644 --- a/api_docs/kbn_doc_links.mdx +++ b/api_docs/kbn_doc_links.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-doc-links title: "@kbn/doc-links" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/doc-links plugin -date: 2024-05-07 +date: 2024-05-08 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 e72dac1c4f4b2..cbede5bf09db9 100644 --- a/api_docs/kbn_docs_utils.mdx +++ b/api_docs/kbn_docs_utils.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-docs-utils title: "@kbn/docs-utils" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/docs-utils plugin -date: 2024-05-07 +date: 2024-05-08 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/docs-utils'] --- import kbnDocsUtilsObj from './kbn_docs_utils.devdocs.json'; diff --git a/api_docs/kbn_dom_drag_drop.mdx b/api_docs/kbn_dom_drag_drop.mdx index 5987b877f4e45..c4f37fddc57d7 100644 --- a/api_docs/kbn_dom_drag_drop.mdx +++ b/api_docs/kbn_dom_drag_drop.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-dom-drag-drop title: "@kbn/dom-drag-drop" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/dom-drag-drop plugin -date: 2024-05-07 +date: 2024-05-08 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/dom-drag-drop'] --- import kbnDomDragDropObj from './kbn_dom_drag_drop.devdocs.json'; diff --git a/api_docs/kbn_ebt_tools.mdx b/api_docs/kbn_ebt_tools.mdx index df23414027d21..a7542207d2e00 100644 --- a/api_docs/kbn_ebt_tools.mdx +++ b/api_docs/kbn_ebt_tools.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-ebt-tools title: "@kbn/ebt-tools" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/ebt-tools plugin -date: 2024-05-07 +date: 2024-05-08 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/ebt-tools'] --- import kbnEbtToolsObj from './kbn_ebt_tools.devdocs.json'; diff --git a/api_docs/kbn_ecs_data_quality_dashboard.mdx b/api_docs/kbn_ecs_data_quality_dashboard.mdx index bf45e7d61ad6c..2b6ffb2ad08cf 100644 --- a/api_docs/kbn_ecs_data_quality_dashboard.mdx +++ b/api_docs/kbn_ecs_data_quality_dashboard.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-ecs-data-quality-dashboard title: "@kbn/ecs-data-quality-dashboard" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/ecs-data-quality-dashboard plugin -date: 2024-05-07 +date: 2024-05-08 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/ecs-data-quality-dashboard'] --- import kbnEcsDataQualityDashboardObj from './kbn_ecs_data_quality_dashboard.devdocs.json'; diff --git a/api_docs/kbn_elastic_agent_utils.mdx b/api_docs/kbn_elastic_agent_utils.mdx index 7fa5ef3f3c913..1fd8e7a918f3c 100644 --- a/api_docs/kbn_elastic_agent_utils.mdx +++ b/api_docs/kbn_elastic_agent_utils.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-elastic-agent-utils title: "@kbn/elastic-agent-utils" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/elastic-agent-utils plugin -date: 2024-05-07 +date: 2024-05-08 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/elastic-agent-utils'] --- import kbnElasticAgentUtilsObj from './kbn_elastic_agent_utils.devdocs.json'; diff --git a/api_docs/kbn_elastic_assistant.mdx b/api_docs/kbn_elastic_assistant.mdx index f783c38853d0e..c0f4d889ffa01 100644 --- a/api_docs/kbn_elastic_assistant.mdx +++ b/api_docs/kbn_elastic_assistant.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-elastic-assistant title: "@kbn/elastic-assistant" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/elastic-assistant plugin -date: 2024-05-07 +date: 2024-05-08 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/elastic-assistant'] --- import kbnElasticAssistantObj from './kbn_elastic_assistant.devdocs.json'; diff --git a/api_docs/kbn_elastic_assistant_common.mdx b/api_docs/kbn_elastic_assistant_common.mdx index 68564211be097..b0e3cd3b3f508 100644 --- a/api_docs/kbn_elastic_assistant_common.mdx +++ b/api_docs/kbn_elastic_assistant_common.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-elastic-assistant-common title: "@kbn/elastic-assistant-common" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/elastic-assistant-common plugin -date: 2024-05-07 +date: 2024-05-08 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/elastic-assistant-common'] --- import kbnElasticAssistantCommonObj from './kbn_elastic_assistant_common.devdocs.json'; diff --git a/api_docs/kbn_es.mdx b/api_docs/kbn_es.mdx index 4c04657d76e3d..f4c68bbbf0bd5 100644 --- a/api_docs/kbn_es.mdx +++ b/api_docs/kbn_es.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-es title: "@kbn/es" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/es plugin -date: 2024-05-07 +date: 2024-05-08 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/es'] --- import kbnEsObj from './kbn_es.devdocs.json'; diff --git a/api_docs/kbn_es_archiver.mdx b/api_docs/kbn_es_archiver.mdx index 0172274ac1f35..1a6bbe320cddb 100644 --- a/api_docs/kbn_es_archiver.mdx +++ b/api_docs/kbn_es_archiver.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-es-archiver title: "@kbn/es-archiver" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/es-archiver plugin -date: 2024-05-07 +date: 2024-05-08 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 9e4a0c62db92c..d6ed825ea89f0 100644 --- a/api_docs/kbn_es_errors.mdx +++ b/api_docs/kbn_es_errors.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-es-errors title: "@kbn/es-errors" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/es-errors plugin -date: 2024-05-07 +date: 2024-05-08 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 4c19b964bad33..c76fcd89d96ef 100644 --- a/api_docs/kbn_es_query.mdx +++ b/api_docs/kbn_es_query.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-es-query title: "@kbn/es-query" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/es-query plugin -date: 2024-05-07 +date: 2024-05-08 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 bf08d8e9f2b16..23b41fabb47c6 100644 --- a/api_docs/kbn_es_types.mdx +++ b/api_docs/kbn_es_types.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-es-types title: "@kbn/es-types" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/es-types plugin -date: 2024-05-07 +date: 2024-05-08 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 ca85bf47ca96c..c5197372a3732 100644 --- a/api_docs/kbn_eslint_plugin_imports.mdx +++ b/api_docs/kbn_eslint_plugin_imports.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-eslint-plugin-imports title: "@kbn/eslint-plugin-imports" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/eslint-plugin-imports plugin -date: 2024-05-07 +date: 2024-05-08 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/eslint-plugin-imports'] --- import kbnEslintPluginImportsObj from './kbn_eslint_plugin_imports.devdocs.json'; diff --git a/api_docs/kbn_esql_ast.mdx b/api_docs/kbn_esql_ast.mdx index 53abd297b3814..e44a580c68951 100644 --- a/api_docs/kbn_esql_ast.mdx +++ b/api_docs/kbn_esql_ast.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-esql-ast title: "@kbn/esql-ast" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/esql-ast plugin -date: 2024-05-07 +date: 2024-05-08 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/esql-ast'] --- import kbnEsqlAstObj from './kbn_esql_ast.devdocs.json'; diff --git a/api_docs/kbn_esql_utils.mdx b/api_docs/kbn_esql_utils.mdx index b0068228f73ab..e99d145b804cc 100644 --- a/api_docs/kbn_esql_utils.mdx +++ b/api_docs/kbn_esql_utils.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-esql-utils title: "@kbn/esql-utils" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/esql-utils plugin -date: 2024-05-07 +date: 2024-05-08 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/esql-utils'] --- import kbnEsqlUtilsObj from './kbn_esql_utils.devdocs.json'; diff --git a/api_docs/kbn_esql_validation_autocomplete.devdocs.json b/api_docs/kbn_esql_validation_autocomplete.devdocs.json index fc9229883fba6..bdaab839c8862 100644 --- a/api_docs/kbn_esql_validation_autocomplete.devdocs.json +++ b/api_docs/kbn_esql_validation_autocomplete.devdocs.json @@ -384,7 +384,7 @@ "label": "getAllFunctions", "description": [], "signature": [ - "(options: { type: \"grouping\" | \"agg\" | \"builtin\" | \"eval\" | (\"grouping\" | \"agg\" | \"builtin\" | \"eval\")[]; } | undefined) => ", + "(options: { type: \"agg\" | \"builtin\" | \"eval\" | (\"agg\" | \"builtin\" | \"eval\")[]; } | undefined) => ", { "pluginId": "@kbn/esql-validation-autocomplete", "scope": "common", @@ -417,7 +417,7 @@ "label": "type", "description": [], "signature": [ - "\"grouping\" | \"agg\" | \"builtin\" | \"eval\" | (\"grouping\" | \"agg\" | \"builtin\" | \"eval\")[]" + "\"agg\" | \"builtin\" | \"eval\" | (\"agg\" | \"builtin\" | \"eval\")[]" ], "path": "packages/kbn-esql-validation-autocomplete/src/shared/helpers.ts", "deprecated": false, @@ -3149,7 +3149,7 @@ "label": "type", "description": [], "signature": [ - "\"grouping\" | \"agg\" | \"builtin\" | \"eval\"" + "\"agg\" | \"builtin\" | \"eval\"" ], "path": "packages/kbn-esql-validation-autocomplete/src/definitions/types.ts", "deprecated": false, diff --git a/api_docs/kbn_esql_validation_autocomplete.mdx b/api_docs/kbn_esql_validation_autocomplete.mdx index 8bfb894e34295..d8a22c3c8e1aa 100644 --- a/api_docs/kbn_esql_validation_autocomplete.mdx +++ b/api_docs/kbn_esql_validation_autocomplete.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-esql-validation-autocomplete title: "@kbn/esql-validation-autocomplete" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/esql-validation-autocomplete plugin -date: 2024-05-07 +date: 2024-05-08 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/esql-validation-autocomplete'] --- import kbnEsqlValidationAutocompleteObj from './kbn_esql_validation_autocomplete.devdocs.json'; diff --git a/api_docs/kbn_event_annotation_common.mdx b/api_docs/kbn_event_annotation_common.mdx index 4274cb07349c5..0497932a15450 100644 --- a/api_docs/kbn_event_annotation_common.mdx +++ b/api_docs/kbn_event_annotation_common.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-event-annotation-common title: "@kbn/event-annotation-common" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/event-annotation-common plugin -date: 2024-05-07 +date: 2024-05-08 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/event-annotation-common'] --- import kbnEventAnnotationCommonObj from './kbn_event_annotation_common.devdocs.json'; diff --git a/api_docs/kbn_event_annotation_components.mdx b/api_docs/kbn_event_annotation_components.mdx index bba225b3b9113..4b575ae79ec83 100644 --- a/api_docs/kbn_event_annotation_components.mdx +++ b/api_docs/kbn_event_annotation_components.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-event-annotation-components title: "@kbn/event-annotation-components" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/event-annotation-components plugin -date: 2024-05-07 +date: 2024-05-08 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/event-annotation-components'] --- import kbnEventAnnotationComponentsObj from './kbn_event_annotation_components.devdocs.json'; diff --git a/api_docs/kbn_expandable_flyout.mdx b/api_docs/kbn_expandable_flyout.mdx index 714e799fef65d..88f832c05b67c 100644 --- a/api_docs/kbn_expandable_flyout.mdx +++ b/api_docs/kbn_expandable_flyout.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-expandable-flyout title: "@kbn/expandable-flyout" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/expandable-flyout plugin -date: 2024-05-07 +date: 2024-05-08 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/expandable-flyout'] --- import kbnExpandableFlyoutObj from './kbn_expandable_flyout.devdocs.json'; diff --git a/api_docs/kbn_field_types.mdx b/api_docs/kbn_field_types.mdx index d48043e624721..603ed7c7cf2ed 100644 --- a/api_docs/kbn_field_types.mdx +++ b/api_docs/kbn_field_types.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-field-types title: "@kbn/field-types" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/field-types plugin -date: 2024-05-07 +date: 2024-05-08 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/field-types'] --- import kbnFieldTypesObj from './kbn_field_types.devdocs.json'; diff --git a/api_docs/kbn_field_utils.devdocs.json b/api_docs/kbn_field_utils.devdocs.json index 157c6b0aeaef4..6ffd8029c7422 100644 --- a/api_docs/kbn_field_utils.devdocs.json +++ b/api_docs/kbn_field_utils.devdocs.json @@ -19,6 +19,64 @@ "common": { "classes": [], "functions": [ + { + "parentPluginId": "@kbn/field-utils", + "id": "def-common.comboBoxFieldOptionMatcher", + "type": "Function", + "tags": [], + "label": "comboBoxFieldOptionMatcher", + "description": [ + "\nAdapts fieldNameWildcardMatcher to combobox props." + ], + "signature": [ + "({ option: { name, label }, searchValue, }: { option: { name?: string | undefined; label: string; }; searchValue: string; }) => boolean" + ], + "path": "packages/kbn-field-utils/src/utils/field_name_wildcard_matcher.ts", + "deprecated": false, + "trackAdoption": false, + "children": [ + { + "parentPluginId": "@kbn/field-utils", + "id": "def-common.comboBoxFieldOptionMatcher.$1", + "type": "Object", + "tags": [], + "label": "{\n option: { name, label },\n searchValue,\n}", + "description": [], + "path": "packages/kbn-field-utils/src/utils/field_name_wildcard_matcher.ts", + "deprecated": false, + "trackAdoption": false, + "children": [ + { + "parentPluginId": "@kbn/field-utils", + "id": "def-common.comboBoxFieldOptionMatcher.$1.option", + "type": "Object", + "tags": [], + "label": "option", + "description": [], + "signature": [ + "{ name?: string | undefined; label: string; }" + ], + "path": "packages/kbn-field-utils/src/utils/field_name_wildcard_matcher.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/field-utils", + "id": "def-common.comboBoxFieldOptionMatcher.$1.searchValue", + "type": "string", + "tags": [], + "label": "searchValue", + "description": [], + "path": "packages/kbn-field-utils/src/utils/field_name_wildcard_matcher.ts", + "deprecated": false, + "trackAdoption": false + } + ] + } + ], + "returnComment": [], + "initialIsOpen": false + }, { "parentPluginId": "@kbn/field-utils", "id": "def-common.FieldDescription", diff --git a/api_docs/kbn_field_utils.mdx b/api_docs/kbn_field_utils.mdx index 19033e6ed8232..6839efe3a3ccd 100644 --- a/api_docs/kbn_field_utils.mdx +++ b/api_docs/kbn_field_utils.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-field-utils title: "@kbn/field-utils" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/field-utils plugin -date: 2024-05-07 +date: 2024-05-08 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/field-utils'] --- import kbnFieldUtilsObj from './kbn_field_utils.devdocs.json'; @@ -21,7 +21,7 @@ Contact [@elastic/kibana-data-discovery](https://github.com/orgs/elastic/teams/k | Public API count | Any count | Items lacking comments | Missing exports | |-------------------|-----------|------------------------|-----------------| -| 50 | 0 | 42 | 1 | +| 54 | 0 | 45 | 1 | ## Common diff --git a/api_docs/kbn_find_used_node_modules.mdx b/api_docs/kbn_find_used_node_modules.mdx index 4fe930e065ddf..f615623cf250b 100644 --- a/api_docs/kbn_find_used_node_modules.mdx +++ b/api_docs/kbn_find_used_node_modules.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-find-used-node-modules title: "@kbn/find-used-node-modules" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/find-used-node-modules plugin -date: 2024-05-07 +date: 2024-05-08 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/find-used-node-modules'] --- import kbnFindUsedNodeModulesObj from './kbn_find_used_node_modules.devdocs.json'; diff --git a/api_docs/kbn_formatters.mdx b/api_docs/kbn_formatters.mdx index 974150a300250..ed99d2a221503 100644 --- a/api_docs/kbn_formatters.mdx +++ b/api_docs/kbn_formatters.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-formatters title: "@kbn/formatters" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/formatters plugin -date: 2024-05-07 +date: 2024-05-08 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/formatters'] --- import kbnFormattersObj from './kbn_formatters.devdocs.json'; diff --git a/api_docs/kbn_ftr_common_functional_services.mdx b/api_docs/kbn_ftr_common_functional_services.mdx index 52a2f4632ac70..d219f60dfb064 100644 --- a/api_docs/kbn_ftr_common_functional_services.mdx +++ b/api_docs/kbn_ftr_common_functional_services.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-ftr-common-functional-services title: "@kbn/ftr-common-functional-services" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/ftr-common-functional-services plugin -date: 2024-05-07 +date: 2024-05-08 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/ftr-common-functional-services'] --- import kbnFtrCommonFunctionalServicesObj from './kbn_ftr_common_functional_services.devdocs.json'; diff --git a/api_docs/kbn_ftr_common_functional_ui_services.mdx b/api_docs/kbn_ftr_common_functional_ui_services.mdx index 2a566f77d39c2..1a7eb37080649 100644 --- a/api_docs/kbn_ftr_common_functional_ui_services.mdx +++ b/api_docs/kbn_ftr_common_functional_ui_services.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-ftr-common-functional-ui-services title: "@kbn/ftr-common-functional-ui-services" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/ftr-common-functional-ui-services plugin -date: 2024-05-07 +date: 2024-05-08 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/ftr-common-functional-ui-services'] --- import kbnFtrCommonFunctionalUiServicesObj from './kbn_ftr_common_functional_ui_services.devdocs.json'; diff --git a/api_docs/kbn_generate.mdx b/api_docs/kbn_generate.mdx index 3d8c56b579268..30580ae4c8d44 100644 --- a/api_docs/kbn_generate.mdx +++ b/api_docs/kbn_generate.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-generate title: "@kbn/generate" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/generate plugin -date: 2024-05-07 +date: 2024-05-08 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/generate'] --- import kbnGenerateObj from './kbn_generate.devdocs.json'; diff --git a/api_docs/kbn_generate_console_definitions.mdx b/api_docs/kbn_generate_console_definitions.mdx index 8017604180b56..fc3cffb14612d 100644 --- a/api_docs/kbn_generate_console_definitions.mdx +++ b/api_docs/kbn_generate_console_definitions.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-generate-console-definitions title: "@kbn/generate-console-definitions" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/generate-console-definitions plugin -date: 2024-05-07 +date: 2024-05-08 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/generate-console-definitions'] --- import kbnGenerateConsoleDefinitionsObj from './kbn_generate_console_definitions.devdocs.json'; diff --git a/api_docs/kbn_generate_csv.mdx b/api_docs/kbn_generate_csv.mdx index ee81a66c7b397..dae29500ce1c3 100644 --- a/api_docs/kbn_generate_csv.mdx +++ b/api_docs/kbn_generate_csv.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-generate-csv title: "@kbn/generate-csv" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/generate-csv plugin -date: 2024-05-07 +date: 2024-05-08 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/generate-csv'] --- import kbnGenerateCsvObj from './kbn_generate_csv.devdocs.json'; diff --git a/api_docs/kbn_guided_onboarding.mdx b/api_docs/kbn_guided_onboarding.mdx index ba7e307c03eb4..f4e63a110b2ef 100644 --- a/api_docs/kbn_guided_onboarding.mdx +++ b/api_docs/kbn_guided_onboarding.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-guided-onboarding title: "@kbn/guided-onboarding" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/guided-onboarding plugin -date: 2024-05-07 +date: 2024-05-08 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/guided-onboarding'] --- import kbnGuidedOnboardingObj from './kbn_guided_onboarding.devdocs.json'; diff --git a/api_docs/kbn_handlebars.mdx b/api_docs/kbn_handlebars.mdx index 134c64a9559e5..9b706e6126c4c 100644 --- a/api_docs/kbn_handlebars.mdx +++ b/api_docs/kbn_handlebars.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-handlebars title: "@kbn/handlebars" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/handlebars plugin -date: 2024-05-07 +date: 2024-05-08 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 d123da471048c..f600b15499a81 100644 --- a/api_docs/kbn_hapi_mocks.mdx +++ b/api_docs/kbn_hapi_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-hapi-mocks title: "@kbn/hapi-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/hapi-mocks plugin -date: 2024-05-07 +date: 2024-05-08 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/hapi-mocks'] --- import kbnHapiMocksObj from './kbn_hapi_mocks.devdocs.json'; diff --git a/api_docs/kbn_health_gateway_server.mdx b/api_docs/kbn_health_gateway_server.mdx index ab29833bf040d..82102f4a3b2f4 100644 --- a/api_docs/kbn_health_gateway_server.mdx +++ b/api_docs/kbn_health_gateway_server.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-health-gateway-server title: "@kbn/health-gateway-server" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/health-gateway-server plugin -date: 2024-05-07 +date: 2024-05-08 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/health-gateway-server'] --- import kbnHealthGatewayServerObj from './kbn_health_gateway_server.devdocs.json'; diff --git a/api_docs/kbn_home_sample_data_card.mdx b/api_docs/kbn_home_sample_data_card.mdx index 43755d81745de..2348cb255c8f2 100644 --- a/api_docs/kbn_home_sample_data_card.mdx +++ b/api_docs/kbn_home_sample_data_card.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-home-sample-data-card title: "@kbn/home-sample-data-card" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/home-sample-data-card plugin -date: 2024-05-07 +date: 2024-05-08 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 32d5eaaaa1bd1..287b7475f75f7 100644 --- a/api_docs/kbn_home_sample_data_tab.mdx +++ b/api_docs/kbn_home_sample_data_tab.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-home-sample-data-tab title: "@kbn/home-sample-data-tab" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/home-sample-data-tab plugin -date: 2024-05-07 +date: 2024-05-08 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 217fb53ff7368..3b4980b3e373c 100644 --- a/api_docs/kbn_i18n.mdx +++ b/api_docs/kbn_i18n.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-i18n title: "@kbn/i18n" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/i18n plugin -date: 2024-05-07 +date: 2024-05-08 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/i18n'] --- import kbnI18nObj from './kbn_i18n.devdocs.json'; diff --git a/api_docs/kbn_i18n_react.mdx b/api_docs/kbn_i18n_react.mdx index e6ad55496248d..b5cfe939cbfb1 100644 --- a/api_docs/kbn_i18n_react.mdx +++ b/api_docs/kbn_i18n_react.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-i18n-react title: "@kbn/i18n-react" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/i18n-react plugin -date: 2024-05-07 +date: 2024-05-08 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/i18n-react'] --- import kbnI18nReactObj from './kbn_i18n_react.devdocs.json'; diff --git a/api_docs/kbn_import_resolver.mdx b/api_docs/kbn_import_resolver.mdx index e2743ce669437..50da53e3223bf 100644 --- a/api_docs/kbn_import_resolver.mdx +++ b/api_docs/kbn_import_resolver.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-import-resolver title: "@kbn/import-resolver" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/import-resolver plugin -date: 2024-05-07 +date: 2024-05-08 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/import-resolver'] --- import kbnImportResolverObj from './kbn_import_resolver.devdocs.json'; diff --git a/api_docs/kbn_index_management.mdx b/api_docs/kbn_index_management.mdx index 8438f1095f70b..a4f18d7409c5c 100644 --- a/api_docs/kbn_index_management.mdx +++ b/api_docs/kbn_index_management.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-index-management title: "@kbn/index-management" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/index-management plugin -date: 2024-05-07 +date: 2024-05-08 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/index-management'] --- import kbnIndexManagementObj from './kbn_index_management.devdocs.json'; diff --git a/api_docs/kbn_inference_integration_flyout.mdx b/api_docs/kbn_inference_integration_flyout.mdx index 999af2b0296d1..3018154addf45 100644 --- a/api_docs/kbn_inference_integration_flyout.mdx +++ b/api_docs/kbn_inference_integration_flyout.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-inference_integration_flyout title: "@kbn/inference_integration_flyout" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/inference_integration_flyout plugin -date: 2024-05-07 +date: 2024-05-08 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/inference_integration_flyout'] --- import kbnInferenceIntegrationFlyoutObj from './kbn_inference_integration_flyout.devdocs.json'; diff --git a/api_docs/kbn_infra_forge.mdx b/api_docs/kbn_infra_forge.mdx index b085079f88481..009b605b19a58 100644 --- a/api_docs/kbn_infra_forge.mdx +++ b/api_docs/kbn_infra_forge.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-infra-forge title: "@kbn/infra-forge" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/infra-forge plugin -date: 2024-05-07 +date: 2024-05-08 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/infra-forge'] --- import kbnInfraForgeObj from './kbn_infra_forge.devdocs.json'; diff --git a/api_docs/kbn_interpreter.mdx b/api_docs/kbn_interpreter.mdx index a775986c7d53e..cd478ada61389 100644 --- a/api_docs/kbn_interpreter.mdx +++ b/api_docs/kbn_interpreter.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-interpreter title: "@kbn/interpreter" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/interpreter plugin -date: 2024-05-07 +date: 2024-05-08 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 2b03e86f0830d..cf26044b404a0 100644 --- a/api_docs/kbn_io_ts_utils.mdx +++ b/api_docs/kbn_io_ts_utils.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-io-ts-utils title: "@kbn/io-ts-utils" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/io-ts-utils plugin -date: 2024-05-07 +date: 2024-05-08 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/io-ts-utils'] --- import kbnIoTsUtilsObj from './kbn_io_ts_utils.devdocs.json'; diff --git a/api_docs/kbn_ipynb.mdx b/api_docs/kbn_ipynb.mdx index 7482626030ea6..278ebcf7b790d 100644 --- a/api_docs/kbn_ipynb.mdx +++ b/api_docs/kbn_ipynb.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-ipynb title: "@kbn/ipynb" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/ipynb plugin -date: 2024-05-07 +date: 2024-05-08 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/ipynb'] --- import kbnIpynbObj from './kbn_ipynb.devdocs.json'; diff --git a/api_docs/kbn_jest_serializers.mdx b/api_docs/kbn_jest_serializers.mdx index c2195c032ec2e..548a257461c60 100644 --- a/api_docs/kbn_jest_serializers.mdx +++ b/api_docs/kbn_jest_serializers.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-jest-serializers title: "@kbn/jest-serializers" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/jest-serializers plugin -date: 2024-05-07 +date: 2024-05-08 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 70bede53ceeed..859ce5160f1cd 100644 --- a/api_docs/kbn_journeys.mdx +++ b/api_docs/kbn_journeys.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-journeys title: "@kbn/journeys" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/journeys plugin -date: 2024-05-07 +date: 2024-05-08 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/journeys'] --- import kbnJourneysObj from './kbn_journeys.devdocs.json'; diff --git a/api_docs/kbn_json_ast.mdx b/api_docs/kbn_json_ast.mdx index 39db67150f5b6..b0faa49a4da1a 100644 --- a/api_docs/kbn_json_ast.mdx +++ b/api_docs/kbn_json_ast.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-json-ast title: "@kbn/json-ast" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/json-ast plugin -date: 2024-05-07 +date: 2024-05-08 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/json-ast'] --- import kbnJsonAstObj from './kbn_json_ast.devdocs.json'; diff --git a/api_docs/kbn_kibana_manifest_schema.mdx b/api_docs/kbn_kibana_manifest_schema.mdx index f7129239854a8..34f26aac4015b 100644 --- a/api_docs/kbn_kibana_manifest_schema.mdx +++ b/api_docs/kbn_kibana_manifest_schema.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-kibana-manifest-schema title: "@kbn/kibana-manifest-schema" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/kibana-manifest-schema plugin -date: 2024-05-07 +date: 2024-05-08 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/kibana-manifest-schema'] --- import kbnKibanaManifestSchemaObj from './kbn_kibana_manifest_schema.devdocs.json'; diff --git a/api_docs/kbn_language_documentation_popover.mdx b/api_docs/kbn_language_documentation_popover.mdx index 4c32c332b5190..73e6e70858a32 100644 --- a/api_docs/kbn_language_documentation_popover.mdx +++ b/api_docs/kbn_language_documentation_popover.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-language-documentation-popover title: "@kbn/language-documentation-popover" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/language-documentation-popover plugin -date: 2024-05-07 +date: 2024-05-08 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/language-documentation-popover'] --- import kbnLanguageDocumentationPopoverObj from './kbn_language_documentation_popover.devdocs.json'; diff --git a/api_docs/kbn_lens_embeddable_utils.mdx b/api_docs/kbn_lens_embeddable_utils.mdx index 007f047532bf6..af6a2e5b0dfec 100644 --- a/api_docs/kbn_lens_embeddable_utils.mdx +++ b/api_docs/kbn_lens_embeddable_utils.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-lens-embeddable-utils title: "@kbn/lens-embeddable-utils" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/lens-embeddable-utils plugin -date: 2024-05-07 +date: 2024-05-08 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/lens-embeddable-utils'] --- import kbnLensEmbeddableUtilsObj from './kbn_lens_embeddable_utils.devdocs.json'; diff --git a/api_docs/kbn_lens_formula_docs.mdx b/api_docs/kbn_lens_formula_docs.mdx index b48938bd65d6a..e4af7c8ed45d7 100644 --- a/api_docs/kbn_lens_formula_docs.mdx +++ b/api_docs/kbn_lens_formula_docs.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-lens-formula-docs title: "@kbn/lens-formula-docs" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/lens-formula-docs plugin -date: 2024-05-07 +date: 2024-05-08 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/lens-formula-docs'] --- import kbnLensFormulaDocsObj from './kbn_lens_formula_docs.devdocs.json'; diff --git a/api_docs/kbn_logging.mdx b/api_docs/kbn_logging.mdx index 07863ac75898c..caeff8291997f 100644 --- a/api_docs/kbn_logging.mdx +++ b/api_docs/kbn_logging.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-logging title: "@kbn/logging" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/logging plugin -date: 2024-05-07 +date: 2024-05-08 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 521da338535ad..c1f6703381756 100644 --- a/api_docs/kbn_logging_mocks.mdx +++ b/api_docs/kbn_logging_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-logging-mocks title: "@kbn/logging-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/logging-mocks plugin -date: 2024-05-07 +date: 2024-05-08 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/logging-mocks'] --- import kbnLoggingMocksObj from './kbn_logging_mocks.devdocs.json'; diff --git a/api_docs/kbn_managed_content_badge.mdx b/api_docs/kbn_managed_content_badge.mdx index edca248e8febf..0e90670db8588 100644 --- a/api_docs/kbn_managed_content_badge.mdx +++ b/api_docs/kbn_managed_content_badge.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-managed-content-badge title: "@kbn/managed-content-badge" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/managed-content-badge plugin -date: 2024-05-07 +date: 2024-05-08 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/managed-content-badge'] --- import kbnManagedContentBadgeObj from './kbn_managed_content_badge.devdocs.json'; diff --git a/api_docs/kbn_managed_vscode_config.mdx b/api_docs/kbn_managed_vscode_config.mdx index 04a0809b83a8a..1062960e6baa7 100644 --- a/api_docs/kbn_managed_vscode_config.mdx +++ b/api_docs/kbn_managed_vscode_config.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-managed-vscode-config title: "@kbn/managed-vscode-config" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/managed-vscode-config plugin -date: 2024-05-07 +date: 2024-05-08 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/managed-vscode-config'] --- import kbnManagedVscodeConfigObj from './kbn_managed_vscode_config.devdocs.json'; diff --git a/api_docs/kbn_management_cards_navigation.mdx b/api_docs/kbn_management_cards_navigation.mdx index 05b4f4de0765f..43d31a7111ca6 100644 --- a/api_docs/kbn_management_cards_navigation.mdx +++ b/api_docs/kbn_management_cards_navigation.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-management-cards-navigation title: "@kbn/management-cards-navigation" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/management-cards-navigation plugin -date: 2024-05-07 +date: 2024-05-08 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/management-cards-navigation'] --- import kbnManagementCardsNavigationObj from './kbn_management_cards_navigation.devdocs.json'; diff --git a/api_docs/kbn_management_settings_application.mdx b/api_docs/kbn_management_settings_application.mdx index a3174dfc9a58c..77dea1a4d5ff9 100644 --- a/api_docs/kbn_management_settings_application.mdx +++ b/api_docs/kbn_management_settings_application.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-management-settings-application title: "@kbn/management-settings-application" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/management-settings-application plugin -date: 2024-05-07 +date: 2024-05-08 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/management-settings-application'] --- import kbnManagementSettingsApplicationObj from './kbn_management_settings_application.devdocs.json'; diff --git a/api_docs/kbn_management_settings_components_field_category.mdx b/api_docs/kbn_management_settings_components_field_category.mdx index ee1634f9d9047..1c406bb36d017 100644 --- a/api_docs/kbn_management_settings_components_field_category.mdx +++ b/api_docs/kbn_management_settings_components_field_category.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-management-settings-components-field-category title: "@kbn/management-settings-components-field-category" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/management-settings-components-field-category plugin -date: 2024-05-07 +date: 2024-05-08 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/management-settings-components-field-category'] --- import kbnManagementSettingsComponentsFieldCategoryObj from './kbn_management_settings_components_field_category.devdocs.json'; diff --git a/api_docs/kbn_management_settings_components_field_input.mdx b/api_docs/kbn_management_settings_components_field_input.mdx index d3b17bee5d9af..b84cc994d7233 100644 --- a/api_docs/kbn_management_settings_components_field_input.mdx +++ b/api_docs/kbn_management_settings_components_field_input.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-management-settings-components-field-input title: "@kbn/management-settings-components-field-input" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/management-settings-components-field-input plugin -date: 2024-05-07 +date: 2024-05-08 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/management-settings-components-field-input'] --- import kbnManagementSettingsComponentsFieldInputObj from './kbn_management_settings_components_field_input.devdocs.json'; diff --git a/api_docs/kbn_management_settings_components_field_row.mdx b/api_docs/kbn_management_settings_components_field_row.mdx index ebf7c1a15d28f..cb5ba34545130 100644 --- a/api_docs/kbn_management_settings_components_field_row.mdx +++ b/api_docs/kbn_management_settings_components_field_row.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-management-settings-components-field-row title: "@kbn/management-settings-components-field-row" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/management-settings-components-field-row plugin -date: 2024-05-07 +date: 2024-05-08 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/management-settings-components-field-row'] --- import kbnManagementSettingsComponentsFieldRowObj from './kbn_management_settings_components_field_row.devdocs.json'; diff --git a/api_docs/kbn_management_settings_components_form.mdx b/api_docs/kbn_management_settings_components_form.mdx index 924060f1d7883..4ba501fa9ce51 100644 --- a/api_docs/kbn_management_settings_components_form.mdx +++ b/api_docs/kbn_management_settings_components_form.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-management-settings-components-form title: "@kbn/management-settings-components-form" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/management-settings-components-form plugin -date: 2024-05-07 +date: 2024-05-08 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/management-settings-components-form'] --- import kbnManagementSettingsComponentsFormObj from './kbn_management_settings_components_form.devdocs.json'; diff --git a/api_docs/kbn_management_settings_field_definition.mdx b/api_docs/kbn_management_settings_field_definition.mdx index fd0247b754e2c..17a64de2c250e 100644 --- a/api_docs/kbn_management_settings_field_definition.mdx +++ b/api_docs/kbn_management_settings_field_definition.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-management-settings-field-definition title: "@kbn/management-settings-field-definition" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/management-settings-field-definition plugin -date: 2024-05-07 +date: 2024-05-08 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/management-settings-field-definition'] --- import kbnManagementSettingsFieldDefinitionObj from './kbn_management_settings_field_definition.devdocs.json'; diff --git a/api_docs/kbn_management_settings_ids.mdx b/api_docs/kbn_management_settings_ids.mdx index d634e0dd0b0b2..9416cdb7b2d7e 100644 --- a/api_docs/kbn_management_settings_ids.mdx +++ b/api_docs/kbn_management_settings_ids.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-management-settings-ids title: "@kbn/management-settings-ids" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/management-settings-ids plugin -date: 2024-05-07 +date: 2024-05-08 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/management-settings-ids'] --- import kbnManagementSettingsIdsObj from './kbn_management_settings_ids.devdocs.json'; diff --git a/api_docs/kbn_management_settings_section_registry.mdx b/api_docs/kbn_management_settings_section_registry.mdx index eb94baf88647e..6bd16cbbeaaa5 100644 --- a/api_docs/kbn_management_settings_section_registry.mdx +++ b/api_docs/kbn_management_settings_section_registry.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-management-settings-section-registry title: "@kbn/management-settings-section-registry" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/management-settings-section-registry plugin -date: 2024-05-07 +date: 2024-05-08 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/management-settings-section-registry'] --- import kbnManagementSettingsSectionRegistryObj from './kbn_management_settings_section_registry.devdocs.json'; diff --git a/api_docs/kbn_management_settings_types.mdx b/api_docs/kbn_management_settings_types.mdx index 7083722d17330..5c3d1a0123ac6 100644 --- a/api_docs/kbn_management_settings_types.mdx +++ b/api_docs/kbn_management_settings_types.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-management-settings-types title: "@kbn/management-settings-types" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/management-settings-types plugin -date: 2024-05-07 +date: 2024-05-08 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/management-settings-types'] --- import kbnManagementSettingsTypesObj from './kbn_management_settings_types.devdocs.json'; diff --git a/api_docs/kbn_management_settings_utilities.mdx b/api_docs/kbn_management_settings_utilities.mdx index 3d0813557f2fe..656399f08cc8a 100644 --- a/api_docs/kbn_management_settings_utilities.mdx +++ b/api_docs/kbn_management_settings_utilities.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-management-settings-utilities title: "@kbn/management-settings-utilities" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/management-settings-utilities plugin -date: 2024-05-07 +date: 2024-05-08 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/management-settings-utilities'] --- import kbnManagementSettingsUtilitiesObj from './kbn_management_settings_utilities.devdocs.json'; diff --git a/api_docs/kbn_management_storybook_config.mdx b/api_docs/kbn_management_storybook_config.mdx index d7911002d978d..9f6d19f82c8ab 100644 --- a/api_docs/kbn_management_storybook_config.mdx +++ b/api_docs/kbn_management_storybook_config.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-management-storybook-config title: "@kbn/management-storybook-config" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/management-storybook-config plugin -date: 2024-05-07 +date: 2024-05-08 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/management-storybook-config'] --- import kbnManagementStorybookConfigObj from './kbn_management_storybook_config.devdocs.json'; diff --git a/api_docs/kbn_mapbox_gl.mdx b/api_docs/kbn_mapbox_gl.mdx index 794daff86be13..8177ce30e5845 100644 --- a/api_docs/kbn_mapbox_gl.mdx +++ b/api_docs/kbn_mapbox_gl.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-mapbox-gl title: "@kbn/mapbox-gl" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/mapbox-gl plugin -date: 2024-05-07 +date: 2024-05-08 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/mapbox-gl'] --- import kbnMapboxGlObj from './kbn_mapbox_gl.devdocs.json'; diff --git a/api_docs/kbn_maps_vector_tile_utils.mdx b/api_docs/kbn_maps_vector_tile_utils.mdx index d8d7339cf5e78..7076e947ab449 100644 --- a/api_docs/kbn_maps_vector_tile_utils.mdx +++ b/api_docs/kbn_maps_vector_tile_utils.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-maps-vector-tile-utils title: "@kbn/maps-vector-tile-utils" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/maps-vector-tile-utils plugin -date: 2024-05-07 +date: 2024-05-08 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/maps-vector-tile-utils'] --- import kbnMapsVectorTileUtilsObj from './kbn_maps_vector_tile_utils.devdocs.json'; diff --git a/api_docs/kbn_ml_agg_utils.mdx b/api_docs/kbn_ml_agg_utils.mdx index a932eb64c2e39..ee05e2aa8891b 100644 --- a/api_docs/kbn_ml_agg_utils.mdx +++ b/api_docs/kbn_ml_agg_utils.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-ml-agg-utils title: "@kbn/ml-agg-utils" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/ml-agg-utils plugin -date: 2024-05-07 +date: 2024-05-08 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/ml-agg-utils'] --- import kbnMlAggUtilsObj from './kbn_ml_agg_utils.devdocs.json'; diff --git a/api_docs/kbn_ml_anomaly_utils.mdx b/api_docs/kbn_ml_anomaly_utils.mdx index 9c52d95815276..73cd348654f9a 100644 --- a/api_docs/kbn_ml_anomaly_utils.mdx +++ b/api_docs/kbn_ml_anomaly_utils.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-ml-anomaly-utils title: "@kbn/ml-anomaly-utils" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/ml-anomaly-utils plugin -date: 2024-05-07 +date: 2024-05-08 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/ml-anomaly-utils'] --- import kbnMlAnomalyUtilsObj from './kbn_ml_anomaly_utils.devdocs.json'; diff --git a/api_docs/kbn_ml_cancellable_search.mdx b/api_docs/kbn_ml_cancellable_search.mdx index e71fa8c778bcc..16f750778f686 100644 --- a/api_docs/kbn_ml_cancellable_search.mdx +++ b/api_docs/kbn_ml_cancellable_search.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-ml-cancellable-search title: "@kbn/ml-cancellable-search" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/ml-cancellable-search plugin -date: 2024-05-07 +date: 2024-05-08 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/ml-cancellable-search'] --- import kbnMlCancellableSearchObj from './kbn_ml_cancellable_search.devdocs.json'; diff --git a/api_docs/kbn_ml_category_validator.mdx b/api_docs/kbn_ml_category_validator.mdx index 8772b9bacff3c..7fdc4dc6ab5fc 100644 --- a/api_docs/kbn_ml_category_validator.mdx +++ b/api_docs/kbn_ml_category_validator.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-ml-category-validator title: "@kbn/ml-category-validator" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/ml-category-validator plugin -date: 2024-05-07 +date: 2024-05-08 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/ml-category-validator'] --- import kbnMlCategoryValidatorObj from './kbn_ml_category_validator.devdocs.json'; diff --git a/api_docs/kbn_ml_chi2test.mdx b/api_docs/kbn_ml_chi2test.mdx index 50bf4f49cff32..e0088e16a57a5 100644 --- a/api_docs/kbn_ml_chi2test.mdx +++ b/api_docs/kbn_ml_chi2test.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-ml-chi2test title: "@kbn/ml-chi2test" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/ml-chi2test plugin -date: 2024-05-07 +date: 2024-05-08 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/ml-chi2test'] --- import kbnMlChi2testObj from './kbn_ml_chi2test.devdocs.json'; diff --git a/api_docs/kbn_ml_data_frame_analytics_utils.mdx b/api_docs/kbn_ml_data_frame_analytics_utils.mdx index 2754cf1e03fa8..e46f43106bc4c 100644 --- a/api_docs/kbn_ml_data_frame_analytics_utils.mdx +++ b/api_docs/kbn_ml_data_frame_analytics_utils.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-ml-data-frame-analytics-utils title: "@kbn/ml-data-frame-analytics-utils" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/ml-data-frame-analytics-utils plugin -date: 2024-05-07 +date: 2024-05-08 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/ml-data-frame-analytics-utils'] --- import kbnMlDataFrameAnalyticsUtilsObj from './kbn_ml_data_frame_analytics_utils.devdocs.json'; diff --git a/api_docs/kbn_ml_data_grid.mdx b/api_docs/kbn_ml_data_grid.mdx index f4ee1cb631afd..ee13fb9299c70 100644 --- a/api_docs/kbn_ml_data_grid.mdx +++ b/api_docs/kbn_ml_data_grid.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-ml-data-grid title: "@kbn/ml-data-grid" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/ml-data-grid plugin -date: 2024-05-07 +date: 2024-05-08 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/ml-data-grid'] --- import kbnMlDataGridObj from './kbn_ml_data_grid.devdocs.json'; diff --git a/api_docs/kbn_ml_date_picker.mdx b/api_docs/kbn_ml_date_picker.mdx index a223f2ff3b58e..06013767287fe 100644 --- a/api_docs/kbn_ml_date_picker.mdx +++ b/api_docs/kbn_ml_date_picker.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-ml-date-picker title: "@kbn/ml-date-picker" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/ml-date-picker plugin -date: 2024-05-07 +date: 2024-05-08 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/ml-date-picker'] --- import kbnMlDatePickerObj from './kbn_ml_date_picker.devdocs.json'; diff --git a/api_docs/kbn_ml_date_utils.mdx b/api_docs/kbn_ml_date_utils.mdx index 99445b4aab055..5f062d69477b3 100644 --- a/api_docs/kbn_ml_date_utils.mdx +++ b/api_docs/kbn_ml_date_utils.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-ml-date-utils title: "@kbn/ml-date-utils" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/ml-date-utils plugin -date: 2024-05-07 +date: 2024-05-08 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/ml-date-utils'] --- import kbnMlDateUtilsObj from './kbn_ml_date_utils.devdocs.json'; diff --git a/api_docs/kbn_ml_error_utils.mdx b/api_docs/kbn_ml_error_utils.mdx index 887ef8539beb1..df404d16f556c 100644 --- a/api_docs/kbn_ml_error_utils.mdx +++ b/api_docs/kbn_ml_error_utils.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-ml-error-utils title: "@kbn/ml-error-utils" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/ml-error-utils plugin -date: 2024-05-07 +date: 2024-05-08 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/ml-error-utils'] --- import kbnMlErrorUtilsObj from './kbn_ml_error_utils.devdocs.json'; diff --git a/api_docs/kbn_ml_in_memory_table.mdx b/api_docs/kbn_ml_in_memory_table.mdx index f404ae663ddce..b47fd74207f60 100644 --- a/api_docs/kbn_ml_in_memory_table.mdx +++ b/api_docs/kbn_ml_in_memory_table.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-ml-in-memory-table title: "@kbn/ml-in-memory-table" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/ml-in-memory-table plugin -date: 2024-05-07 +date: 2024-05-08 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/ml-in-memory-table'] --- import kbnMlInMemoryTableObj from './kbn_ml_in_memory_table.devdocs.json'; diff --git a/api_docs/kbn_ml_is_defined.mdx b/api_docs/kbn_ml_is_defined.mdx index 255fd276703b6..c9b67cc6e6912 100644 --- a/api_docs/kbn_ml_is_defined.mdx +++ b/api_docs/kbn_ml_is_defined.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-ml-is-defined title: "@kbn/ml-is-defined" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/ml-is-defined plugin -date: 2024-05-07 +date: 2024-05-08 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/ml-is-defined'] --- import kbnMlIsDefinedObj from './kbn_ml_is_defined.devdocs.json'; diff --git a/api_docs/kbn_ml_is_populated_object.mdx b/api_docs/kbn_ml_is_populated_object.mdx index 2b31a682c035e..ace46b09e1780 100644 --- a/api_docs/kbn_ml_is_populated_object.mdx +++ b/api_docs/kbn_ml_is_populated_object.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-ml-is-populated-object title: "@kbn/ml-is-populated-object" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/ml-is-populated-object plugin -date: 2024-05-07 +date: 2024-05-08 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/ml-is-populated-object'] --- import kbnMlIsPopulatedObjectObj from './kbn_ml_is_populated_object.devdocs.json'; diff --git a/api_docs/kbn_ml_kibana_theme.mdx b/api_docs/kbn_ml_kibana_theme.mdx index e221dd4ad7f7d..c75d0aaba1ebb 100644 --- a/api_docs/kbn_ml_kibana_theme.mdx +++ b/api_docs/kbn_ml_kibana_theme.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-ml-kibana-theme title: "@kbn/ml-kibana-theme" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/ml-kibana-theme plugin -date: 2024-05-07 +date: 2024-05-08 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/ml-kibana-theme'] --- import kbnMlKibanaThemeObj from './kbn_ml_kibana_theme.devdocs.json'; diff --git a/api_docs/kbn_ml_local_storage.mdx b/api_docs/kbn_ml_local_storage.mdx index 5b7310bf3cd47..51d9cd0495066 100644 --- a/api_docs/kbn_ml_local_storage.mdx +++ b/api_docs/kbn_ml_local_storage.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-ml-local-storage title: "@kbn/ml-local-storage" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/ml-local-storage plugin -date: 2024-05-07 +date: 2024-05-08 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/ml-local-storage'] --- import kbnMlLocalStorageObj from './kbn_ml_local_storage.devdocs.json'; diff --git a/api_docs/kbn_ml_nested_property.mdx b/api_docs/kbn_ml_nested_property.mdx index b8eb222ffa0ca..52892ebafe51f 100644 --- a/api_docs/kbn_ml_nested_property.mdx +++ b/api_docs/kbn_ml_nested_property.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-ml-nested-property title: "@kbn/ml-nested-property" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/ml-nested-property plugin -date: 2024-05-07 +date: 2024-05-08 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/ml-nested-property'] --- import kbnMlNestedPropertyObj from './kbn_ml_nested_property.devdocs.json'; diff --git a/api_docs/kbn_ml_number_utils.mdx b/api_docs/kbn_ml_number_utils.mdx index eb85af6221bed..cb6f42e662c1c 100644 --- a/api_docs/kbn_ml_number_utils.mdx +++ b/api_docs/kbn_ml_number_utils.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-ml-number-utils title: "@kbn/ml-number-utils" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/ml-number-utils plugin -date: 2024-05-07 +date: 2024-05-08 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/ml-number-utils'] --- import kbnMlNumberUtilsObj from './kbn_ml_number_utils.devdocs.json'; diff --git a/api_docs/kbn_ml_query_utils.mdx b/api_docs/kbn_ml_query_utils.mdx index 46a9d2ed0d675..794f4ed323c80 100644 --- a/api_docs/kbn_ml_query_utils.mdx +++ b/api_docs/kbn_ml_query_utils.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-ml-query-utils title: "@kbn/ml-query-utils" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/ml-query-utils plugin -date: 2024-05-07 +date: 2024-05-08 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/ml-query-utils'] --- import kbnMlQueryUtilsObj from './kbn_ml_query_utils.devdocs.json'; diff --git a/api_docs/kbn_ml_random_sampler_utils.mdx b/api_docs/kbn_ml_random_sampler_utils.mdx index 369f2ea1ab16e..7546193ee0bc2 100644 --- a/api_docs/kbn_ml_random_sampler_utils.mdx +++ b/api_docs/kbn_ml_random_sampler_utils.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-ml-random-sampler-utils title: "@kbn/ml-random-sampler-utils" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/ml-random-sampler-utils plugin -date: 2024-05-07 +date: 2024-05-08 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/ml-random-sampler-utils'] --- import kbnMlRandomSamplerUtilsObj from './kbn_ml_random_sampler_utils.devdocs.json'; diff --git a/api_docs/kbn_ml_route_utils.mdx b/api_docs/kbn_ml_route_utils.mdx index 97171eb7ddad2..7746f8008c581 100644 --- a/api_docs/kbn_ml_route_utils.mdx +++ b/api_docs/kbn_ml_route_utils.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-ml-route-utils title: "@kbn/ml-route-utils" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/ml-route-utils plugin -date: 2024-05-07 +date: 2024-05-08 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/ml-route-utils'] --- import kbnMlRouteUtilsObj from './kbn_ml_route_utils.devdocs.json'; diff --git a/api_docs/kbn_ml_runtime_field_utils.mdx b/api_docs/kbn_ml_runtime_field_utils.mdx index bcb0bbfd1dbd3..e30f1502a6d11 100644 --- a/api_docs/kbn_ml_runtime_field_utils.mdx +++ b/api_docs/kbn_ml_runtime_field_utils.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-ml-runtime-field-utils title: "@kbn/ml-runtime-field-utils" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/ml-runtime-field-utils plugin -date: 2024-05-07 +date: 2024-05-08 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/ml-runtime-field-utils'] --- import kbnMlRuntimeFieldUtilsObj from './kbn_ml_runtime_field_utils.devdocs.json'; diff --git a/api_docs/kbn_ml_string_hash.mdx b/api_docs/kbn_ml_string_hash.mdx index b9502c70e0b2d..397cbcf9f2b0d 100644 --- a/api_docs/kbn_ml_string_hash.mdx +++ b/api_docs/kbn_ml_string_hash.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-ml-string-hash title: "@kbn/ml-string-hash" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/ml-string-hash plugin -date: 2024-05-07 +date: 2024-05-08 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/ml-string-hash'] --- import kbnMlStringHashObj from './kbn_ml_string_hash.devdocs.json'; diff --git a/api_docs/kbn_ml_time_buckets.mdx b/api_docs/kbn_ml_time_buckets.mdx index 1eb3af665d872..bd75dd3e28bd8 100644 --- a/api_docs/kbn_ml_time_buckets.mdx +++ b/api_docs/kbn_ml_time_buckets.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-ml-time-buckets title: "@kbn/ml-time-buckets" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/ml-time-buckets plugin -date: 2024-05-07 +date: 2024-05-08 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/ml-time-buckets'] --- import kbnMlTimeBucketsObj from './kbn_ml_time_buckets.devdocs.json'; diff --git a/api_docs/kbn_ml_trained_models_utils.mdx b/api_docs/kbn_ml_trained_models_utils.mdx index 0ac9c1e2feeb8..686470fd9f3e2 100644 --- a/api_docs/kbn_ml_trained_models_utils.mdx +++ b/api_docs/kbn_ml_trained_models_utils.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-ml-trained-models-utils title: "@kbn/ml-trained-models-utils" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/ml-trained-models-utils plugin -date: 2024-05-07 +date: 2024-05-08 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/ml-trained-models-utils'] --- import kbnMlTrainedModelsUtilsObj from './kbn_ml_trained_models_utils.devdocs.json'; diff --git a/api_docs/kbn_ml_ui_actions.mdx b/api_docs/kbn_ml_ui_actions.mdx index 9fc0c07fd73a7..b61d77c229a87 100644 --- a/api_docs/kbn_ml_ui_actions.mdx +++ b/api_docs/kbn_ml_ui_actions.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-ml-ui-actions title: "@kbn/ml-ui-actions" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/ml-ui-actions plugin -date: 2024-05-07 +date: 2024-05-08 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/ml-ui-actions'] --- import kbnMlUiActionsObj from './kbn_ml_ui_actions.devdocs.json'; diff --git a/api_docs/kbn_ml_url_state.mdx b/api_docs/kbn_ml_url_state.mdx index e855a50880ab4..a64a1fa776a19 100644 --- a/api_docs/kbn_ml_url_state.mdx +++ b/api_docs/kbn_ml_url_state.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-ml-url-state title: "@kbn/ml-url-state" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/ml-url-state plugin -date: 2024-05-07 +date: 2024-05-08 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/ml-url-state'] --- import kbnMlUrlStateObj from './kbn_ml_url_state.devdocs.json'; diff --git a/api_docs/kbn_mock_idp_utils.mdx b/api_docs/kbn_mock_idp_utils.mdx index 69e43f7294bbb..76b91f00ee372 100644 --- a/api_docs/kbn_mock_idp_utils.mdx +++ b/api_docs/kbn_mock_idp_utils.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-mock-idp-utils title: "@kbn/mock-idp-utils" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/mock-idp-utils plugin -date: 2024-05-07 +date: 2024-05-08 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/mock-idp-utils'] --- import kbnMockIdpUtilsObj from './kbn_mock_idp_utils.devdocs.json'; diff --git a/api_docs/kbn_monaco.mdx b/api_docs/kbn_monaco.mdx index 9f27c78cdc106..2913192a27945 100644 --- a/api_docs/kbn_monaco.mdx +++ b/api_docs/kbn_monaco.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-monaco title: "@kbn/monaco" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/monaco plugin -date: 2024-05-07 +date: 2024-05-08 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/monaco'] --- import kbnMonacoObj from './kbn_monaco.devdocs.json'; diff --git a/api_docs/kbn_object_versioning.mdx b/api_docs/kbn_object_versioning.mdx index 7f6cf3e8ba7bb..6c24475d1b55d 100644 --- a/api_docs/kbn_object_versioning.mdx +++ b/api_docs/kbn_object_versioning.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-object-versioning title: "@kbn/object-versioning" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/object-versioning plugin -date: 2024-05-07 +date: 2024-05-08 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/object-versioning'] --- import kbnObjectVersioningObj from './kbn_object_versioning.devdocs.json'; diff --git a/api_docs/kbn_observability_alert_details.devdocs.json b/api_docs/kbn_observability_alert_details.devdocs.json index d88ae9dc21099..f5de812cee8b5 100644 --- a/api_docs/kbn_observability_alert_details.devdocs.json +++ b/api_docs/kbn_observability_alert_details.devdocs.json @@ -126,7 +126,7 @@ "label": "AlertThresholdTimeRangeRect", "description": [], "signature": [ - "({ alertStarted, color, id, threshold }: Props) => JSX.Element" + "({ color, id, threshold }: Props) => JSX.Element" ], "path": "x-pack/packages/observability/alert_details/src/components/alert_threshold_time_range_rect.tsx", "deprecated": false, @@ -137,7 +137,7 @@ "id": "def-common.AlertThresholdTimeRangeRect.$1", "type": "Object", "tags": [], - "label": "{ alertStarted, color, id, threshold }", + "label": "{ color, id, threshold }", "description": [], "signature": [ "Props" diff --git a/api_docs/kbn_observability_alert_details.mdx b/api_docs/kbn_observability_alert_details.mdx index 54d5b15fc8125..96c658019a75c 100644 --- a/api_docs/kbn_observability_alert_details.mdx +++ b/api_docs/kbn_observability_alert_details.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-observability-alert-details title: "@kbn/observability-alert-details" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/observability-alert-details plugin -date: 2024-05-07 +date: 2024-05-08 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/observability-alert-details'] --- import kbnObservabilityAlertDetailsObj from './kbn_observability_alert_details.devdocs.json'; diff --git a/api_docs/kbn_observability_alerting_test_data.mdx b/api_docs/kbn_observability_alerting_test_data.mdx index 9c06593288d50..58e29d82f0290 100644 --- a/api_docs/kbn_observability_alerting_test_data.mdx +++ b/api_docs/kbn_observability_alerting_test_data.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-observability-alerting-test-data title: "@kbn/observability-alerting-test-data" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/observability-alerting-test-data plugin -date: 2024-05-07 +date: 2024-05-08 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/observability-alerting-test-data'] --- import kbnObservabilityAlertingTestDataObj from './kbn_observability_alerting_test_data.devdocs.json'; diff --git a/api_docs/kbn_observability_get_padded_alert_time_range_util.mdx b/api_docs/kbn_observability_get_padded_alert_time_range_util.mdx index 6c8fedabb6751..63a76e69b532e 100644 --- a/api_docs/kbn_observability_get_padded_alert_time_range_util.mdx +++ b/api_docs/kbn_observability_get_padded_alert_time_range_util.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-observability-get-padded-alert-time-range-util title: "@kbn/observability-get-padded-alert-time-range-util" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/observability-get-padded-alert-time-range-util plugin -date: 2024-05-07 +date: 2024-05-08 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/observability-get-padded-alert-time-range-util'] --- import kbnObservabilityGetPaddedAlertTimeRangeUtilObj from './kbn_observability_get_padded_alert_time_range_util.devdocs.json'; diff --git a/api_docs/kbn_openapi_bundler.mdx b/api_docs/kbn_openapi_bundler.mdx index d6e1457b99227..4d47bfec0599a 100644 --- a/api_docs/kbn_openapi_bundler.mdx +++ b/api_docs/kbn_openapi_bundler.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-openapi-bundler title: "@kbn/openapi-bundler" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/openapi-bundler plugin -date: 2024-05-07 +date: 2024-05-08 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/openapi-bundler'] --- import kbnOpenapiBundlerObj from './kbn_openapi_bundler.devdocs.json'; diff --git a/api_docs/kbn_openapi_generator.mdx b/api_docs/kbn_openapi_generator.mdx index ed4a77142fea5..aca31e63e1315 100644 --- a/api_docs/kbn_openapi_generator.mdx +++ b/api_docs/kbn_openapi_generator.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-openapi-generator title: "@kbn/openapi-generator" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/openapi-generator plugin -date: 2024-05-07 +date: 2024-05-08 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/openapi-generator'] --- import kbnOpenapiGeneratorObj from './kbn_openapi_generator.devdocs.json'; diff --git a/api_docs/kbn_optimizer.mdx b/api_docs/kbn_optimizer.mdx index 7e8e155e411f5..45ea3093a17eb 100644 --- a/api_docs/kbn_optimizer.mdx +++ b/api_docs/kbn_optimizer.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-optimizer title: "@kbn/optimizer" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/optimizer plugin -date: 2024-05-07 +date: 2024-05-08 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 9137a9f34603e..c7a1e8379b09f 100644 --- a/api_docs/kbn_optimizer_webpack_helpers.mdx +++ b/api_docs/kbn_optimizer_webpack_helpers.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-optimizer-webpack-helpers title: "@kbn/optimizer-webpack-helpers" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/optimizer-webpack-helpers plugin -date: 2024-05-07 +date: 2024-05-08 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 0ad82ff60f0f2..25541a0714530 100644 --- a/api_docs/kbn_osquery_io_ts_types.mdx +++ b/api_docs/kbn_osquery_io_ts_types.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-osquery-io-ts-types title: "@kbn/osquery-io-ts-types" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/osquery-io-ts-types plugin -date: 2024-05-07 +date: 2024-05-08 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/osquery-io-ts-types'] --- import kbnOsqueryIoTsTypesObj from './kbn_osquery_io_ts_types.devdocs.json'; diff --git a/api_docs/kbn_panel_loader.mdx b/api_docs/kbn_panel_loader.mdx index b0ccc90b7d427..1dd72a622d926 100644 --- a/api_docs/kbn_panel_loader.mdx +++ b/api_docs/kbn_panel_loader.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-panel-loader title: "@kbn/panel-loader" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/panel-loader plugin -date: 2024-05-07 +date: 2024-05-08 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/panel-loader'] --- import kbnPanelLoaderObj from './kbn_panel_loader.devdocs.json'; diff --git a/api_docs/kbn_performance_testing_dataset_extractor.mdx b/api_docs/kbn_performance_testing_dataset_extractor.mdx index 345fa7d54e341..f54b24e9715e6 100644 --- a/api_docs/kbn_performance_testing_dataset_extractor.mdx +++ b/api_docs/kbn_performance_testing_dataset_extractor.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-performance-testing-dataset-extractor title: "@kbn/performance-testing-dataset-extractor" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/performance-testing-dataset-extractor plugin -date: 2024-05-07 +date: 2024-05-08 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/performance-testing-dataset-extractor'] --- import kbnPerformanceTestingDatasetExtractorObj from './kbn_performance_testing_dataset_extractor.devdocs.json'; diff --git a/api_docs/kbn_plugin_check.mdx b/api_docs/kbn_plugin_check.mdx index 9b7bab241c6cc..0cb0928413318 100644 --- a/api_docs/kbn_plugin_check.mdx +++ b/api_docs/kbn_plugin_check.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-plugin-check title: "@kbn/plugin-check" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/plugin-check plugin -date: 2024-05-07 +date: 2024-05-08 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/plugin-check'] --- import kbnPluginCheckObj from './kbn_plugin_check.devdocs.json'; diff --git a/api_docs/kbn_plugin_generator.mdx b/api_docs/kbn_plugin_generator.mdx index 85eac6e43a470..c8eecd043d12b 100644 --- a/api_docs/kbn_plugin_generator.mdx +++ b/api_docs/kbn_plugin_generator.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-plugin-generator title: "@kbn/plugin-generator" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/plugin-generator plugin -date: 2024-05-07 +date: 2024-05-08 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 cd29d893f8f82..fd779bc7cd835 100644 --- a/api_docs/kbn_plugin_helpers.mdx +++ b/api_docs/kbn_plugin_helpers.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-plugin-helpers title: "@kbn/plugin-helpers" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/plugin-helpers plugin -date: 2024-05-07 +date: 2024-05-08 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/plugin-helpers'] --- import kbnPluginHelpersObj from './kbn_plugin_helpers.devdocs.json'; diff --git a/api_docs/kbn_presentation_containers.mdx b/api_docs/kbn_presentation_containers.mdx index b3fc85d73c2c5..584bdf62f3b36 100644 --- a/api_docs/kbn_presentation_containers.mdx +++ b/api_docs/kbn_presentation_containers.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-presentation-containers title: "@kbn/presentation-containers" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/presentation-containers plugin -date: 2024-05-07 +date: 2024-05-08 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/presentation-containers'] --- import kbnPresentationContainersObj from './kbn_presentation_containers.devdocs.json'; diff --git a/api_docs/kbn_presentation_publishing.mdx b/api_docs/kbn_presentation_publishing.mdx index 4dec9be274a47..baffa06d1b7a5 100644 --- a/api_docs/kbn_presentation_publishing.mdx +++ b/api_docs/kbn_presentation_publishing.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-presentation-publishing title: "@kbn/presentation-publishing" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/presentation-publishing plugin -date: 2024-05-07 +date: 2024-05-08 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/presentation-publishing'] --- import kbnPresentationPublishingObj from './kbn_presentation_publishing.devdocs.json'; diff --git a/api_docs/kbn_profiling_utils.mdx b/api_docs/kbn_profiling_utils.mdx index 13ecd3645eb81..ce0ea9cce6ee3 100644 --- a/api_docs/kbn_profiling_utils.mdx +++ b/api_docs/kbn_profiling_utils.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-profiling-utils title: "@kbn/profiling-utils" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/profiling-utils plugin -date: 2024-05-07 +date: 2024-05-08 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/profiling-utils'] --- import kbnProfilingUtilsObj from './kbn_profiling_utils.devdocs.json'; diff --git a/api_docs/kbn_random_sampling.mdx b/api_docs/kbn_random_sampling.mdx index 98de4cff644f7..1c55b41484b3c 100644 --- a/api_docs/kbn_random_sampling.mdx +++ b/api_docs/kbn_random_sampling.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-random-sampling title: "@kbn/random-sampling" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/random-sampling plugin -date: 2024-05-07 +date: 2024-05-08 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/random-sampling'] --- import kbnRandomSamplingObj from './kbn_random_sampling.devdocs.json'; diff --git a/api_docs/kbn_react_field.mdx b/api_docs/kbn_react_field.mdx index 9ea6345045c36..a63dee90884f9 100644 --- a/api_docs/kbn_react_field.mdx +++ b/api_docs/kbn_react_field.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-react-field title: "@kbn/react-field" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/react-field plugin -date: 2024-05-07 +date: 2024-05-08 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/react-field'] --- import kbnReactFieldObj from './kbn_react_field.devdocs.json'; diff --git a/api_docs/kbn_react_hooks.mdx b/api_docs/kbn_react_hooks.mdx index d26febe62c660..a4a9827078195 100644 --- a/api_docs/kbn_react_hooks.mdx +++ b/api_docs/kbn_react_hooks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-react-hooks title: "@kbn/react-hooks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/react-hooks plugin -date: 2024-05-07 +date: 2024-05-08 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/react-hooks'] --- import kbnReactHooksObj from './kbn_react_hooks.devdocs.json'; diff --git a/api_docs/kbn_react_kibana_context_common.mdx b/api_docs/kbn_react_kibana_context_common.mdx index ad6b96c26a7f4..737794c7a7018 100644 --- a/api_docs/kbn_react_kibana_context_common.mdx +++ b/api_docs/kbn_react_kibana_context_common.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-react-kibana-context-common title: "@kbn/react-kibana-context-common" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/react-kibana-context-common plugin -date: 2024-05-07 +date: 2024-05-08 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/react-kibana-context-common'] --- import kbnReactKibanaContextCommonObj from './kbn_react_kibana_context_common.devdocs.json'; diff --git a/api_docs/kbn_react_kibana_context_render.mdx b/api_docs/kbn_react_kibana_context_render.mdx index f90b1fbc4fa63..a3924dc98533d 100644 --- a/api_docs/kbn_react_kibana_context_render.mdx +++ b/api_docs/kbn_react_kibana_context_render.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-react-kibana-context-render title: "@kbn/react-kibana-context-render" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/react-kibana-context-render plugin -date: 2024-05-07 +date: 2024-05-08 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/react-kibana-context-render'] --- import kbnReactKibanaContextRenderObj from './kbn_react_kibana_context_render.devdocs.json'; diff --git a/api_docs/kbn_react_kibana_context_root.mdx b/api_docs/kbn_react_kibana_context_root.mdx index 3dea8690b9155..c1eb84d8dcef9 100644 --- a/api_docs/kbn_react_kibana_context_root.mdx +++ b/api_docs/kbn_react_kibana_context_root.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-react-kibana-context-root title: "@kbn/react-kibana-context-root" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/react-kibana-context-root plugin -date: 2024-05-07 +date: 2024-05-08 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/react-kibana-context-root'] --- import kbnReactKibanaContextRootObj from './kbn_react_kibana_context_root.devdocs.json'; diff --git a/api_docs/kbn_react_kibana_context_styled.mdx b/api_docs/kbn_react_kibana_context_styled.mdx index 9069f465ce801..8dc725ac9b19d 100644 --- a/api_docs/kbn_react_kibana_context_styled.mdx +++ b/api_docs/kbn_react_kibana_context_styled.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-react-kibana-context-styled title: "@kbn/react-kibana-context-styled" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/react-kibana-context-styled plugin -date: 2024-05-07 +date: 2024-05-08 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/react-kibana-context-styled'] --- import kbnReactKibanaContextStyledObj from './kbn_react_kibana_context_styled.devdocs.json'; diff --git a/api_docs/kbn_react_kibana_context_theme.mdx b/api_docs/kbn_react_kibana_context_theme.mdx index 94f62672908d2..24aea98682596 100644 --- a/api_docs/kbn_react_kibana_context_theme.mdx +++ b/api_docs/kbn_react_kibana_context_theme.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-react-kibana-context-theme title: "@kbn/react-kibana-context-theme" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/react-kibana-context-theme plugin -date: 2024-05-07 +date: 2024-05-08 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/react-kibana-context-theme'] --- import kbnReactKibanaContextThemeObj from './kbn_react_kibana_context_theme.devdocs.json'; diff --git a/api_docs/kbn_react_kibana_mount.mdx b/api_docs/kbn_react_kibana_mount.mdx index a2ea40a6355c2..1dea19036a56b 100644 --- a/api_docs/kbn_react_kibana_mount.mdx +++ b/api_docs/kbn_react_kibana_mount.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-react-kibana-mount title: "@kbn/react-kibana-mount" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/react-kibana-mount plugin -date: 2024-05-07 +date: 2024-05-08 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/react-kibana-mount'] --- import kbnReactKibanaMountObj from './kbn_react_kibana_mount.devdocs.json'; diff --git a/api_docs/kbn_repo_file_maps.mdx b/api_docs/kbn_repo_file_maps.mdx index 98ba6cc49d148..994174d383db5 100644 --- a/api_docs/kbn_repo_file_maps.mdx +++ b/api_docs/kbn_repo_file_maps.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-repo-file-maps title: "@kbn/repo-file-maps" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/repo-file-maps plugin -date: 2024-05-07 +date: 2024-05-08 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/repo-file-maps'] --- import kbnRepoFileMapsObj from './kbn_repo_file_maps.devdocs.json'; diff --git a/api_docs/kbn_repo_linter.mdx b/api_docs/kbn_repo_linter.mdx index 0375c41d9ae29..a036728bfa474 100644 --- a/api_docs/kbn_repo_linter.mdx +++ b/api_docs/kbn_repo_linter.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-repo-linter title: "@kbn/repo-linter" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/repo-linter plugin -date: 2024-05-07 +date: 2024-05-08 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/repo-linter'] --- import kbnRepoLinterObj from './kbn_repo_linter.devdocs.json'; diff --git a/api_docs/kbn_repo_path.mdx b/api_docs/kbn_repo_path.mdx index 7e4b1913c3f15..b4d823ce189ef 100644 --- a/api_docs/kbn_repo_path.mdx +++ b/api_docs/kbn_repo_path.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-repo-path title: "@kbn/repo-path" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/repo-path plugin -date: 2024-05-07 +date: 2024-05-08 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/repo-path'] --- import kbnRepoPathObj from './kbn_repo_path.devdocs.json'; diff --git a/api_docs/kbn_repo_source_classifier.mdx b/api_docs/kbn_repo_source_classifier.mdx index 823e14a3dfdb6..ea397c55aeaad 100644 --- a/api_docs/kbn_repo_source_classifier.mdx +++ b/api_docs/kbn_repo_source_classifier.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-repo-source-classifier title: "@kbn/repo-source-classifier" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/repo-source-classifier plugin -date: 2024-05-07 +date: 2024-05-08 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/repo-source-classifier'] --- import kbnRepoSourceClassifierObj from './kbn_repo_source_classifier.devdocs.json'; diff --git a/api_docs/kbn_reporting_common.mdx b/api_docs/kbn_reporting_common.mdx index 74340eacdf4a4..384a1b6c3ce9a 100644 --- a/api_docs/kbn_reporting_common.mdx +++ b/api_docs/kbn_reporting_common.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-reporting-common title: "@kbn/reporting-common" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/reporting-common plugin -date: 2024-05-07 +date: 2024-05-08 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/reporting-common'] --- import kbnReportingCommonObj from './kbn_reporting_common.devdocs.json'; diff --git a/api_docs/kbn_reporting_csv_share_panel.mdx b/api_docs/kbn_reporting_csv_share_panel.mdx index 1bc51b4b0e863..13e1763209f46 100644 --- a/api_docs/kbn_reporting_csv_share_panel.mdx +++ b/api_docs/kbn_reporting_csv_share_panel.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-reporting-csv-share-panel title: "@kbn/reporting-csv-share-panel" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/reporting-csv-share-panel plugin -date: 2024-05-07 +date: 2024-05-08 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/reporting-csv-share-panel'] --- import kbnReportingCsvSharePanelObj from './kbn_reporting_csv_share_panel.devdocs.json'; diff --git a/api_docs/kbn_reporting_export_types_csv.mdx b/api_docs/kbn_reporting_export_types_csv.mdx index 4de21e053b32b..64e9d43ac3c5e 100644 --- a/api_docs/kbn_reporting_export_types_csv.mdx +++ b/api_docs/kbn_reporting_export_types_csv.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-reporting-export-types-csv title: "@kbn/reporting-export-types-csv" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/reporting-export-types-csv plugin -date: 2024-05-07 +date: 2024-05-08 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/reporting-export-types-csv'] --- import kbnReportingExportTypesCsvObj from './kbn_reporting_export_types_csv.devdocs.json'; diff --git a/api_docs/kbn_reporting_export_types_csv_common.mdx b/api_docs/kbn_reporting_export_types_csv_common.mdx index 9885030fe6998..229970ec38a14 100644 --- a/api_docs/kbn_reporting_export_types_csv_common.mdx +++ b/api_docs/kbn_reporting_export_types_csv_common.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-reporting-export-types-csv-common title: "@kbn/reporting-export-types-csv-common" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/reporting-export-types-csv-common plugin -date: 2024-05-07 +date: 2024-05-08 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/reporting-export-types-csv-common'] --- import kbnReportingExportTypesCsvCommonObj from './kbn_reporting_export_types_csv_common.devdocs.json'; diff --git a/api_docs/kbn_reporting_export_types_pdf.mdx b/api_docs/kbn_reporting_export_types_pdf.mdx index 7f8e80578ee9d..a997f48a76a6c 100644 --- a/api_docs/kbn_reporting_export_types_pdf.mdx +++ b/api_docs/kbn_reporting_export_types_pdf.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-reporting-export-types-pdf title: "@kbn/reporting-export-types-pdf" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/reporting-export-types-pdf plugin -date: 2024-05-07 +date: 2024-05-08 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/reporting-export-types-pdf'] --- import kbnReportingExportTypesPdfObj from './kbn_reporting_export_types_pdf.devdocs.json'; diff --git a/api_docs/kbn_reporting_export_types_pdf_common.mdx b/api_docs/kbn_reporting_export_types_pdf_common.mdx index 2efea333c74ca..6a835280cde95 100644 --- a/api_docs/kbn_reporting_export_types_pdf_common.mdx +++ b/api_docs/kbn_reporting_export_types_pdf_common.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-reporting-export-types-pdf-common title: "@kbn/reporting-export-types-pdf-common" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/reporting-export-types-pdf-common plugin -date: 2024-05-07 +date: 2024-05-08 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/reporting-export-types-pdf-common'] --- import kbnReportingExportTypesPdfCommonObj from './kbn_reporting_export_types_pdf_common.devdocs.json'; diff --git a/api_docs/kbn_reporting_export_types_png.mdx b/api_docs/kbn_reporting_export_types_png.mdx index f24cb9dab3eab..b984a825f34d4 100644 --- a/api_docs/kbn_reporting_export_types_png.mdx +++ b/api_docs/kbn_reporting_export_types_png.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-reporting-export-types-png title: "@kbn/reporting-export-types-png" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/reporting-export-types-png plugin -date: 2024-05-07 +date: 2024-05-08 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/reporting-export-types-png'] --- import kbnReportingExportTypesPngObj from './kbn_reporting_export_types_png.devdocs.json'; diff --git a/api_docs/kbn_reporting_export_types_png_common.mdx b/api_docs/kbn_reporting_export_types_png_common.mdx index bfb253907b700..448006dab4f13 100644 --- a/api_docs/kbn_reporting_export_types_png_common.mdx +++ b/api_docs/kbn_reporting_export_types_png_common.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-reporting-export-types-png-common title: "@kbn/reporting-export-types-png-common" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/reporting-export-types-png-common plugin -date: 2024-05-07 +date: 2024-05-08 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/reporting-export-types-png-common'] --- import kbnReportingExportTypesPngCommonObj from './kbn_reporting_export_types_png_common.devdocs.json'; diff --git a/api_docs/kbn_reporting_mocks_server.mdx b/api_docs/kbn_reporting_mocks_server.mdx index bc332f1fe7c52..84489934e1c4f 100644 --- a/api_docs/kbn_reporting_mocks_server.mdx +++ b/api_docs/kbn_reporting_mocks_server.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-reporting-mocks-server title: "@kbn/reporting-mocks-server" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/reporting-mocks-server plugin -date: 2024-05-07 +date: 2024-05-08 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/reporting-mocks-server'] --- import kbnReportingMocksServerObj from './kbn_reporting_mocks_server.devdocs.json'; diff --git a/api_docs/kbn_reporting_public.mdx b/api_docs/kbn_reporting_public.mdx index 916ce1f4841b5..c8c1349a7e6bc 100644 --- a/api_docs/kbn_reporting_public.mdx +++ b/api_docs/kbn_reporting_public.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-reporting-public title: "@kbn/reporting-public" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/reporting-public plugin -date: 2024-05-07 +date: 2024-05-08 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/reporting-public'] --- import kbnReportingPublicObj from './kbn_reporting_public.devdocs.json'; diff --git a/api_docs/kbn_reporting_server.mdx b/api_docs/kbn_reporting_server.mdx index 3118a8b2afca6..f67184cffcb19 100644 --- a/api_docs/kbn_reporting_server.mdx +++ b/api_docs/kbn_reporting_server.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-reporting-server title: "@kbn/reporting-server" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/reporting-server plugin -date: 2024-05-07 +date: 2024-05-08 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/reporting-server'] --- import kbnReportingServerObj from './kbn_reporting_server.devdocs.json'; diff --git a/api_docs/kbn_resizable_layout.mdx b/api_docs/kbn_resizable_layout.mdx index d6aadeda2c8ac..86b4955b8d39b 100644 --- a/api_docs/kbn_resizable_layout.mdx +++ b/api_docs/kbn_resizable_layout.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-resizable-layout title: "@kbn/resizable-layout" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/resizable-layout plugin -date: 2024-05-07 +date: 2024-05-08 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/resizable-layout'] --- import kbnResizableLayoutObj from './kbn_resizable_layout.devdocs.json'; diff --git a/api_docs/kbn_rison.mdx b/api_docs/kbn_rison.mdx index 464526a5d585e..00308de9965f8 100644 --- a/api_docs/kbn_rison.mdx +++ b/api_docs/kbn_rison.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-rison title: "@kbn/rison" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/rison plugin -date: 2024-05-07 +date: 2024-05-08 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/rison'] --- import kbnRisonObj from './kbn_rison.devdocs.json'; diff --git a/api_docs/kbn_router_to_openapispec.mdx b/api_docs/kbn_router_to_openapispec.mdx index c9c179cc082a2..63b8d8665a2e2 100644 --- a/api_docs/kbn_router_to_openapispec.mdx +++ b/api_docs/kbn_router_to_openapispec.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-router-to-openapispec title: "@kbn/router-to-openapispec" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/router-to-openapispec plugin -date: 2024-05-07 +date: 2024-05-08 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/router-to-openapispec'] --- import kbnRouterToOpenapispecObj from './kbn_router_to_openapispec.devdocs.json'; diff --git a/api_docs/kbn_router_utils.mdx b/api_docs/kbn_router_utils.mdx index a5bed2ba74d1c..8ca9c60efac79 100644 --- a/api_docs/kbn_router_utils.mdx +++ b/api_docs/kbn_router_utils.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-router-utils title: "@kbn/router-utils" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/router-utils plugin -date: 2024-05-07 +date: 2024-05-08 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/router-utils'] --- import kbnRouterUtilsObj from './kbn_router_utils.devdocs.json'; diff --git a/api_docs/kbn_rrule.mdx b/api_docs/kbn_rrule.mdx index 84827fa2d7b2e..d6bf8f4481a7d 100644 --- a/api_docs/kbn_rrule.mdx +++ b/api_docs/kbn_rrule.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-rrule title: "@kbn/rrule" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/rrule plugin -date: 2024-05-07 +date: 2024-05-08 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/rrule'] --- import kbnRruleObj from './kbn_rrule.devdocs.json'; diff --git a/api_docs/kbn_rule_data_utils.mdx b/api_docs/kbn_rule_data_utils.mdx index e42a4f1735fb5..cda7f96c0a91f 100644 --- a/api_docs/kbn_rule_data_utils.mdx +++ b/api_docs/kbn_rule_data_utils.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-rule-data-utils title: "@kbn/rule-data-utils" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/rule-data-utils plugin -date: 2024-05-07 +date: 2024-05-08 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/rule-data-utils'] --- import kbnRuleDataUtilsObj from './kbn_rule_data_utils.devdocs.json'; diff --git a/api_docs/kbn_saved_objects_settings.mdx b/api_docs/kbn_saved_objects_settings.mdx index 81309db618a09..56d61e43af6ac 100644 --- a/api_docs/kbn_saved_objects_settings.mdx +++ b/api_docs/kbn_saved_objects_settings.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-saved-objects-settings title: "@kbn/saved-objects-settings" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/saved-objects-settings plugin -date: 2024-05-07 +date: 2024-05-08 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/saved-objects-settings'] --- import kbnSavedObjectsSettingsObj from './kbn_saved_objects_settings.devdocs.json'; diff --git a/api_docs/kbn_search_api_panels.mdx b/api_docs/kbn_search_api_panels.mdx index c8e3132345b6a..51f2fbc6c137c 100644 --- a/api_docs/kbn_search_api_panels.mdx +++ b/api_docs/kbn_search_api_panels.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-search-api-panels title: "@kbn/search-api-panels" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/search-api-panels plugin -date: 2024-05-07 +date: 2024-05-08 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/search-api-panels'] --- import kbnSearchApiPanelsObj from './kbn_search_api_panels.devdocs.json'; diff --git a/api_docs/kbn_search_connectors.mdx b/api_docs/kbn_search_connectors.mdx index 0ca394bfb1072..a0105096c3fb8 100644 --- a/api_docs/kbn_search_connectors.mdx +++ b/api_docs/kbn_search_connectors.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-search-connectors title: "@kbn/search-connectors" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/search-connectors plugin -date: 2024-05-07 +date: 2024-05-08 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/search-connectors'] --- import kbnSearchConnectorsObj from './kbn_search_connectors.devdocs.json'; diff --git a/api_docs/kbn_search_errors.mdx b/api_docs/kbn_search_errors.mdx index 5eb3f550ed434..79f2a94705686 100644 --- a/api_docs/kbn_search_errors.mdx +++ b/api_docs/kbn_search_errors.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-search-errors title: "@kbn/search-errors" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/search-errors plugin -date: 2024-05-07 +date: 2024-05-08 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/search-errors'] --- import kbnSearchErrorsObj from './kbn_search_errors.devdocs.json'; diff --git a/api_docs/kbn_search_index_documents.mdx b/api_docs/kbn_search_index_documents.mdx index 50169e907ffcd..a9199387d3715 100644 --- a/api_docs/kbn_search_index_documents.mdx +++ b/api_docs/kbn_search_index_documents.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-search-index-documents title: "@kbn/search-index-documents" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/search-index-documents plugin -date: 2024-05-07 +date: 2024-05-08 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/search-index-documents'] --- import kbnSearchIndexDocumentsObj from './kbn_search_index_documents.devdocs.json'; diff --git a/api_docs/kbn_search_response_warnings.mdx b/api_docs/kbn_search_response_warnings.mdx index 8548eb53e2601..bfa697a730ac5 100644 --- a/api_docs/kbn_search_response_warnings.mdx +++ b/api_docs/kbn_search_response_warnings.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-search-response-warnings title: "@kbn/search-response-warnings" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/search-response-warnings plugin -date: 2024-05-07 +date: 2024-05-08 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/search-response-warnings'] --- import kbnSearchResponseWarningsObj from './kbn_search_response_warnings.devdocs.json'; diff --git a/api_docs/kbn_search_types.mdx b/api_docs/kbn_search_types.mdx index 48f8bffab99b3..98737a76c1d68 100644 --- a/api_docs/kbn_search_types.mdx +++ b/api_docs/kbn_search_types.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-search-types title: "@kbn/search-types" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/search-types plugin -date: 2024-05-07 +date: 2024-05-08 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/search-types'] --- import kbnSearchTypesObj from './kbn_search_types.devdocs.json'; diff --git a/api_docs/kbn_security_hardening.mdx b/api_docs/kbn_security_hardening.mdx index 7e76ad875b6c5..0ba38dd17380c 100644 --- a/api_docs/kbn_security_hardening.mdx +++ b/api_docs/kbn_security_hardening.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-security-hardening title: "@kbn/security-hardening" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/security-hardening plugin -date: 2024-05-07 +date: 2024-05-08 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/security-hardening'] --- import kbnSecurityHardeningObj from './kbn_security_hardening.devdocs.json'; diff --git a/api_docs/kbn_security_plugin_types_common.mdx b/api_docs/kbn_security_plugin_types_common.mdx index 5afeea0349d87..894066c8b1fe9 100644 --- a/api_docs/kbn_security_plugin_types_common.mdx +++ b/api_docs/kbn_security_plugin_types_common.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-security-plugin-types-common title: "@kbn/security-plugin-types-common" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/security-plugin-types-common plugin -date: 2024-05-07 +date: 2024-05-08 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/security-plugin-types-common'] --- import kbnSecurityPluginTypesCommonObj from './kbn_security_plugin_types_common.devdocs.json'; diff --git a/api_docs/kbn_security_plugin_types_public.mdx b/api_docs/kbn_security_plugin_types_public.mdx index 63e8b979e24be..674c0abea2b40 100644 --- a/api_docs/kbn_security_plugin_types_public.mdx +++ b/api_docs/kbn_security_plugin_types_public.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-security-plugin-types-public title: "@kbn/security-plugin-types-public" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/security-plugin-types-public plugin -date: 2024-05-07 +date: 2024-05-08 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/security-plugin-types-public'] --- import kbnSecurityPluginTypesPublicObj from './kbn_security_plugin_types_public.devdocs.json'; diff --git a/api_docs/kbn_security_plugin_types_server.mdx b/api_docs/kbn_security_plugin_types_server.mdx index 339a98b8bf81c..963b42e46dd90 100644 --- a/api_docs/kbn_security_plugin_types_server.mdx +++ b/api_docs/kbn_security_plugin_types_server.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-security-plugin-types-server title: "@kbn/security-plugin-types-server" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/security-plugin-types-server plugin -date: 2024-05-07 +date: 2024-05-08 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/security-plugin-types-server'] --- import kbnSecurityPluginTypesServerObj from './kbn_security_plugin_types_server.devdocs.json'; diff --git a/api_docs/kbn_security_solution_features.mdx b/api_docs/kbn_security_solution_features.mdx index ac0c92f25cdec..c04c7de538c73 100644 --- a/api_docs/kbn_security_solution_features.mdx +++ b/api_docs/kbn_security_solution_features.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-security-solution-features title: "@kbn/security-solution-features" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/security-solution-features plugin -date: 2024-05-07 +date: 2024-05-08 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/security-solution-features'] --- import kbnSecuritySolutionFeaturesObj from './kbn_security_solution_features.devdocs.json'; diff --git a/api_docs/kbn_security_solution_navigation.mdx b/api_docs/kbn_security_solution_navigation.mdx index 1302db6211250..cb253347cbc41 100644 --- a/api_docs/kbn_security_solution_navigation.mdx +++ b/api_docs/kbn_security_solution_navigation.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-security-solution-navigation title: "@kbn/security-solution-navigation" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/security-solution-navigation plugin -date: 2024-05-07 +date: 2024-05-08 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/security-solution-navigation'] --- import kbnSecuritySolutionNavigationObj from './kbn_security_solution_navigation.devdocs.json'; diff --git a/api_docs/kbn_security_solution_side_nav.mdx b/api_docs/kbn_security_solution_side_nav.mdx index 3766dfb8693d2..24e88411d9141 100644 --- a/api_docs/kbn_security_solution_side_nav.mdx +++ b/api_docs/kbn_security_solution_side_nav.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-security-solution-side-nav title: "@kbn/security-solution-side-nav" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/security-solution-side-nav plugin -date: 2024-05-07 +date: 2024-05-08 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/security-solution-side-nav'] --- import kbnSecuritySolutionSideNavObj from './kbn_security_solution_side_nav.devdocs.json'; diff --git a/api_docs/kbn_security_solution_storybook_config.mdx b/api_docs/kbn_security_solution_storybook_config.mdx index 6b2659f5d49cb..cce9a8844406d 100644 --- a/api_docs/kbn_security_solution_storybook_config.mdx +++ b/api_docs/kbn_security_solution_storybook_config.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-security-solution-storybook-config title: "@kbn/security-solution-storybook-config" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/security-solution-storybook-config plugin -date: 2024-05-07 +date: 2024-05-08 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/security-solution-storybook-config'] --- import kbnSecuritySolutionStorybookConfigObj from './kbn_security_solution_storybook_config.devdocs.json'; diff --git a/api_docs/kbn_securitysolution_autocomplete.mdx b/api_docs/kbn_securitysolution_autocomplete.mdx index 641fd5bbc79c2..0f3d7d1df612e 100644 --- a/api_docs/kbn_securitysolution_autocomplete.mdx +++ b/api_docs/kbn_securitysolution_autocomplete.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-securitysolution-autocomplete title: "@kbn/securitysolution-autocomplete" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/securitysolution-autocomplete plugin -date: 2024-05-07 +date: 2024-05-08 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/securitysolution-autocomplete'] --- import kbnSecuritysolutionAutocompleteObj from './kbn_securitysolution_autocomplete.devdocs.json'; diff --git a/api_docs/kbn_securitysolution_data_table.mdx b/api_docs/kbn_securitysolution_data_table.mdx index f95ccacea611a..3ea5e0624cf2f 100644 --- a/api_docs/kbn_securitysolution_data_table.mdx +++ b/api_docs/kbn_securitysolution_data_table.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-securitysolution-data-table title: "@kbn/securitysolution-data-table" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/securitysolution-data-table plugin -date: 2024-05-07 +date: 2024-05-08 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/securitysolution-data-table'] --- import kbnSecuritysolutionDataTableObj from './kbn_securitysolution_data_table.devdocs.json'; diff --git a/api_docs/kbn_securitysolution_ecs.mdx b/api_docs/kbn_securitysolution_ecs.mdx index df312406fd172..84f480182714e 100644 --- a/api_docs/kbn_securitysolution_ecs.mdx +++ b/api_docs/kbn_securitysolution_ecs.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-securitysolution-ecs title: "@kbn/securitysolution-ecs" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/securitysolution-ecs plugin -date: 2024-05-07 +date: 2024-05-08 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/securitysolution-ecs'] --- import kbnSecuritysolutionEcsObj from './kbn_securitysolution_ecs.devdocs.json'; diff --git a/api_docs/kbn_securitysolution_es_utils.mdx b/api_docs/kbn_securitysolution_es_utils.mdx index bd9e26e320bb6..5bbd897cc3517 100644 --- a/api_docs/kbn_securitysolution_es_utils.mdx +++ b/api_docs/kbn_securitysolution_es_utils.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-securitysolution-es-utils title: "@kbn/securitysolution-es-utils" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/securitysolution-es-utils plugin -date: 2024-05-07 +date: 2024-05-08 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 6b778079b9fe9..7c5b557d9f0db 100644 --- a/api_docs/kbn_securitysolution_exception_list_components.mdx +++ b/api_docs/kbn_securitysolution_exception_list_components.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-securitysolution-exception-list-components title: "@kbn/securitysolution-exception-list-components" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/securitysolution-exception-list-components plugin -date: 2024-05-07 +date: 2024-05-08 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/securitysolution-exception-list-components'] --- import kbnSecuritysolutionExceptionListComponentsObj from './kbn_securitysolution_exception_list_components.devdocs.json'; diff --git a/api_docs/kbn_securitysolution_grouping.mdx b/api_docs/kbn_securitysolution_grouping.mdx index 6a538d1f2cb57..2001d71073087 100644 --- a/api_docs/kbn_securitysolution_grouping.mdx +++ b/api_docs/kbn_securitysolution_grouping.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-securitysolution-grouping title: "@kbn/securitysolution-grouping" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/securitysolution-grouping plugin -date: 2024-05-07 +date: 2024-05-08 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/securitysolution-grouping'] --- import kbnSecuritysolutionGroupingObj from './kbn_securitysolution_grouping.devdocs.json'; diff --git a/api_docs/kbn_securitysolution_hook_utils.mdx b/api_docs/kbn_securitysolution_hook_utils.mdx index cc61238ade4fd..03964bf312ca5 100644 --- a/api_docs/kbn_securitysolution_hook_utils.mdx +++ b/api_docs/kbn_securitysolution_hook_utils.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-securitysolution-hook-utils title: "@kbn/securitysolution-hook-utils" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/securitysolution-hook-utils plugin -date: 2024-05-07 +date: 2024-05-08 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 85e4dc7904f79..67ba959b10650 100644 --- a/api_docs/kbn_securitysolution_io_ts_alerting_types.mdx +++ b/api_docs/kbn_securitysolution_io_ts_alerting_types.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-securitysolution-io-ts-alerting-types title: "@kbn/securitysolution-io-ts-alerting-types" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/securitysolution-io-ts-alerting-types plugin -date: 2024-05-07 +date: 2024-05-08 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 1024019d1cf43..ce2018bfb9ef9 100644 --- a/api_docs/kbn_securitysolution_io_ts_list_types.mdx +++ b/api_docs/kbn_securitysolution_io_ts_list_types.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-securitysolution-io-ts-list-types title: "@kbn/securitysolution-io-ts-list-types" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/securitysolution-io-ts-list-types plugin -date: 2024-05-07 +date: 2024-05-08 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 4e9695976d7ca..7111cece6d4e2 100644 --- a/api_docs/kbn_securitysolution_io_ts_types.mdx +++ b/api_docs/kbn_securitysolution_io_ts_types.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-securitysolution-io-ts-types title: "@kbn/securitysolution-io-ts-types" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/securitysolution-io-ts-types plugin -date: 2024-05-07 +date: 2024-05-08 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 32b5789ea83b0..95effbf79e021 100644 --- a/api_docs/kbn_securitysolution_io_ts_utils.mdx +++ b/api_docs/kbn_securitysolution_io_ts_utils.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-securitysolution-io-ts-utils title: "@kbn/securitysolution-io-ts-utils" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/securitysolution-io-ts-utils plugin -date: 2024-05-07 +date: 2024-05-08 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 07a6a94cf971c..b1fceac4a47df 100644 --- a/api_docs/kbn_securitysolution_list_api.mdx +++ b/api_docs/kbn_securitysolution_list_api.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-securitysolution-list-api title: "@kbn/securitysolution-list-api" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/securitysolution-list-api plugin -date: 2024-05-07 +date: 2024-05-08 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 5e1539e30ca02..58668baf6d733 100644 --- a/api_docs/kbn_securitysolution_list_constants.mdx +++ b/api_docs/kbn_securitysolution_list_constants.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-securitysolution-list-constants title: "@kbn/securitysolution-list-constants" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/securitysolution-list-constants plugin -date: 2024-05-07 +date: 2024-05-08 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 060c725a25bc3..5b482f7a56b9b 100644 --- a/api_docs/kbn_securitysolution_list_hooks.mdx +++ b/api_docs/kbn_securitysolution_list_hooks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-securitysolution-list-hooks title: "@kbn/securitysolution-list-hooks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/securitysolution-list-hooks plugin -date: 2024-05-07 +date: 2024-05-08 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 03ddadac37d1a..44fd3534e446a 100644 --- a/api_docs/kbn_securitysolution_list_utils.mdx +++ b/api_docs/kbn_securitysolution_list_utils.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-securitysolution-list-utils title: "@kbn/securitysolution-list-utils" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/securitysolution-list-utils plugin -date: 2024-05-07 +date: 2024-05-08 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 ffd714fde546a..48e1fdd678901 100644 --- a/api_docs/kbn_securitysolution_rules.mdx +++ b/api_docs/kbn_securitysolution_rules.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-securitysolution-rules title: "@kbn/securitysolution-rules" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/securitysolution-rules plugin -date: 2024-05-07 +date: 2024-05-08 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 b199411056cbc..cc8027cc3be35 100644 --- a/api_docs/kbn_securitysolution_t_grid.mdx +++ b/api_docs/kbn_securitysolution_t_grid.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-securitysolution-t-grid title: "@kbn/securitysolution-t-grid" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/securitysolution-t-grid plugin -date: 2024-05-07 +date: 2024-05-08 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 435859641dfb9..b464b612968c0 100644 --- a/api_docs/kbn_securitysolution_utils.mdx +++ b/api_docs/kbn_securitysolution_utils.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-securitysolution-utils title: "@kbn/securitysolution-utils" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/securitysolution-utils plugin -date: 2024-05-07 +date: 2024-05-08 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 37a167ac7950e..f34f682ad1b48 100644 --- a/api_docs/kbn_server_http_tools.mdx +++ b/api_docs/kbn_server_http_tools.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-server-http-tools title: "@kbn/server-http-tools" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/server-http-tools plugin -date: 2024-05-07 +date: 2024-05-08 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 ab2e32279b308..3808fbcebc308 100644 --- a/api_docs/kbn_server_route_repository.mdx +++ b/api_docs/kbn_server_route_repository.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-server-route-repository title: "@kbn/server-route-repository" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/server-route-repository plugin -date: 2024-05-07 +date: 2024-05-08 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/server-route-repository'] --- import kbnServerRouteRepositoryObj from './kbn_server_route_repository.devdocs.json'; diff --git a/api_docs/kbn_serverless_common_settings.mdx b/api_docs/kbn_serverless_common_settings.mdx index a5a51b3895e85..c165d5180e19b 100644 --- a/api_docs/kbn_serverless_common_settings.mdx +++ b/api_docs/kbn_serverless_common_settings.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-serverless-common-settings title: "@kbn/serverless-common-settings" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/serverless-common-settings plugin -date: 2024-05-07 +date: 2024-05-08 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/serverless-common-settings'] --- import kbnServerlessCommonSettingsObj from './kbn_serverless_common_settings.devdocs.json'; diff --git a/api_docs/kbn_serverless_observability_settings.mdx b/api_docs/kbn_serverless_observability_settings.mdx index 67e289f36d643..7df050ea213c7 100644 --- a/api_docs/kbn_serverless_observability_settings.mdx +++ b/api_docs/kbn_serverless_observability_settings.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-serverless-observability-settings title: "@kbn/serverless-observability-settings" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/serverless-observability-settings plugin -date: 2024-05-07 +date: 2024-05-08 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/serverless-observability-settings'] --- import kbnServerlessObservabilitySettingsObj from './kbn_serverless_observability_settings.devdocs.json'; diff --git a/api_docs/kbn_serverless_project_switcher.mdx b/api_docs/kbn_serverless_project_switcher.mdx index 843e02c840a4c..d2bd002648b79 100644 --- a/api_docs/kbn_serverless_project_switcher.mdx +++ b/api_docs/kbn_serverless_project_switcher.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-serverless-project-switcher title: "@kbn/serverless-project-switcher" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/serverless-project-switcher plugin -date: 2024-05-07 +date: 2024-05-08 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/serverless-project-switcher'] --- import kbnServerlessProjectSwitcherObj from './kbn_serverless_project_switcher.devdocs.json'; diff --git a/api_docs/kbn_serverless_search_settings.mdx b/api_docs/kbn_serverless_search_settings.mdx index a191f67451594..f32ab84c1c539 100644 --- a/api_docs/kbn_serverless_search_settings.mdx +++ b/api_docs/kbn_serverless_search_settings.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-serverless-search-settings title: "@kbn/serverless-search-settings" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/serverless-search-settings plugin -date: 2024-05-07 +date: 2024-05-08 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/serverless-search-settings'] --- import kbnServerlessSearchSettingsObj from './kbn_serverless_search_settings.devdocs.json'; diff --git a/api_docs/kbn_serverless_security_settings.mdx b/api_docs/kbn_serverless_security_settings.mdx index 22d77cca319b9..61d49f298f277 100644 --- a/api_docs/kbn_serverless_security_settings.mdx +++ b/api_docs/kbn_serverless_security_settings.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-serverless-security-settings title: "@kbn/serverless-security-settings" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/serverless-security-settings plugin -date: 2024-05-07 +date: 2024-05-08 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/serverless-security-settings'] --- import kbnServerlessSecuritySettingsObj from './kbn_serverless_security_settings.devdocs.json'; diff --git a/api_docs/kbn_serverless_storybook_config.mdx b/api_docs/kbn_serverless_storybook_config.mdx index c14cb5b455815..bb968c2716759 100644 --- a/api_docs/kbn_serverless_storybook_config.mdx +++ b/api_docs/kbn_serverless_storybook_config.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-serverless-storybook-config title: "@kbn/serverless-storybook-config" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/serverless-storybook-config plugin -date: 2024-05-07 +date: 2024-05-08 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/serverless-storybook-config'] --- import kbnServerlessStorybookConfigObj from './kbn_serverless_storybook_config.devdocs.json'; diff --git a/api_docs/kbn_shared_svg.mdx b/api_docs/kbn_shared_svg.mdx index c5e929535005f..f7d5e865ed06a 100644 --- a/api_docs/kbn_shared_svg.mdx +++ b/api_docs/kbn_shared_svg.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-shared-svg title: "@kbn/shared-svg" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/shared-svg plugin -date: 2024-05-07 +date: 2024-05-08 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/shared-svg'] --- import kbnSharedSvgObj from './kbn_shared_svg.devdocs.json'; diff --git a/api_docs/kbn_shared_ux_avatar_solution.mdx b/api_docs/kbn_shared_ux_avatar_solution.mdx index 744e7354ef7d9..19f0fe11a6370 100644 --- a/api_docs/kbn_shared_ux_avatar_solution.mdx +++ b/api_docs/kbn_shared_ux_avatar_solution.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-shared-ux-avatar-solution title: "@kbn/shared-ux-avatar-solution" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/shared-ux-avatar-solution plugin -date: 2024-05-07 +date: 2024-05-08 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/shared-ux-avatar-solution'] --- import kbnSharedUxAvatarSolutionObj from './kbn_shared_ux_avatar_solution.devdocs.json'; diff --git a/api_docs/kbn_shared_ux_button_exit_full_screen.mdx b/api_docs/kbn_shared_ux_button_exit_full_screen.mdx index 9d912fb9fbcf9..79e9c33b322e4 100644 --- a/api_docs/kbn_shared_ux_button_exit_full_screen.mdx +++ b/api_docs/kbn_shared_ux_button_exit_full_screen.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-shared-ux-button-exit-full-screen title: "@kbn/shared-ux-button-exit-full-screen" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/shared-ux-button-exit-full-screen plugin -date: 2024-05-07 +date: 2024-05-08 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/shared-ux-button-exit-full-screen'] --- import kbnSharedUxButtonExitFullScreenObj from './kbn_shared_ux_button_exit_full_screen.devdocs.json'; diff --git a/api_docs/kbn_shared_ux_button_toolbar.mdx b/api_docs/kbn_shared_ux_button_toolbar.mdx index 3efcfe40c82d3..3d015816baa52 100644 --- a/api_docs/kbn_shared_ux_button_toolbar.mdx +++ b/api_docs/kbn_shared_ux_button_toolbar.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-shared-ux-button-toolbar title: "@kbn/shared-ux-button-toolbar" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/shared-ux-button-toolbar plugin -date: 2024-05-07 +date: 2024-05-08 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 3422e38df9cff..c012bd8998dba 100644 --- a/api_docs/kbn_shared_ux_card_no_data.mdx +++ b/api_docs/kbn_shared_ux_card_no_data.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-shared-ux-card-no-data title: "@kbn/shared-ux-card-no-data" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/shared-ux-card-no-data plugin -date: 2024-05-07 +date: 2024-05-08 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 5cd79c606ae1d..99eded234e519 100644 --- a/api_docs/kbn_shared_ux_card_no_data_mocks.mdx +++ b/api_docs/kbn_shared_ux_card_no_data_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-shared-ux-card-no-data-mocks title: "@kbn/shared-ux-card-no-data-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/shared-ux-card-no-data-mocks plugin -date: 2024-05-07 +date: 2024-05-08 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/shared-ux-card-no-data-mocks'] --- import kbnSharedUxCardNoDataMocksObj from './kbn_shared_ux_card_no_data_mocks.devdocs.json'; diff --git a/api_docs/kbn_shared_ux_chrome_navigation.mdx b/api_docs/kbn_shared_ux_chrome_navigation.mdx index 50ea9e344adb7..cdffb1b8091cb 100644 --- a/api_docs/kbn_shared_ux_chrome_navigation.mdx +++ b/api_docs/kbn_shared_ux_chrome_navigation.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-shared-ux-chrome-navigation title: "@kbn/shared-ux-chrome-navigation" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/shared-ux-chrome-navigation plugin -date: 2024-05-07 +date: 2024-05-08 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/shared-ux-chrome-navigation'] --- import kbnSharedUxChromeNavigationObj from './kbn_shared_ux_chrome_navigation.devdocs.json'; diff --git a/api_docs/kbn_shared_ux_error_boundary.mdx b/api_docs/kbn_shared_ux_error_boundary.mdx index b48672c6b00a2..bd9ab20facdac 100644 --- a/api_docs/kbn_shared_ux_error_boundary.mdx +++ b/api_docs/kbn_shared_ux_error_boundary.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-shared-ux-error-boundary title: "@kbn/shared-ux-error-boundary" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/shared-ux-error-boundary plugin -date: 2024-05-07 +date: 2024-05-08 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/shared-ux-error-boundary'] --- import kbnSharedUxErrorBoundaryObj from './kbn_shared_ux_error_boundary.devdocs.json'; diff --git a/api_docs/kbn_shared_ux_file_context.mdx b/api_docs/kbn_shared_ux_file_context.mdx index 3ac94054af166..3f863f70b1872 100644 --- a/api_docs/kbn_shared_ux_file_context.mdx +++ b/api_docs/kbn_shared_ux_file_context.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-shared-ux-file-context title: "@kbn/shared-ux-file-context" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/shared-ux-file-context plugin -date: 2024-05-07 +date: 2024-05-08 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/shared-ux-file-context'] --- import kbnSharedUxFileContextObj from './kbn_shared_ux_file_context.devdocs.json'; diff --git a/api_docs/kbn_shared_ux_file_image.mdx b/api_docs/kbn_shared_ux_file_image.mdx index ae12ba9e73f59..bef3b036f9d1e 100644 --- a/api_docs/kbn_shared_ux_file_image.mdx +++ b/api_docs/kbn_shared_ux_file_image.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-shared-ux-file-image title: "@kbn/shared-ux-file-image" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/shared-ux-file-image plugin -date: 2024-05-07 +date: 2024-05-08 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/shared-ux-file-image'] --- import kbnSharedUxFileImageObj from './kbn_shared_ux_file_image.devdocs.json'; diff --git a/api_docs/kbn_shared_ux_file_image_mocks.mdx b/api_docs/kbn_shared_ux_file_image_mocks.mdx index a93bee1149bed..0f80389d077ff 100644 --- a/api_docs/kbn_shared_ux_file_image_mocks.mdx +++ b/api_docs/kbn_shared_ux_file_image_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-shared-ux-file-image-mocks title: "@kbn/shared-ux-file-image-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/shared-ux-file-image-mocks plugin -date: 2024-05-07 +date: 2024-05-08 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/shared-ux-file-image-mocks'] --- import kbnSharedUxFileImageMocksObj from './kbn_shared_ux_file_image_mocks.devdocs.json'; diff --git a/api_docs/kbn_shared_ux_file_mocks.mdx b/api_docs/kbn_shared_ux_file_mocks.mdx index de8282fc50e4e..f59f540c257a6 100644 --- a/api_docs/kbn_shared_ux_file_mocks.mdx +++ b/api_docs/kbn_shared_ux_file_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-shared-ux-file-mocks title: "@kbn/shared-ux-file-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/shared-ux-file-mocks plugin -date: 2024-05-07 +date: 2024-05-08 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/shared-ux-file-mocks'] --- import kbnSharedUxFileMocksObj from './kbn_shared_ux_file_mocks.devdocs.json'; diff --git a/api_docs/kbn_shared_ux_file_picker.mdx b/api_docs/kbn_shared_ux_file_picker.mdx index 15c02ace7a9d8..a54f9d738ed55 100644 --- a/api_docs/kbn_shared_ux_file_picker.mdx +++ b/api_docs/kbn_shared_ux_file_picker.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-shared-ux-file-picker title: "@kbn/shared-ux-file-picker" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/shared-ux-file-picker plugin -date: 2024-05-07 +date: 2024-05-08 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/shared-ux-file-picker'] --- import kbnSharedUxFilePickerObj from './kbn_shared_ux_file_picker.devdocs.json'; diff --git a/api_docs/kbn_shared_ux_file_types.mdx b/api_docs/kbn_shared_ux_file_types.mdx index 9629ca3c2323b..2b75de54cf168 100644 --- a/api_docs/kbn_shared_ux_file_types.mdx +++ b/api_docs/kbn_shared_ux_file_types.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-shared-ux-file-types title: "@kbn/shared-ux-file-types" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/shared-ux-file-types plugin -date: 2024-05-07 +date: 2024-05-08 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/shared-ux-file-types'] --- import kbnSharedUxFileTypesObj from './kbn_shared_ux_file_types.devdocs.json'; diff --git a/api_docs/kbn_shared_ux_file_upload.mdx b/api_docs/kbn_shared_ux_file_upload.mdx index a3b54f849fd06..855ca7474ee22 100644 --- a/api_docs/kbn_shared_ux_file_upload.mdx +++ b/api_docs/kbn_shared_ux_file_upload.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-shared-ux-file-upload title: "@kbn/shared-ux-file-upload" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/shared-ux-file-upload plugin -date: 2024-05-07 +date: 2024-05-08 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/shared-ux-file-upload'] --- import kbnSharedUxFileUploadObj from './kbn_shared_ux_file_upload.devdocs.json'; diff --git a/api_docs/kbn_shared_ux_file_util.mdx b/api_docs/kbn_shared_ux_file_util.mdx index 652cc70868fd7..b41f45632d26e 100644 --- a/api_docs/kbn_shared_ux_file_util.mdx +++ b/api_docs/kbn_shared_ux_file_util.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-shared-ux-file-util title: "@kbn/shared-ux-file-util" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/shared-ux-file-util plugin -date: 2024-05-07 +date: 2024-05-08 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/shared-ux-file-util'] --- import kbnSharedUxFileUtilObj from './kbn_shared_ux_file_util.devdocs.json'; diff --git a/api_docs/kbn_shared_ux_link_redirect_app.mdx b/api_docs/kbn_shared_ux_link_redirect_app.mdx index a4b997552a862..26189e5b1e596 100644 --- a/api_docs/kbn_shared_ux_link_redirect_app.mdx +++ b/api_docs/kbn_shared_ux_link_redirect_app.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-shared-ux-link-redirect-app title: "@kbn/shared-ux-link-redirect-app" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/shared-ux-link-redirect-app plugin -date: 2024-05-07 +date: 2024-05-08 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/shared-ux-link-redirect-app'] --- import kbnSharedUxLinkRedirectAppObj from './kbn_shared_ux_link_redirect_app.devdocs.json'; diff --git a/api_docs/kbn_shared_ux_link_redirect_app_mocks.mdx b/api_docs/kbn_shared_ux_link_redirect_app_mocks.mdx index 5ac1515b51acc..5966718c556df 100644 --- a/api_docs/kbn_shared_ux_link_redirect_app_mocks.mdx +++ b/api_docs/kbn_shared_ux_link_redirect_app_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-shared-ux-link-redirect-app-mocks title: "@kbn/shared-ux-link-redirect-app-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/shared-ux-link-redirect-app-mocks plugin -date: 2024-05-07 +date: 2024-05-08 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/shared-ux-link-redirect-app-mocks'] --- import kbnSharedUxLinkRedirectAppMocksObj from './kbn_shared_ux_link_redirect_app_mocks.devdocs.json'; diff --git a/api_docs/kbn_shared_ux_markdown.mdx b/api_docs/kbn_shared_ux_markdown.mdx index 8ea762feb49b5..285b93461d54f 100644 --- a/api_docs/kbn_shared_ux_markdown.mdx +++ b/api_docs/kbn_shared_ux_markdown.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-shared-ux-markdown title: "@kbn/shared-ux-markdown" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/shared-ux-markdown plugin -date: 2024-05-07 +date: 2024-05-08 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/shared-ux-markdown'] --- import kbnSharedUxMarkdownObj from './kbn_shared_ux_markdown.devdocs.json'; diff --git a/api_docs/kbn_shared_ux_markdown_mocks.mdx b/api_docs/kbn_shared_ux_markdown_mocks.mdx index c9f9c1a82c9c1..0bd237db76249 100644 --- a/api_docs/kbn_shared_ux_markdown_mocks.mdx +++ b/api_docs/kbn_shared_ux_markdown_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-shared-ux-markdown-mocks title: "@kbn/shared-ux-markdown-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/shared-ux-markdown-mocks plugin -date: 2024-05-07 +date: 2024-05-08 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/shared-ux-markdown-mocks'] --- import kbnSharedUxMarkdownMocksObj from './kbn_shared_ux_markdown_mocks.devdocs.json'; diff --git a/api_docs/kbn_shared_ux_page_analytics_no_data.mdx b/api_docs/kbn_shared_ux_page_analytics_no_data.mdx index faeae7ab7c82d..dce5478e34f04 100644 --- a/api_docs/kbn_shared_ux_page_analytics_no_data.mdx +++ b/api_docs/kbn_shared_ux_page_analytics_no_data.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-shared-ux-page-analytics-no-data title: "@kbn/shared-ux-page-analytics-no-data" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/shared-ux-page-analytics-no-data plugin -date: 2024-05-07 +date: 2024-05-08 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 caed77829bd3b..2a71a39a941ea 100644 --- a/api_docs/kbn_shared_ux_page_analytics_no_data_mocks.mdx +++ b/api_docs/kbn_shared_ux_page_analytics_no_data_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-shared-ux-page-analytics-no-data-mocks title: "@kbn/shared-ux-page-analytics-no-data-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/shared-ux-page-analytics-no-data-mocks plugin -date: 2024-05-07 +date: 2024-05-08 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 6c41aa2999ef7..b02276d3e017e 100644 --- a/api_docs/kbn_shared_ux_page_kibana_no_data.mdx +++ b/api_docs/kbn_shared_ux_page_kibana_no_data.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-shared-ux-page-kibana-no-data title: "@kbn/shared-ux-page-kibana-no-data" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/shared-ux-page-kibana-no-data plugin -date: 2024-05-07 +date: 2024-05-08 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 f968e0c134af7..dee130e7ca4c7 100644 --- a/api_docs/kbn_shared_ux_page_kibana_no_data_mocks.mdx +++ b/api_docs/kbn_shared_ux_page_kibana_no_data_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-shared-ux-page-kibana-no-data-mocks title: "@kbn/shared-ux-page-kibana-no-data-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/shared-ux-page-kibana-no-data-mocks plugin -date: 2024-05-07 +date: 2024-05-08 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 c864bd17ca645..b0f1a0bce65d5 100644 --- a/api_docs/kbn_shared_ux_page_kibana_template.mdx +++ b/api_docs/kbn_shared_ux_page_kibana_template.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-shared-ux-page-kibana-template title: "@kbn/shared-ux-page-kibana-template" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/shared-ux-page-kibana-template plugin -date: 2024-05-07 +date: 2024-05-08 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 b812ad076221b..edbc47ccce5fc 100644 --- a/api_docs/kbn_shared_ux_page_kibana_template_mocks.mdx +++ b/api_docs/kbn_shared_ux_page_kibana_template_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-shared-ux-page-kibana-template-mocks title: "@kbn/shared-ux-page-kibana-template-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/shared-ux-page-kibana-template-mocks plugin -date: 2024-05-07 +date: 2024-05-08 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 cffc580407a2d..f5e468c86d9fc 100644 --- a/api_docs/kbn_shared_ux_page_no_data.mdx +++ b/api_docs/kbn_shared_ux_page_no_data.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-shared-ux-page-no-data title: "@kbn/shared-ux-page-no-data" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/shared-ux-page-no-data plugin -date: 2024-05-07 +date: 2024-05-08 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 6739b1bc84258..014630a24dfc8 100644 --- a/api_docs/kbn_shared_ux_page_no_data_config.mdx +++ b/api_docs/kbn_shared_ux_page_no_data_config.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-shared-ux-page-no-data-config title: "@kbn/shared-ux-page-no-data-config" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/shared-ux-page-no-data-config plugin -date: 2024-05-07 +date: 2024-05-08 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 fca0931e7daa6..9eb76301ad45c 100644 --- a/api_docs/kbn_shared_ux_page_no_data_config_mocks.mdx +++ b/api_docs/kbn_shared_ux_page_no_data_config_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-shared-ux-page-no-data-config-mocks title: "@kbn/shared-ux-page-no-data-config-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/shared-ux-page-no-data-config-mocks plugin -date: 2024-05-07 +date: 2024-05-08 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 a9f98d95008f1..3ee844b814fd8 100644 --- a/api_docs/kbn_shared_ux_page_no_data_mocks.mdx +++ b/api_docs/kbn_shared_ux_page_no_data_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-shared-ux-page-no-data-mocks title: "@kbn/shared-ux-page-no-data-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/shared-ux-page-no-data-mocks plugin -date: 2024-05-07 +date: 2024-05-08 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 1be70f1b98749..8c4a1100e17ef 100644 --- a/api_docs/kbn_shared_ux_page_solution_nav.mdx +++ b/api_docs/kbn_shared_ux_page_solution_nav.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-shared-ux-page-solution-nav title: "@kbn/shared-ux-page-solution-nav" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/shared-ux-page-solution-nav plugin -date: 2024-05-07 +date: 2024-05-08 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 7f6c7bc5eaf6e..ce4ce918a5b19 100644 --- a/api_docs/kbn_shared_ux_prompt_no_data_views.mdx +++ b/api_docs/kbn_shared_ux_prompt_no_data_views.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-shared-ux-prompt-no-data-views title: "@kbn/shared-ux-prompt-no-data-views" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/shared-ux-prompt-no-data-views plugin -date: 2024-05-07 +date: 2024-05-08 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 54f602363bfb2..f99a9c18ce457 100644 --- a/api_docs/kbn_shared_ux_prompt_no_data_views_mocks.mdx +++ b/api_docs/kbn_shared_ux_prompt_no_data_views_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-shared-ux-prompt-no-data-views-mocks title: "@kbn/shared-ux-prompt-no-data-views-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/shared-ux-prompt-no-data-views-mocks plugin -date: 2024-05-07 +date: 2024-05-08 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/shared-ux-prompt-no-data-views-mocks'] --- import kbnSharedUxPromptNoDataViewsMocksObj from './kbn_shared_ux_prompt_no_data_views_mocks.devdocs.json'; diff --git a/api_docs/kbn_shared_ux_prompt_not_found.mdx b/api_docs/kbn_shared_ux_prompt_not_found.mdx index a956538538b65..349366bed379c 100644 --- a/api_docs/kbn_shared_ux_prompt_not_found.mdx +++ b/api_docs/kbn_shared_ux_prompt_not_found.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-shared-ux-prompt-not-found title: "@kbn/shared-ux-prompt-not-found" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/shared-ux-prompt-not-found plugin -date: 2024-05-07 +date: 2024-05-08 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/shared-ux-prompt-not-found'] --- import kbnSharedUxPromptNotFoundObj from './kbn_shared_ux_prompt_not_found.devdocs.json'; diff --git a/api_docs/kbn_shared_ux_router.mdx b/api_docs/kbn_shared_ux_router.mdx index 01760d99894b7..7bb92215492e5 100644 --- a/api_docs/kbn_shared_ux_router.mdx +++ b/api_docs/kbn_shared_ux_router.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-shared-ux-router title: "@kbn/shared-ux-router" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/shared-ux-router plugin -date: 2024-05-07 +date: 2024-05-08 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 6e04c7604e574..c065418433bc2 100644 --- a/api_docs/kbn_shared_ux_router_mocks.mdx +++ b/api_docs/kbn_shared_ux_router_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-shared-ux-router-mocks title: "@kbn/shared-ux-router-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/shared-ux-router-mocks plugin -date: 2024-05-07 +date: 2024-05-08 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 d30dc474b1f8d..3d3c5089239af 100644 --- a/api_docs/kbn_shared_ux_storybook_config.mdx +++ b/api_docs/kbn_shared_ux_storybook_config.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-shared-ux-storybook-config title: "@kbn/shared-ux-storybook-config" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/shared-ux-storybook-config plugin -date: 2024-05-07 +date: 2024-05-08 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 5bd95ffe04e8d..e12f604f5f213 100644 --- a/api_docs/kbn_shared_ux_storybook_mock.mdx +++ b/api_docs/kbn_shared_ux_storybook_mock.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-shared-ux-storybook-mock title: "@kbn/shared-ux-storybook-mock" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/shared-ux-storybook-mock plugin -date: 2024-05-07 +date: 2024-05-08 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/shared-ux-storybook-mock'] --- import kbnSharedUxStorybookMockObj from './kbn_shared_ux_storybook_mock.devdocs.json'; diff --git a/api_docs/kbn_shared_ux_tabbed_modal.mdx b/api_docs/kbn_shared_ux_tabbed_modal.mdx index 8656d78746289..2c5a79a636b4b 100644 --- a/api_docs/kbn_shared_ux_tabbed_modal.mdx +++ b/api_docs/kbn_shared_ux_tabbed_modal.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-shared-ux-tabbed-modal title: "@kbn/shared-ux-tabbed-modal" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/shared-ux-tabbed-modal plugin -date: 2024-05-07 +date: 2024-05-08 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/shared-ux-tabbed-modal'] --- import kbnSharedUxTabbedModalObj from './kbn_shared_ux_tabbed_modal.devdocs.json'; diff --git a/api_docs/kbn_shared_ux_utility.mdx b/api_docs/kbn_shared_ux_utility.mdx index 46f11055f5450..078374f3aa83a 100644 --- a/api_docs/kbn_shared_ux_utility.mdx +++ b/api_docs/kbn_shared_ux_utility.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-shared-ux-utility title: "@kbn/shared-ux-utility" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/shared-ux-utility plugin -date: 2024-05-07 +date: 2024-05-08 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/shared-ux-utility'] --- import kbnSharedUxUtilityObj from './kbn_shared_ux_utility.devdocs.json'; diff --git a/api_docs/kbn_slo_schema.mdx b/api_docs/kbn_slo_schema.mdx index bc09568d7794f..d687446afc878 100644 --- a/api_docs/kbn_slo_schema.mdx +++ b/api_docs/kbn_slo_schema.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-slo-schema title: "@kbn/slo-schema" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/slo-schema plugin -date: 2024-05-07 +date: 2024-05-08 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/slo-schema'] --- import kbnSloSchemaObj from './kbn_slo_schema.devdocs.json'; diff --git a/api_docs/kbn_solution_nav_es.mdx b/api_docs/kbn_solution_nav_es.mdx index ffdd80a5095b9..cc72fdeadd5a5 100644 --- a/api_docs/kbn_solution_nav_es.mdx +++ b/api_docs/kbn_solution_nav_es.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-solution-nav-es title: "@kbn/solution-nav-es" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/solution-nav-es plugin -date: 2024-05-07 +date: 2024-05-08 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/solution-nav-es'] --- import kbnSolutionNavEsObj from './kbn_solution_nav_es.devdocs.json'; diff --git a/api_docs/kbn_solution_nav_oblt.mdx b/api_docs/kbn_solution_nav_oblt.mdx index c55e9aade46ca..53a91f8725521 100644 --- a/api_docs/kbn_solution_nav_oblt.mdx +++ b/api_docs/kbn_solution_nav_oblt.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-solution-nav-oblt title: "@kbn/solution-nav-oblt" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/solution-nav-oblt plugin -date: 2024-05-07 +date: 2024-05-08 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/solution-nav-oblt'] --- import kbnSolutionNavObltObj from './kbn_solution_nav_oblt.devdocs.json'; diff --git a/api_docs/kbn_some_dev_log.mdx b/api_docs/kbn_some_dev_log.mdx index 16405d6506ec7..3ee86801b7100 100644 --- a/api_docs/kbn_some_dev_log.mdx +++ b/api_docs/kbn_some_dev_log.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-some-dev-log title: "@kbn/some-dev-log" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/some-dev-log plugin -date: 2024-05-07 +date: 2024-05-08 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/some-dev-log'] --- import kbnSomeDevLogObj from './kbn_some_dev_log.devdocs.json'; diff --git a/api_docs/kbn_sort_predicates.mdx b/api_docs/kbn_sort_predicates.mdx index 949f02026184f..a0618235ff0d1 100644 --- a/api_docs/kbn_sort_predicates.mdx +++ b/api_docs/kbn_sort_predicates.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-sort-predicates title: "@kbn/sort-predicates" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/sort-predicates plugin -date: 2024-05-07 +date: 2024-05-08 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/sort-predicates'] --- import kbnSortPredicatesObj from './kbn_sort_predicates.devdocs.json'; diff --git a/api_docs/kbn_std.mdx b/api_docs/kbn_std.mdx index 0028af6458444..b34160f5ce46f 100644 --- a/api_docs/kbn_std.mdx +++ b/api_docs/kbn_std.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-std title: "@kbn/std" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/std plugin -date: 2024-05-07 +date: 2024-05-08 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 30567572c8d5e..a23ee54528d4e 100644 --- a/api_docs/kbn_stdio_dev_helpers.mdx +++ b/api_docs/kbn_stdio_dev_helpers.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-stdio-dev-helpers title: "@kbn/stdio-dev-helpers" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/stdio-dev-helpers plugin -date: 2024-05-07 +date: 2024-05-08 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 3ff597004c22a..dc828b440e97d 100644 --- a/api_docs/kbn_storybook.mdx +++ b/api_docs/kbn_storybook.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-storybook title: "@kbn/storybook" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/storybook plugin -date: 2024-05-07 +date: 2024-05-08 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 4a590cd971ab7..1147790709652 100644 --- a/api_docs/kbn_telemetry_tools.mdx +++ b/api_docs/kbn_telemetry_tools.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-telemetry-tools title: "@kbn/telemetry-tools" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/telemetry-tools plugin -date: 2024-05-07 +date: 2024-05-08 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 b754fc7266609..ea67dcb00429f 100644 --- a/api_docs/kbn_test.mdx +++ b/api_docs/kbn_test.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-test title: "@kbn/test" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/test plugin -date: 2024-05-07 +date: 2024-05-08 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/test'] --- import kbnTestObj from './kbn_test.devdocs.json'; diff --git a/api_docs/kbn_test_eui_helpers.mdx b/api_docs/kbn_test_eui_helpers.mdx index a6e0f69e31cb9..d64acfa934ec9 100644 --- a/api_docs/kbn_test_eui_helpers.mdx +++ b/api_docs/kbn_test_eui_helpers.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-test-eui-helpers title: "@kbn/test-eui-helpers" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/test-eui-helpers plugin -date: 2024-05-07 +date: 2024-05-08 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/test-eui-helpers'] --- import kbnTestEuiHelpersObj from './kbn_test_eui_helpers.devdocs.json'; diff --git a/api_docs/kbn_test_jest_helpers.mdx b/api_docs/kbn_test_jest_helpers.mdx index ea9322d8ac157..720d2944cfe9c 100644 --- a/api_docs/kbn_test_jest_helpers.mdx +++ b/api_docs/kbn_test_jest_helpers.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-test-jest-helpers title: "@kbn/test-jest-helpers" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/test-jest-helpers plugin -date: 2024-05-07 +date: 2024-05-08 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 6ba8f71013034..d9e5633ebe4b0 100644 --- a/api_docs/kbn_test_subj_selector.mdx +++ b/api_docs/kbn_test_subj_selector.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-test-subj-selector title: "@kbn/test-subj-selector" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/test-subj-selector plugin -date: 2024-05-07 +date: 2024-05-08 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/test-subj-selector'] --- import kbnTestSubjSelectorObj from './kbn_test_subj_selector.devdocs.json'; diff --git a/api_docs/kbn_text_based_editor.mdx b/api_docs/kbn_text_based_editor.mdx index 0f15b4bede9d4..918e1d1b70c88 100644 --- a/api_docs/kbn_text_based_editor.mdx +++ b/api_docs/kbn_text_based_editor.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-text-based-editor title: "@kbn/text-based-editor" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/text-based-editor plugin -date: 2024-05-07 +date: 2024-05-08 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/text-based-editor'] --- import kbnTextBasedEditorObj from './kbn_text_based_editor.devdocs.json'; diff --git a/api_docs/kbn_timerange.mdx b/api_docs/kbn_timerange.mdx index f02719f0ef05f..2ee85e0267a7a 100644 --- a/api_docs/kbn_timerange.mdx +++ b/api_docs/kbn_timerange.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-timerange title: "@kbn/timerange" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/timerange plugin -date: 2024-05-07 +date: 2024-05-08 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/timerange'] --- import kbnTimerangeObj from './kbn_timerange.devdocs.json'; diff --git a/api_docs/kbn_tooling_log.mdx b/api_docs/kbn_tooling_log.mdx index 8a9c68e540b3c..39930a01aa3bf 100644 --- a/api_docs/kbn_tooling_log.mdx +++ b/api_docs/kbn_tooling_log.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-tooling-log title: "@kbn/tooling-log" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/tooling-log plugin -date: 2024-05-07 +date: 2024-05-08 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/tooling-log'] --- import kbnToolingLogObj from './kbn_tooling_log.devdocs.json'; diff --git a/api_docs/kbn_triggers_actions_ui_types.mdx b/api_docs/kbn_triggers_actions_ui_types.mdx index aff7155cf6241..b02456af22e81 100644 --- a/api_docs/kbn_triggers_actions_ui_types.mdx +++ b/api_docs/kbn_triggers_actions_ui_types.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-triggers-actions-ui-types title: "@kbn/triggers-actions-ui-types" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/triggers-actions-ui-types plugin -date: 2024-05-07 +date: 2024-05-08 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/triggers-actions-ui-types'] --- import kbnTriggersActionsUiTypesObj from './kbn_triggers_actions_ui_types.devdocs.json'; diff --git a/api_docs/kbn_ts_projects.mdx b/api_docs/kbn_ts_projects.mdx index 5d2403bf7c360..56680c202444f 100644 --- a/api_docs/kbn_ts_projects.mdx +++ b/api_docs/kbn_ts_projects.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-ts-projects title: "@kbn/ts-projects" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/ts-projects plugin -date: 2024-05-07 +date: 2024-05-08 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/ts-projects'] --- import kbnTsProjectsObj from './kbn_ts_projects.devdocs.json'; diff --git a/api_docs/kbn_typed_react_router_config.mdx b/api_docs/kbn_typed_react_router_config.mdx index 1779f7edd81d1..c37c1a40ed7a7 100644 --- a/api_docs/kbn_typed_react_router_config.mdx +++ b/api_docs/kbn_typed_react_router_config.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-typed-react-router-config title: "@kbn/typed-react-router-config" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/typed-react-router-config plugin -date: 2024-05-07 +date: 2024-05-08 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/typed-react-router-config'] --- import kbnTypedReactRouterConfigObj from './kbn_typed_react_router_config.devdocs.json'; diff --git a/api_docs/kbn_ui_actions_browser.mdx b/api_docs/kbn_ui_actions_browser.mdx index 58a24631f8daa..66105a80c08da 100644 --- a/api_docs/kbn_ui_actions_browser.mdx +++ b/api_docs/kbn_ui_actions_browser.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-ui-actions-browser title: "@kbn/ui-actions-browser" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/ui-actions-browser plugin -date: 2024-05-07 +date: 2024-05-08 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/ui-actions-browser'] --- import kbnUiActionsBrowserObj from './kbn_ui_actions_browser.devdocs.json'; diff --git a/api_docs/kbn_ui_shared_deps_src.mdx b/api_docs/kbn_ui_shared_deps_src.mdx index 0c00262e0aea1..95adc7119b535 100644 --- a/api_docs/kbn_ui_shared_deps_src.mdx +++ b/api_docs/kbn_ui_shared_deps_src.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-ui-shared-deps-src title: "@kbn/ui-shared-deps-src" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/ui-shared-deps-src plugin -date: 2024-05-07 +date: 2024-05-08 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/ui-shared-deps-src'] --- import kbnUiSharedDepsSrcObj from './kbn_ui_shared_deps_src.devdocs.json'; diff --git a/api_docs/kbn_ui_theme.mdx b/api_docs/kbn_ui_theme.mdx index c990c29d013eb..67e43fd0987c2 100644 --- a/api_docs/kbn_ui_theme.mdx +++ b/api_docs/kbn_ui_theme.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-ui-theme title: "@kbn/ui-theme" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/ui-theme plugin -date: 2024-05-07 +date: 2024-05-08 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/ui-theme'] --- import kbnUiThemeObj from './kbn_ui_theme.devdocs.json'; diff --git a/api_docs/kbn_unified_data_table.mdx b/api_docs/kbn_unified_data_table.mdx index f98d0089826d7..4b6bfd75b662f 100644 --- a/api_docs/kbn_unified_data_table.mdx +++ b/api_docs/kbn_unified_data_table.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-unified-data-table title: "@kbn/unified-data-table" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/unified-data-table plugin -date: 2024-05-07 +date: 2024-05-08 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/unified-data-table'] --- import kbnUnifiedDataTableObj from './kbn_unified_data_table.devdocs.json'; diff --git a/api_docs/kbn_unified_doc_viewer.mdx b/api_docs/kbn_unified_doc_viewer.mdx index 9cf47290f0857..c8eba4cf7042d 100644 --- a/api_docs/kbn_unified_doc_viewer.mdx +++ b/api_docs/kbn_unified_doc_viewer.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-unified-doc-viewer title: "@kbn/unified-doc-viewer" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/unified-doc-viewer plugin -date: 2024-05-07 +date: 2024-05-08 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/unified-doc-viewer'] --- import kbnUnifiedDocViewerObj from './kbn_unified_doc_viewer.devdocs.json'; diff --git a/api_docs/kbn_unified_field_list.mdx b/api_docs/kbn_unified_field_list.mdx index d214ce32cc9c6..a8821d93cc15d 100644 --- a/api_docs/kbn_unified_field_list.mdx +++ b/api_docs/kbn_unified_field_list.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-unified-field-list title: "@kbn/unified-field-list" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/unified-field-list plugin -date: 2024-05-07 +date: 2024-05-08 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/unified-field-list'] --- import kbnUnifiedFieldListObj from './kbn_unified_field_list.devdocs.json'; diff --git a/api_docs/kbn_unsaved_changes_badge.mdx b/api_docs/kbn_unsaved_changes_badge.mdx index f37aeca449611..493aed470644a 100644 --- a/api_docs/kbn_unsaved_changes_badge.mdx +++ b/api_docs/kbn_unsaved_changes_badge.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-unsaved-changes-badge title: "@kbn/unsaved-changes-badge" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/unsaved-changes-badge plugin -date: 2024-05-07 +date: 2024-05-08 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/unsaved-changes-badge'] --- import kbnUnsavedChangesBadgeObj from './kbn_unsaved_changes_badge.devdocs.json'; diff --git a/api_docs/kbn_use_tracked_promise.mdx b/api_docs/kbn_use_tracked_promise.mdx index 9e7234224bf44..d62aa1eb808eb 100644 --- a/api_docs/kbn_use_tracked_promise.mdx +++ b/api_docs/kbn_use_tracked_promise.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-use-tracked-promise title: "@kbn/use-tracked-promise" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/use-tracked-promise plugin -date: 2024-05-07 +date: 2024-05-08 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/use-tracked-promise'] --- import kbnUseTrackedPromiseObj from './kbn_use_tracked_promise.devdocs.json'; diff --git a/api_docs/kbn_user_profile_components.mdx b/api_docs/kbn_user_profile_components.mdx index ae12b7eb537f0..d1ac1b7398282 100644 --- a/api_docs/kbn_user_profile_components.mdx +++ b/api_docs/kbn_user_profile_components.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-user-profile-components title: "@kbn/user-profile-components" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/user-profile-components plugin -date: 2024-05-07 +date: 2024-05-08 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 540aebf8a97a5..0f5083903f730 100644 --- a/api_docs/kbn_utility_types.mdx +++ b/api_docs/kbn_utility_types.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-utility-types title: "@kbn/utility-types" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/utility-types plugin -date: 2024-05-07 +date: 2024-05-08 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 66fa4bc2ce871..55bf2843a0d5d 100644 --- a/api_docs/kbn_utility_types_jest.mdx +++ b/api_docs/kbn_utility_types_jest.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-utility-types-jest title: "@kbn/utility-types-jest" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/utility-types-jest plugin -date: 2024-05-07 +date: 2024-05-08 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 7190ff432ac1d..d6b517965b9cb 100644 --- a/api_docs/kbn_utils.mdx +++ b/api_docs/kbn_utils.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-utils title: "@kbn/utils" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/utils plugin -date: 2024-05-07 +date: 2024-05-08 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/utils'] --- import kbnUtilsObj from './kbn_utils.devdocs.json'; diff --git a/api_docs/kbn_visualization_ui_components.mdx b/api_docs/kbn_visualization_ui_components.mdx index 35ed6c05c0836..18437e06d74c4 100644 --- a/api_docs/kbn_visualization_ui_components.mdx +++ b/api_docs/kbn_visualization_ui_components.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-visualization-ui-components title: "@kbn/visualization-ui-components" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/visualization-ui-components plugin -date: 2024-05-07 +date: 2024-05-08 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/visualization-ui-components'] --- import kbnVisualizationUiComponentsObj from './kbn_visualization_ui_components.devdocs.json'; diff --git a/api_docs/kbn_visualization_utils.mdx b/api_docs/kbn_visualization_utils.mdx index e49d818026c38..e9893305bf30d 100644 --- a/api_docs/kbn_visualization_utils.mdx +++ b/api_docs/kbn_visualization_utils.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-visualization-utils title: "@kbn/visualization-utils" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/visualization-utils plugin -date: 2024-05-07 +date: 2024-05-08 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/visualization-utils'] --- import kbnVisualizationUtilsObj from './kbn_visualization_utils.devdocs.json'; diff --git a/api_docs/kbn_xstate_utils.mdx b/api_docs/kbn_xstate_utils.mdx index 70c36db92992b..f866cfb34cc88 100644 --- a/api_docs/kbn_xstate_utils.mdx +++ b/api_docs/kbn_xstate_utils.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-xstate-utils title: "@kbn/xstate-utils" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/xstate-utils plugin -date: 2024-05-07 +date: 2024-05-08 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/xstate-utils'] --- import kbnXstateUtilsObj from './kbn_xstate_utils.devdocs.json'; diff --git a/api_docs/kbn_yarn_lock_validator.mdx b/api_docs/kbn_yarn_lock_validator.mdx index f368499e09543..b61e1d4b1f5e5 100644 --- a/api_docs/kbn_yarn_lock_validator.mdx +++ b/api_docs/kbn_yarn_lock_validator.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-yarn-lock-validator title: "@kbn/yarn-lock-validator" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/yarn-lock-validator plugin -date: 2024-05-07 +date: 2024-05-08 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/yarn-lock-validator'] --- import kbnYarnLockValidatorObj from './kbn_yarn_lock_validator.devdocs.json'; diff --git a/api_docs/kbn_zod_helpers.mdx b/api_docs/kbn_zod_helpers.mdx index ccec2efed99da..0603046cae833 100644 --- a/api_docs/kbn_zod_helpers.mdx +++ b/api_docs/kbn_zod_helpers.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-zod-helpers title: "@kbn/zod-helpers" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/zod-helpers plugin -date: 2024-05-07 +date: 2024-05-08 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/zod-helpers'] --- import kbnZodHelpersObj from './kbn_zod_helpers.devdocs.json'; diff --git a/api_docs/kibana_overview.mdx b/api_docs/kibana_overview.mdx index f6f3836adf6bb..861d3dce2b527 100644 --- a/api_docs/kibana_overview.mdx +++ b/api_docs/kibana_overview.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kibanaOverview title: "kibanaOverview" image: https://source.unsplash.com/400x175/?github description: API docs for the kibanaOverview plugin -date: 2024-05-07 +date: 2024-05-08 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'kibanaOverview'] --- import kibanaOverviewObj from './kibana_overview.devdocs.json'; diff --git a/api_docs/kibana_react.devdocs.json b/api_docs/kibana_react.devdocs.json index 7ecaec8ae26f6..fb67fa4907473 100644 --- a/api_docs/kibana_react.devdocs.json +++ b/api_docs/kibana_react.devdocs.json @@ -511,34 +511,6 @@ "deprecated": true, "trackAdoption": false, "references": [ - { - "plugin": "devTools", - "path": "src/plugins/dev_tools/public/application.tsx" - }, - { - "plugin": "devTools", - "path": "src/plugins/dev_tools/public/application.tsx" - }, - { - "plugin": "devTools", - "path": "src/plugins/dev_tools/public/application.tsx" - }, - { - "plugin": "console", - "path": "src/plugins/console/public/shared_imports.ts" - }, - { - "plugin": "crossClusterReplication", - "path": "x-pack/plugins/cross_cluster_replication/public/shared_imports.ts" - }, - { - "plugin": "grokdebugger", - "path": "x-pack/plugins/grokdebugger/public/shared_imports.ts" - }, - { - "plugin": "ingestPipelines", - "path": "x-pack/plugins/ingest_pipelines/public/shared_imports.ts" - }, { "plugin": "infra", "path": "x-pack/plugins/observability_solution/infra/public/apps/common_providers.tsx" @@ -551,38 +523,6 @@ "plugin": "infra", "path": "x-pack/plugins/observability_solution/infra/public/apps/common_providers.tsx" }, - { - "plugin": "painlessLab", - "path": "x-pack/plugins/painless_lab/public/shared_imports.ts" - }, - { - "plugin": "painlessLab", - "path": "x-pack/plugins/painless_lab/public/application/index.tsx" - }, - { - "plugin": "painlessLab", - "path": "x-pack/plugins/painless_lab/public/application/index.tsx" - }, - { - "plugin": "painlessLab", - "path": "x-pack/plugins/painless_lab/public/application/index.tsx" - }, - { - "plugin": "searchprofiler", - "path": "x-pack/plugins/searchprofiler/public/shared_imports.ts" - }, - { - "plugin": "searchprofiler", - "path": "x-pack/plugins/searchprofiler/public/application/index.tsx" - }, - { - "plugin": "searchprofiler", - "path": "x-pack/plugins/searchprofiler/public/application/index.tsx" - }, - { - "plugin": "searchprofiler", - "path": "x-pack/plugins/searchprofiler/public/application/index.tsx" - }, { "plugin": "metricsDataAccess", "path": "x-pack/plugins/observability_solution/metrics_data_access/public/apps/common_providers.tsx" @@ -1083,38 +1023,6 @@ { "plugin": "observabilityShared", "path": "x-pack/plugins/observability_solution/observability_shared/public/components/header_menu/header_menu_portal.tsx" - }, - { - "plugin": "console", - "path": "src/plugins/console/public/shared_imports.ts" - }, - { - "plugin": "console", - "path": "src/plugins/console/public/application/hooks/use_send_current_request/use_send_current_request.ts" - }, - { - "plugin": "console", - "path": "src/plugins/console/public/application/hooks/use_send_current_request/use_send_current_request.ts" - }, - { - "plugin": "runtimeFields", - "path": "x-pack/plugins/runtime_fields/public/shared_imports.ts" - }, - { - "plugin": "runtimeFields", - "path": "x-pack/plugins/runtime_fields/public/load_editor.tsx" - }, - { - "plugin": "runtimeFields", - "path": "x-pack/plugins/runtime_fields/public/load_editor.tsx" - }, - { - "plugin": "indexManagement", - "path": "x-pack/plugins/index_management/public/application/components/component_templates/component_template_wizard/component_template_datastreams_rollover/use_datastreams_rollover.tsx" - }, - { - "plugin": "indexManagement", - "path": "x-pack/plugins/index_management/public/application/components/component_templates/component_template_wizard/component_template_datastreams_rollover/use_datastreams_rollover.tsx" } ], "children": [ diff --git a/api_docs/kibana_react.mdx b/api_docs/kibana_react.mdx index fd5ae16e93647..4a5e447ebc22f 100644 --- a/api_docs/kibana_react.mdx +++ b/api_docs/kibana_react.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kibanaReact title: "kibanaReact" image: https://source.unsplash.com/400x175/?github description: API docs for the kibanaReact plugin -date: 2024-05-07 +date: 2024-05-08 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 d833ed1b4753d..c5987e0625d6b 100644 --- a/api_docs/kibana_utils.mdx +++ b/api_docs/kibana_utils.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kibanaUtils title: "kibanaUtils" image: https://source.unsplash.com/400x175/?github description: API docs for the kibanaUtils plugin -date: 2024-05-07 +date: 2024-05-08 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 1507d84cf0776..14b69c5f3111c 100644 --- a/api_docs/kubernetes_security.mdx +++ b/api_docs/kubernetes_security.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kubernetesSecurity title: "kubernetesSecurity" image: https://source.unsplash.com/400x175/?github description: API docs for the kubernetesSecurity plugin -date: 2024-05-07 +date: 2024-05-08 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 046cee9bacbbc..03bb3fcadeb27 100644 --- a/api_docs/lens.mdx +++ b/api_docs/lens.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/lens title: "lens" image: https://source.unsplash.com/400x175/?github description: API docs for the lens plugin -date: 2024-05-07 +date: 2024-05-08 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 d8477b45a31ae..abe562b59fa86 100644 --- a/api_docs/license_api_guard.mdx +++ b/api_docs/license_api_guard.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/licenseApiGuard title: "licenseApiGuard" image: https://source.unsplash.com/400x175/?github description: API docs for the licenseApiGuard plugin -date: 2024-05-07 +date: 2024-05-08 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 992e108882ccd..9d08bf7c6f91b 100644 --- a/api_docs/license_management.mdx +++ b/api_docs/license_management.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/licenseManagement title: "licenseManagement" image: https://source.unsplash.com/400x175/?github description: API docs for the licenseManagement plugin -date: 2024-05-07 +date: 2024-05-08 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 c754936160d91..d9009a3981dee 100644 --- a/api_docs/licensing.mdx +++ b/api_docs/licensing.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/licensing title: "licensing" image: https://source.unsplash.com/400x175/?github description: API docs for the licensing plugin -date: 2024-05-07 +date: 2024-05-08 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'licensing'] --- import licensingObj from './licensing.devdocs.json'; diff --git a/api_docs/links.mdx b/api_docs/links.mdx index 397b3dd856db7..d98527bad0d80 100644 --- a/api_docs/links.mdx +++ b/api_docs/links.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/links title: "links" image: https://source.unsplash.com/400x175/?github description: API docs for the links plugin -date: 2024-05-07 +date: 2024-05-08 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'links'] --- import linksObj from './links.devdocs.json'; diff --git a/api_docs/lists.mdx b/api_docs/lists.mdx index d232568385698..601b7ab5b477b 100644 --- a/api_docs/lists.mdx +++ b/api_docs/lists.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/lists title: "lists" image: https://source.unsplash.com/400x175/?github description: API docs for the lists plugin -date: 2024-05-07 +date: 2024-05-08 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'lists'] --- import listsObj from './lists.devdocs.json'; diff --git a/api_docs/logs_explorer.mdx b/api_docs/logs_explorer.mdx index 2eaacecfeb321..9de811c374e1c 100644 --- a/api_docs/logs_explorer.mdx +++ b/api_docs/logs_explorer.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/logsExplorer title: "logsExplorer" image: https://source.unsplash.com/400x175/?github description: API docs for the logsExplorer plugin -date: 2024-05-07 +date: 2024-05-08 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'logsExplorer'] --- import logsExplorerObj from './logs_explorer.devdocs.json'; diff --git a/api_docs/logs_shared.mdx b/api_docs/logs_shared.mdx index bdf0476decc5c..d8f6568f15fa1 100644 --- a/api_docs/logs_shared.mdx +++ b/api_docs/logs_shared.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/logsShared title: "logsShared" image: https://source.unsplash.com/400x175/?github description: API docs for the logsShared plugin -date: 2024-05-07 +date: 2024-05-08 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'logsShared'] --- import logsSharedObj from './logs_shared.devdocs.json'; diff --git a/api_docs/management.mdx b/api_docs/management.mdx index da966e66eb854..19c68ac040353 100644 --- a/api_docs/management.mdx +++ b/api_docs/management.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/management title: "management" image: https://source.unsplash.com/400x175/?github description: API docs for the management plugin -date: 2024-05-07 +date: 2024-05-08 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'management'] --- import managementObj from './management.devdocs.json'; diff --git a/api_docs/maps.devdocs.json b/api_docs/maps.devdocs.json index dc828b0c0a133..f10d07d9b6d91 100644 --- a/api_docs/maps.devdocs.json +++ b/api_docs/maps.devdocs.json @@ -1930,6 +1930,83 @@ ], "initialIsOpen": false }, + { + "parentPluginId": "maps", + "id": "def-public.CreateLayerDescriptorParams", + "type": "Interface", + "tags": [], + "label": "CreateLayerDescriptorParams", + "description": [], + "path": "x-pack/plugins/maps/public/classes/sources/es_search_source/create_layer_descriptor.ts", + "deprecated": false, + "trackAdoption": false, + "children": [ + { + "parentPluginId": "maps", + "id": "def-public.CreateLayerDescriptorParams.indexPatternId", + "type": "string", + "tags": [], + "label": "indexPatternId", + "description": [], + "path": "x-pack/plugins/maps/public/classes/sources/es_search_source/create_layer_descriptor.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "maps", + "id": "def-public.CreateLayerDescriptorParams.geoFieldName", + "type": "string", + "tags": [], + "label": "geoFieldName", + "description": [], + "path": "x-pack/plugins/maps/public/classes/sources/es_search_source/create_layer_descriptor.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "maps", + "id": "def-public.CreateLayerDescriptorParams.geoFieldType", + "type": "Enum", + "tags": [], + "label": "geoFieldType", + "description": [], + "signature": [ + { + "pluginId": "maps", + "scope": "common", + "docId": "kibMapsPluginApi", + "section": "def-common.ES_GEO_FIELD_TYPE", + "text": "ES_GEO_FIELD_TYPE" + } + ], + "path": "x-pack/plugins/maps/public/classes/sources/es_search_source/create_layer_descriptor.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "maps", + "id": "def-public.CreateLayerDescriptorParams.query", + "type": "Object", + "tags": [], + "label": "query", + "description": [], + "signature": [ + { + "pluginId": "@kbn/es-query", + "scope": "common", + "docId": "kibKbnEsQueryPluginApi", + "section": "def-common.Query", + "text": "Query" + }, + " | undefined" + ], + "path": "x-pack/plugins/maps/public/classes/sources/es_search_source/create_layer_descriptor.ts", + "deprecated": false, + "trackAdoption": false + } + ], + "initialIsOpen": false + }, { "parentPluginId": "maps", "id": "def-public.EMSTermJoinConfig", @@ -4583,7 +4660,13 @@ "text": "LayerDescriptor" }, " | null>; createESSearchSourceLayerDescriptor: (params: ", - "CreateLayerDescriptorParams", + { + "pluginId": "maps", + "scope": "public", + "docId": "kibMapsPluginApi", + "section": "def-public.CreateLayerDescriptorParams", + "text": "CreateLayerDescriptorParams" + }, ") => Promise<", { "pluginId": "maps", diff --git a/api_docs/maps.mdx b/api_docs/maps.mdx index d43c59cf94f9a..0f0a70ea41240 100644 --- a/api_docs/maps.mdx +++ b/api_docs/maps.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/maps title: "maps" image: https://source.unsplash.com/400x175/?github description: API docs for the maps plugin -date: 2024-05-07 +date: 2024-05-08 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'maps'] --- import mapsObj from './maps.devdocs.json'; @@ -21,7 +21,7 @@ Contact [@elastic/kibana-gis](https://github.com/orgs/elastic/teams/kibana-gis) | Public API count | Any count | Items lacking comments | Missing exports | |-------------------|-----------|------------------------|-----------------| -| 281 | 0 | 276 | 32 | +| 286 | 0 | 281 | 31 | ## Client diff --git a/api_docs/maps_ems.mdx b/api_docs/maps_ems.mdx index 24dca7a498348..6eb44fae8bfaa 100644 --- a/api_docs/maps_ems.mdx +++ b/api_docs/maps_ems.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/mapsEms title: "mapsEms" image: https://source.unsplash.com/400x175/?github description: API docs for the mapsEms plugin -date: 2024-05-07 +date: 2024-05-08 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'mapsEms'] --- import mapsEmsObj from './maps_ems.devdocs.json'; diff --git a/api_docs/metrics_data_access.mdx b/api_docs/metrics_data_access.mdx index 82666d05729e4..de788f8c267bd 100644 --- a/api_docs/metrics_data_access.mdx +++ b/api_docs/metrics_data_access.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/metricsDataAccess title: "metricsDataAccess" image: https://source.unsplash.com/400x175/?github description: API docs for the metricsDataAccess plugin -date: 2024-05-07 +date: 2024-05-08 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'metricsDataAccess'] --- import metricsDataAccessObj from './metrics_data_access.devdocs.json'; diff --git a/api_docs/ml.mdx b/api_docs/ml.mdx index edaa5ccffd7c5..a473604fc3edb 100644 --- a/api_docs/ml.mdx +++ b/api_docs/ml.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/ml title: "ml" image: https://source.unsplash.com/400x175/?github description: API docs for the ml plugin -date: 2024-05-07 +date: 2024-05-08 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'ml'] --- import mlObj from './ml.devdocs.json'; diff --git a/api_docs/mock_idp_plugin.mdx b/api_docs/mock_idp_plugin.mdx index b2b2c0b9be4d3..0f94e9167b81e 100644 --- a/api_docs/mock_idp_plugin.mdx +++ b/api_docs/mock_idp_plugin.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/mockIdpPlugin title: "mockIdpPlugin" image: https://source.unsplash.com/400x175/?github description: API docs for the mockIdpPlugin plugin -date: 2024-05-07 +date: 2024-05-08 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'mockIdpPlugin'] --- import mockIdpPluginObj from './mock_idp_plugin.devdocs.json'; diff --git a/api_docs/monitoring.mdx b/api_docs/monitoring.mdx index 41a2027b427b4..e201d8af7cc80 100644 --- a/api_docs/monitoring.mdx +++ b/api_docs/monitoring.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/monitoring title: "monitoring" image: https://source.unsplash.com/400x175/?github description: API docs for the monitoring plugin -date: 2024-05-07 +date: 2024-05-08 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 76267b13568a9..27363d5cc4dfa 100644 --- a/api_docs/monitoring_collection.mdx +++ b/api_docs/monitoring_collection.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/monitoringCollection title: "monitoringCollection" image: https://source.unsplash.com/400x175/?github description: API docs for the monitoringCollection plugin -date: 2024-05-07 +date: 2024-05-08 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 6d31d405e2676..94563328842e4 100644 --- a/api_docs/navigation.mdx +++ b/api_docs/navigation.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/navigation title: "navigation" image: https://source.unsplash.com/400x175/?github description: API docs for the navigation plugin -date: 2024-05-07 +date: 2024-05-08 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 d062507b38d09..7fbe7f674c983 100644 --- a/api_docs/newsfeed.mdx +++ b/api_docs/newsfeed.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/newsfeed title: "newsfeed" image: https://source.unsplash.com/400x175/?github description: API docs for the newsfeed plugin -date: 2024-05-07 +date: 2024-05-08 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'newsfeed'] --- import newsfeedObj from './newsfeed.devdocs.json'; diff --git a/api_docs/no_data_page.mdx b/api_docs/no_data_page.mdx index c07fd5b69a264..918662ca938ae 100644 --- a/api_docs/no_data_page.mdx +++ b/api_docs/no_data_page.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/noDataPage title: "noDataPage" image: https://source.unsplash.com/400x175/?github description: API docs for the noDataPage plugin -date: 2024-05-07 +date: 2024-05-08 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'noDataPage'] --- import noDataPageObj from './no_data_page.devdocs.json'; diff --git a/api_docs/notifications.mdx b/api_docs/notifications.mdx index 6d3c1602695d0..ab667349f7f0e 100644 --- a/api_docs/notifications.mdx +++ b/api_docs/notifications.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/notifications title: "notifications" image: https://source.unsplash.com/400x175/?github description: API docs for the notifications plugin -date: 2024-05-07 +date: 2024-05-08 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'notifications'] --- import notificationsObj from './notifications.devdocs.json'; diff --git a/api_docs/observability.mdx b/api_docs/observability.mdx index 66b1efa3f377c..3bcce3480ccbc 100644 --- a/api_docs/observability.mdx +++ b/api_docs/observability.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/observability title: "observability" image: https://source.unsplash.com/400x175/?github description: API docs for the observability plugin -date: 2024-05-07 +date: 2024-05-08 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'observability'] --- import observabilityObj from './observability.devdocs.json'; diff --git a/api_docs/observability_a_i_assistant.devdocs.json b/api_docs/observability_a_i_assistant.devdocs.json index c486b0a6cfbe9..f2e981c27e292 100644 --- a/api_docs/observability_a_i_assistant.devdocs.json +++ b/api_docs/observability_a_i_assistant.devdocs.json @@ -6484,12 +6484,12 @@ "label": "meta", "description": [], "signature": [ - "ErrorMetaAttributes[T] | undefined" + "ErrorMetaAttributes[T]" ], "path": "x-pack/plugins/observability_solution/observability_ai_assistant/common/conversation_complete.ts", "deprecated": false, "trackAdoption": false, - "isRequired": false + "isRequired": true } ], "returnComment": [] diff --git a/api_docs/observability_a_i_assistant.mdx b/api_docs/observability_a_i_assistant.mdx index 57ef4d4bbc0da..03f804cda0d7e 100644 --- a/api_docs/observability_a_i_assistant.mdx +++ b/api_docs/observability_a_i_assistant.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/observabilityAIAssistant title: "observabilityAIAssistant" image: https://source.unsplash.com/400x175/?github description: API docs for the observabilityAIAssistant plugin -date: 2024-05-07 +date: 2024-05-08 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'observabilityAIAssistant'] --- import observabilityAIAssistantObj from './observability_a_i_assistant.devdocs.json'; diff --git a/api_docs/observability_a_i_assistant_app.mdx b/api_docs/observability_a_i_assistant_app.mdx index a3dd697e64e2d..91392d4dcfd45 100644 --- a/api_docs/observability_a_i_assistant_app.mdx +++ b/api_docs/observability_a_i_assistant_app.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/observabilityAIAssistantApp title: "observabilityAIAssistantApp" image: https://source.unsplash.com/400x175/?github description: API docs for the observabilityAIAssistantApp plugin -date: 2024-05-07 +date: 2024-05-08 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'observabilityAIAssistantApp'] --- import observabilityAIAssistantAppObj from './observability_a_i_assistant_app.devdocs.json'; diff --git a/api_docs/observability_ai_assistant_management.mdx b/api_docs/observability_ai_assistant_management.mdx index e465044da0b54..b3e994e0b9f14 100644 --- a/api_docs/observability_ai_assistant_management.mdx +++ b/api_docs/observability_ai_assistant_management.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/observabilityAiAssistantManagement title: "observabilityAiAssistantManagement" image: https://source.unsplash.com/400x175/?github description: API docs for the observabilityAiAssistantManagement plugin -date: 2024-05-07 +date: 2024-05-08 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'observabilityAiAssistantManagement'] --- import observabilityAiAssistantManagementObj from './observability_ai_assistant_management.devdocs.json'; diff --git a/api_docs/observability_logs_explorer.mdx b/api_docs/observability_logs_explorer.mdx index b46e53712ade4..56d47dea88a85 100644 --- a/api_docs/observability_logs_explorer.mdx +++ b/api_docs/observability_logs_explorer.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/observabilityLogsExplorer title: "observabilityLogsExplorer" image: https://source.unsplash.com/400x175/?github description: API docs for the observabilityLogsExplorer plugin -date: 2024-05-07 +date: 2024-05-08 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'observabilityLogsExplorer'] --- import observabilityLogsExplorerObj from './observability_logs_explorer.devdocs.json'; diff --git a/api_docs/observability_onboarding.mdx b/api_docs/observability_onboarding.mdx index 14ee93cf35cb3..aef1a9f3af95e 100644 --- a/api_docs/observability_onboarding.mdx +++ b/api_docs/observability_onboarding.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/observabilityOnboarding title: "observabilityOnboarding" image: https://source.unsplash.com/400x175/?github description: API docs for the observabilityOnboarding plugin -date: 2024-05-07 +date: 2024-05-08 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'observabilityOnboarding'] --- import observabilityOnboardingObj from './observability_onboarding.devdocs.json'; diff --git a/api_docs/observability_shared.mdx b/api_docs/observability_shared.mdx index 6abe52b5fdfe6..bc299e6f40165 100644 --- a/api_docs/observability_shared.mdx +++ b/api_docs/observability_shared.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/observabilityShared title: "observabilityShared" image: https://source.unsplash.com/400x175/?github description: API docs for the observabilityShared plugin -date: 2024-05-07 +date: 2024-05-08 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'observabilityShared'] --- import observabilitySharedObj from './observability_shared.devdocs.json'; diff --git a/api_docs/osquery.devdocs.json b/api_docs/osquery.devdocs.json index 25200d49eec76..2d09d029c0772 100644 --- a/api_docs/osquery.devdocs.json +++ b/api_docs/osquery.devdocs.json @@ -301,7 +301,7 @@ "label": "createActionService", "description": [], "signature": [ - "{ create: (params: { agent_ids?: string[] | undefined; agent_all?: boolean | undefined; agent_platforms?: string[] | undefined; agent_policy_ids?: string[] | undefined; query?: string | undefined; queries?: { id: string; query: string; ecs_mapping: { [x: string]: { field?: string | undefined; value?: string | string[] | undefined; }; } | undefined; version: string | undefined; platform: string | undefined; removed: boolean | undefined; snapshot: boolean | undefined; }[] | undefined; saved_query_id?: string | undefined; timeout?: number | undefined; ecs_mapping?: { [x: string]: { field?: string | undefined; value?: string | string[] | undefined; }; } | undefined; pack_id?: string | undefined; alert_ids?: string[] | undefined; case_ids?: string[] | undefined; event_ids?: string[] | undefined; metadata?: object | undefined; }, alertData?: OutputOf> | undefined) => Promise<{ response: { action_id: string; '@timestamp': string; expiration: string; type: string; input_type: string; alert_ids: string[] | undefined; event_ids: string[] | undefined; case_ids: string[] | undefined; agent_ids: string[] | undefined; agent_all: boolean | undefined; agent_platforms: string[] | undefined; agent_policy_ids: string[] | undefined; agents: string[]; user_id: string | undefined; metadata: object | undefined; pack_id: string | undefined; pack_name: string | undefined; pack_prebuilt: boolean | undefined; queries: ", + "[]; }; readonly \"kibana.alert.rule.execution.timestamp\": { readonly type: \"date\"; readonly array: false; readonly required: false; }; readonly \"kibana.alert.rule.parameters\": { readonly array: false; readonly type: \"flattened\"; readonly ignore_above: 4096; readonly required: false; }; readonly \"kibana.alert.rule.tags\": { readonly type: \"keyword\"; readonly array: true; readonly required: false; }; readonly \"kibana.alert.start\": { readonly type: \"date\"; readonly array: false; readonly required: false; }; readonly \"kibana.alert.time_range\": { readonly type: \"date_range\"; readonly format: \"epoch_millis||strict_date_optional_time\"; readonly array: false; readonly required: false; }; readonly \"kibana.alert.url\": { readonly type: \"keyword\"; readonly array: false; readonly index: false; readonly required: false; readonly ignore_above: 2048; }; readonly \"kibana.alert.workflow_assignee_ids\": { readonly type: \"keyword\"; readonly array: true; readonly required: false; }; readonly \"kibana.alert.workflow_status\": { readonly type: \"keyword\"; readonly array: false; readonly required: false; }; readonly \"kibana.alert.workflow_tags\": { readonly type: \"keyword\"; readonly array: true; readonly required: false; }; readonly \"kibana.version\": { readonly type: \"version\"; readonly array: false; readonly required: false; }; }>> & { _index: string; }) | undefined) => Promise<{ response: { action_id: string; '@timestamp': string; expiration: string; type: string; input_type: string; alert_ids: string[] | undefined; event_ids: string[] | undefined; case_ids: string[] | undefined; agent_ids: string[] | undefined; agent_all: boolean | undefined; agent_platforms: string[] | undefined; agent_policy_ids: string[] | undefined; agents: string[]; user_id: string | undefined; metadata: object | undefined; pack_id: string | undefined; pack_name: string | undefined; pack_prebuilt: boolean | undefined; queries: ", "Dictionary", "[]; }; fleetActionsCount: number; }>; stop: () => void; }" ], diff --git a/api_docs/osquery.mdx b/api_docs/osquery.mdx index ecaa6803dfdb2..d415eb4a742aa 100644 --- a/api_docs/osquery.mdx +++ b/api_docs/osquery.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/osquery title: "osquery" image: https://source.unsplash.com/400x175/?github description: API docs for the osquery plugin -date: 2024-05-07 +date: 2024-05-08 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'osquery'] --- import osqueryObj from './osquery.devdocs.json'; diff --git a/api_docs/painless_lab.mdx b/api_docs/painless_lab.mdx index acd87b4ee5482..1d47d09d063c4 100644 --- a/api_docs/painless_lab.mdx +++ b/api_docs/painless_lab.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/painlessLab title: "painlessLab" image: https://source.unsplash.com/400x175/?github description: API docs for the painlessLab plugin -date: 2024-05-07 +date: 2024-05-08 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'painlessLab'] --- import painlessLabObj from './painless_lab.devdocs.json'; diff --git a/api_docs/plugin_directory.mdx b/api_docs/plugin_directory.mdx index 4fe422ca9cfcf..b678d2d9056a8 100644 --- a/api_docs/plugin_directory.mdx +++ b/api_docs/plugin_directory.mdx @@ -7,7 +7,7 @@ id: kibDevDocsPluginDirectory slug: /kibana-dev-docs/api-meta/plugin-api-directory title: Directory description: Directory of public APIs available through plugins or packages. -date: 2024-05-07 +date: 2024-05-08 tags: ['contributor', 'dev', 'apidocs', 'kibana'] --- @@ -21,7 +21,7 @@ tags: ['contributor', 'dev', 'apidocs', 'kibana'] | API Count | Any Count | Missing comments | Missing exports | |--------------|----------|-----------------|--------| -| 48111 | 241 | 36699 | 1850 | +| 48130 | 241 | 36716 | 1851 | ## Plugin Directory @@ -32,7 +32,7 @@ tags: ['contributor', 'dev', 'apidocs', 'kibana'] | | [@elastic/obs-knowledge-team](https://github.com/orgs/elastic/teams/obs-knowledge-team) | - | 4 | 0 | 4 | 1 | | | [@elastic/ml-ui](https://github.com/orgs/elastic/teams/ml-ui) | AIOps plugin maintained by ML team. | 67 | 0 | 4 | 1 | | | [@elastic/response-ops](https://github.com/orgs/elastic/teams/response-ops) | - | 862 | 1 | 830 | 54 | -| | [@elastic/obs-ux-infra_services-team](https://github.com/orgs/elastic/teams/obs-ux-infra_services-team) | The user interface for Elastic APM | 29 | 0 | 29 | 122 | +| | [@elastic/obs-ux-infra_services-team](https://github.com/orgs/elastic/teams/obs-ux-infra_services-team) | The user interface for Elastic APM | 29 | 0 | 29 | 123 | | | [@elastic/obs-knowledge-team](https://github.com/orgs/elastic/teams/obs-knowledge-team) | - | 9 | 0 | 9 | 0 | | | [@elastic/obs-knowledge-team](https://github.com/orgs/elastic/teams/obs-knowledge-team) | Asset manager plugin for entity assets (inventory, topology, etc) | 9 | 0 | 9 | 2 | | | [@elastic/obs-knowledge-team](https://github.com/orgs/elastic/teams/obs-knowledge-team) | - | 2 | 0 | 2 | 0 | @@ -130,7 +130,7 @@ tags: ['contributor', 'dev', 'apidocs', 'kibana'] | | [@elastic/obs-ux-logs-team](https://github.com/orgs/elastic/teams/obs-ux-logs-team) | Exposes the shared components and APIs to access and visualize logs. | 303 | 0 | 277 | 32 | | logstash | [@elastic/logstash](https://github.com/orgs/elastic/teams/logstash) | - | 0 | 0 | 0 | 0 | | | [@elastic/kibana-management](https://github.com/orgs/elastic/teams/kibana-management) | - | 44 | 0 | 44 | 7 | -| | [@elastic/kibana-gis](https://github.com/orgs/elastic/teams/kibana-gis) | - | 281 | 0 | 276 | 32 | +| | [@elastic/kibana-gis](https://github.com/orgs/elastic/teams/kibana-gis) | - | 286 | 0 | 281 | 31 | | | [@elastic/kibana-gis](https://github.com/orgs/elastic/teams/kibana-gis) | - | 60 | 0 | 60 | 0 | | | [@elastic/obs-knowledge-team](https://github.com/orgs/elastic/teams/obs-knowledge-team) | Exposes utilities for accessing metrics data | 104 | 8 | 104 | 6 | | | [@elastic/ml-ui](https://github.com/orgs/elastic/teams/ml-ui) | This plugin provides access to the machine learning features provided by Elastic. | 153 | 3 | 66 | 100 | @@ -247,7 +247,7 @@ tags: ['contributor', 'dev', 'apidocs', 'kibana'] | | [@elastic/kibana-core](https://github.com/orgs/elastic/teams/kibana-core) | - | 22 | 0 | 1 | 0 | | | [@elastic/kibana-core](https://github.com/orgs/elastic/teams/kibana-core) | - | 18 | 0 | 18 | 0 | | | [@elastic/obs-ux-infra_services-team](https://github.com/orgs/elastic/teams/obs-ux-infra_services-team) | - | 4 | 0 | 4 | 0 | -| | [@elastic/obs-ux-infra_services-team](https://github.com/orgs/elastic/teams/obs-ux-infra_services-team) | - | 44 | 0 | 44 | 7 | +| | [@elastic/obs-ux-infra_services-team](https://github.com/orgs/elastic/teams/obs-ux-infra_services-team) | - | 49 | 0 | 49 | 8 | | | [@elastic/obs-ux-infra_services-team](https://github.com/orgs/elastic/teams/obs-ux-infra_services-team) | - | 191 | 0 | 191 | 28 | | | [@elastic/obs-ux-infra_services-team](https://github.com/orgs/elastic/teams/obs-ux-infra_services-team) | - | 11 | 0 | 11 | 0 | | | [@elastic/kibana-qa](https://github.com/orgs/elastic/teams/kibana-qa) | - | 12 | 0 | 12 | 0 | @@ -361,7 +361,7 @@ tags: ['contributor', 'dev', 'apidocs', 'kibana'] | | [@elastic/kibana-core](https://github.com/orgs/elastic/teams/kibana-core) | - | 9 | 0 | 9 | 0 | | | [@elastic/kibana-core](https://github.com/orgs/elastic/teams/kibana-core) | - | 4 | 0 | 4 | 0 | | | [@elastic/kibana-core](https://github.com/orgs/elastic/teams/kibana-core) | - | 38 | 0 | 31 | 0 | -| | [@elastic/kibana-core](https://github.com/orgs/elastic/teams/kibana-core) | - | 56 | 0 | 30 | 0 | +| | [@elastic/kibana-core](https://github.com/orgs/elastic/teams/kibana-core) | - | 61 | 0 | 34 | 0 | | | [@elastic/kibana-core](https://github.com/orgs/elastic/teams/kibana-core) | - | 9 | 0 | 5 | 2 | | | [@elastic/kibana-core](https://github.com/orgs/elastic/teams/kibana-core) | - | 13 | 0 | 13 | 0 | | | [@elastic/kibana-core](https://github.com/orgs/elastic/teams/kibana-core) | - | 29 | 0 | 25 | 0 | @@ -496,7 +496,7 @@ tags: ['contributor', 'dev', 'apidocs', 'kibana'] | | [@elastic/kibana-visualizations](https://github.com/orgs/elastic/teams/kibana-visualizations) | - | 52 | 0 | 52 | 1 | | | [@elastic/security-threat-hunting-investigations](https://github.com/orgs/elastic/teams/security-threat-hunting-investigations) | - | 38 | 0 | 14 | 1 | | | [@elastic/kibana-data-discovery](https://github.com/orgs/elastic/teams/kibana-data-discovery) | - | 22 | 0 | 18 | 0 | -| | [@elastic/kibana-data-discovery](https://github.com/orgs/elastic/teams/kibana-data-discovery) | - | 50 | 0 | 42 | 1 | +| | [@elastic/kibana-data-discovery](https://github.com/orgs/elastic/teams/kibana-data-discovery) | - | 54 | 0 | 45 | 1 | | | [@elastic/kibana-operations](https://github.com/orgs/elastic/teams/kibana-operations) | - | 2 | 0 | 0 | 0 | | | [@elastic/obs-ux-logs-team](https://github.com/orgs/elastic/teams/obs-ux-logs-team) | - | 3 | 0 | 3 | 0 | | | [@elastic/kibana-operations](https://github.com/orgs/elastic/teams/kibana-operations) | - | 36 | 0 | 21 | 1 | diff --git a/api_docs/presentation_panel.mdx b/api_docs/presentation_panel.mdx index 063b9cf5e2b71..9e9503f3774e4 100644 --- a/api_docs/presentation_panel.mdx +++ b/api_docs/presentation_panel.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/presentationPanel title: "presentationPanel" image: https://source.unsplash.com/400x175/?github description: API docs for the presentationPanel plugin -date: 2024-05-07 +date: 2024-05-08 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'presentationPanel'] --- import presentationPanelObj from './presentation_panel.devdocs.json'; diff --git a/api_docs/presentation_util.mdx b/api_docs/presentation_util.mdx index a6a52059416e8..bc38f1e53691a 100644 --- a/api_docs/presentation_util.mdx +++ b/api_docs/presentation_util.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/presentationUtil title: "presentationUtil" image: https://source.unsplash.com/400x175/?github description: API docs for the presentationUtil plugin -date: 2024-05-07 +date: 2024-05-08 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 3f82a29534996..a75f20e8c0c32 100644 --- a/api_docs/profiling.mdx +++ b/api_docs/profiling.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/profiling title: "profiling" image: https://source.unsplash.com/400x175/?github description: API docs for the profiling plugin -date: 2024-05-07 +date: 2024-05-08 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'profiling'] --- import profilingObj from './profiling.devdocs.json'; diff --git a/api_docs/profiling_data_access.mdx b/api_docs/profiling_data_access.mdx index df964c2871156..5adbf4bec3a77 100644 --- a/api_docs/profiling_data_access.mdx +++ b/api_docs/profiling_data_access.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/profilingDataAccess title: "profilingDataAccess" image: https://source.unsplash.com/400x175/?github description: API docs for the profilingDataAccess plugin -date: 2024-05-07 +date: 2024-05-08 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'profilingDataAccess'] --- import profilingDataAccessObj from './profiling_data_access.devdocs.json'; diff --git a/api_docs/remote_clusters.mdx b/api_docs/remote_clusters.mdx index f5df410601e03..2d6e3543b877f 100644 --- a/api_docs/remote_clusters.mdx +++ b/api_docs/remote_clusters.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/remoteClusters title: "remoteClusters" image: https://source.unsplash.com/400x175/?github description: API docs for the remoteClusters plugin -date: 2024-05-07 +date: 2024-05-08 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 ab221e6bfec7f..522da7446a24a 100644 --- a/api_docs/reporting.mdx +++ b/api_docs/reporting.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/reporting title: "reporting" image: https://source.unsplash.com/400x175/?github description: API docs for the reporting plugin -date: 2024-05-07 +date: 2024-05-08 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 27289bf32ec69..85b1516b57059 100644 --- a/api_docs/rollup.mdx +++ b/api_docs/rollup.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/rollup title: "rollup" image: https://source.unsplash.com/400x175/?github description: API docs for the rollup plugin -date: 2024-05-07 +date: 2024-05-08 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'rollup'] --- import rollupObj from './rollup.devdocs.json'; diff --git a/api_docs/rule_registry.devdocs.json b/api_docs/rule_registry.devdocs.json index d5f57b730b6a1..642c93433b951 100644 --- a/api_docs/rule_registry.devdocs.json +++ b/api_docs/rule_registry.devdocs.json @@ -107,15 +107,7 @@ "label": "get", "description": [], "signature": [ - "({ id, index }: GetAlertParams) => Promise> | undefined>" + "({ id, index }: GetAlertParams) => Promise<{ _index: string; \"@timestamp\"?: string | undefined; \"kibana.alert.rule.rule_type_id\"?: string | undefined; \"kibana.alert.rule.consumer\"?: string | undefined; \"kibana.alert.instance.id\"?: string | undefined; \"kibana.alert.rule.category\"?: string | undefined; \"kibana.alert.rule.name\"?: string | undefined; \"kibana.alert.rule.producer\"?: string | undefined; \"kibana.alert.rule.revision\"?: number | undefined; \"kibana.alert.rule.uuid\"?: string | undefined; \"kibana.alert.status\"?: string | undefined; \"kibana.alert.uuid\"?: string | undefined; \"kibana.space_ids\"?: string[] | undefined; \"event.action\"?: string | undefined; tags?: string[] | undefined; \"kibana.alert.rule.execution.uuid\"?: string | undefined; \"event.kind\"?: string | undefined; \"kibana.alert.action_group\"?: string | undefined; \"kibana.alert.case_ids\"?: string[] | undefined; \"kibana.alert.consecutive_matches\"?: number | undefined; \"kibana.alert.duration.us\"?: number | undefined; \"kibana.alert.end\"?: string | undefined; \"kibana.alert.flapping\"?: boolean | undefined; \"kibana.alert.flapping_history\"?: boolean[] | undefined; \"kibana.alert.last_detected\"?: string | undefined; \"kibana.alert.maintenance_window_ids\"?: string[] | undefined; \"kibana.alert.reason\"?: string | undefined; \"kibana.alert.rule.execution.timestamp\"?: string | undefined; \"kibana.alert.rule.parameters\"?: { [key: string]: unknown; } | undefined; \"kibana.alert.rule.tags\"?: string[] | undefined; \"kibana.alert.start\"?: string | undefined; \"kibana.alert.time_range\"?: unknown; \"kibana.alert.url\"?: string | undefined; \"kibana.alert.workflow_assignee_ids\"?: string[] | undefined; \"kibana.alert.workflow_status\"?: string | undefined; \"kibana.alert.workflow_tags\"?: string[] | undefined; \"kibana.version\"?: string | undefined; \"ecs.version\"?: string | undefined; \"kibana.alert.risk_score\"?: number | undefined; \"kibana.alert.rule.author\"?: string | undefined; \"kibana.alert.rule.created_at\"?: string | undefined; \"kibana.alert.rule.created_by\"?: string | undefined; \"kibana.alert.rule.description\"?: string | undefined; \"kibana.alert.rule.enabled\"?: string | undefined; \"kibana.alert.rule.from\"?: string | undefined; \"kibana.alert.rule.interval\"?: string | undefined; \"kibana.alert.rule.license\"?: string | undefined; \"kibana.alert.rule.note\"?: string | undefined; \"kibana.alert.rule.references\"?: string[] | undefined; \"kibana.alert.rule.rule_id\"?: string | undefined; \"kibana.alert.rule.rule_name_override\"?: string | undefined; \"kibana.alert.rule.to\"?: string | undefined; \"kibana.alert.rule.type\"?: string | undefined; \"kibana.alert.rule.updated_at\"?: string | undefined; \"kibana.alert.rule.updated_by\"?: string | undefined; \"kibana.alert.rule.version\"?: string | undefined; \"kibana.alert.severity\"?: string | undefined; \"kibana.alert.suppression.docs_count\"?: number | undefined; \"kibana.alert.suppression.end\"?: string | undefined; \"kibana.alert.suppression.start\"?: string | undefined; \"kibana.alert.suppression.terms.field\"?: string[] | undefined; \"kibana.alert.suppression.terms.value\"?: string[] | undefined; \"kibana.alert.system_status\"?: string | undefined; \"kibana.alert.workflow_reason\"?: string | undefined; \"kibana.alert.workflow_status_updated_at\"?: string | undefined; \"kibana.alert.workflow_user\"?: string | undefined; }>" ], "path": "x-pack/plugins/rule_registry/server/alert_data_client/alerts_client.ts", "deprecated": false, diff --git a/api_docs/rule_registry.mdx b/api_docs/rule_registry.mdx index 56bf12a9d113e..3b1b0e7752876 100644 --- a/api_docs/rule_registry.mdx +++ b/api_docs/rule_registry.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/ruleRegistry title: "ruleRegistry" image: https://source.unsplash.com/400x175/?github description: API docs for the ruleRegistry plugin -date: 2024-05-07 +date: 2024-05-08 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 cac00818b4148..e06eba1c01efc 100644 --- a/api_docs/runtime_fields.mdx +++ b/api_docs/runtime_fields.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/runtimeFields title: "runtimeFields" image: https://source.unsplash.com/400x175/?github description: API docs for the runtimeFields plugin -date: 2024-05-07 +date: 2024-05-08 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 984a23721fe15..87f00527ef708 100644 --- a/api_docs/saved_objects.mdx +++ b/api_docs/saved_objects.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/savedObjects title: "savedObjects" image: https://source.unsplash.com/400x175/?github description: API docs for the savedObjects plugin -date: 2024-05-07 +date: 2024-05-08 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 93a1044b25199..0895892fedb95 100644 --- a/api_docs/saved_objects_finder.mdx +++ b/api_docs/saved_objects_finder.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/savedObjectsFinder title: "savedObjectsFinder" image: https://source.unsplash.com/400x175/?github description: API docs for the savedObjectsFinder plugin -date: 2024-05-07 +date: 2024-05-08 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 deb861b0fc118..92e8567148323 100644 --- a/api_docs/saved_objects_management.mdx +++ b/api_docs/saved_objects_management.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/savedObjectsManagement title: "savedObjectsManagement" image: https://source.unsplash.com/400x175/?github description: API docs for the savedObjectsManagement plugin -date: 2024-05-07 +date: 2024-05-08 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 39e7778ff56bb..4fc36a967196f 100644 --- a/api_docs/saved_objects_tagging.mdx +++ b/api_docs/saved_objects_tagging.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/savedObjectsTagging title: "savedObjectsTagging" image: https://source.unsplash.com/400x175/?github description: API docs for the savedObjectsTagging plugin -date: 2024-05-07 +date: 2024-05-08 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 405e8e22d1da8..bede53d59531f 100644 --- a/api_docs/saved_objects_tagging_oss.mdx +++ b/api_docs/saved_objects_tagging_oss.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/savedObjectsTaggingOss title: "savedObjectsTaggingOss" image: https://source.unsplash.com/400x175/?github description: API docs for the savedObjectsTaggingOss plugin -date: 2024-05-07 +date: 2024-05-08 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 db2f0c595705f..3f9074fb2a169 100644 --- a/api_docs/saved_search.mdx +++ b/api_docs/saved_search.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/savedSearch title: "savedSearch" image: https://source.unsplash.com/400x175/?github description: API docs for the savedSearch plugin -date: 2024-05-07 +date: 2024-05-08 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 fa3d7f94c17a6..e97edb9dde8e5 100644 --- a/api_docs/screenshot_mode.mdx +++ b/api_docs/screenshot_mode.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/screenshotMode title: "screenshotMode" image: https://source.unsplash.com/400x175/?github description: API docs for the screenshotMode plugin -date: 2024-05-07 +date: 2024-05-08 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 24062313dc252..2b3918dba22e4 100644 --- a/api_docs/screenshotting.mdx +++ b/api_docs/screenshotting.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/screenshotting title: "screenshotting" image: https://source.unsplash.com/400x175/?github description: API docs for the screenshotting plugin -date: 2024-05-07 +date: 2024-05-08 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'screenshotting'] --- import screenshottingObj from './screenshotting.devdocs.json'; diff --git a/api_docs/search_connectors.mdx b/api_docs/search_connectors.mdx index cc39a5ab07dd5..8f2f96937f4a5 100644 --- a/api_docs/search_connectors.mdx +++ b/api_docs/search_connectors.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/searchConnectors title: "searchConnectors" image: https://source.unsplash.com/400x175/?github description: API docs for the searchConnectors plugin -date: 2024-05-07 +date: 2024-05-08 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'searchConnectors'] --- import searchConnectorsObj from './search_connectors.devdocs.json'; diff --git a/api_docs/search_notebooks.mdx b/api_docs/search_notebooks.mdx index da7c51f45377b..2977c1e7989d7 100644 --- a/api_docs/search_notebooks.mdx +++ b/api_docs/search_notebooks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/searchNotebooks title: "searchNotebooks" image: https://source.unsplash.com/400x175/?github description: API docs for the searchNotebooks plugin -date: 2024-05-07 +date: 2024-05-08 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'searchNotebooks'] --- import searchNotebooksObj from './search_notebooks.devdocs.json'; diff --git a/api_docs/search_playground.mdx b/api_docs/search_playground.mdx index 092eef3bfc1b2..367d882d94871 100644 --- a/api_docs/search_playground.mdx +++ b/api_docs/search_playground.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/searchPlayground title: "searchPlayground" image: https://source.unsplash.com/400x175/?github description: API docs for the searchPlayground plugin -date: 2024-05-07 +date: 2024-05-08 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'searchPlayground'] --- import searchPlaygroundObj from './search_playground.devdocs.json'; diff --git a/api_docs/security.mdx b/api_docs/security.mdx index ce89204dc52e2..60b2295bfb982 100644 --- a/api_docs/security.mdx +++ b/api_docs/security.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/security title: "security" image: https://source.unsplash.com/400x175/?github description: API docs for the security plugin -date: 2024-05-07 +date: 2024-05-08 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'security'] --- import securityObj from './security.devdocs.json'; diff --git a/api_docs/security_solution.devdocs.json b/api_docs/security_solution.devdocs.json index 2ce600a624ca8..1298c0bc66463 100644 --- a/api_docs/security_solution.devdocs.json +++ b/api_docs/security_solution.devdocs.json @@ -485,7 +485,7 @@ "\nExperimental flag needed to enable the link" ], "signature": [ - "\"assistantModelEvaluation\" | \"attackDiscoveryEnabled\" | \"tGridEnabled\" | \"tGridEventRenderedViewEnabled\" | \"excludePoliciesInFilterEnabled\" | \"kubernetesEnabled\" | \"donutChartEmbeddablesEnabled\" | \"previewTelemetryUrlEnabled\" | \"insightsRelatedAlertsByProcessAncestry\" | \"extendedRuleExecutionLoggingEnabled\" | \"socTrendsEnabled\" | \"responseActionsEnabled\" | \"endpointResponseActionsEnabled\" | \"responseActionUploadEnabled\" | \"automatedProcessActionsEnabled\" | \"responseActionsSentinelOneV1Enabled\" | \"responseActionsSentinelOneV2Enabled\" | \"responseActionsSentinelOneGetFileEnabled\" | \"agentStatusClientEnabled\" | \"responseActionsCrowdstrikeManualHostIsolationEnabled\" | \"alertsPageChartsEnabled\" | \"alertTypeEnabled\" | \"expandableFlyoutInCreateRuleEnabled\" | \"expandableEventFlyoutEnabled\" | \"expandableTimelineFlyoutEnabled\" | \"alertsPageFiltersEnabled\" | \"newUserDetailsFlyout\" | \"newUserDetailsFlyoutManagedUser\" | \"newHostDetailsFlyout\" | \"riskScoringPersistence\" | \"riskScoringRoutesEnabled\" | \"esqlRulesDisabled\" | \"protectionUpdatesEnabled\" | \"disableTimelineSaveTour\" | \"riskEnginePrivilegesRouteEnabled\" | \"sentinelOneDataInAnalyzerEnabled\" | \"sentinelOneManualHostActionsEnabled\" | \"crowdstrikeDataInAnalyzerEnabled\" | \"jsonPrebuiltRulesDiffingEnabled\" | \"timelineEsqlTabDisabled\" | \"unifiedComponentsInTimelineEnabled\" | \"analyzerDatePickersAndSourcererDisabled\" | \"perFieldPrebuiltRulesDiffingEnabled\" | \"malwareOnWriteScanOptionAvailable\" | \"aiAssistantFlyoutMode\" | \"valueListItemsModalEnabled\" | \"bulkCustomHighlightedFieldsEnabled\" | undefined" + "\"assistantModelEvaluation\" | \"attackDiscoveryEnabled\" | \"tGridEnabled\" | \"tGridEventRenderedViewEnabled\" | \"excludePoliciesInFilterEnabled\" | \"kubernetesEnabled\" | \"donutChartEmbeddablesEnabled\" | \"previewTelemetryUrlEnabled\" | \"insightsRelatedAlertsByProcessAncestry\" | \"extendedRuleExecutionLoggingEnabled\" | \"socTrendsEnabled\" | \"responseActionsEnabled\" | \"endpointResponseActionsEnabled\" | \"responseActionUploadEnabled\" | \"automatedProcessActionsEnabled\" | \"responseActionsSentinelOneV1Enabled\" | \"responseActionsSentinelOneV2Enabled\" | \"responseActionsSentinelOneGetFileEnabled\" | \"agentStatusClientEnabled\" | \"responseActionsCrowdstrikeManualHostIsolationEnabled\" | \"alertsPageChartsEnabled\" | \"alertTypeEnabled\" | \"expandableFlyoutInCreateRuleEnabled\" | \"expandableEventFlyoutEnabled\" | \"expandableTimelineFlyoutEnabled\" | \"alertsPageFiltersEnabled\" | \"newUserDetailsFlyout\" | \"newUserDetailsFlyoutManagedUser\" | \"newHostDetailsFlyout\" | \"riskScoringPersistence\" | \"riskScoringRoutesEnabled\" | \"esqlRulesDisabled\" | \"protectionUpdatesEnabled\" | \"disableTimelineSaveTour\" | \"riskEnginePrivilegesRouteEnabled\" | \"sentinelOneDataInAnalyzerEnabled\" | \"sentinelOneManualHostActionsEnabled\" | \"crowdstrikeDataInAnalyzerEnabled\" | \"jamfDataInAnalyzerEnabled\" | \"jsonPrebuiltRulesDiffingEnabled\" | \"timelineEsqlTabDisabled\" | \"unifiedComponentsInTimelineEnabled\" | \"analyzerDatePickersAndSourcererDisabled\" | \"perFieldPrebuiltRulesDiffingEnabled\" | \"malwareOnWriteScanOptionAvailable\" | \"aiAssistantFlyoutMode\" | \"valueListItemsModalEnabled\" | \"bulkCustomHighlightedFieldsEnabled\" | undefined" ], "path": "x-pack/plugins/security_solution/public/common/links/types.ts", "deprecated": false, @@ -565,7 +565,7 @@ "\nExperimental flag needed to disable the link. Opposite of experimentalKey" ], "signature": [ - "\"assistantModelEvaluation\" | \"attackDiscoveryEnabled\" | \"tGridEnabled\" | \"tGridEventRenderedViewEnabled\" | \"excludePoliciesInFilterEnabled\" | \"kubernetesEnabled\" | \"donutChartEmbeddablesEnabled\" | \"previewTelemetryUrlEnabled\" | \"insightsRelatedAlertsByProcessAncestry\" | \"extendedRuleExecutionLoggingEnabled\" | \"socTrendsEnabled\" | \"responseActionsEnabled\" | \"endpointResponseActionsEnabled\" | \"responseActionUploadEnabled\" | \"automatedProcessActionsEnabled\" | \"responseActionsSentinelOneV1Enabled\" | \"responseActionsSentinelOneV2Enabled\" | \"responseActionsSentinelOneGetFileEnabled\" | \"agentStatusClientEnabled\" | \"responseActionsCrowdstrikeManualHostIsolationEnabled\" | \"alertsPageChartsEnabled\" | \"alertTypeEnabled\" | \"expandableFlyoutInCreateRuleEnabled\" | \"expandableEventFlyoutEnabled\" | \"expandableTimelineFlyoutEnabled\" | \"alertsPageFiltersEnabled\" | \"newUserDetailsFlyout\" | \"newUserDetailsFlyoutManagedUser\" | \"newHostDetailsFlyout\" | \"riskScoringPersistence\" | \"riskScoringRoutesEnabled\" | \"esqlRulesDisabled\" | \"protectionUpdatesEnabled\" | \"disableTimelineSaveTour\" | \"riskEnginePrivilegesRouteEnabled\" | \"sentinelOneDataInAnalyzerEnabled\" | \"sentinelOneManualHostActionsEnabled\" | \"crowdstrikeDataInAnalyzerEnabled\" | \"jsonPrebuiltRulesDiffingEnabled\" | \"timelineEsqlTabDisabled\" | \"unifiedComponentsInTimelineEnabled\" | \"analyzerDatePickersAndSourcererDisabled\" | \"perFieldPrebuiltRulesDiffingEnabled\" | \"malwareOnWriteScanOptionAvailable\" | \"aiAssistantFlyoutMode\" | \"valueListItemsModalEnabled\" | \"bulkCustomHighlightedFieldsEnabled\" | undefined" + "\"assistantModelEvaluation\" | \"attackDiscoveryEnabled\" | \"tGridEnabled\" | \"tGridEventRenderedViewEnabled\" | \"excludePoliciesInFilterEnabled\" | \"kubernetesEnabled\" | \"donutChartEmbeddablesEnabled\" | \"previewTelemetryUrlEnabled\" | \"insightsRelatedAlertsByProcessAncestry\" | \"extendedRuleExecutionLoggingEnabled\" | \"socTrendsEnabled\" | \"responseActionsEnabled\" | \"endpointResponseActionsEnabled\" | \"responseActionUploadEnabled\" | \"automatedProcessActionsEnabled\" | \"responseActionsSentinelOneV1Enabled\" | \"responseActionsSentinelOneV2Enabled\" | \"responseActionsSentinelOneGetFileEnabled\" | \"agentStatusClientEnabled\" | \"responseActionsCrowdstrikeManualHostIsolationEnabled\" | \"alertsPageChartsEnabled\" | \"alertTypeEnabled\" | \"expandableFlyoutInCreateRuleEnabled\" | \"expandableEventFlyoutEnabled\" | \"expandableTimelineFlyoutEnabled\" | \"alertsPageFiltersEnabled\" | \"newUserDetailsFlyout\" | \"newUserDetailsFlyoutManagedUser\" | \"newHostDetailsFlyout\" | \"riskScoringPersistence\" | \"riskScoringRoutesEnabled\" | \"esqlRulesDisabled\" | \"protectionUpdatesEnabled\" | \"disableTimelineSaveTour\" | \"riskEnginePrivilegesRouteEnabled\" | \"sentinelOneDataInAnalyzerEnabled\" | \"sentinelOneManualHostActionsEnabled\" | \"crowdstrikeDataInAnalyzerEnabled\" | \"jamfDataInAnalyzerEnabled\" | \"jsonPrebuiltRulesDiffingEnabled\" | \"timelineEsqlTabDisabled\" | \"unifiedComponentsInTimelineEnabled\" | \"analyzerDatePickersAndSourcererDisabled\" | \"perFieldPrebuiltRulesDiffingEnabled\" | \"malwareOnWriteScanOptionAvailable\" | \"aiAssistantFlyoutMode\" | \"valueListItemsModalEnabled\" | \"bulkCustomHighlightedFieldsEnabled\" | undefined" ], "path": "x-pack/plugins/security_solution/public/common/links/types.ts", "deprecated": false, @@ -1964,7 +1964,7 @@ "label": "experimentalFeatures", "description": [], "signature": [ - "{ readonly tGridEnabled: boolean; readonly tGridEventRenderedViewEnabled: boolean; readonly excludePoliciesInFilterEnabled: boolean; readonly kubernetesEnabled: boolean; readonly donutChartEmbeddablesEnabled: boolean; readonly previewTelemetryUrlEnabled: boolean; readonly insightsRelatedAlertsByProcessAncestry: boolean; readonly extendedRuleExecutionLoggingEnabled: boolean; readonly socTrendsEnabled: boolean; readonly responseActionsEnabled: boolean; readonly endpointResponseActionsEnabled: boolean; readonly responseActionUploadEnabled: boolean; readonly automatedProcessActionsEnabled: boolean; readonly responseActionsSentinelOneV1Enabled: boolean; readonly responseActionsSentinelOneV2Enabled: boolean; readonly responseActionsSentinelOneGetFileEnabled: boolean; readonly agentStatusClientEnabled: boolean; readonly responseActionsCrowdstrikeManualHostIsolationEnabled: boolean; readonly alertsPageChartsEnabled: boolean; readonly alertTypeEnabled: boolean; readonly expandableFlyoutInCreateRuleEnabled: boolean; readonly expandableEventFlyoutEnabled: boolean; readonly expandableTimelineFlyoutEnabled: boolean; readonly alertsPageFiltersEnabled: boolean; readonly attackDiscoveryEnabled: boolean; readonly assistantModelEvaluation: boolean; readonly newUserDetailsFlyout: boolean; readonly newUserDetailsFlyoutManagedUser: boolean; readonly newHostDetailsFlyout: boolean; readonly riskScoringPersistence: boolean; readonly riskScoringRoutesEnabled: boolean; readonly esqlRulesDisabled: boolean; readonly protectionUpdatesEnabled: boolean; readonly disableTimelineSaveTour: boolean; readonly riskEnginePrivilegesRouteEnabled: boolean; readonly sentinelOneDataInAnalyzerEnabled: boolean; readonly sentinelOneManualHostActionsEnabled: boolean; readonly crowdstrikeDataInAnalyzerEnabled: boolean; readonly jsonPrebuiltRulesDiffingEnabled: boolean; readonly timelineEsqlTabDisabled: boolean; readonly unifiedComponentsInTimelineEnabled: boolean; readonly analyzerDatePickersAndSourcererDisabled: boolean; readonly perFieldPrebuiltRulesDiffingEnabled: boolean; readonly malwareOnWriteScanOptionAvailable: boolean; readonly aiAssistantFlyoutMode: boolean; readonly valueListItemsModalEnabled: boolean; readonly bulkCustomHighlightedFieldsEnabled: boolean; }" + "{ readonly tGridEnabled: boolean; readonly tGridEventRenderedViewEnabled: boolean; readonly excludePoliciesInFilterEnabled: boolean; readonly kubernetesEnabled: boolean; readonly donutChartEmbeddablesEnabled: boolean; readonly previewTelemetryUrlEnabled: boolean; readonly insightsRelatedAlertsByProcessAncestry: boolean; readonly extendedRuleExecutionLoggingEnabled: boolean; readonly socTrendsEnabled: boolean; readonly responseActionsEnabled: boolean; readonly endpointResponseActionsEnabled: boolean; readonly responseActionUploadEnabled: boolean; readonly automatedProcessActionsEnabled: boolean; readonly responseActionsSentinelOneV1Enabled: boolean; readonly responseActionsSentinelOneV2Enabled: boolean; readonly responseActionsSentinelOneGetFileEnabled: boolean; readonly agentStatusClientEnabled: boolean; readonly responseActionsCrowdstrikeManualHostIsolationEnabled: boolean; readonly alertsPageChartsEnabled: boolean; readonly alertTypeEnabled: boolean; readonly expandableFlyoutInCreateRuleEnabled: boolean; readonly expandableEventFlyoutEnabled: boolean; readonly expandableTimelineFlyoutEnabled: boolean; readonly alertsPageFiltersEnabled: boolean; readonly attackDiscoveryEnabled: boolean; readonly assistantModelEvaluation: boolean; readonly newUserDetailsFlyout: boolean; readonly newUserDetailsFlyoutManagedUser: boolean; readonly newHostDetailsFlyout: boolean; readonly riskScoringPersistence: boolean; readonly riskScoringRoutesEnabled: boolean; readonly esqlRulesDisabled: boolean; readonly protectionUpdatesEnabled: boolean; readonly disableTimelineSaveTour: boolean; readonly riskEnginePrivilegesRouteEnabled: boolean; readonly sentinelOneDataInAnalyzerEnabled: boolean; readonly sentinelOneManualHostActionsEnabled: boolean; readonly crowdstrikeDataInAnalyzerEnabled: boolean; readonly jamfDataInAnalyzerEnabled: boolean; readonly jsonPrebuiltRulesDiffingEnabled: boolean; readonly timelineEsqlTabDisabled: boolean; readonly unifiedComponentsInTimelineEnabled: boolean; readonly analyzerDatePickersAndSourcererDisabled: boolean; readonly perFieldPrebuiltRulesDiffingEnabled: boolean; readonly malwareOnWriteScanOptionAvailable: boolean; readonly aiAssistantFlyoutMode: boolean; readonly valueListItemsModalEnabled: boolean; readonly bulkCustomHighlightedFieldsEnabled: boolean; }" ], "path": "x-pack/plugins/security_solution/public/types.ts", "deprecated": false, @@ -3054,7 +3054,7 @@ "\nThe security solution generic experimental features" ], "signature": [ - "{ readonly tGridEnabled: boolean; readonly tGridEventRenderedViewEnabled: boolean; readonly excludePoliciesInFilterEnabled: boolean; readonly kubernetesEnabled: boolean; readonly donutChartEmbeddablesEnabled: boolean; readonly previewTelemetryUrlEnabled: boolean; readonly insightsRelatedAlertsByProcessAncestry: boolean; readonly extendedRuleExecutionLoggingEnabled: boolean; readonly socTrendsEnabled: boolean; readonly responseActionsEnabled: boolean; readonly endpointResponseActionsEnabled: boolean; readonly responseActionUploadEnabled: boolean; readonly automatedProcessActionsEnabled: boolean; readonly responseActionsSentinelOneV1Enabled: boolean; readonly responseActionsSentinelOneV2Enabled: boolean; readonly responseActionsSentinelOneGetFileEnabled: boolean; readonly agentStatusClientEnabled: boolean; readonly responseActionsCrowdstrikeManualHostIsolationEnabled: boolean; readonly alertsPageChartsEnabled: boolean; readonly alertTypeEnabled: boolean; readonly expandableFlyoutInCreateRuleEnabled: boolean; readonly expandableEventFlyoutEnabled: boolean; readonly expandableTimelineFlyoutEnabled: boolean; readonly alertsPageFiltersEnabled: boolean; readonly attackDiscoveryEnabled: boolean; readonly assistantModelEvaluation: boolean; readonly newUserDetailsFlyout: boolean; readonly newUserDetailsFlyoutManagedUser: boolean; readonly newHostDetailsFlyout: boolean; readonly riskScoringPersistence: boolean; readonly riskScoringRoutesEnabled: boolean; readonly esqlRulesDisabled: boolean; readonly protectionUpdatesEnabled: boolean; readonly disableTimelineSaveTour: boolean; readonly riskEnginePrivilegesRouteEnabled: boolean; readonly sentinelOneDataInAnalyzerEnabled: boolean; readonly sentinelOneManualHostActionsEnabled: boolean; readonly crowdstrikeDataInAnalyzerEnabled: boolean; readonly jsonPrebuiltRulesDiffingEnabled: boolean; readonly timelineEsqlTabDisabled: boolean; readonly unifiedComponentsInTimelineEnabled: boolean; readonly analyzerDatePickersAndSourcererDisabled: boolean; readonly perFieldPrebuiltRulesDiffingEnabled: boolean; readonly malwareOnWriteScanOptionAvailable: boolean; readonly aiAssistantFlyoutMode: boolean; readonly valueListItemsModalEnabled: boolean; readonly bulkCustomHighlightedFieldsEnabled: boolean; }" + "{ readonly tGridEnabled: boolean; readonly tGridEventRenderedViewEnabled: boolean; readonly excludePoliciesInFilterEnabled: boolean; readonly kubernetesEnabled: boolean; readonly donutChartEmbeddablesEnabled: boolean; readonly previewTelemetryUrlEnabled: boolean; readonly insightsRelatedAlertsByProcessAncestry: boolean; readonly extendedRuleExecutionLoggingEnabled: boolean; readonly socTrendsEnabled: boolean; readonly responseActionsEnabled: boolean; readonly endpointResponseActionsEnabled: boolean; readonly responseActionUploadEnabled: boolean; readonly automatedProcessActionsEnabled: boolean; readonly responseActionsSentinelOneV1Enabled: boolean; readonly responseActionsSentinelOneV2Enabled: boolean; readonly responseActionsSentinelOneGetFileEnabled: boolean; readonly agentStatusClientEnabled: boolean; readonly responseActionsCrowdstrikeManualHostIsolationEnabled: boolean; readonly alertsPageChartsEnabled: boolean; readonly alertTypeEnabled: boolean; readonly expandableFlyoutInCreateRuleEnabled: boolean; readonly expandableEventFlyoutEnabled: boolean; readonly expandableTimelineFlyoutEnabled: boolean; readonly alertsPageFiltersEnabled: boolean; readonly attackDiscoveryEnabled: boolean; readonly assistantModelEvaluation: boolean; readonly newUserDetailsFlyout: boolean; readonly newUserDetailsFlyoutManagedUser: boolean; readonly newHostDetailsFlyout: boolean; readonly riskScoringPersistence: boolean; readonly riskScoringRoutesEnabled: boolean; readonly esqlRulesDisabled: boolean; readonly protectionUpdatesEnabled: boolean; readonly disableTimelineSaveTour: boolean; readonly riskEnginePrivilegesRouteEnabled: boolean; readonly sentinelOneDataInAnalyzerEnabled: boolean; readonly sentinelOneManualHostActionsEnabled: boolean; readonly crowdstrikeDataInAnalyzerEnabled: boolean; readonly jamfDataInAnalyzerEnabled: boolean; readonly jsonPrebuiltRulesDiffingEnabled: boolean; readonly timelineEsqlTabDisabled: boolean; readonly unifiedComponentsInTimelineEnabled: boolean; readonly analyzerDatePickersAndSourcererDisabled: boolean; readonly perFieldPrebuiltRulesDiffingEnabled: boolean; readonly malwareOnWriteScanOptionAvailable: boolean; readonly aiAssistantFlyoutMode: boolean; readonly valueListItemsModalEnabled: boolean; readonly bulkCustomHighlightedFieldsEnabled: boolean; }" ], "path": "x-pack/plugins/security_solution/server/plugin_contract.ts", "deprecated": false, @@ -3230,7 +3230,7 @@ "label": "ExperimentalFeatures", "description": [], "signature": [ - "{ readonly tGridEnabled: boolean; readonly tGridEventRenderedViewEnabled: boolean; readonly excludePoliciesInFilterEnabled: boolean; readonly kubernetesEnabled: boolean; readonly donutChartEmbeddablesEnabled: boolean; readonly previewTelemetryUrlEnabled: boolean; readonly insightsRelatedAlertsByProcessAncestry: boolean; readonly extendedRuleExecutionLoggingEnabled: boolean; readonly socTrendsEnabled: boolean; readonly responseActionsEnabled: boolean; readonly endpointResponseActionsEnabled: boolean; readonly responseActionUploadEnabled: boolean; readonly automatedProcessActionsEnabled: boolean; readonly responseActionsSentinelOneV1Enabled: boolean; readonly responseActionsSentinelOneV2Enabled: boolean; readonly responseActionsSentinelOneGetFileEnabled: boolean; readonly agentStatusClientEnabled: boolean; readonly responseActionsCrowdstrikeManualHostIsolationEnabled: boolean; readonly alertsPageChartsEnabled: boolean; readonly alertTypeEnabled: boolean; readonly expandableFlyoutInCreateRuleEnabled: boolean; readonly expandableEventFlyoutEnabled: boolean; readonly expandableTimelineFlyoutEnabled: boolean; readonly alertsPageFiltersEnabled: boolean; readonly attackDiscoveryEnabled: boolean; readonly assistantModelEvaluation: boolean; readonly newUserDetailsFlyout: boolean; readonly newUserDetailsFlyoutManagedUser: boolean; readonly newHostDetailsFlyout: boolean; readonly riskScoringPersistence: boolean; readonly riskScoringRoutesEnabled: boolean; readonly esqlRulesDisabled: boolean; readonly protectionUpdatesEnabled: boolean; readonly disableTimelineSaveTour: boolean; readonly riskEnginePrivilegesRouteEnabled: boolean; readonly sentinelOneDataInAnalyzerEnabled: boolean; readonly sentinelOneManualHostActionsEnabled: boolean; readonly crowdstrikeDataInAnalyzerEnabled: boolean; readonly jsonPrebuiltRulesDiffingEnabled: boolean; readonly timelineEsqlTabDisabled: boolean; readonly unifiedComponentsInTimelineEnabled: boolean; readonly analyzerDatePickersAndSourcererDisabled: boolean; readonly perFieldPrebuiltRulesDiffingEnabled: boolean; readonly malwareOnWriteScanOptionAvailable: boolean; readonly aiAssistantFlyoutMode: boolean; readonly valueListItemsModalEnabled: boolean; readonly bulkCustomHighlightedFieldsEnabled: boolean; }" + "{ readonly tGridEnabled: boolean; readonly tGridEventRenderedViewEnabled: boolean; readonly excludePoliciesInFilterEnabled: boolean; readonly kubernetesEnabled: boolean; readonly donutChartEmbeddablesEnabled: boolean; readonly previewTelemetryUrlEnabled: boolean; readonly insightsRelatedAlertsByProcessAncestry: boolean; readonly extendedRuleExecutionLoggingEnabled: boolean; readonly socTrendsEnabled: boolean; readonly responseActionsEnabled: boolean; readonly endpointResponseActionsEnabled: boolean; readonly responseActionUploadEnabled: boolean; readonly automatedProcessActionsEnabled: boolean; readonly responseActionsSentinelOneV1Enabled: boolean; readonly responseActionsSentinelOneV2Enabled: boolean; readonly responseActionsSentinelOneGetFileEnabled: boolean; readonly agentStatusClientEnabled: boolean; readonly responseActionsCrowdstrikeManualHostIsolationEnabled: boolean; readonly alertsPageChartsEnabled: boolean; readonly alertTypeEnabled: boolean; readonly expandableFlyoutInCreateRuleEnabled: boolean; readonly expandableEventFlyoutEnabled: boolean; readonly expandableTimelineFlyoutEnabled: boolean; readonly alertsPageFiltersEnabled: boolean; readonly attackDiscoveryEnabled: boolean; readonly assistantModelEvaluation: boolean; readonly newUserDetailsFlyout: boolean; readonly newUserDetailsFlyoutManagedUser: boolean; readonly newHostDetailsFlyout: boolean; readonly riskScoringPersistence: boolean; readonly riskScoringRoutesEnabled: boolean; readonly esqlRulesDisabled: boolean; readonly protectionUpdatesEnabled: boolean; readonly disableTimelineSaveTour: boolean; readonly riskEnginePrivilegesRouteEnabled: boolean; readonly sentinelOneDataInAnalyzerEnabled: boolean; readonly sentinelOneManualHostActionsEnabled: boolean; readonly crowdstrikeDataInAnalyzerEnabled: boolean; readonly jamfDataInAnalyzerEnabled: boolean; readonly jsonPrebuiltRulesDiffingEnabled: boolean; readonly timelineEsqlTabDisabled: boolean; readonly unifiedComponentsInTimelineEnabled: boolean; readonly analyzerDatePickersAndSourcererDisabled: boolean; readonly perFieldPrebuiltRulesDiffingEnabled: boolean; readonly malwareOnWriteScanOptionAvailable: boolean; readonly aiAssistantFlyoutMode: boolean; readonly valueListItemsModalEnabled: boolean; readonly bulkCustomHighlightedFieldsEnabled: boolean; }" ], "path": "x-pack/plugins/security_solution/common/experimental_features.ts", "deprecated": false, @@ -3296,7 +3296,7 @@ "\nA list of allowed values that can be used in `xpack.securitySolution.enableExperimental`.\nThis object is then used to validate and parse the value entered." ], "signature": [ - "{ readonly tGridEnabled: true; readonly tGridEventRenderedViewEnabled: true; readonly excludePoliciesInFilterEnabled: false; readonly kubernetesEnabled: true; readonly donutChartEmbeddablesEnabled: false; readonly previewTelemetryUrlEnabled: false; readonly insightsRelatedAlertsByProcessAncestry: true; readonly extendedRuleExecutionLoggingEnabled: false; readonly socTrendsEnabled: false; readonly responseActionsEnabled: true; readonly endpointResponseActionsEnabled: true; readonly responseActionUploadEnabled: true; readonly automatedProcessActionsEnabled: true; readonly responseActionsSentinelOneV1Enabled: true; readonly responseActionsSentinelOneV2Enabled: false; readonly responseActionsSentinelOneGetFileEnabled: false; readonly agentStatusClientEnabled: false; readonly responseActionsCrowdstrikeManualHostIsolationEnabled: false; readonly alertsPageChartsEnabled: true; readonly alertTypeEnabled: false; readonly expandableFlyoutInCreateRuleEnabled: true; readonly expandableEventFlyoutEnabled: true; readonly expandableTimelineFlyoutEnabled: true; readonly alertsPageFiltersEnabled: true; readonly attackDiscoveryEnabled: false; readonly assistantModelEvaluation: false; readonly newUserDetailsFlyout: true; readonly newUserDetailsFlyoutManagedUser: false; readonly newHostDetailsFlyout: true; readonly riskScoringPersistence: true; readonly riskScoringRoutesEnabled: true; readonly esqlRulesDisabled: false; readonly protectionUpdatesEnabled: true; readonly disableTimelineSaveTour: false; readonly riskEnginePrivilegesRouteEnabled: true; readonly sentinelOneDataInAnalyzerEnabled: true; readonly sentinelOneManualHostActionsEnabled: true; readonly crowdstrikeDataInAnalyzerEnabled: false; readonly jsonPrebuiltRulesDiffingEnabled: true; readonly timelineEsqlTabDisabled: false; readonly unifiedComponentsInTimelineEnabled: false; readonly analyzerDatePickersAndSourcererDisabled: false; readonly perFieldPrebuiltRulesDiffingEnabled: true; readonly malwareOnWriteScanOptionAvailable: false; readonly aiAssistantFlyoutMode: false; readonly valueListItemsModalEnabled: true; readonly bulkCustomHighlightedFieldsEnabled: false; }" + "{ readonly tGridEnabled: true; readonly tGridEventRenderedViewEnabled: true; readonly excludePoliciesInFilterEnabled: false; readonly kubernetesEnabled: true; readonly donutChartEmbeddablesEnabled: false; readonly previewTelemetryUrlEnabled: false; readonly insightsRelatedAlertsByProcessAncestry: true; readonly extendedRuleExecutionLoggingEnabled: false; readonly socTrendsEnabled: false; readonly responseActionsEnabled: true; readonly endpointResponseActionsEnabled: true; readonly responseActionUploadEnabled: true; readonly automatedProcessActionsEnabled: true; readonly responseActionsSentinelOneV1Enabled: true; readonly responseActionsSentinelOneV2Enabled: false; readonly responseActionsSentinelOneGetFileEnabled: false; readonly agentStatusClientEnabled: false; readonly responseActionsCrowdstrikeManualHostIsolationEnabled: false; readonly alertsPageChartsEnabled: true; readonly alertTypeEnabled: false; readonly expandableFlyoutInCreateRuleEnabled: true; readonly expandableEventFlyoutEnabled: true; readonly expandableTimelineFlyoutEnabled: true; readonly alertsPageFiltersEnabled: true; readonly attackDiscoveryEnabled: false; readonly assistantModelEvaluation: false; readonly newUserDetailsFlyout: true; readonly newUserDetailsFlyoutManagedUser: false; readonly newHostDetailsFlyout: true; readonly riskScoringPersistence: true; readonly riskScoringRoutesEnabled: true; readonly esqlRulesDisabled: false; readonly protectionUpdatesEnabled: true; readonly disableTimelineSaveTour: false; readonly riskEnginePrivilegesRouteEnabled: true; readonly sentinelOneDataInAnalyzerEnabled: true; readonly sentinelOneManualHostActionsEnabled: true; readonly crowdstrikeDataInAnalyzerEnabled: false; readonly jamfDataInAnalyzerEnabled: false; readonly jsonPrebuiltRulesDiffingEnabled: true; readonly timelineEsqlTabDisabled: false; readonly unifiedComponentsInTimelineEnabled: false; readonly analyzerDatePickersAndSourcererDisabled: false; readonly perFieldPrebuiltRulesDiffingEnabled: true; readonly malwareOnWriteScanOptionAvailable: false; readonly aiAssistantFlyoutMode: true; readonly valueListItemsModalEnabled: true; readonly bulkCustomHighlightedFieldsEnabled: false; }" ], "path": "x-pack/plugins/security_solution/common/experimental_features.ts", "deprecated": false, diff --git a/api_docs/security_solution.mdx b/api_docs/security_solution.mdx index 08b96ce0a8429..a70f8a0547753 100644 --- a/api_docs/security_solution.mdx +++ b/api_docs/security_solution.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/securitySolution title: "securitySolution" image: https://source.unsplash.com/400x175/?github description: API docs for the securitySolution plugin -date: 2024-05-07 +date: 2024-05-08 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'securitySolution'] --- import securitySolutionObj from './security_solution.devdocs.json'; diff --git a/api_docs/security_solution_ess.mdx b/api_docs/security_solution_ess.mdx index f59da08d73538..cfe0f17474bc5 100644 --- a/api_docs/security_solution_ess.mdx +++ b/api_docs/security_solution_ess.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/securitySolutionEss title: "securitySolutionEss" image: https://source.unsplash.com/400x175/?github description: API docs for the securitySolutionEss plugin -date: 2024-05-07 +date: 2024-05-08 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'securitySolutionEss'] --- import securitySolutionEssObj from './security_solution_ess.devdocs.json'; diff --git a/api_docs/security_solution_serverless.mdx b/api_docs/security_solution_serverless.mdx index c14277be9ef2d..ae5b63b94d265 100644 --- a/api_docs/security_solution_serverless.mdx +++ b/api_docs/security_solution_serverless.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/securitySolutionServerless title: "securitySolutionServerless" image: https://source.unsplash.com/400x175/?github description: API docs for the securitySolutionServerless plugin -date: 2024-05-07 +date: 2024-05-08 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'securitySolutionServerless'] --- import securitySolutionServerlessObj from './security_solution_serverless.devdocs.json'; diff --git a/api_docs/serverless.mdx b/api_docs/serverless.mdx index 0d34ac524e71d..6baed8cb30777 100644 --- a/api_docs/serverless.mdx +++ b/api_docs/serverless.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/serverless title: "serverless" image: https://source.unsplash.com/400x175/?github description: API docs for the serverless plugin -date: 2024-05-07 +date: 2024-05-08 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'serverless'] --- import serverlessObj from './serverless.devdocs.json'; diff --git a/api_docs/serverless_observability.mdx b/api_docs/serverless_observability.mdx index 7e488cd888441..ea59ceec49bab 100644 --- a/api_docs/serverless_observability.mdx +++ b/api_docs/serverless_observability.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/serverlessObservability title: "serverlessObservability" image: https://source.unsplash.com/400x175/?github description: API docs for the serverlessObservability plugin -date: 2024-05-07 +date: 2024-05-08 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'serverlessObservability'] --- import serverlessObservabilityObj from './serverless_observability.devdocs.json'; diff --git a/api_docs/serverless_search.mdx b/api_docs/serverless_search.mdx index 0b4ca7fe94517..461daf517809d 100644 --- a/api_docs/serverless_search.mdx +++ b/api_docs/serverless_search.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/serverlessSearch title: "serverlessSearch" image: https://source.unsplash.com/400x175/?github description: API docs for the serverlessSearch plugin -date: 2024-05-07 +date: 2024-05-08 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'serverlessSearch'] --- import serverlessSearchObj from './serverless_search.devdocs.json'; diff --git a/api_docs/session_view.mdx b/api_docs/session_view.mdx index a39633343914d..7fc3002d2eca6 100644 --- a/api_docs/session_view.mdx +++ b/api_docs/session_view.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/sessionView title: "sessionView" image: https://source.unsplash.com/400x175/?github description: API docs for the sessionView plugin -date: 2024-05-07 +date: 2024-05-08 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 8e7cd6bc73892..97b2df157c884 100644 --- a/api_docs/share.mdx +++ b/api_docs/share.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/share title: "share" image: https://source.unsplash.com/400x175/?github description: API docs for the share plugin -date: 2024-05-07 +date: 2024-05-08 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'share'] --- import shareObj from './share.devdocs.json'; diff --git a/api_docs/slo.mdx b/api_docs/slo.mdx index b9af365750fff..44a18b30c5fbd 100644 --- a/api_docs/slo.mdx +++ b/api_docs/slo.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/slo title: "slo" image: https://source.unsplash.com/400x175/?github description: API docs for the slo plugin -date: 2024-05-07 +date: 2024-05-08 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'slo'] --- import sloObj from './slo.devdocs.json'; diff --git a/api_docs/snapshot_restore.mdx b/api_docs/snapshot_restore.mdx index 1a198ffddd57f..31d2c540f45a3 100644 --- a/api_docs/snapshot_restore.mdx +++ b/api_docs/snapshot_restore.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/snapshotRestore title: "snapshotRestore" image: https://source.unsplash.com/400x175/?github description: API docs for the snapshotRestore plugin -date: 2024-05-07 +date: 2024-05-08 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 dc4ccd6b61d7d..16cbc76f35084 100644 --- a/api_docs/spaces.mdx +++ b/api_docs/spaces.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/spaces title: "spaces" image: https://source.unsplash.com/400x175/?github description: API docs for the spaces plugin -date: 2024-05-07 +date: 2024-05-08 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 398c602108f66..28495844f9704 100644 --- a/api_docs/stack_alerts.mdx +++ b/api_docs/stack_alerts.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/stackAlerts title: "stackAlerts" image: https://source.unsplash.com/400x175/?github description: API docs for the stackAlerts plugin -date: 2024-05-07 +date: 2024-05-08 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 b780bc73f8036..0445a5baf2905 100644 --- a/api_docs/stack_connectors.mdx +++ b/api_docs/stack_connectors.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/stackConnectors title: "stackConnectors" image: https://source.unsplash.com/400x175/?github description: API docs for the stackConnectors plugin -date: 2024-05-07 +date: 2024-05-08 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 2fc876ce18268..4d613c46b6bb3 100644 --- a/api_docs/task_manager.mdx +++ b/api_docs/task_manager.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/taskManager title: "taskManager" image: https://source.unsplash.com/400x175/?github description: API docs for the taskManager plugin -date: 2024-05-07 +date: 2024-05-08 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 e32b438a32f33..4269973b07e21 100644 --- a/api_docs/telemetry.mdx +++ b/api_docs/telemetry.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/telemetry title: "telemetry" image: https://source.unsplash.com/400x175/?github description: API docs for the telemetry plugin -date: 2024-05-07 +date: 2024-05-08 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 5bb462f5ee062..a536545d66574 100644 --- a/api_docs/telemetry_collection_manager.mdx +++ b/api_docs/telemetry_collection_manager.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/telemetryCollectionManager title: "telemetryCollectionManager" image: https://source.unsplash.com/400x175/?github description: API docs for the telemetryCollectionManager plugin -date: 2024-05-07 +date: 2024-05-08 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 d5c1bf80a808d..80a6ebae54b87 100644 --- a/api_docs/telemetry_collection_xpack.mdx +++ b/api_docs/telemetry_collection_xpack.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/telemetryCollectionXpack title: "telemetryCollectionXpack" image: https://source.unsplash.com/400x175/?github description: API docs for the telemetryCollectionXpack plugin -date: 2024-05-07 +date: 2024-05-08 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 1f5d2e0609375..70ad1b531d17d 100644 --- a/api_docs/telemetry_management_section.mdx +++ b/api_docs/telemetry_management_section.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/telemetryManagementSection title: "telemetryManagementSection" image: https://source.unsplash.com/400x175/?github description: API docs for the telemetryManagementSection plugin -date: 2024-05-07 +date: 2024-05-08 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'telemetryManagementSection'] --- import telemetryManagementSectionObj from './telemetry_management_section.devdocs.json'; diff --git a/api_docs/text_based_languages.mdx b/api_docs/text_based_languages.mdx index df475489c6d1d..f054fbf7b03b7 100644 --- a/api_docs/text_based_languages.mdx +++ b/api_docs/text_based_languages.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/textBasedLanguages title: "textBasedLanguages" image: https://source.unsplash.com/400x175/?github description: API docs for the textBasedLanguages plugin -date: 2024-05-07 +date: 2024-05-08 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'textBasedLanguages'] --- import textBasedLanguagesObj from './text_based_languages.devdocs.json'; diff --git a/api_docs/threat_intelligence.mdx b/api_docs/threat_intelligence.mdx index cacc0d9cbd906..9f639a8013797 100644 --- a/api_docs/threat_intelligence.mdx +++ b/api_docs/threat_intelligence.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/threatIntelligence title: "threatIntelligence" image: https://source.unsplash.com/400x175/?github description: API docs for the threatIntelligence plugin -date: 2024-05-07 +date: 2024-05-08 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 329a5f23bb0f5..665641a20157f 100644 --- a/api_docs/timelines.mdx +++ b/api_docs/timelines.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/timelines title: "timelines" image: https://source.unsplash.com/400x175/?github description: API docs for the timelines plugin -date: 2024-05-07 +date: 2024-05-08 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 e3aa5f939d5a6..840aaab6087dc 100644 --- a/api_docs/transform.mdx +++ b/api_docs/transform.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/transform title: "transform" image: https://source.unsplash.com/400x175/?github description: API docs for the transform plugin -date: 2024-05-07 +date: 2024-05-08 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 848f94d5674f4..dbc666e7c26d8 100644 --- a/api_docs/triggers_actions_ui.mdx +++ b/api_docs/triggers_actions_ui.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/triggersActionsUi title: "triggersActionsUi" image: https://source.unsplash.com/400x175/?github description: API docs for the triggersActionsUi plugin -date: 2024-05-07 +date: 2024-05-08 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 ecd4e86a80293..17b2ee4aa95e8 100644 --- a/api_docs/ui_actions.mdx +++ b/api_docs/ui_actions.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/uiActions title: "uiActions" image: https://source.unsplash.com/400x175/?github description: API docs for the uiActions plugin -date: 2024-05-07 +date: 2024-05-08 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 f740435d1095d..05f77c246c3f8 100644 --- a/api_docs/ui_actions_enhanced.mdx +++ b/api_docs/ui_actions_enhanced.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/uiActionsEnhanced title: "uiActionsEnhanced" image: https://source.unsplash.com/400x175/?github description: API docs for the uiActionsEnhanced plugin -date: 2024-05-07 +date: 2024-05-08 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'uiActionsEnhanced'] --- import uiActionsEnhancedObj from './ui_actions_enhanced.devdocs.json'; diff --git a/api_docs/unified_doc_viewer.mdx b/api_docs/unified_doc_viewer.mdx index fc7852338b714..5f9ade7eeec18 100644 --- a/api_docs/unified_doc_viewer.mdx +++ b/api_docs/unified_doc_viewer.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/unifiedDocViewer title: "unifiedDocViewer" image: https://source.unsplash.com/400x175/?github description: API docs for the unifiedDocViewer plugin -date: 2024-05-07 +date: 2024-05-08 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'unifiedDocViewer'] --- import unifiedDocViewerObj from './unified_doc_viewer.devdocs.json'; diff --git a/api_docs/unified_histogram.mdx b/api_docs/unified_histogram.mdx index 98a006a8491e8..7486dcb2635df 100644 --- a/api_docs/unified_histogram.mdx +++ b/api_docs/unified_histogram.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/unifiedHistogram title: "unifiedHistogram" image: https://source.unsplash.com/400x175/?github description: API docs for the unifiedHistogram plugin -date: 2024-05-07 +date: 2024-05-08 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'unifiedHistogram'] --- import unifiedHistogramObj from './unified_histogram.devdocs.json'; diff --git a/api_docs/unified_search.mdx b/api_docs/unified_search.mdx index 8e3fe86d3c060..c9b605c7285eb 100644 --- a/api_docs/unified_search.mdx +++ b/api_docs/unified_search.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/unifiedSearch title: "unifiedSearch" image: https://source.unsplash.com/400x175/?github description: API docs for the unifiedSearch plugin -date: 2024-05-07 +date: 2024-05-08 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 a183f9d955251..cb7c06dead6d2 100644 --- a/api_docs/unified_search_autocomplete.mdx +++ b/api_docs/unified_search_autocomplete.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/unifiedSearch-autocomplete title: "unifiedSearch.autocomplete" image: https://source.unsplash.com/400x175/?github description: API docs for the unifiedSearch.autocomplete plugin -date: 2024-05-07 +date: 2024-05-08 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'unifiedSearch.autocomplete'] --- import unifiedSearchAutocompleteObj from './unified_search_autocomplete.devdocs.json'; diff --git a/api_docs/uptime.mdx b/api_docs/uptime.mdx index a72811ee6f272..6d6c2088c1aac 100644 --- a/api_docs/uptime.mdx +++ b/api_docs/uptime.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/uptime title: "uptime" image: https://source.unsplash.com/400x175/?github description: API docs for the uptime plugin -date: 2024-05-07 +date: 2024-05-08 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'uptime'] --- import uptimeObj from './uptime.devdocs.json'; diff --git a/api_docs/url_forwarding.mdx b/api_docs/url_forwarding.mdx index 53bd29a071eb0..552d55f1b5722 100644 --- a/api_docs/url_forwarding.mdx +++ b/api_docs/url_forwarding.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/urlForwarding title: "urlForwarding" image: https://source.unsplash.com/400x175/?github description: API docs for the urlForwarding plugin -date: 2024-05-07 +date: 2024-05-08 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 0ba7760f02d7b..8a5a3b8a0295d 100644 --- a/api_docs/usage_collection.mdx +++ b/api_docs/usage_collection.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/usageCollection title: "usageCollection" image: https://source.unsplash.com/400x175/?github description: API docs for the usageCollection plugin -date: 2024-05-07 +date: 2024-05-08 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 6a6471e55881b..ab0f426c53d28 100644 --- a/api_docs/ux.mdx +++ b/api_docs/ux.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/ux title: "ux" image: https://source.unsplash.com/400x175/?github description: API docs for the ux plugin -date: 2024-05-07 +date: 2024-05-08 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 38a57a2cda4eb..09cfab6e6a817 100644 --- a/api_docs/vis_default_editor.mdx +++ b/api_docs/vis_default_editor.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/visDefaultEditor title: "visDefaultEditor" image: https://source.unsplash.com/400x175/?github description: API docs for the visDefaultEditor plugin -date: 2024-05-07 +date: 2024-05-08 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 f913b1c15e04e..12bcbdfdcf772 100644 --- a/api_docs/vis_type_gauge.mdx +++ b/api_docs/vis_type_gauge.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/visTypeGauge title: "visTypeGauge" image: https://source.unsplash.com/400x175/?github description: API docs for the visTypeGauge plugin -date: 2024-05-07 +date: 2024-05-08 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 6dc7562445401..eb32e545f7a85 100644 --- a/api_docs/vis_type_heatmap.mdx +++ b/api_docs/vis_type_heatmap.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/visTypeHeatmap title: "visTypeHeatmap" image: https://source.unsplash.com/400x175/?github description: API docs for the visTypeHeatmap plugin -date: 2024-05-07 +date: 2024-05-08 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 04c1f0360d917..2f9ccc4572e19 100644 --- a/api_docs/vis_type_pie.mdx +++ b/api_docs/vis_type_pie.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/visTypePie title: "visTypePie" image: https://source.unsplash.com/400x175/?github description: API docs for the visTypePie plugin -date: 2024-05-07 +date: 2024-05-08 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 7ed5f1478f808..2b1bc6b4d0345 100644 --- a/api_docs/vis_type_table.mdx +++ b/api_docs/vis_type_table.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/visTypeTable title: "visTypeTable" image: https://source.unsplash.com/400x175/?github description: API docs for the visTypeTable plugin -date: 2024-05-07 +date: 2024-05-08 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 6be95d9806641..d4b7d7cb61a53 100644 --- a/api_docs/vis_type_timelion.mdx +++ b/api_docs/vis_type_timelion.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/visTypeTimelion title: "visTypeTimelion" image: https://source.unsplash.com/400x175/?github description: API docs for the visTypeTimelion plugin -date: 2024-05-07 +date: 2024-05-08 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 1649e43a3ae9b..261265f9cd663 100644 --- a/api_docs/vis_type_timeseries.mdx +++ b/api_docs/vis_type_timeseries.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/visTypeTimeseries title: "visTypeTimeseries" image: https://source.unsplash.com/400x175/?github description: API docs for the visTypeTimeseries plugin -date: 2024-05-07 +date: 2024-05-08 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 a3dc522271ef7..f608063fff904 100644 --- a/api_docs/vis_type_vega.mdx +++ b/api_docs/vis_type_vega.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/visTypeVega title: "visTypeVega" image: https://source.unsplash.com/400x175/?github description: API docs for the visTypeVega plugin -date: 2024-05-07 +date: 2024-05-08 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 4416a05f81b20..eea54e65a3ad7 100644 --- a/api_docs/vis_type_vislib.mdx +++ b/api_docs/vis_type_vislib.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/visTypeVislib title: "visTypeVislib" image: https://source.unsplash.com/400x175/?github description: API docs for the visTypeVislib plugin -date: 2024-05-07 +date: 2024-05-08 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 e09fee372091f..820464e0da685 100644 --- a/api_docs/vis_type_xy.mdx +++ b/api_docs/vis_type_xy.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/visTypeXy title: "visTypeXy" image: https://source.unsplash.com/400x175/?github description: API docs for the visTypeXy plugin -date: 2024-05-07 +date: 2024-05-08 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 2ca1fc860febe..cdc3d96d1852f 100644 --- a/api_docs/visualizations.mdx +++ b/api_docs/visualizations.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/visualizations title: "visualizations" image: https://source.unsplash.com/400x175/?github description: API docs for the visualizations plugin -date: 2024-05-07 +date: 2024-05-08 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'visualizations'] --- import visualizationsObj from './visualizations.devdocs.json'; From c43da3e4349a6bb13cdab507530efd926147c30b Mon Sep 17 00:00:00 2001 From: Jatin Kathuria Date: Wed, 8 May 2024 08:21:30 +0200 Subject: [PATCH 47/86] [Security Solution] Timeline : Disabling Timeline ESQL feature flag should disable ESQL Tab. (#182816) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit ## Summary handles https://github.com/elastic/kibana/issues/182798 Recently there was PR : https://github.com/elastic/kibana/pull/181616 which does not disable ES|QL tab in timeline even if feature flag is disabled when : - User has already created a ESQL Query in timeline and saved the timeline. This PR makes sure when below feature flag exists, then `ES|QL` tab will be definitely disabled even when user has a saved timeline with ES|QL Query in it. ```yaml xpack.securitySolution.enableExperimental: - timelineEsqlTabDisabled ``` ## Desk Testing Guidelines 1. Remove above Feature Flag 2. Go to Timeline and Create a Timeline with ESQL Query 3. Save the timeline. 4. Go To advanced Settings and search for `esql` and disable the `enableESQL` setting. 5. Go back to the timeline saved in step 3. 6. ✅ Assert that the `ES|QL` tab is still there. 7. ✅ Assert that the `ES|QL` tab is NOT there in a new timeline. 8. Add above feature flag - which disables the esql Tab. 9. Go back to the timeline saved in step 3. 10. ✅ Assert that the `ES|QL` tab is no longer there. 11. ✅ Assert that the `ES|QL` tab is NOT there in a new timeline. ### Checklist - [x] [Unit or functional tests](https://www.elastic.co/guide/en/kibana/master/development-tests.html) were updated or added to match the most common scenarios --- .../hooks/esql/use_esql_availability.ts | 10 ++- .../components/timeline/tabs/index.test.tsx | 90 ++++++++++++++----- .../components/timeline/tabs/index.tsx | 27 +++++- 3 files changed, 95 insertions(+), 32 deletions(-) diff --git a/x-pack/plugins/security_solution/public/common/hooks/esql/use_esql_availability.ts b/x-pack/plugins/security_solution/public/common/hooks/esql/use_esql_availability.ts index 41fc7084b32bf..3e9bdb658c3e1 100644 --- a/x-pack/plugins/security_solution/public/common/hooks/esql/use_esql_availability.ts +++ b/x-pack/plugins/security_solution/public/common/hooks/esql/use_esql_availability.ts @@ -18,17 +18,19 @@ import { useIsExperimentalFeatureEnabled } from '../use_experimental_features'; export const useEsqlAvailability = () => { const { uiSettings } = useKibana().services; const isEsqlAdvancedSettingEnabled = uiSettings?.get(ENABLE_ESQL); + + const isTimelineEsqlFeatureFlagDisabled = + useIsExperimentalFeatureEnabled('timelineEsqlTabDisabled'); + const isEsqlRuleTypeEnabled = !useIsExperimentalFeatureEnabled('esqlRulesDisabled') && isEsqlAdvancedSettingEnabled; - const isESQLTabInTimelineEnabled = - !useIsExperimentalFeatureEnabled('timelineEsqlTabDisabled') && isEsqlAdvancedSettingEnabled; return useMemo( () => ({ isEsqlAdvancedSettingEnabled, isEsqlRuleTypeEnabled, - isESQLTabInTimelineEnabled, + isTimelineEsqlEnabledByFeatureFlag: !isTimelineEsqlFeatureFlagDisabled, }), - [isESQLTabInTimelineEnabled, isEsqlAdvancedSettingEnabled, isEsqlRuleTypeEnabled] + [isEsqlAdvancedSettingEnabled, isTimelineEsqlFeatureFlagDisabled, isEsqlRuleTypeEnabled] ); }; diff --git a/x-pack/plugins/security_solution/public/timelines/components/timeline/tabs/index.test.tsx b/x-pack/plugins/security_solution/public/timelines/components/timeline/tabs/index.test.tsx index 7f399aa095a8a..4d0a8f5cfd363 100644 --- a/x-pack/plugins/security_solution/public/timelines/components/timeline/tabs/index.test.tsx +++ b/x-pack/plugins/security_solution/public/timelines/components/timeline/tabs/index.test.tsx @@ -18,7 +18,8 @@ import { render, screen, waitFor } from '@testing-library/react'; jest.mock('../../../../common/hooks/esql/use_esql_availability', () => ({ useEsqlAvailability: jest.fn().mockReturnValue({ - isESQLTabInTimelineEnabled: true, + isEsqlAdvancedSettingEnabled: true, + isTimelineEsqlEnabledByFeatureFlag: true, }), })); @@ -44,38 +45,79 @@ describe('Timeline', () => { expect(screen.getByTestId(esqlTabSubj)).toBeVisible(); }); - it('should not show the esql tab when the advanced setting is disabled', async () => { - useEsqlAvailabilityMock.mockReturnValue({ - isESQLTabInTimelineEnabled: false, + describe('no existing esql query is present', () => { + it('should not show the esql tab when the advanced setting is disabled', async () => { + useEsqlAvailabilityMock.mockReturnValue({ + isEsqlAdvancedSettingEnabled: false, + isTimelineEsqlEnabledByFeatureFlag: true, + }); + render( + + + + ); + + await waitFor(() => { + expect(screen.queryByTestId(esqlTabSubj)).toBeNull(); + }); }); - render( - - - - ); + it('should not show the esql tab when the esql is disabled by feature flag', async () => { + useEsqlAvailabilityMock.mockReturnValue({ + isEsqlAdvancedSettingEnabled: false, + isTimelineEsqlEnabledByFeatureFlag: false, + }); + render( + + + + ); - await waitFor(() => { - expect(screen.queryByTestId(esqlTabSubj)).toBeNull(); + await waitFor(() => { + expect(screen.queryByTestId(esqlTabSubj)).toBeNull(); + }); }); }); - it('should show the esql tab when the advanced setting is disabled, but an esql query is present', async () => { - useEsqlAvailabilityMock.mockReturnValue({ - isESQLTabInTimelineEnabled: false, + describe('existing esql query is present', () => { + let mockStore: ReturnType; + beforeEach(() => { + const stateWithSavedSearchId = structuredClone(mockGlobalState); + stateWithSavedSearchId.timeline.timelineById[TimelineId.test].savedSearchId = 'test-id'; + mockStore = createMockStore(stateWithSavedSearchId); }); - const stateWithSavedSearchId = structuredClone(mockGlobalState); - stateWithSavedSearchId.timeline.timelineById[TimelineId.test].savedSearchId = 'test-id'; - const mockStore = createMockStore(stateWithSavedSearchId); + it('should show the esql tab when the advanced setting is disabled', async () => { + useEsqlAvailabilityMock.mockReturnValue({ + isESQLTabInTimelineEnabled: false, + isTimelineEsqlEnabledByFeatureFlag: true, + }); - render( - - - - ); + render( + + + + ); + + await waitFor(() => { + expect(screen.queryByTestId(esqlTabSubj)).toBeVisible(); + }); + }); + + it('should not show the esql tab when the esql is disabled by the feature flag', async () => { + useEsqlAvailabilityMock.mockReturnValue({ + isESQLTabInTimelineEnabled: true, + isTimelineEsqlEnabledByFeatureFlag: false, + }); + + render( + + + + ); - await waitFor(() => { - expect(screen.queryByTestId(esqlTabSubj)).toBeVisible(); + await waitFor(() => { + expect(screen.queryByTestId(esqlTabSubj)).toBeNull(); + }); }); }); }); diff --git a/x-pack/plugins/security_solution/public/timelines/components/timeline/tabs/index.tsx b/x-pack/plugins/security_solution/public/timelines/components/timeline/tabs/index.tsx index 2e164677735dd..643a5b54be415 100644 --- a/x-pack/plugins/security_solution/public/timelines/components/timeline/tabs/index.tsx +++ b/x-pack/plugins/security_solution/public/timelines/components/timeline/tabs/index.tsx @@ -110,11 +110,20 @@ const ActiveTimelineTab = memo( showTimeline, }) => { const { hasAssistantPrivilege } = useAssistantAvailability(); - const { isESQLTabInTimelineEnabled } = useEsqlAvailability(); + const { isTimelineEsqlEnabledByFeatureFlag, isEsqlAdvancedSettingEnabled } = + useEsqlAvailability(); const timelineESQLSavedSearch = useShallowEqualSelector((state) => selectTimelineESQLSavedSearchId(state, timelineId) ); - const shouldShowESQLTab = isESQLTabInTimelineEnabled || timelineESQLSavedSearch != null; + const shouldShowESQLTab = useMemo(() => { + // disabling esql feature from feature flag should unequivocally hide the tab + // irrespective of the fact that the advanced setting is enabled or + // not or existing esql query is present or not + if (!isTimelineEsqlEnabledByFeatureFlag) { + return false; + } + return isEsqlAdvancedSettingEnabled || timelineESQLSavedSearch != null; + }, [isEsqlAdvancedSettingEnabled, isTimelineEsqlEnabledByFeatureFlag, timelineESQLSavedSearch]); const aiAssistantFlyoutMode = useIsExperimentalFeatureEnabled('aiAssistantFlyoutMode'); const getTab = useCallback( (tab: TimelineTabs) => { @@ -271,14 +280,24 @@ const TabsContentComponent: React.FC = ({ const getAppNotes = useMemo(() => getNotesSelector(), []); const getTimelineNoteIds = useMemo(() => getNoteIdsSelector(), []); const getTimelinePinnedEventNotes = useMemo(() => getEventIdToNoteIdsSelector(), []); - const { isESQLTabInTimelineEnabled } = useEsqlAvailability(); + const { isEsqlAdvancedSettingEnabled, isTimelineEsqlEnabledByFeatureFlag } = + useEsqlAvailability(); + const timelineESQLSavedSearch = useShallowEqualSelector((state) => selectTimelineESQLSavedSearchId(state, timelineId) ); const activeTab = useShallowEqualSelector((state) => getActiveTab(state, timelineId)); const showTimeline = useShallowEqualSelector((state) => getShowTimeline(state, timelineId)); - const shouldShowESQLTab = isESQLTabInTimelineEnabled || timelineESQLSavedSearch != null; + const shouldShowESQLTab = useMemo(() => { + // disabling esql feature from feature flag should unequivocally hide the tab + // irrespective of the fact that the advanced setting is enabled or + // not or existing esql query is present or not + if (!isTimelineEsqlEnabledByFeatureFlag) { + return false; + } + return isEsqlAdvancedSettingEnabled || timelineESQLSavedSearch != null; + }, [isEsqlAdvancedSettingEnabled, isTimelineEsqlEnabledByFeatureFlag, timelineESQLSavedSearch]); const numberOfPinnedEvents = useShallowEqualSelector((state) => getNumberOfPinnedEvents(state, timelineId) From 731cfc84b60d40538630736c1587851b873160bb Mon Sep 17 00:00:00 2001 From: Julia Rechkunova Date: Wed, 8 May 2024 08:28:19 +0200 Subject: [PATCH 48/86] [Discover] Unskip data grid serverless tests (#182810) - Closes https://github.com/elastic/kibana/issues/182125 - Closes https://github.com/elastic/kibana/issues/182126 25x https://buildkite.com/elastic/kibana-flaky-test-suite-runner/builds/5869 --- .../test_suites/common/discover/group2/_data_grid_doc_table.ts | 3 +-- .../functional/test_suites/common/discover/group2/index.ts | 3 +-- 2 files changed, 2 insertions(+), 4 deletions(-) diff --git a/x-pack/test_serverless/functional/test_suites/common/discover/group2/_data_grid_doc_table.ts b/x-pack/test_serverless/functional/test_suites/common/discover/group2/_data_grid_doc_table.ts index 3745b1223d615..2ca4c5f856937 100644 --- a/x-pack/test_serverless/functional/test_suites/common/discover/group2/_data_grid_doc_table.ts +++ b/x-pack/test_serverless/functional/test_suites/common/discover/group2/_data_grid_doc_table.ts @@ -33,8 +33,7 @@ export default function ({ getService, getPageObjects }: FtrProviderContext) { const testSubjects = getService('testSubjects'); const security = getService('security'); - // FLAKY: https://github.com/elastic/kibana/issues/182125 - describe.skip('discover data grid doc table', function describeIndexTests() { + describe('discover data grid doc table', function describeIndexTests() { before(async function () { await security.testUser.setRoles(['kibana_admin', 'test_logstash_reader']); log.debug('load kibana index with default index pattern'); diff --git a/x-pack/test_serverless/functional/test_suites/common/discover/group2/index.ts b/x-pack/test_serverless/functional/test_suites/common/discover/group2/index.ts index be8a043327a7d..658b92845ffca 100644 --- a/x-pack/test_serverless/functional/test_suites/common/discover/group2/index.ts +++ b/x-pack/test_serverless/functional/test_suites/common/discover/group2/index.ts @@ -11,8 +11,7 @@ export default function ({ getService, loadTestFile }: FtrProviderContext) { const esArchiver = getService('esArchiver'); const browser = getService('browser'); - // FLAKY: https://github.com/elastic/kibana/issues/182126 - describe.skip('discover/group2', function () { + describe('discover/group2', function () { before(async function () { await browser.setWindowSize(1600, 1200); }); From 120bda4ce96268859c3971e9b43bce0fbf4617a3 Mon Sep 17 00:00:00 2001 From: Stratoula Kalafateli Date: Wed, 8 May 2024 09:16:32 +0200 Subject: [PATCH 49/86] Removes dashboard dependency from maps (#182713) ## Summary The maps plugin is the last consumer of the `allowByValueEmbeddables `. This PR removes it from the plugin. Note: The remaining part is to remove it from the dashboards plugin but I will leave it to the dashboard team to handle it as removing the `dashboard.allowByValueEmbeddables` yml setting might be considered a breaking change. --------- Co-authored-by: kibanamachine <42973632+kibanamachine@users.noreply.github.com> --- x-pack/plugins/maps/kibana.jsonc | 1 - x-pack/plugins/maps/public/kibana_services.ts | 3 --- x-pack/plugins/maps/public/plugin.ts | 2 -- .../maps/public/routes/map_page/saved_map/saved_map.ts | 6 ++---- .../plugins/maps/public/routes/map_page/top_nav_config.tsx | 3 +-- x-pack/plugins/maps/tsconfig.json | 1 - 6 files changed, 3 insertions(+), 13 deletions(-) diff --git a/x-pack/plugins/maps/kibana.jsonc b/x-pack/plugins/maps/kibana.jsonc index fb0472100e1c2..97b8d1b9cddc2 100644 --- a/x-pack/plugins/maps/kibana.jsonc +++ b/x-pack/plugins/maps/kibana.jsonc @@ -24,7 +24,6 @@ "navigation", "expressions", "visualizations", - "dashboard", "embeddable", "mapsEms", "share", diff --git a/x-pack/plugins/maps/public/kibana_services.ts b/x-pack/plugins/maps/public/kibana_services.ts index 398ff8630f8be..6212c28c60f66 100644 --- a/x-pack/plugins/maps/public/kibana_services.ts +++ b/x-pack/plugins/maps/public/kibana_services.ts @@ -104,6 +104,3 @@ export const getEMSSettings: () => EMSSettings = () => { export const getEmsTileLayerId = () => mapsEms.config.emsTileLayerId; export const getShareService = () => pluginsStart.share; - -export const getIsAllowByValueEmbeddables = () => - pluginsStart.dashboard.dashboardFeatureFlagConfig.allowByValueEmbeddables; diff --git a/x-pack/plugins/maps/public/plugin.ts b/x-pack/plugins/maps/public/plugin.ts index 2eaabaa00aaf6..19ff39b76dd0b 100644 --- a/x-pack/plugins/maps/public/plugin.ts +++ b/x-pack/plugins/maps/public/plugin.ts @@ -10,7 +10,6 @@ import type { Setup as InspectorSetupContract } from '@kbn/inspector-plugin/publ import type { UiActionsStart } from '@kbn/ui-actions-plugin/public'; import type { NavigationPublicPluginStart } from '@kbn/navigation-plugin/public'; import type { Start as InspectorStartContract } from '@kbn/inspector-plugin/public'; -import type { DashboardStart } from '@kbn/dashboard-plugin/public'; import type { UsageCollectionSetup } from '@kbn/usage-collection-plugin/public'; import type { FieldFormatsStart } from '@kbn/field-formats-plugin/public'; import type { @@ -125,7 +124,6 @@ export interface MapsPluginStartDependencies { uiActions: UiActionsStart; share: SharePluginStart; visualizations: VisualizationsStart; - dashboard: DashboardStart; savedObjectsTagging?: SavedObjectTaggingPluginStart; presentationUtil: PresentationUtilPluginStart; security?: SecurityPluginStart; diff --git a/x-pack/plugins/maps/public/routes/map_page/saved_map/saved_map.ts b/x-pack/plugins/maps/public/routes/map_page/saved_map/saved_map.ts index b1118fcbf00e8..4d7273c3fd4b2 100644 --- a/x-pack/plugins/maps/public/routes/map_page/saved_map/saved_map.ts +++ b/x-pack/plugins/maps/public/routes/map_page/saved_map/saved_map.ts @@ -41,7 +41,6 @@ import { getCoreChrome, getIndexPatternService, getToasts, - getIsAllowByValueEmbeddables, getSavedObjectsTagging, getTimeFilter, getUsageCollection, @@ -386,8 +385,7 @@ export class SavedMap { public hasSaveAndReturnConfig() { const hasOriginatingApp = this.hasOriginatingApp(); - const isNewMap = !this.getSavedObjectId(); - return getIsAllowByValueEmbeddables() ? hasOriginatingApp : !isNewMap && hasOriginatingApp; + return hasOriginatingApp; } public getTitle(): string { @@ -439,7 +437,7 @@ export class SavedMap { public isByValue(): boolean { const hasSavedObjectId = !!this.getSavedObjectId(); - return getIsAllowByValueEmbeddables() && !!this._originatingApp && !hasSavedObjectId; + return !!this._originatingApp && !hasSavedObjectId; } public async save({ diff --git a/x-pack/plugins/maps/public/routes/map_page/top_nav_config.tsx b/x-pack/plugins/maps/public/routes/map_page/top_nav_config.tsx index 0aabdf877cd42..221d90ac4f2ca 100644 --- a/x-pack/plugins/maps/public/routes/map_page/top_nav_config.tsx +++ b/x-pack/plugins/maps/public/routes/map_page/top_nav_config.tsx @@ -21,7 +21,6 @@ import { ScopedHistory } from '@kbn/core/public'; import { getNavigateToApp, getMapsCapabilities, - getIsAllowByValueEmbeddables, getInspector, getCoreOverlays, getSavedObjectsTagging, @@ -215,7 +214,7 @@ export function getTopNavConfig({ let saveModal; - if (savedMap.hasOriginatingApp() || !getIsAllowByValueEmbeddables()) { + if (savedMap.hasOriginatingApp()) { saveModal = ( Date: Wed, 8 May 2024 00:54:58 -0700 Subject: [PATCH 50/86] [Fleet] Relax privileges for Integrations Settings & Config tab (#182869) ## Summary Resolves https://github.com/elastic/kibana/issues/181131. This PR enforces the following privileges: - Read access to integrations to view Integration > Settings - `writeIntegrationPolicies` and all access to integrations to make changes in Integration > Settings (including marking an integration as auto-upgrade at API level) - Read access to integrations & access to add agents to view Integrations > Config --- x-pack/plugins/fleet/common/authz.ts | 4 +-- .../sections/epm/screens/detail/index.tsx | 4 ++- .../epm/screens/detail/settings/settings.tsx | 29 ++++++++++--------- .../plugins/fleet/server/routes/epm/index.ts | 4 +-- .../translations/translations/fr-FR.json | 1 - .../translations/translations/ja-JP.json | 1 - .../translations/translations/zh-CN.json | 1 - 7 files changed, 22 insertions(+), 22 deletions(-) diff --git a/x-pack/plugins/fleet/common/authz.ts b/x-pack/plugins/fleet/common/authz.ts index 8c5868616e2d4..463ab7dc90c97 100644 --- a/x-pack/plugins/fleet/common/authz.ts +++ b/x-pack/plugins/fleet/common/authz.ts @@ -158,8 +158,8 @@ export const calculateAuthz = ({ removePackages: writeIntegrationPolicies && integrations.all, uploadPackages: writeIntegrationPolicies && integrations.all, - readPackageSettings: hasFleetAll && integrations.all, - writePackageSettings: hasFleetAll && integrations.all, + readPackageSettings: integrations.read, + writePackageSettings: writeIntegrationPolicies && integrations.all, readIntegrationPolicies, writeIntegrationPolicies, diff --git a/x-pack/plugins/fleet/public/applications/integrations/sections/epm/screens/detail/index.tsx b/x-pack/plugins/fleet/public/applications/integrations/sections/epm/screens/detail/index.tsx index 8e594f6c8d7d9..c688da76819d4 100644 --- a/x-pack/plugins/fleet/public/applications/integrations/sections/epm/screens/detail/index.tsx +++ b/x-pack/plugins/fleet/public/applications/integrations/sections/epm/screens/detail/index.tsx @@ -137,6 +137,7 @@ export function Detail() { const prerelease = useMemo(() => Boolean(queryParams.get('prerelease')), [queryParams]); const authz = useAuthz(); + const canAddAgent = authz.fleet.addAgents; const canInstallPackages = authz.integrations.installPackages; const canReadPackageSettings = authz.integrations.readPackageSettings; const canReadIntegrationPolicies = authz.integrations.readIntegrationPolicies; @@ -268,7 +269,8 @@ export function Detail() { useUIExtension(packageInfoData?.item?.name ?? '', 'package-detail-custom') !== undefined; // Only show config tab if package has `inputs` - const showConfigTab = packageInfo ? packageToPackagePolicyInputs(packageInfo).length > 0 : false; + const showConfigTab = + canAddAgent && (packageInfo ? packageToPackagePolicyInputs(packageInfo).length > 0 : false); // Only show API references tab if it is allowed & has documentation to show const showDocumentationTab = diff --git a/x-pack/plugins/fleet/public/applications/integrations/sections/epm/screens/detail/settings/settings.tsx b/x-pack/plugins/fleet/public/applications/integrations/sections/epm/screens/detail/settings/settings.tsx index 5c7d73f3e6794..aa722b5eb8d48 100644 --- a/x-pack/plugins/fleet/public/applications/integrations/sections/epm/screens/detail/settings/settings.tsx +++ b/x-pack/plugins/fleet/public/applications/integrations/sections/epm/screens/detail/settings/settings.tsx @@ -81,20 +81,21 @@ const UpdatesAvailableMsg = ({ defaultMessage: 'New version available', })} > - - - - - -

- {'View changelog.'} -

-
-
+ + + + ), + }} + /> ); diff --git a/x-pack/plugins/fleet/server/routes/epm/index.ts b/x-pack/plugins/fleet/server/routes/epm/index.ts index 7d2a756ffd6de..9108ab1df32df 100644 --- a/x-pack/plugins/fleet/server/routes/epm/index.ts +++ b/x-pack/plugins/fleet/server/routes/epm/index.ts @@ -192,7 +192,7 @@ export const registerRoutes = (router: FleetAuthzRouter) => { .put({ path: EPM_API_ROUTES.INFO_PATTERN, fleetAuthz: { - integrations: { upgradePackages: true, writePackageSettings: true }, + integrations: { writePackageSettings: true }, }, }) .addVersion( @@ -359,7 +359,7 @@ export const registerRoutes = (router: FleetAuthzRouter) => { path: EPM_API_ROUTES.INFO_PATTERN_DEPRECATED, fleetAuthz: { - integrations: { upgradePackages: true, writePackageSettings: true }, + integrations: { writePackageSettings: true }, }, }) .addVersion( diff --git a/x-pack/plugins/translations/translations/fr-FR.json b/x-pack/plugins/translations/translations/fr-FR.json index 3096ecc47cec2..4814b1be2d6a2 100644 --- a/x-pack/plugins/translations/translations/fr-FR.json +++ b/x-pack/plugins/translations/translations/fr-FR.json @@ -17660,7 +17660,6 @@ "xpack.fleet.fleetServerSetupPermissionDeniedErrorMessage": "Le serveur Fleet doit être configuré. Pour cela, le privilège de cluster {roleName} est requis. Contactez votre administrateur.", "xpack.fleet.googleCloudShell.guide.description": "La commande Google Cloud Shell ci-dessous permet de créer toutes les ressources nécessaires à l'évaluation de la sécurité de vos projets GCP. En savoir plus sur {learnMore}.", "xpack.fleet.homeIntegration.tutorialModule.noticeText": "{notePrefix} Une version plus récente de ce module est {availableAsIntegrationLink}. Pour en savoir plus sur les intégrations et le nouvel agent Elastic Agent, lisez notre {blogPostLink}.", - "xpack.fleet.integration.settings.versionInfo.updatesAvailableBody": "Passez à la version {latestVersion} pour bénéficier des fonctionnalités les plus récentes.", "xpack.fleet.integrations.confirmUpdateModal.body.agentCount": "{agentCount, plural, one {# agent} other {# agents}}", "xpack.fleet.integrations.confirmUpdateModal.body.policyCount": "{packagePolicyCount, plural, one {# politique d’intégration} other {# politiques d’intégration}}", "xpack.fleet.integrations.installPackage.installingPackageButtonLabel": "Installation des ressources {title} en cours", diff --git a/x-pack/plugins/translations/translations/ja-JP.json b/x-pack/plugins/translations/translations/ja-JP.json index ddb0f672e86a0..31af4836bd0ff 100644 --- a/x-pack/plugins/translations/translations/ja-JP.json +++ b/x-pack/plugins/translations/translations/ja-JP.json @@ -17637,7 +17637,6 @@ "xpack.fleet.fleetServerSetupPermissionDeniedErrorMessage": "Fleetサーバーを設定する必要があります。これには{roleName}クラスター権限が必要です。管理者にお問い合わせください。", "xpack.fleet.googleCloudShell.guide.description": "以下のGoogle Cloud Shellコマンドは、GCPプロジェクトのセキュリティ態勢を評価するために必要なすべてのリソースを作成します。{learnMore}の詳細をご覧ください。", "xpack.fleet.homeIntegration.tutorialModule.noticeText": "{notePrefix}このモジュールの新しいバージョンは{availableAsIntegrationLink}です。統合と新しいElasticエージェントの詳細については、{blogPostLink}をお読みください。", - "xpack.fleet.integration.settings.versionInfo.updatesAvailableBody": "バージョン{latestVersion}にアップグレードして最新の機能を入手してください。", "xpack.fleet.integrations.confirmUpdateModal.body.agentCount": "{agentCount, plural, other {# 個のエージェント}}", "xpack.fleet.integrations.confirmUpdateModal.body.policyCount": "{packagePolicyCount, plural, other {# 個の統合ポリシー}}", "xpack.fleet.integrations.installPackage.installingPackageButtonLabel": "{title} アセットをインストールしています", diff --git a/x-pack/plugins/translations/translations/zh-CN.json b/x-pack/plugins/translations/translations/zh-CN.json index 4049a2bfb6b91..ba71fe0550888 100644 --- a/x-pack/plugins/translations/translations/zh-CN.json +++ b/x-pack/plugins/translations/translations/zh-CN.json @@ -17665,7 +17665,6 @@ "xpack.fleet.fleetServerSetupPermissionDeniedErrorMessage": "需要设置 Fleet 服务器。这需要 {roleName} 集群权限。请联系您的管理员。", "xpack.fleet.googleCloudShell.guide.description": "以下 Google Cloud Shell 命令将创建所有必要资源来评估您的 GCP 组织的安全态势。详细了解 {learnMore}。", "xpack.fleet.homeIntegration.tutorialModule.noticeText": "{notePrefix} 此模块的较新版本为 {availableAsIntegrationLink}。要详细了解集成和新 Elastic 代理,请阅读我们的{blogPostLink}。", - "xpack.fleet.integration.settings.versionInfo.updatesAvailableBody": "升级到版本 {latestVersion} 可获取最新功能。", "xpack.fleet.integrations.confirmUpdateModal.body.agentCount": "{agentCount, plural, other {# 个代理}}", "xpack.fleet.integrations.confirmUpdateModal.body.policyCount": "{packagePolicyCount, plural, other {# 个集成策略}}", "xpack.fleet.integrations.installPackage.installingPackageButtonLabel": "正在安装 {title} 资产", From f5854558d3b8511e43a80d99df592be3d7fa0641 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Cau=C3=AA=20Marcondes?= <55978943+cauemarcondes@users.noreply.github.com> Date: Wed, 8 May 2024 09:31:09 +0100 Subject: [PATCH 51/86] [Logs] Adding data access plugin (#181823) closes https://github.com/elastic/kibana/issues/181813 - Adds new logs_data_access plugin - Adds Logs rates services that returns: ``` [serviceName]: { logRate: number | null; logErrorRate: number | null; } ``` --------- Co-authored-by: kibanamachine <42973632+kibanamachine@users.noreply.github.com> --- .github/CODEOWNERS | 1 + docs/developer/plugin-list.asciidoc | 4 + package.json | 1 + .../src/scenarios/traces_logs_assets.ts | 48 ++++++-- tsconfig.base.json | 2 + .../logs_data_access/README.md | 5 + .../logs_data_access/jest.config.js | 14 +++ .../logs_data_access/kibana.jsonc | 16 +++ .../logs_data_access/server/index.ts | 15 +++ .../logs_data_access/server/plugin.ts | 47 ++++++++ .../services/get_logs_rates_service/index.ts | 104 ++++++++++++++++++ .../get_logs_rates_service/utils.test.ts | 39 +++++++ .../services/get_logs_rates_service/utils.ts | 29 +++++ .../server/services/register_services.ts | 20 ++++ .../logs_data_access/server/types.ts | 20 ++++ .../logs_data_access/tsconfig.json | 14 +++ yarn.lock | 4 + 17 files changed, 373 insertions(+), 10 deletions(-) create mode 100644 x-pack/plugins/observability_solution/logs_data_access/README.md create mode 100644 x-pack/plugins/observability_solution/logs_data_access/jest.config.js create mode 100644 x-pack/plugins/observability_solution/logs_data_access/kibana.jsonc create mode 100644 x-pack/plugins/observability_solution/logs_data_access/server/index.ts create mode 100644 x-pack/plugins/observability_solution/logs_data_access/server/plugin.ts create mode 100644 x-pack/plugins/observability_solution/logs_data_access/server/services/get_logs_rates_service/index.ts create mode 100644 x-pack/plugins/observability_solution/logs_data_access/server/services/get_logs_rates_service/utils.test.ts create mode 100644 x-pack/plugins/observability_solution/logs_data_access/server/services/get_logs_rates_service/utils.ts create mode 100644 x-pack/plugins/observability_solution/logs_data_access/server/services/register_services.ts create mode 100644 x-pack/plugins/observability_solution/logs_data_access/server/types.ts create mode 100644 x-pack/plugins/observability_solution/logs_data_access/tsconfig.json diff --git a/.github/CODEOWNERS b/.github/CODEOWNERS index cdf47d35f9ceb..7ce67b0e5d954 100644 --- a/.github/CODEOWNERS +++ b/.github/CODEOWNERS @@ -532,6 +532,7 @@ examples/locator_examples @elastic/appex-sharedux examples/locator_explorer @elastic/appex-sharedux packages/kbn-logging @elastic/kibana-core packages/kbn-logging-mocks @elastic/kibana-core +x-pack/plugins/observability_solution/logs_data_access @elastic/obs-ux-logs-team x-pack/plugins/observability_solution/logs_explorer @elastic/obs-ux-logs-team x-pack/plugins/observability_solution/logs_shared @elastic/obs-ux-logs-team x-pack/plugins/logstash @elastic/logstash diff --git a/docs/developer/plugin-list.asciidoc b/docs/developer/plugin-list.asciidoc index b5a11cf016bc7..f6653998374a1 100644 --- a/docs/developer/plugin-list.asciidoc +++ b/docs/developer/plugin-list.asciidoc @@ -651,6 +651,10 @@ the infrastructure monitoring use-case within Kibana. using the CURL scripts in the scripts folder. +|{kib-repo}blob/{branch}/x-pack/plugins/observability_solution/logs_data_access/README.md[logsDataAccess] +|Exposes services to access logs data. + + |{kib-repo}blob/{branch}/x-pack/plugins/observability_solution/logs_explorer/README.md[logsExplorer] |This plugin is home to the component and related types. It implements several of the underlying concepts that the Observability Logs Explorer app builds upon. diff --git a/package.json b/package.json index 30095b1c5d591..6e385a82a6a8b 100644 --- a/package.json +++ b/package.json @@ -558,6 +558,7 @@ "@kbn/locator-explorer-plugin": "link:examples/locator_explorer", "@kbn/logging": "link:packages/kbn-logging", "@kbn/logging-mocks": "link:packages/kbn-logging-mocks", + "@kbn/logs-data-access-plugin": "link:x-pack/plugins/observability_solution/logs_data_access", "@kbn/logs-explorer-plugin": "link:x-pack/plugins/observability_solution/logs_explorer", "@kbn/logs-shared-plugin": "link:x-pack/plugins/observability_solution/logs_shared", "@kbn/logstash-plugin": "link:x-pack/plugins/logstash", diff --git a/packages/kbn-apm-synthtrace/src/scenarios/traces_logs_assets.ts b/packages/kbn-apm-synthtrace/src/scenarios/traces_logs_assets.ts index afdec115f5b9e..187be94f62e36 100644 --- a/packages/kbn-apm-synthtrace/src/scenarios/traces_logs_assets.ts +++ b/packages/kbn-apm-synthtrace/src/scenarios/traces_logs_assets.ts @@ -10,6 +10,7 @@ import { ApmFields, generateLongId, generateShortId, + infra, Instance, log, Serializable, @@ -23,16 +24,37 @@ const ENVIRONMENT = getSynthtraceEnvironment(__filename); const scenario: Scenario = async (runOptions) => { const { logger } = runOptions; - const { numServices = 3 } = runOptions.scenarioOpts || {}; + const { numServices = 3, numHosts = 10 } = runOptions.scenarioOpts || {}; return { - generate: ({ range, clients: { apmEsClient, assetsEsClient, logsEsClient } }) => { + generate: ({ + range, + clients: { apmEsClient, assetsEsClient, logsEsClient, infraEsClient }, + }) => { const transactionName = '240rpm/75% 1000ms'; const successfulTimestamps = range.interval('1m').rate(1); const failedTimestamps = range.interval('1m').rate(1); const serviceNames = [...Array(numServices).keys()].map((index) => `synth-node-${index}`); + const HOSTS = Array(numHosts) + .fill(0) + .map((_, idx) => infra.host(`my-host-${idx}`)); + + const hosts = range + .interval('30s') + .rate(1) + .generator((timestamp) => + HOSTS.flatMap((host) => [ + host.cpu().timestamp(timestamp), + host.memory().timestamp(timestamp), + host.network().timestamp(timestamp), + host.load().timestamp(timestamp), + host.filesystem().timestamp(timestamp), + host.diskio().timestamp(timestamp), + ]) + ); + const instances = serviceNames.map((serviceName) => apm .service({ name: serviceName, environment: ENVIRONMENT, agentName: 'nodejs' }) @@ -97,6 +119,12 @@ const scenario: Scenario = async (runOptions) => { return [...successfulTraceEvents, ...failedTraceEvents, ...metricsets]; }; + const MESSAGE_LOG_LEVELS = [ + { message: 'A simple log with something random in the middle', level: 'info' }, + { message: 'Yet another debug log', level: 'debug' }, + { message: 'Error with certificate: "ca_trusted_fingerprint"', level: 'error' }, + ]; + const logsWithTraces = range .interval('1m') .rate(1) @@ -104,10 +132,8 @@ const scenario: Scenario = async (runOptions) => { return Array(3) .fill(0) .map(() => { - const { message, level } = { - message: 'A simple log with something random in the middle', - level: 'info', - }; + const index = Math.floor(Math.random() * 3); + const { message, level } = MESSAGE_LOG_LEVELS[index]; const CLUSTER = { clusterId: generateShortId(), clusterName: 'synth-cluster-2', @@ -145,10 +171,8 @@ const scenario: Scenario = async (runOptions) => { return Array(3) .fill(0) .map(() => { - const { message, level } = { - message: 'A simple log with something random in the middle', - level: 'info', - }; + const index = Math.floor(Math.random() * 3); + const { message, level } = MESSAGE_LOG_LEVELS[index]; const CLUSTER = { clusterId: generateShortId(), clusterName: 'synth-cluster-2', @@ -206,6 +230,10 @@ const scenario: Scenario = async (runOptions) => { apmEsClient, logger.perf('generating_apm_events', () => tracesGen) ), + withClient( + infraEsClient, + logger.perf('generating_infra_hosts', () => hosts) + ), ]; }, }; diff --git a/tsconfig.base.json b/tsconfig.base.json index 9dddb7c5d67d5..c034da408f82f 100644 --- a/tsconfig.base.json +++ b/tsconfig.base.json @@ -1058,6 +1058,8 @@ "@kbn/logging/*": ["packages/kbn-logging/*"], "@kbn/logging-mocks": ["packages/kbn-logging-mocks"], "@kbn/logging-mocks/*": ["packages/kbn-logging-mocks/*"], + "@kbn/logs-data-access-plugin": ["x-pack/plugins/observability_solution/logs_data_access"], + "@kbn/logs-data-access-plugin/*": ["x-pack/plugins/observability_solution/logs_data_access/*"], "@kbn/logs-explorer-plugin": ["x-pack/plugins/observability_solution/logs_explorer"], "@kbn/logs-explorer-plugin/*": ["x-pack/plugins/observability_solution/logs_explorer/*"], "@kbn/logs-shared-plugin": ["x-pack/plugins/observability_solution/logs_shared"], diff --git a/x-pack/plugins/observability_solution/logs_data_access/README.md b/x-pack/plugins/observability_solution/logs_data_access/README.md new file mode 100644 index 0000000000000..a1b0505cb5934 --- /dev/null +++ b/x-pack/plugins/observability_solution/logs_data_access/README.md @@ -0,0 +1,5 @@ +# Logs data access + +Exposes services to access logs data. + +Services are registered during plugin [start](./server/plugin.ts) phase and defined in the [services](./server/services/) folder. diff --git a/x-pack/plugins/observability_solution/logs_data_access/jest.config.js b/x-pack/plugins/observability_solution/logs_data_access/jest.config.js new file mode 100644 index 0000000000000..08c16628e15ca --- /dev/null +++ b/x-pack/plugins/observability_solution/logs_data_access/jest.config.js @@ -0,0 +1,14 @@ +/* + * Copyright 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. + */ + +const path = require('path'); + +module.exports = { + preset: '@kbn/test', + rootDir: path.resolve(__dirname, '../../../..'), + roots: ['/x-pack/plugins/observability_solution/logs_data_access'], +}; diff --git a/x-pack/plugins/observability_solution/logs_data_access/kibana.jsonc b/x-pack/plugins/observability_solution/logs_data_access/kibana.jsonc new file mode 100644 index 0000000000000..0636aac3e5c96 --- /dev/null +++ b/x-pack/plugins/observability_solution/logs_data_access/kibana.jsonc @@ -0,0 +1,16 @@ +{ + "type": "plugin", + "id": "@kbn/logs-data-access-plugin", + "owner": "@elastic/obs-ux-logs-team", + "plugin": { + "id": "logsDataAccess", + "server": true, + "browser": false, + "requiredPlugins": [ + "data", + "dataViews" + ], + "optionalPlugins": [], + "requiredBundles": [] + } +} diff --git a/x-pack/plugins/observability_solution/logs_data_access/server/index.ts b/x-pack/plugins/observability_solution/logs_data_access/server/index.ts new file mode 100644 index 0000000000000..ee394c191c276 --- /dev/null +++ b/x-pack/plugins/observability_solution/logs_data_access/server/index.ts @@ -0,0 +1,15 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ +import type { PluginInitializerContext } from '@kbn/core/server'; +import type { LogsDataAccessPluginSetup, LogsDataAccessPluginStart } from './plugin'; + +export type { LogsDataAccessPluginSetup, LogsDataAccessPluginStart }; + +export async function plugin(initializerContext: PluginInitializerContext) { + const { LogsDataAccessPlugin } = await import('./plugin'); + return new LogsDataAccessPlugin(initializerContext); +} diff --git a/x-pack/plugins/observability_solution/logs_data_access/server/plugin.ts b/x-pack/plugins/observability_solution/logs_data_access/server/plugin.ts new file mode 100644 index 0000000000000..13977e869b233 --- /dev/null +++ b/x-pack/plugins/observability_solution/logs_data_access/server/plugin.ts @@ -0,0 +1,47 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import type { + CoreSetup, + CoreStart, + Logger, + Plugin, + PluginInitializerContext, +} from '@kbn/core/server'; +import { registerServices } from './services/register_services'; +import { LogsDataAccessPluginStartDeps, LogsDataAccessPluginSetupDeps } from './types'; + +export type LogsDataAccessPluginSetup = ReturnType; +export type LogsDataAccessPluginStart = ReturnType; + +export class LogsDataAccessPlugin + implements + Plugin< + LogsDataAccessPluginSetup, + LogsDataAccessPluginStart, + LogsDataAccessPluginSetupDeps, + LogsDataAccessPluginStartDeps + > +{ + private readonly logger: Logger; + + constructor(initializerContext: PluginInitializerContext) { + this.logger = initializerContext.logger.get(); + } + public setup(core: CoreSetup, plugins: LogsDataAccessPluginSetupDeps) {} + + public start(core: CoreStart, plugins: LogsDataAccessPluginStartDeps) { + const services = registerServices({ + logger: this.logger, + deps: {}, + }); + + return { + services, + }; + } +} diff --git a/x-pack/plugins/observability_solution/logs_data_access/server/services/get_logs_rates_service/index.ts b/x-pack/plugins/observability_solution/logs_data_access/server/services/get_logs_rates_service/index.ts new file mode 100644 index 0000000000000..1634270309689 --- /dev/null +++ b/x-pack/plugins/observability_solution/logs_data_access/server/services/get_logs_rates_service/index.ts @@ -0,0 +1,104 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import { ElasticsearchClient } from '@kbn/core/server'; +import { estypes } from '@elastic/elasticsearch'; +import { RegisterServicesParams } from '../register_services'; +import { getLogErrorRate, getLogRatePerMinute } from './utils'; + +export interface LogsRatesServiceParams { + esClient: ElasticsearchClient; + serviceNames: string[]; + identifyingMetadata: string; + timeFrom: number; + timeTo: number; +} + +interface LogErrorsAggregation extends estypes.AggregationsStringRareTermsBucketKeys { + logErrors: estypes.AggregationsTermsAggregateBase; +} + +interface LogRateQueryAggregation { + services: estypes.AggregationsTermsAggregateBase; +} + +export interface LogsRatesServiceReturnType { + [serviceName: string]: { + logRatePerMinute: number; + logErrorRate: null | number; + }; +} + +export function createGetLogsRatesService(params: RegisterServicesParams) { + return async ({ + esClient, + identifyingMetadata, + serviceNames, + timeFrom, + timeTo, + }: LogsRatesServiceParams): Promise => { + const esResponse = await esClient.search({ + index: 'logs-*-*', + size: 0, + query: { + bool: { + filter: [ + { + terms: { + [identifyingMetadata]: serviceNames, + }, + }, + { + range: { + ['@timestamp']: { + gte: timeFrom, + lte: timeTo, + format: 'epoch_millis', + }, + }, + }, + ], + }, + }, + aggs: { + services: { + terms: { + field: identifyingMetadata, + }, + aggs: { + logErrors: { + terms: { + field: 'log.level', + include: ['error', 'ERROR'], + }, + }, + }, + }, + }, + }); + const aggregations = esResponse.aggregations as LogRateQueryAggregation | undefined; + const buckets = aggregations?.services.buckets as LogErrorsAggregation[] | undefined; + + return buckets + ? buckets.reduce((acc, bucket) => { + const logCount = bucket.doc_count; + const logErrorBuckets = bucket.logErrors + .buckets as estypes.AggregationsStringRareTermsBucketKeys[]; + + const logErrorCount = logErrorBuckets[0]?.doc_count; + + return { + ...acc, + [bucket.key]: { + logRatePerMinute: getLogRatePerMinute({ logCount, timeFrom, timeTo }), + logErrorRate: logErrorCount ? getLogErrorRate({ logCount, logErrorCount }) : null, + }, + }; + }, {}) + : {}; + }; +} diff --git a/x-pack/plugins/observability_solution/logs_data_access/server/services/get_logs_rates_service/utils.test.ts b/x-pack/plugins/observability_solution/logs_data_access/server/services/get_logs_rates_service/utils.test.ts new file mode 100644 index 0000000000000..e1fbd84e7177b --- /dev/null +++ b/x-pack/plugins/observability_solution/logs_data_access/server/services/get_logs_rates_service/utils.test.ts @@ -0,0 +1,39 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ +import { getLogRatePerMinute, getLogErrorRate } from './utils'; + +describe('getLogRatePerMinute', () => { + it('should log rate per minute for one minute period', () => { + expect(getLogRatePerMinute({ logCount: 60, timeFrom: 0, timeTo: 60000 })).toBe(60); + }); + + it('should log rate per minute for five minutes period', () => { + expect(getLogRatePerMinute({ logCount: 60, timeFrom: 0, timeTo: 300000 })).toBe(12); + }); + + it('should handle zero log count', () => { + expect(getLogRatePerMinute({ logCount: 0, timeFrom: 0, timeTo: 60000 })).toBe(0); + }); +}); + +describe('getLogErrorRate', () => { + it('should return the correct log error rate', () => { + expect(getLogErrorRate({ logCount: 100, logErrorCount: 10 })).toBe(0.1); + }); + + it('should handle zero error count', () => { + expect(getLogErrorRate({ logCount: 100, logErrorCount: 0 })).toBe(0); + }); + + it('should handle no error count provided', () => { + expect(getLogErrorRate({ logCount: 100 })).toBe(0); + }); + + it('should handle error count exceeding log count', () => { + expect(getLogErrorRate({ logCount: 100, logErrorCount: 150 })).toBe(1.5); + }); +}); diff --git a/x-pack/plugins/observability_solution/logs_data_access/server/services/get_logs_rates_service/utils.ts b/x-pack/plugins/observability_solution/logs_data_access/server/services/get_logs_rates_service/utils.ts new file mode 100644 index 0000000000000..c56f7114999ad --- /dev/null +++ b/x-pack/plugins/observability_solution/logs_data_access/server/services/get_logs_rates_service/utils.ts @@ -0,0 +1,29 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +export function getLogRatePerMinute({ + logCount, + timeFrom, + timeTo, +}: { + logCount: number; + timeFrom: number; + timeTo: number; +}) { + const durationAsMinutes = (timeTo - timeFrom) / 1000 / 60; + return logCount / durationAsMinutes; +} + +export function getLogErrorRate({ + logCount, + logErrorCount = 0, +}: { + logCount: number; + logErrorCount?: number; +}) { + return logErrorCount / logCount; +} diff --git a/x-pack/plugins/observability_solution/logs_data_access/server/services/register_services.ts b/x-pack/plugins/observability_solution/logs_data_access/server/services/register_services.ts new file mode 100644 index 0000000000000..c35b30783b5f4 --- /dev/null +++ b/x-pack/plugins/observability_solution/logs_data_access/server/services/register_services.ts @@ -0,0 +1,20 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import { Logger } from '@kbn/logging'; +import { createGetLogsRatesService } from './get_logs_rates_service'; + +export interface RegisterServicesParams { + logger: Logger; + deps: {}; +} + +export function registerServices(params: RegisterServicesParams) { + return { + getLogsRatesService: createGetLogsRatesService(params), + }; +} diff --git a/x-pack/plugins/observability_solution/logs_data_access/server/types.ts b/x-pack/plugins/observability_solution/logs_data_access/server/types.ts new file mode 100644 index 0000000000000..12346d6ab7f57 --- /dev/null +++ b/x-pack/plugins/observability_solution/logs_data_access/server/types.ts @@ -0,0 +1,20 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ +import { + PluginSetup as DataPluginSetup, + PluginStart as DataPluginStart, +} from '@kbn/data-plugin/server'; +import { PluginStart as DataViewsPluginStart } from '@kbn/data-views-plugin/server'; + +export interface LogsDataAccessPluginSetupDeps { + data: DataPluginSetup; +} + +export interface LogsDataAccessPluginStartDeps { + data: DataPluginStart; + dataViews: DataViewsPluginStart; +} diff --git a/x-pack/plugins/observability_solution/logs_data_access/tsconfig.json b/x-pack/plugins/observability_solution/logs_data_access/tsconfig.json new file mode 100644 index 0000000000000..9bd4031c7a39e --- /dev/null +++ b/x-pack/plugins/observability_solution/logs_data_access/tsconfig.json @@ -0,0 +1,14 @@ +{ + "extends": "../../../../tsconfig.base.json", + "compilerOptions": { + "outDir": "target/types" + }, + "include": ["common/**/*", "server/**/*", "jest.config.js"], + "exclude": ["target/**/*"], + "kbn_references": [ + "@kbn/core", + "@kbn/logging", + "@kbn/data-plugin", + "@kbn/data-views-plugin", + ] +} diff --git a/yarn.lock b/yarn.lock index 17e5466fc27db..ba830c1cdb1b6 100644 --- a/yarn.lock +++ b/yarn.lock @@ -5166,6 +5166,10 @@ version "0.0.0" uid "" +"@kbn/logs-data-access-plugin@link:x-pack/plugins/observability_solution/logs_data_access": + version "0.0.0" + uid "" + "@kbn/logs-explorer-plugin@link:x-pack/plugins/observability_solution/logs_explorer": version "0.0.0" uid "" From 1798e7b7abdfa9ec505184650eeefa06c0939638 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?S=C3=B8ren=20Louv-Jansen?= Date: Wed, 8 May 2024 10:38:20 +0200 Subject: [PATCH 52/86] Add Observability AI Assistant test suites to CODEOWNERS file (#182716) This adds the Obs AI Assistant team as code owners for the api and functional tests related to Obs AI Assistant --- .github/CODEOWNERS | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/.github/CODEOWNERS b/.github/CODEOWNERS index 7ce67b0e5d954..de091b2a82ede 100644 --- a/.github/CODEOWNERS +++ b/.github/CODEOWNERS @@ -1029,6 +1029,10 @@ packages/kbn-monaco/src/esql @elastic/kibana-esql ### Observability Plugins +# Observability AI Assistant +x-pack/test/observability_ai_assistant_api_integration @elastic/obs-ai-assistant +x-pack/test/observability_ai_assistant_functional @elastic/obs-ai-assistant + # Infra Monitoring ## This plugin mostly contains the codebase for the infra services, but also includes some code for the Logs UI app. ## To keep @elastic/obs-ux-logs-team as codeowner of the plugin manifest without requiring a review for all the other code changes From 25098d9a72f97a7a35b44df3af4c323279c8bda5 Mon Sep 17 00:00:00 2001 From: elena-shostak <165678770+elena-shostak@users.noreply.github.com> Date: Wed, 8 May 2024 10:52:35 +0200 Subject: [PATCH 53/86] [Roles] Support for remote_cluster field in ES role definition (#182377) ## Summary Added support for `remote_cluster` field in ES role definition. The change is needed for running queries with `ENRICH` keyword that are sent over CCS. - Updated GET and PUT APIs, documentation and corresponding data models. - Added UI section to support the new API features. - Extracted remote clusters ComboBox to a separate component [RemoteClusterComboBox](https://github.com/elastic/kibana/pull/182377/files#diff-6b3189b6d802fd2196bcc445dc5c6021af70cf165fe3f8c4d4a5e6a4df651309R22) to share it between the remote clusters and remote index privilege views. https://github.com/elastic/kibana/assets/165678770/d3cf8b9c-e83d-4ace-ba2e-f8e028977f2d ### Checklist - [x] Any text added follows [EUI's writing guidelines](https://elastic.github.io/eui/#/guidelines/writing), uses sentence case text and includes [i18n support](https://github.com/elastic/kibana/blob/main/packages/kbn-i18n/README.md) - [x] [Documentation](https://www.elastic.co/guide/en/kibana/master/development-documentation.html) was added for features that require explanation or tutorials - [x] [Unit or functional tests](https://www.elastic.co/guide/en/kibana/master/development-tests.html) were updated or added to match the most common scenarios - [x] [Flaky Test Runner](https://ci-stats.kibana.dev/trigger_flaky_test_runner/1) was used on any tests changed ([Report](https://buildkite.com/elastic/kibana-flaky-test-suite-runner/builds/5855)) - [x] Any UI touched in this PR is usable by keyboard only (learn more about [keyboard accessibility](https://webaim.org/techniques/keyboard/)) - [x] Any UI touched in this PR does not create any new axe failures (run axe in browser: [FF](https://addons.mozilla.org/en-US/firefox/addon/axe-devtools/), [Chrome](https://chrome.google.com/webstore/detail/axe-web-accessibility-tes/lhdoppojpmngadmnindnejefpokejbdd?hl=en-US)) - [x] This renders correctly on smaller devices using a responsive layout. (You can test this [in your browser](https://www.browserstack.com/guide/responsive-testing-on-local-server)) - [x] This was checked for [cross-browser compatibility](https://www.elastic.co/support/matrix#matrix_browsers) ### For maintainers - [x] This was checked for breaking API changes and was [labeled appropriately](https://www.elastic.co/guide/en/kibana/master/contributing.html#kibana-release-notes-process) __Fixes: https://github.com/elastic/kibana/issues/182035__ ## Release note Added support for `remote_cluster` field in ES role definition. --- docs/api/role-management/put.asciidoc | 8 +- .../security/plugin_types_common/index.ts | 1 + .../src/authorization/index.ts | 1 + .../src/authorization/role.ts | 6 + .../src/licensing/license_features.ts | 5 + .../src/authorization/role_schema.ts | 13 ++ x-pack/plugins/security/common/index.ts | 1 + .../common/licensing/license_service.test.ts | 9 + .../common/licensing/license_service.ts | 3 + .../common/model/builtin_es_privileges.ts | 1 + .../role_mappings/role_mappings_api_client.ts | 1 + .../roles/edit_role/edit_role_page.tsx | 5 +- .../elasticsearch_privileges.test.tsx.snap | 4 + .../index_privileges.test.tsx.snap | 1 + .../remote_cluster_privileges.test.tsx.snap | 52 +++++ ...mote_cluster_privileges_form.test.tsx.snap | 116 +++++++++++ .../remote_clusters_combo_box.test.tsx.snap | 146 ++++++++++++++ .../privileges/es/cluster_privileges.test.tsx | 3 + .../es/elasticsearch_privileges.test.tsx | 17 +- .../es/elasticsearch_privileges.tsx | 37 ++++ .../es/index_privilege_form.test.tsx | 64 ------ .../privileges/es/index_privilege_form.tsx | 46 +---- .../privileges/es/index_privileges.test.tsx | 4 + .../es/remote_cluster_privileges.test.tsx | 175 +++++++++++++++++ .../es/remote_cluster_privileges.tsx | 147 ++++++++++++++ .../remote_cluster_privileges_form.test.tsx | 182 ++++++++++++++++++ .../es/remote_cluster_privileges_form.tsx | 170 ++++++++++++++++ .../es/remote_clusters_combo_box.test.tsx | 106 ++++++++++ .../es/remote_clusters_combo_box.tsx | 87 +++++++++ .../roles/edit_role/validate_role.ts | 85 +++++++- .../roles/elasticsearch_role.test.ts | 11 ++ .../authorization/roles/elasticsearch_role.ts | 2 + .../privilege_deprecations.test.ts | 2 + .../authorization/privileges/get_builtin.ts | 5 +- .../roles/model/put_payload.test.ts | 82 +++++++- .../authorization/roles/model/put_payload.ts | 2 + .../routes/authorization/roles/put.test.ts | 55 ++++++ .../routes/role_mapping/feature_check.test.ts | 7 + .../routes/role_mapping/feature_check.ts | 3 +- .../server/routes/views/login.test.ts | 1 + .../apis/security/builtin_es_privileges.ts | 2 +- x-pack/test/functional/apps/security/index.ts | 1 + .../security/remote_cluster_security_roles.ts | 90 +++++++++ .../functional/page_objects/security_page.ts | 65 ++++++- 44 files changed, 1694 insertions(+), 130 deletions(-) create mode 100644 x-pack/plugins/security/public/management/roles/edit_role/privileges/es/__snapshots__/remote_cluster_privileges.test.tsx.snap create mode 100644 x-pack/plugins/security/public/management/roles/edit_role/privileges/es/__snapshots__/remote_cluster_privileges_form.test.tsx.snap create mode 100644 x-pack/plugins/security/public/management/roles/edit_role/privileges/es/__snapshots__/remote_clusters_combo_box.test.tsx.snap create mode 100644 x-pack/plugins/security/public/management/roles/edit_role/privileges/es/remote_cluster_privileges.test.tsx create mode 100644 x-pack/plugins/security/public/management/roles/edit_role/privileges/es/remote_cluster_privileges.tsx create mode 100644 x-pack/plugins/security/public/management/roles/edit_role/privileges/es/remote_cluster_privileges_form.test.tsx create mode 100644 x-pack/plugins/security/public/management/roles/edit_role/privileges/es/remote_cluster_privileges_form.tsx create mode 100644 x-pack/plugins/security/public/management/roles/edit_role/privileges/es/remote_clusters_combo_box.test.tsx create mode 100644 x-pack/plugins/security/public/management/roles/edit_role/privileges/es/remote_clusters_combo_box.tsx create mode 100644 x-pack/test/functional/apps/security/remote_cluster_security_roles.ts diff --git a/docs/api/role-management/put.asciidoc b/docs/api/role-management/put.asciidoc index 5061276078295..ce293f75b63ae 100644 --- a/docs/api/role-management/put.asciidoc +++ b/docs/api/role-management/put.asciidoc @@ -26,7 +26,7 @@ To use the create or update role API, you must have the `manage_security` cluste `elasticsearch`:: (Optional, object) {es} cluster and index privileges. Valid keys include - `cluster`, `indices`, `remote_indices`, and `run_as`. For more information, see + `cluster`, `indices`, `remote_indices`, `remote_cluster`, and `run_as`. For more information, see {ref}/defining-roles.html[Defining roles]. `kibana`:: @@ -210,6 +210,12 @@ $ curl -X PUT api/security/role/my_kibana_role "names": [ "remote_index1", "remote_index2" ], "privileges": [ "all" ] } + ], + "remote_cluster": [ + { + "clusters": [ "remote_cluster1" ], + "privileges": [ "monitor_enrich" ] + } ] }, "kibana": [ diff --git a/x-pack/packages/security/plugin_types_common/index.ts b/x-pack/packages/security/plugin_types_common/index.ts index c5771f6982807..9d4d690e524a0 100644 --- a/x-pack/packages/security/plugin_types_common/index.ts +++ b/x-pack/packages/security/plugin_types_common/index.ts @@ -16,6 +16,7 @@ export type { RoleIndexPrivilege, RoleKibanaPrivilege, RoleRemoteIndexPrivilege, + RoleRemoteClusterPrivilege, FeaturesPrivileges, } from './src/authorization'; export type { SecurityLicense, SecurityLicenseFeatures, LoginLayout } from './src/licensing'; diff --git a/x-pack/packages/security/plugin_types_common/src/authorization/index.ts b/x-pack/packages/security/plugin_types_common/src/authorization/index.ts index 29cb395ccfe4f..89857a18865af 100644 --- a/x-pack/packages/security/plugin_types_common/src/authorization/index.ts +++ b/x-pack/packages/security/plugin_types_common/src/authorization/index.ts @@ -11,4 +11,5 @@ export type { RoleKibanaPrivilege, RoleIndexPrivilege, RoleRemoteIndexPrivilege, + RoleRemoteClusterPrivilege, } from './role'; diff --git a/x-pack/packages/security/plugin_types_common/src/authorization/role.ts b/x-pack/packages/security/plugin_types_common/src/authorization/role.ts index cce0b811c5875..3a20b64d4d06c 100644 --- a/x-pack/packages/security/plugin_types_common/src/authorization/role.ts +++ b/x-pack/packages/security/plugin_types_common/src/authorization/role.ts @@ -28,11 +28,17 @@ export interface RoleKibanaPrivilege { _reserved?: string[]; } +export interface RoleRemoteClusterPrivilege { + clusters: string[]; + privileges: string[]; +} + export interface Role { name: string; description?: string; elasticsearch: { cluster: string[]; + remote_cluster?: RoleRemoteClusterPrivilege[]; indices: RoleIndexPrivilege[]; remote_indices?: RoleRemoteIndexPrivilege[]; run_as: string[]; diff --git a/x-pack/packages/security/plugin_types_common/src/licensing/license_features.ts b/x-pack/packages/security/plugin_types_common/src/licensing/license_features.ts index c5f05c83c8e48..58fb081a5760d 100644 --- a/x-pack/packages/security/plugin_types_common/src/licensing/license_features.ts +++ b/x-pack/packages/security/plugin_types_common/src/licensing/license_features.ts @@ -59,6 +59,11 @@ export interface SecurityLicenseFeatures { */ readonly allowRoleRemoteIndexPrivileges: boolean; + /** + * Indicates whether we allow users to define remote cluster privileges in roles. + */ + readonly allowRemoteClusterPrivileges: boolean; + /** * Indicates whether we allow Role-based access control (RBAC). */ diff --git a/x-pack/packages/security/plugin_types_server/src/authorization/role_schema.ts b/x-pack/packages/security/plugin_types_server/src/authorization/role_schema.ts index ea7f896927905..3d673fa25dc5f 100644 --- a/x-pack/packages/security/plugin_types_server/src/authorization/role_schema.ts +++ b/x-pack/packages/security/plugin_types_server/src/authorization/role_schema.ts @@ -22,6 +22,19 @@ export const elasticsearchRoleSchema = schema.object({ */ cluster: schema.maybe(schema.arrayOf(schema.string())), + /** + * An optional list of remote cluster privileges. These privileges define the remote cluster level actions that + * users with this role are able to execute + */ + remote_cluster: schema.maybe( + schema.arrayOf( + schema.object({ + privileges: schema.arrayOf(schema.string(), { minSize: 1 }), + clusters: schema.arrayOf(schema.string(), { minSize: 1 }), + }) + ) + ), + /** * An optional list of indices permissions entries. */ diff --git a/x-pack/plugins/security/common/index.ts b/x-pack/plugins/security/common/index.ts index de3e6e8cac0ca..1a767f778fb7a 100644 --- a/x-pack/plugins/security/common/index.ts +++ b/x-pack/plugins/security/common/index.ts @@ -31,6 +31,7 @@ export type { RoleIndexPrivilege, RoleKibanaPrivilege, RoleRemoteIndexPrivilege, + RoleRemoteClusterPrivilege, FeaturesPrivileges, LoginLayout, SecurityLicenseFeatures, diff --git a/x-pack/plugins/security/common/licensing/license_service.test.ts b/x-pack/plugins/security/common/licensing/license_service.test.ts index 8bf9f4a030051..f1b80db5cba2d 100644 --- a/x-pack/plugins/security/common/licensing/license_service.test.ts +++ b/x-pack/plugins/security/common/licensing/license_service.test.ts @@ -26,6 +26,7 @@ describe('license features', function () { allowRoleDocumentLevelSecurity: false, allowRoleFieldLevelSecurity: false, allowRoleRemoteIndexPrivileges: false, + allowRemoteClusterPrivileges: false, layout: 'error-es-unavailable', allowRbac: false, allowSubFeaturePrivileges: false, @@ -50,6 +51,7 @@ describe('license features', function () { allowRoleDocumentLevelSecurity: false, allowRoleFieldLevelSecurity: false, allowRoleRemoteIndexPrivileges: false, + allowRemoteClusterPrivileges: false, layout: 'error-xpack-unavailable', allowRbac: false, allowSubFeaturePrivileges: false, @@ -78,6 +80,7 @@ describe('license features', function () { "allowAuditLogging": false, "allowLogin": false, "allowRbac": false, + "allowRemoteClusterPrivileges": false, "allowRoleDocumentLevelSecurity": false, "allowRoleFieldLevelSecurity": false, "allowRoleRemoteIndexPrivileges": false, @@ -101,6 +104,7 @@ describe('license features', function () { "allowAuditLogging": true, "allowLogin": true, "allowRbac": true, + "allowRemoteClusterPrivileges": true, "allowRoleDocumentLevelSecurity": true, "allowRoleFieldLevelSecurity": true, "allowRoleRemoteIndexPrivileges": true, @@ -137,6 +141,7 @@ describe('license features', function () { allowRoleDocumentLevelSecurity: false, allowRoleFieldLevelSecurity: false, allowRoleRemoteIndexPrivileges: false, + allowRemoteClusterPrivileges: false, allowRbac: true, allowSubFeaturePrivileges: false, allowAuditLogging: false, @@ -164,6 +169,7 @@ describe('license features', function () { allowRoleDocumentLevelSecurity: false, allowRoleFieldLevelSecurity: false, allowRoleRemoteIndexPrivileges: false, + allowRemoteClusterPrivileges: false, allowRbac: false, allowSubFeaturePrivileges: false, allowAuditLogging: false, @@ -190,6 +196,7 @@ describe('license features', function () { allowRoleDocumentLevelSecurity: false, allowRoleFieldLevelSecurity: false, allowRoleRemoteIndexPrivileges: false, + allowRemoteClusterPrivileges: false, allowRbac: true, allowSubFeaturePrivileges: false, allowAuditLogging: false, @@ -216,6 +223,7 @@ describe('license features', function () { allowRoleDocumentLevelSecurity: false, allowRoleFieldLevelSecurity: false, allowRoleRemoteIndexPrivileges: false, + allowRemoteClusterPrivileges: false, allowRbac: true, allowSubFeaturePrivileges: true, allowAuditLogging: true, @@ -242,6 +250,7 @@ describe('license features', function () { allowRoleDocumentLevelSecurity: true, allowRoleFieldLevelSecurity: true, allowRoleRemoteIndexPrivileges: true, + allowRemoteClusterPrivileges: true, allowRbac: true, allowSubFeaturePrivileges: true, allowAuditLogging: true, diff --git a/x-pack/plugins/security/common/licensing/license_service.ts b/x-pack/plugins/security/common/licensing/license_service.ts index 70b84e1712e08..3066d32a72695 100644 --- a/x-pack/plugins/security/common/licensing/license_service.ts +++ b/x-pack/plugins/security/common/licensing/license_service.ts @@ -77,6 +77,7 @@ export class SecurityLicenseService { allowRoleDocumentLevelSecurity: false, allowRoleFieldLevelSecurity: false, allowRoleRemoteIndexPrivileges: false, + allowRemoteClusterPrivileges: false, allowRbac: false, allowSubFeaturePrivileges: false, allowUserProfileCollaboration: false, @@ -98,6 +99,7 @@ export class SecurityLicenseService { allowRoleDocumentLevelSecurity: false, allowRoleFieldLevelSecurity: false, allowRoleRemoteIndexPrivileges: false, + allowRemoteClusterPrivileges: false, allowRbac: false, allowSubFeaturePrivileges: false, allowUserProfileCollaboration: false, @@ -119,6 +121,7 @@ export class SecurityLicenseService { allowRoleDocumentLevelSecurity: isLicensePlatinumOrBetter, allowRoleFieldLevelSecurity: isLicensePlatinumOrBetter, allowRoleRemoteIndexPrivileges: isLicensePlatinumOrBetter, + allowRemoteClusterPrivileges: isLicensePlatinumOrBetter, allowRbac: true, allowUserProfileCollaboration: isLicenseStandardOrBetter, }; diff --git a/x-pack/plugins/security/common/model/builtin_es_privileges.ts b/x-pack/plugins/security/common/model/builtin_es_privileges.ts index b6b5791a4477d..c2b6801e52961 100644 --- a/x-pack/plugins/security/common/model/builtin_es_privileges.ts +++ b/x-pack/plugins/security/common/model/builtin_es_privileges.ts @@ -8,4 +8,5 @@ export interface BuiltinESPrivileges { cluster: string[]; index: string[]; + remote_cluster: string[]; } diff --git a/x-pack/plugins/security/public/management/role_mappings/role_mappings_api_client.ts b/x-pack/plugins/security/public/management/role_mappings/role_mappings_api_client.ts index bab0222222dec..c2b1f08d90319 100644 --- a/x-pack/plugins/security/public/management/role_mappings/role_mappings_api_client.ts +++ b/x-pack/plugins/security/public/management/role_mappings/role_mappings_api_client.ts @@ -15,6 +15,7 @@ export interface CheckRoleMappingFeaturesResponse { canUseStoredScripts: boolean; hasCompatibleRealms: boolean; canUseRemoteIndices: boolean; + canUseRemoteClusters: boolean; } type DeleteRoleMappingsResponse = Array<{ diff --git a/x-pack/plugins/security/public/management/roles/edit_role/edit_role_page.tsx b/x-pack/plugins/security/public/management/roles/edit_role/edit_role_page.tsx index 745cb2d68ab07..56fb561443e82 100644 --- a/x-pack/plugins/security/public/management/roles/edit_role/edit_role_page.tsx +++ b/x-pack/plugins/security/public/management/roles/edit_role/edit_role_page.tsx @@ -211,7 +211,7 @@ function useRole( ? rolesAPIClient.getRole(roleName) : Promise.resolve({ name: '', - elasticsearch: { cluster: [], indices: [], run_as: [] }, + elasticsearch: { cluster: [], indices: [], run_as: [], remote_cluster: [] }, kibana: [], _unrecognized_applications: [], } as Role); @@ -529,6 +529,9 @@ export const EditRolePage: FunctionComponent = ({ canUseRemoteIndices={ buildFlavor === 'traditional' && featureCheckState.value?.canUseRemoteIndices } + canUseRemoteClusters={ + buildFlavor === 'traditional' && featureCheckState.value?.canUseRemoteClusters + } isDarkMode={isDarkMode} buildFlavor={buildFlavor} /> diff --git a/x-pack/plugins/security/public/management/roles/edit_role/privileges/es/__snapshots__/elasticsearch_privileges.test.tsx.snap b/x-pack/plugins/security/public/management/roles/edit_role/privileges/es/__snapshots__/elasticsearch_privileges.test.tsx.snap index 6bd0c97b5e8ac..7732ac20b4ee9 100644 --- a/x-pack/plugins/security/public/management/roles/edit_role/privileges/es/__snapshots__/elasticsearch_privileges.test.tsx.snap +++ b/x-pack/plugins/security/public/management/roles/edit_role/privileges/es/__snapshots__/elasticsearch_privileges.test.tsx.snap @@ -59,6 +59,7 @@ exports[`it renders correctly in serverless mode 1`] = ` "elasticsearch": Object { "cluster": Array [], "indices": Array [], + "remote_cluster": Array [], "run_as": Array [], }, "kibana": Array [], @@ -141,6 +142,7 @@ exports[`it renders correctly in serverless mode 1`] = ` "elasticsearch": Object { "cluster": Array [], "indices": Array [], + "remote_cluster": Array [], "run_as": Array [], }, "kibana": Array [], @@ -215,6 +217,7 @@ exports[`it renders without crashing 1`] = ` "elasticsearch": Object { "cluster": Array [], "indices": Array [], + "remote_cluster": Array [], "run_as": Array [], }, "kibana": Array [], @@ -346,6 +349,7 @@ exports[`it renders without crashing 1`] = ` "elasticsearch": Object { "cluster": Array [], "indices": Array [], + "remote_cluster": Array [], "run_as": Array [], }, "kibana": Array [], diff --git a/x-pack/plugins/security/public/management/roles/edit_role/privileges/es/__snapshots__/index_privileges.test.tsx.snap b/x-pack/plugins/security/public/management/roles/edit_role/privileges/es/__snapshots__/index_privileges.test.tsx.snap index d99dac15df58f..c3df729a7e3ee 100644 --- a/x-pack/plugins/security/public/management/roles/edit_role/privileges/es/__snapshots__/index_privileges.test.tsx.snap +++ b/x-pack/plugins/security/public/management/roles/edit_role/privileges/es/__snapshots__/index_privileges.test.tsx.snap @@ -36,6 +36,7 @@ exports[`it renders without crashing 1`] = ` "elasticsearch": Object { "cluster": Array [], "indices": Array [], + "remote_cluster": Array [], "run_as": Array [], }, "kibana": Array [], diff --git a/x-pack/plugins/security/public/management/roles/edit_role/privileges/es/__snapshots__/remote_cluster_privileges.test.tsx.snap b/x-pack/plugins/security/public/management/roles/edit_role/privileges/es/__snapshots__/remote_cluster_privileges.test.tsx.snap new file mode 100644 index 0000000000000..e0939f7f55e02 --- /dev/null +++ b/x-pack/plugins/security/public/management/roles/edit_role/privileges/es/__snapshots__/remote_cluster_privileges.test.tsx.snap @@ -0,0 +1,52 @@ +// Jest Snapshot v1, https://goo.gl/fbAQLP + +exports[`it renders without crashing 1`] = ` + +`; diff --git a/x-pack/plugins/security/public/management/roles/edit_role/privileges/es/__snapshots__/remote_cluster_privileges_form.test.tsx.snap b/x-pack/plugins/security/public/management/roles/edit_role/privileges/es/__snapshots__/remote_cluster_privileges_form.test.tsx.snap new file mode 100644 index 0000000000000..6f48ce3b977aa --- /dev/null +++ b/x-pack/plugins/security/public/management/roles/edit_role/privileges/es/__snapshots__/remote_cluster_privileges_form.test.tsx.snap @@ -0,0 +1,116 @@ +// Jest Snapshot v1, https://goo.gl/fbAQLP + +exports[`it renders without crashing 1`] = ` + + + + + + + + + } + labelType="label" + > + + + + + + } + labelType="label" + > + + + + + + + + + + + +`; diff --git a/x-pack/plugins/security/public/management/roles/edit_role/privileges/es/__snapshots__/remote_clusters_combo_box.test.tsx.snap b/x-pack/plugins/security/public/management/roles/edit_role/privileges/es/__snapshots__/remote_clusters_combo_box.test.tsx.snap new file mode 100644 index 0000000000000..158d4882f457c --- /dev/null +++ b/x-pack/plugins/security/public/management/roles/edit_role/privileges/es/__snapshots__/remote_clusters_combo_box.test.tsx.snap @@ -0,0 +1,146 @@ +// Jest Snapshot v1, https://goo.gl/fbAQLP + +exports[`it renders without crashing 1`] = ` + + } + type="warning" + />, + "disabled": true, + "label": "test1", + }, + ] + } + selectedOptions={Array []} + singleSelection={false} + sortMatchesBy="none" +/> +`; diff --git a/x-pack/plugins/security/public/management/roles/edit_role/privileges/es/cluster_privileges.test.tsx b/x-pack/plugins/security/public/management/roles/edit_role/privileges/es/cluster_privileges.test.tsx index 81edde34b4d28..0793083ca21df 100644 --- a/x-pack/plugins/security/public/management/roles/edit_role/privileges/es/cluster_privileges.test.tsx +++ b/x-pack/plugins/security/public/management/roles/edit_role/privileges/es/cluster_privileges.test.tsx @@ -17,6 +17,7 @@ test('it renders without crashing', () => { const role: Role = { name: '', elasticsearch: { + remote_cluster: [], cluster: [], indices: [], run_as: [], @@ -39,6 +40,7 @@ test('it renders fields as disabled when not editable', () => { name: '', elasticsearch: { cluster: [], + remote_cluster: [], indices: [], run_as: [], }, @@ -61,6 +63,7 @@ test('it allows for custom cluster privileges', () => { name: '', elasticsearch: { cluster: ['existing-custom', 'monitor'], + remote_cluster: [], indices: [], run_as: [], }, diff --git a/x-pack/plugins/security/public/management/roles/edit_role/privileges/es/elasticsearch_privileges.test.tsx b/x-pack/plugins/security/public/management/roles/edit_role/privileges/es/elasticsearch_privileges.test.tsx index 3850e55f9211c..ef914c58522c0 100644 --- a/x-pack/plugins/security/public/management/roles/edit_role/privileges/es/elasticsearch_privileges.test.tsx +++ b/x-pack/plugins/security/public/management/roles/edit_role/privileges/es/elasticsearch_privileges.test.tsx @@ -30,6 +30,7 @@ function getProps() { name: '', elasticsearch: { cluster: [], + remote_cluster: [], indices: [], run_as: [], }, @@ -43,6 +44,7 @@ function getProps() { builtinESPrivileges: { cluster: ['all', 'manage', 'monitor'], index: ['all', 'read', 'write', 'index'], + remote_cluster: [], }, indicesAPIClient: indicesAPIClientMock.create(), docLinks, @@ -75,13 +77,26 @@ test('it renders remote index privileges section when `canUseRemoteIndices` is e expect(wrapper.find('IndexPrivileges[indexType="remote_indices"]')).toHaveLength(1); }); +test('it does not render remote cluster privileges section by default', () => { + const wrapper = shallowWithIntl(); + expect(wrapper.find('RemoteClusterPrivileges')).toHaveLength(0); +}); + +test('it renders remote index privileges section when `canUseRemoteClusters` is enabled', () => { + const wrapper = shallowWithIntl(); + expect(wrapper.find('RemoteClusterPrivileges')).toHaveLength(1); +}); + test('it renders fields as disabled when not editable', () => { - const wrapper = shallowWithIntl(); + const wrapper = shallowWithIntl( + + ); expect(wrapper.find('EuiComboBox').prop('isDisabled')).toBe(true); expect(wrapper.find('ClusterPrivileges').prop('editable')).toBe(false); expect( wrapper.find('IndexPrivileges').everyWhere((component) => component.prop('editable')) ).toBe(false); + expect(wrapper.find('RemoteClusterPrivileges').prop('editable')).toBe(false); }); test('it renders correctly in serverless mode', () => { diff --git a/x-pack/plugins/security/public/management/roles/edit_role/privileges/es/elasticsearch_privileges.tsx b/x-pack/plugins/security/public/management/roles/edit_role/privileges/es/elasticsearch_privileges.tsx index 0aa4900e8715b..1ff2ede4c575c 100644 --- a/x-pack/plugins/security/public/management/roles/edit_role/privileges/es/elasticsearch_privileges.tsx +++ b/x-pack/plugins/security/public/management/roles/edit_role/privileges/es/elasticsearch_privileges.tsx @@ -25,6 +25,7 @@ import type { PublicMethodsOf } from '@kbn/utility-types'; import { ClusterPrivileges } from './cluster_privileges'; import { IndexPrivileges } from './index_privileges'; +import { RemoteClusterPrivileges } from './remote_cluster_privileges'; import type { BuiltinESPrivileges, Role, SecurityLicense } from '../../../../../../common'; import type { IndicesAPIClient } from '../../../indices_api_client'; import { CollapsiblePanel } from '../../collapsible_panel'; @@ -43,6 +44,7 @@ interface Props { indexPatterns: string[]; remoteClusters?: Cluster[]; canUseRemoteIndices?: boolean; + canUseRemoteClusters?: boolean; isDarkMode?: boolean; buildFlavor: BuildFlavor; } @@ -69,6 +71,7 @@ export class ElasticsearchPrivileges extends Component { license, builtinESPrivileges, canUseRemoteIndices, + canUseRemoteClusters, buildFlavor, } = this.props; @@ -219,6 +222,40 @@ export class ElasticsearchPrivileges extends Component { /> )} + {buildFlavor === 'traditional' && canUseRemoteClusters && ( + <> + + + + +

+ +

+
+ + +

+ + {this.learnMore(docLinks.links.security.clusterPrivileges)} +

+
+ + + )} ); }; diff --git a/x-pack/plugins/security/public/management/roles/edit_role/privileges/es/index_privilege_form.test.tsx b/x-pack/plugins/security/public/management/roles/edit_role/privileges/es/index_privilege_form.test.tsx index fa1bbe2f8c447..dc7ebaf3b3069 100644 --- a/x-pack/plugins/security/public/management/roles/edit_role/privileges/es/index_privilege_form.test.tsx +++ b/x-pack/plugins/security/public/management/roles/edit_role/privileges/es/index_privilege_form.test.tsx @@ -107,70 +107,6 @@ test('should not render clusters field for local indices', () => { expect(wrapper.find('[data-test-subj="clustersInput0"]')).toHaveLength(0); }); -test('should render clusters field for remote indices', () => { - const wrapper = shallowWithIntl( - - ); - const clustersInput = wrapper.find('[data-test-subj="clustersInput0"]'); - expect(clustersInput).toHaveLength(1); - expect(clustersInput.prop('options')).toEqual([ - { label: 'test2' }, - { label: expect.anything(), isGroupLabelOption: true }, - { - label: 'test1', - disabled: true, - append: expect.anything(), - }, - ]); -}); - describe('delete button', () => { const props = { indexType: 'indices' as const, diff --git a/x-pack/plugins/security/public/management/roles/edit_role/privileges/es/index_privilege_form.tsx b/x-pack/plugins/security/public/management/roles/edit_role/privileges/es/index_privilege_form.tsx index 30e1c6423d1ff..f89195e624f5b 100644 --- a/x-pack/plugins/security/public/management/roles/edit_role/privileges/es/index_privilege_form.tsx +++ b/x-pack/plugins/security/public/management/roles/edit_role/privileges/es/index_privilege_form.tsx @@ -12,7 +12,6 @@ import { EuiFlexGroup, EuiFlexItem, EuiFormRow, - EuiIconTip, EuiPanel, EuiSpacer, EuiSwitch, @@ -27,6 +26,7 @@ import type { monaco } from '@kbn/monaco'; import type { Cluster } from '@kbn/remote-clusters-plugin/public'; import type { PublicMethodsOf } from '@kbn/utility-types'; +import { RemoteClusterComboBox } from './remote_clusters_combo_box'; import type { RoleIndexPrivilege, RoleRemoteIndexPrivilege } from '../../../../../../common'; import type { IndicesAPIClient } from '../../../indices_api_client'; import type { RoleValidator } from '../../validate_role'; @@ -125,45 +125,6 @@ export class IndexPrivilegeForm extends Component { } private getPrivilegeForm = () => { - const remoteClusterOptions: EuiComboBoxOptionOption[] = []; - if (this.props.remoteClusters) { - const incompatibleOptions: EuiComboBoxOptionOption[] = []; - this.props.remoteClusters.forEach((item, i) => { - const disabled = item.securityModel !== 'api_key'; - if (!disabled) { - remoteClusterOptions.push({ - label: item.name, - }); - } else { - incompatibleOptions.push({ - label: item.name, - disabled, - append: disabled ? ( - - } - /> - ) : undefined, - }); - } - }); - if (incompatibleOptions.length) { - remoteClusterOptions.push( - { - label: 'Incompatible clusters', - isGroupLabelOption: true, - }, - ...incompatibleOptions - ); - } - } - return ( <> @@ -181,9 +142,8 @@ export class IndexPrivilegeForm extends Component { this.props.indexPrivilege as RoleRemoteIndexPrivilege )} > - { 'xpack.security.management.editRole.indexPrivilegeForm.clustersPlaceholder', { defaultMessage: 'Add a remote cluster…' } )} + remoteClusters={this.props.remoteClusters ?? []} + type="remote_indexes" fullWidth /> diff --git a/x-pack/plugins/security/public/management/roles/edit_role/privileges/es/index_privileges.test.tsx b/x-pack/plugins/security/public/management/roles/edit_role/privileges/es/index_privileges.test.tsx index 05ddf9d7d5514..ab125c1ca7076 100644 --- a/x-pack/plugins/security/public/management/roles/edit_role/privileges/es/index_privileges.test.tsx +++ b/x-pack/plugins/security/public/management/roles/edit_role/privileges/es/index_privileges.test.tsx @@ -38,6 +38,7 @@ test('it renders without crashing', async () => { kibana: [], elasticsearch: { cluster: [], + remote_cluster: [], indices: [], run_as: [], }, @@ -75,6 +76,7 @@ test('it renders an IndexPrivilegeForm for each index privilege on the role', as kibana: [], elasticsearch: { cluster: [], + remote_cluster: [], indices: [ { names: ['foo*'], @@ -129,6 +131,7 @@ test('it renders an IndexPrivilegeForm for each remote index privilege on the ro kibana: [], elasticsearch: { cluster: [], + remote_cluster: [], indices: [], remote_indices: [ { @@ -183,6 +186,7 @@ test('it renders fields as disabled when not editable', async () => { kibana: [], elasticsearch: { cluster: [], + remote_cluster: [], indices: [ { names: ['foo*'], diff --git a/x-pack/plugins/security/public/management/roles/edit_role/privileges/es/remote_cluster_privileges.test.tsx b/x-pack/plugins/security/public/management/roles/edit_role/privileges/es/remote_cluster_privileges.test.tsx new file mode 100644 index 0000000000000..5739c0ca2e1d2 --- /dev/null +++ b/x-pack/plugins/security/public/management/roles/edit_role/privileges/es/remote_cluster_privileges.test.tsx @@ -0,0 +1,175 @@ +/* + * Copyright 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 { coreMock } from '@kbn/core/public/mocks'; +import { KibanaContextProvider } from '@kbn/kibana-react-plugin/public'; +import type { SecurityLicenseFeatures } from '@kbn/security-plugin-types-common'; +import { mountWithIntl, shallowWithIntl } from '@kbn/test-jest-helpers'; +import '@kbn/code-editor-mock/jest_helper'; + +import { RemoteClusterPrivileges } from './remote_cluster_privileges'; +import { RemoteClusterPrivilegesForm } from './remote_cluster_privileges_form'; +import { licenseMock } from '../../../../../../common/licensing/index.mock'; +import { RoleValidator } from '../../validate_role'; + +test('it renders without crashing', async () => { + const wrapper = shallowWithIntl( + + + + ); + + expect(wrapper.children()).toMatchSnapshot(); +}); + +test('it renders an RemoteClusterPrivilegesForm for each remote cluster privilege on the role', async () => { + const wrapper = mountWithIntl( + + + + ); + + expect(wrapper.find(RemoteClusterPrivilegesForm)).toHaveLength(3); +}); + +test('it renders fields as disabled when not editable', async () => { + const props = { + role: { + name: '', + kibana: [], + elasticsearch: { + cluster: [], + remote_cluster: [ + { + clusters: ['cluster1', 'cluster2'], + privileges: ['monitor_enrich'], + }, + { + clusters: ['cluster3', 'cluster4'], + privileges: ['monitor_enrich'], + }, + ], + indices: [], + run_as: [], + }, + }, + onChange: jest.fn(), + editable: false, + validator: new RoleValidator(), + availableRemoteClusterPrivileges: ['monitor_enrich'], + license: licenseMock.create(), + }; + const wrapper = mountWithIntl( + + + + ); + + expect( + wrapper + .find('RemoteClusterPrivilegesForm') + .everyWhere((component) => component.prop('isRoleReadOnly')) + ).toBe(true); +}); + +test('it renders fields as disabled when `allowRemoteClusterPrivileges` is set to false', async () => { + const license = licenseMock.create(); + + license.getFeatures.mockReturnValue({ + allowRemoteClusterPrivileges: false, + } as SecurityLicenseFeatures); + + const props = { + role: { + name: '', + kibana: [], + elasticsearch: { + cluster: [], + remote_cluster: [ + { + clusters: ['cluster1', 'cluster2'], + privileges: ['monitor_enrich'], + }, + { + clusters: ['cluster3', 'cluster4'], + privileges: ['monitor_enrich'], + }, + ], + indices: [], + run_as: [], + }, + }, + onChange: jest.fn(), + editable: false, + validator: new RoleValidator(), + availableRemoteClusterPrivileges: ['monitor_enrich'], + license: licenseMock.create(), + }; + const wrapper = mountWithIntl( + + + + ); + + expect( + wrapper + .find('RemoteClusterPrivilegesForm') + .everyWhere((component) => component.prop('isRoleReadOnly')) + ).toBe(true); +}); diff --git a/x-pack/plugins/security/public/management/roles/edit_role/privileges/es/remote_cluster_privileges.tsx b/x-pack/plugins/security/public/management/roles/edit_role/privileges/es/remote_cluster_privileges.tsx new file mode 100644 index 0000000000000..7b6096356dd63 --- /dev/null +++ b/x-pack/plugins/security/public/management/roles/edit_role/privileges/es/remote_cluster_privileges.tsx @@ -0,0 +1,147 @@ +/* + * Copyright 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 { EuiButton, EuiFlexGroup, EuiFlexItem, EuiIconTip, EuiSpacer } from '@elastic/eui'; +import React, { useCallback, useMemo } from 'react'; + +import { FormattedMessage } from '@kbn/i18n-react'; +import type { Cluster } from '@kbn/remote-clusters-plugin/public'; + +import { RemoteClusterPrivilegesForm } from './remote_cluster_privileges_form'; +import type { Role, RoleRemoteClusterPrivilege, SecurityLicense } from '../../../../../../common'; +import { isRoleReadOnly } from '../../../../../../common/model'; +import type { RoleValidator } from '../../validate_role'; + +interface Props { + remoteClusters?: Cluster[]; + role: Role; + availableRemoteClusterPrivileges: string[]; + license: SecurityLicense; + onChange: (role: Role) => void; + validator: RoleValidator; + editable?: boolean; +} + +export const RemoteClusterPrivileges: React.FunctionComponent = ({ + remoteClusters, + license, + availableRemoteClusterPrivileges, + role, + editable, + onChange, + validator, +}) => { + const remoteClusterPrivileges = useMemo(() => role.elasticsearch.remote_cluster ?? [], [role]); + const remoteClusterPrivilegesDisabled = useMemo(() => { + const { allowRemoteClusterPrivileges } = license.getFeatures(); + + return !allowRemoteClusterPrivileges; + }, [license]); + + const isReadOnly = useMemo( + () => !editable || isRoleReadOnly(role) || remoteClusterPrivilegesDisabled, + [role, editable, remoteClusterPrivilegesDisabled] + ); + + const onRoleChange = useCallback( + (remoteCluster: RoleRemoteClusterPrivilege[]) => { + const roleDraft = { + ...role, + elasticsearch: { + ...role.elasticsearch, + remote_cluster: remoteCluster, + }, + }; + + onChange(roleDraft); + }, + [onChange, role] + ); + + const addRemoteClusterPrivilege = useCallback(() => { + const newRemoteClusterPrivileges = [ + ...remoteClusterPrivileges, + { + clusters: [], + privileges: [], + }, + ]; + + onRoleChange(newRemoteClusterPrivileges); + }, [onRoleChange, remoteClusterPrivileges]); + + const onRemoteClusterPrivilegeChange = useCallback( + (privilegeIndex: number) => (updatedPrivilege: RoleRemoteClusterPrivilege) => { + const newRemoteClusterPrivileges = [...remoteClusterPrivileges]; + newRemoteClusterPrivileges[privilegeIndex] = updatedPrivilege; + + onRoleChange(newRemoteClusterPrivileges); + }, + [onRoleChange, remoteClusterPrivileges] + ); + + const onRemoteClusterPrivilegeDelete = useCallback( + (privilegeIndex: number) => () => { + const newRemoteClusterPrivileges = [...remoteClusterPrivileges]; + newRemoteClusterPrivileges.splice(privilegeIndex, 1); + + onRoleChange(newRemoteClusterPrivileges); + }, + [onRoleChange, remoteClusterPrivileges] + ); + + return ( + <> + {remoteClusterPrivileges.map((remoteClusterPrivilege, i) => ( + + ))} + {editable && ( + <> + + + + + + + + {remoteClusterPrivilegesDisabled && ( + + + } + position="right" + /> + + )} + + + )} + + ); +}; diff --git a/x-pack/plugins/security/public/management/roles/edit_role/privileges/es/remote_cluster_privileges_form.test.tsx b/x-pack/plugins/security/public/management/roles/edit_role/privileges/es/remote_cluster_privileges_form.test.tsx new file mode 100644 index 0000000000000..c1bbc330a9070 --- /dev/null +++ b/x-pack/plugins/security/public/management/roles/edit_role/privileges/es/remote_cluster_privileges_form.test.tsx @@ -0,0 +1,182 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import { EuiButtonIcon } from '@elastic/eui'; +import type { EuiComboBoxProps } from '@elastic/eui'; +import React from 'react'; + +import '@kbn/code-editor-mock/jest_helper'; +import { mountWithIntl, shallowWithIntl } from '@kbn/test-jest-helpers'; + +import { RemoteClusterPrivilegesForm } from './remote_cluster_privileges_form'; +import { RoleValidator } from '../../validate_role'; + +test('it renders without crashing', () => { + const wrapper = shallowWithIntl( + + ); + expect(wrapper).toMatchSnapshot(); +}); + +test('it allows for custom remote cluster input', () => { + const onChange = jest.fn(); + const wrapper = mountWithIntl( + + ); + + const privilegesSelect = wrapper.find( + 'EuiComboBox[data-test-subj="remoteClusterClustersInput0"]' + ); + + (privilegesSelect.props() as any).onCreateOption('custom-cluster'); + + expect(onChange).toHaveBeenCalledWith( + expect.objectContaining({ clusters: ['cluster1', 'custom-cluster'] }) + ); +}); + +test('it does not allow for custom remote cluster privileges', () => { + const onChange = jest.fn(); + const wrapper = mountWithIntl( + + ); + + const privilegesSelect = wrapper.find( + 'EuiComboBox[data-test-subj="remoteClusterPrivilegesInput0"]' + ); + + expect((privilegesSelect.props() as EuiComboBoxProps).onCreateOption).toBe(undefined); +}); + +test('it allows for custom remote cluster clusters input', () => { + const onChange = jest.fn(); + const wrapper = mountWithIntl( + + ); + + const clustersSelect = wrapper.find('EuiComboBox[data-test-subj="remoteClusterClustersInput0"]'); + + (clustersSelect.props() as any).onCreateOption('cluster2'); + + expect(onChange).toHaveBeenCalledWith( + expect.objectContaining({ clusters: ['cluster1', 'cluster2'] }) + ); +}); + +test('it renders fields as disabled when isRoleReadOnly is true', () => { + const onChange = jest.fn(); + const wrapper = mountWithIntl( + + ); + + const privilegesSelect = wrapper.find( + 'EuiComboBox[data-test-subj="remoteClusterPrivilegesInput0"]' + ); + expect(privilegesSelect.prop('isDisabled')).toBe(true); + + const clustersSelect = wrapper.find('EuiComboBox[data-test-subj="remoteClusterClustersInput0"]'); + expect(clustersSelect.prop('isDisabled')).toBe(true); +}); + +describe('delete button', () => { + const props = { + remoteClusterPrivilege: { + clusters: ['cluster1'], + privileges: ['monitor_enrich'], + }, + formIndex: 0, + availableRemoteClusterPrivileges: ['monitor_enrich'], + isRoleReadOnly: false, + validator: new RoleValidator(), + onChange: jest.fn(), + onDelete: jest.fn(), + intl: {} as any, + }; + + test('it is hidden when isRoleReadOnly is true', () => { + const testProps = { + ...props, + isRoleReadOnly: true, + }; + const wrapper = mountWithIntl(); + expect(wrapper.find(EuiButtonIcon)).toHaveLength(0); + }); + + test('it is shown when isRoleReadOnly is false', () => { + const testProps = { + ...props, + isRoleReadOnly: false, + }; + const wrapper = mountWithIntl(); + expect(wrapper.find(EuiButtonIcon)).toHaveLength(1); + }); + + test('it invokes onDelete when clicked', () => { + const testProps = { + ...props, + isRoleReadOnly: false, + }; + const wrapper = mountWithIntl(); + wrapper.find(EuiButtonIcon).simulate('click'); + expect(testProps.onDelete).toHaveBeenCalledTimes(1); + }); +}); diff --git a/x-pack/plugins/security/public/management/roles/edit_role/privileges/es/remote_cluster_privileges_form.tsx b/x-pack/plugins/security/public/management/roles/edit_role/privileges/es/remote_cluster_privileges_form.tsx new file mode 100644 index 0000000000000..5e55ebaf1d281 --- /dev/null +++ b/x-pack/plugins/security/public/management/roles/edit_role/privileges/es/remote_cluster_privileges_form.tsx @@ -0,0 +1,170 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import type { EuiComboBoxOptionOption } from '@elastic/eui'; +import { + EuiButtonIcon, + EuiComboBox, + EuiFlexGroup, + EuiFlexItem, + EuiFormRow, + EuiPanel, + EuiSpacer, +} from '@elastic/eui'; +import React, { Fragment, useCallback } from 'react'; + +import { i18n } from '@kbn/i18n'; +import { FormattedMessage } from '@kbn/i18n-react'; +import type { Cluster } from '@kbn/remote-clusters-plugin/public'; + +import { RemoteClusterComboBox } from './remote_clusters_combo_box'; +import type { RoleRemoteClusterPrivilege } from '../../../../../../common'; +import type { RoleValidator } from '../../validate_role'; + +const fromOption = (option: EuiComboBoxOptionOption) => option.label; +const toOption = (value: string): EuiComboBoxOptionOption => ({ label: value }); + +interface Props { + formIndex: number; + remoteClusterPrivilege: RoleRemoteClusterPrivilege; + remoteClusters?: Cluster[]; + availableRemoteClusterPrivileges: string[]; + onChange: (remoteClusterPrivilege: RoleRemoteClusterPrivilege) => void; + onDelete: () => void; + isRoleReadOnly: boolean; + validator: RoleValidator; +} + +export const RemoteClusterPrivilegesForm: React.FunctionComponent = ({ + isRoleReadOnly, + remoteClusters = [], + formIndex, + validator, + remoteClusterPrivilege, + availableRemoteClusterPrivileges, + onChange, + onDelete, +}) => { + const onCreateClusterOption = useCallback( + (option: string) => { + const nextClusters = (remoteClusterPrivilege.clusters ?? []).concat([option]); + + onChange({ + ...remoteClusterPrivilege, + clusters: nextClusters, + }); + }, + [remoteClusterPrivilege, onChange] + ); + + const onClustersChange = useCallback( + (nextOptions: EuiComboBoxOptionOption[]) => { + const clusters = nextOptions.map(fromOption); + onChange({ + ...remoteClusterPrivilege, + clusters, + }); + }, + [onChange, remoteClusterPrivilege] + ); + + const onPrivilegeChange = useCallback( + (newPrivileges: EuiComboBoxOptionOption[]) => { + onChange({ + ...remoteClusterPrivilege, + privileges: newPrivileges.map(fromOption), + }); + }, + [remoteClusterPrivilege, onChange] + ); + + return ( + + + + + + + + + } + fullWidth + {...validator.validateRemoteClusterPrivilegeClusterField(remoteClusterPrivilege)} + > + + + + + + } + fullWidth + {...validator.validateRemoteClusterPrivilegePrivilegesField( + remoteClusterPrivilege + )} + > + + + + + + + {!isRoleReadOnly && ( + + + + )} + + + ); +}; diff --git a/x-pack/plugins/security/public/management/roles/edit_role/privileges/es/remote_clusters_combo_box.test.tsx b/x-pack/plugins/security/public/management/roles/edit_role/privileges/es/remote_clusters_combo_box.test.tsx new file mode 100644 index 0000000000000..4cf918d4c8c1c --- /dev/null +++ b/x-pack/plugins/security/public/management/roles/edit_role/privileges/es/remote_clusters_combo_box.test.tsx @@ -0,0 +1,106 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import React from 'react'; + +import '@kbn/code-editor-mock/jest_helper'; +import { shallowWithIntl } from '@kbn/test-jest-helpers'; + +import { RemoteClusterComboBox } from './remote_clusters_combo_box'; + +test('it renders without crashing', () => { + const wrapper = shallowWithIntl( + + ); + expect(wrapper).toMatchSnapshot(); +}); + +test('should render clusters field', () => { + const wrapper = shallowWithIntl( + + ); + const clustersInput = wrapper.find('EuiComboBox'); + expect(clustersInput.prop('options')).toEqual([ + { label: 'test2' }, + { label: expect.anything(), isGroupLabelOption: true }, + { + label: 'test1', + disabled: true, + append: expect.anything(), + }, + ]); +}); diff --git a/x-pack/plugins/security/public/management/roles/edit_role/privileges/es/remote_clusters_combo_box.tsx b/x-pack/plugins/security/public/management/roles/edit_role/privileges/es/remote_clusters_combo_box.tsx new file mode 100644 index 0000000000000..30efc78f0aaf1 --- /dev/null +++ b/x-pack/plugins/security/public/management/roles/edit_role/privileges/es/remote_clusters_combo_box.tsx @@ -0,0 +1,87 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import type { EuiComboBoxOptionOption, EuiComboBoxProps } from '@elastic/eui'; +import { EuiComboBox, EuiIconTip } from '@elastic/eui'; +import React, { useMemo } from 'react'; + +import { FormattedMessage } from '@kbn/i18n-react'; +import type { Cluster } from '@kbn/remote-clusters-plugin/public'; + +const API_KEY_SECURITY_MODEL = 'api_key'; + +interface Props extends Omit, 'options'> { + remoteClusters: Cluster[]; + type: 'remote_cluster' | 'remote_indexes'; +} + +export const RemoteClusterComboBox: React.FunctionComponent = ({ + remoteClusters, + type, + ...restProps +}) => { + const remoteClusterOptions = useMemo(() => { + const { incompatible, remote } = remoteClusters.reduce<{ + remote: EuiComboBoxOptionOption[]; + incompatible: EuiComboBoxOptionOption[]; + }>( + (data, item) => { + const disabled = item.securityModel !== API_KEY_SECURITY_MODEL; + + if (!disabled) { + data.remote.push({ label: item.name }); + + return data; + } + + data.incompatible.push({ + label: item.name, + disabled, + append: disabled ? ( + + ) : ( + + ) + } + /> + ) : undefined, + }); + + return data; + }, + { + incompatible: [], + remote: [], + } + ); + + if (incompatible.length) { + remote.push( + { + label: 'Incompatible clusters', + isGroupLabelOption: true, + }, + ...incompatible + ); + } + + return remote; + }, [remoteClusters, type]); + + return ; +}; diff --git a/x-pack/plugins/security/public/management/roles/edit_role/validate_role.ts b/x-pack/plugins/security/public/management/roles/edit_role/validate_role.ts index 18728994a5e4e..bf85f80df1fc1 100644 --- a/x-pack/plugins/security/public/management/roles/edit_role/validate_role.ts +++ b/x-pack/plugins/security/public/management/roles/edit_role/validate_role.ts @@ -7,7 +7,12 @@ import { i18n } from '@kbn/i18n'; -import type { Role, RoleIndexPrivilege, RoleRemoteIndexPrivilege } from '../../../../common'; +import type { + Role, + RoleIndexPrivilege, + RoleRemoteClusterPrivilege, + RoleRemoteIndexPrivilege, +} from '../../../../common'; import { MAX_NAME_LENGTH, NAME_REGEX } from '../../../../common/constants'; interface RoleValidatorOptions { @@ -81,6 +86,27 @@ export class RoleValidator { return valid(); } + public validateRemoteClusterPrivileges(role: Role): RoleValidationResult { + if (!this.shouldValidate) { + return valid(); + } + + const areRemoteClustersInvalid = role.elasticsearch.remote_cluster?.some( + (remoteClusterPrivilege) => { + return ( + this.validateRemoteClusterPrivilegeClusterField(remoteClusterPrivilege).isInvalid || + this.validateRemoteClusterPrivilegePrivilegesField(remoteClusterPrivilege).isInvalid + ); + } + ); + + if (areRemoteClustersInvalid) { + return invalid(); + } + + return valid(); + } + public validateIndexPrivileges(role: Role): RoleValidationResult { if (!this.shouldValidate) { return valid(); @@ -239,6 +265,58 @@ export class RoleValidator { return valid(); } + public validateRemoteClusterPrivilegeClusterField( + remoteClusterPrivilege: RoleRemoteClusterPrivilege + ): RoleValidationResult { + if (!this.shouldValidate) { + return valid(); + } + + // Ignore if all other fields are empty + if (!remoteClusterPrivilege.privileges.length) { + return valid(); + } + + if (!remoteClusterPrivilege.clusters.length) { + return invalid( + i18n.translate( + 'xpack.security.management.editRole.validateRole.oneClusterRequiredWarningMessage', + { + defaultMessage: 'Enter or select at least one cluster', + } + ) + ); + } + + return valid(); + } + + public validateRemoteClusterPrivilegePrivilegesField( + remoteClusterPrivilege: RoleRemoteClusterPrivilege + ): RoleValidationResult { + if (!this.shouldValidate) { + return valid(); + } + + // Ignore if all other fields are empty + if (!remoteClusterPrivilege.clusters.length) { + return valid(); + } + + if (!remoteClusterPrivilege.privileges.length) { + return invalid( + i18n.translate( + 'xpack.security.management.editRole.validateRole.oneRemoteClusterPrivilegeRequiredWarningMessage', + { + defaultMessage: 'Enter or select at least one privilege', + } + ) + ); + } + + return valid(); + } + public validateSelectedSpaces( spaceIds: string[], privilege: string | null @@ -313,12 +391,15 @@ export class RoleValidator { const { isInvalid: areIndicesInvalid } = this.validateIndexPrivileges(role); const { isInvalid: areRemoteIndicesInvalid } = this.validateRemoteIndexPrivileges(role); const { isInvalid: areSpacePrivilegesInvalid } = this.validateSpacePrivileges(role); + const { isInvalid: areRemoteClusterPrivilegesInvalid } = + this.validateRemoteClusterPrivileges(role); if ( isNameInvalid || areIndicesInvalid || areRemoteIndicesInvalid || - areSpacePrivilegesInvalid + areSpacePrivilegesInvalid || + areRemoteClusterPrivilegesInvalid ) { return invalid(); } diff --git a/x-pack/plugins/security/server/authorization/roles/elasticsearch_role.test.ts b/x-pack/plugins/security/server/authorization/roles/elasticsearch_role.test.ts index 47947d2fb2adc..bb8b43c45f272 100644 --- a/x-pack/plugins/security/server/authorization/roles/elasticsearch_role.test.ts +++ b/x-pack/plugins/security/server/authorization/roles/elasticsearch_role.test.ts @@ -16,6 +16,7 @@ const roles = [ { name: 'global-base-all', cluster: [], + remote_cluster: [], indices: [], applications: [ { @@ -33,6 +34,7 @@ const roles = [ { name: 'global-base-read', cluster: [], + remote_cluster: [], indices: [], applications: [ { @@ -50,6 +52,7 @@ const roles = [ { name: 'global-foo-all', cluster: [], + remote_cluster: [], indices: [], applications: [ { @@ -67,6 +70,7 @@ const roles = [ { name: 'global-foo-read', cluster: [], + remote_cluster: [], indices: [], applications: [ { @@ -84,6 +88,7 @@ const roles = [ { name: 'global-malformed', cluster: [], + remote_cluster: [], indices: [], applications: [ { @@ -101,6 +106,7 @@ const roles = [ { name: 'default-base-all', cluster: [], + remote_cluster: [], indices: [], applications: [ { @@ -118,6 +124,7 @@ const roles = [ { name: 'default-base-read', cluster: [], + remote_cluster: [], indices: [], applications: [ { @@ -135,6 +142,7 @@ const roles = [ { name: 'default-foo-all', cluster: [], + remote_cluster: [], indices: [], applications: [ { @@ -152,6 +160,7 @@ const roles = [ { name: 'default-foo-read', cluster: [], + remote_cluster: [], indices: [], applications: [ { @@ -169,6 +178,7 @@ const roles = [ { name: 'default-malformed', cluster: [], + remote_cluster: [], indices: [], applications: [ { @@ -294,6 +304,7 @@ describe('#transformElasticsearchRoleToRole', () => { const role = { name: 'global-all', cluster: [], + remote_cluster: [], indices: [], applications: [ { diff --git a/x-pack/plugins/security/server/authorization/roles/elasticsearch_role.ts b/x-pack/plugins/security/server/authorization/roles/elasticsearch_role.ts index 9477fa8be9084..e06c9938b078f 100644 --- a/x-pack/plugins/security/server/authorization/roles/elasticsearch_role.ts +++ b/x-pack/plugins/security/server/authorization/roles/elasticsearch_role.ts @@ -28,6 +28,7 @@ export type ElasticsearchRole = Pick< resources: string[]; }>; cluster: Role['elasticsearch']['cluster']; + remote_cluster: Role['elasticsearch']['remote_cluster']; indices: Role['elasticsearch']['indices']; remote_indices?: Role['elasticsearch']['remote_indices']; run_as: Role['elasticsearch']['run_as']; @@ -56,6 +57,7 @@ export function transformElasticsearchRoleToRole( transient_metadata: elasticsearchRole.transient_metadata, elasticsearch: { cluster: elasticsearchRole.cluster, + remote_cluster: elasticsearchRole.remote_cluster, indices: elasticsearchRole.indices, remote_indices: elasticsearchRole.remote_indices, run_as: elasticsearchRole.run_as, diff --git a/x-pack/plugins/security/server/deprecations/privilege_deprecations.test.ts b/x-pack/plugins/security/server/deprecations/privilege_deprecations.test.ts index 2ab306ce82108..f62bdc52e6d4c 100644 --- a/x-pack/plugins/security/server/deprecations/privilege_deprecations.test.ts +++ b/x-pack/plugins/security/server/deprecations/privilege_deprecations.test.ts @@ -66,6 +66,7 @@ describe('#getPrivilegeDeprecationsService', () => { "elasticsearch": Object { "cluster": Array [], "indices": Array [], + "remote_cluster": undefined, "remote_indices": undefined, "run_as": Array [], }, @@ -139,6 +140,7 @@ describe('#getPrivilegeDeprecationsService', () => { "elasticsearch": Object { "cluster": Array [], "indices": Array [], + "remote_cluster": undefined, "remote_indices": undefined, "run_as": Array [], }, diff --git a/x-pack/plugins/security/server/routes/authorization/privileges/get_builtin.ts b/x-pack/plugins/security/server/routes/authorization/privileges/get_builtin.ts index e51e8e1d5ae51..98b1f33bd5b38 100644 --- a/x-pack/plugins/security/server/routes/authorization/privileges/get_builtin.ts +++ b/x-pack/plugins/security/server/routes/authorization/privileges/get_builtin.ts @@ -21,7 +21,10 @@ export function defineGetBuiltinPrivilegesRoutes({ router }: RouteDefinitionPara : [privileges.index]; privileges.index = indexPriviledges.filter((privilege) => privilege !== 'none'); - return response.ok({ body: privileges }); + // TODO: remove hardcoded value once ES returns built-in privileges for remote_cluster + const remoteClusterPrivileges = ['monitor_enrich']; + + return response.ok({ body: { ...privileges, remote_cluster: remoteClusterPrivileges } }); } ); } diff --git a/x-pack/plugins/security/server/routes/authorization/roles/model/put_payload.test.ts b/x-pack/plugins/security/server/routes/authorization/roles/model/put_payload.test.ts index 717170567a550..b9e772e6451db 100644 --- a/x-pack/plugins/security/server/routes/authorization/roles/model/put_payload.test.ts +++ b/x-pack/plugins/security/server/routes/authorization/roles/model/put_payload.test.ts @@ -108,10 +108,10 @@ describe('Put payload schema', () => { kibana: [{ spaces: ['foo-*'] }], }) ).toThrowErrorMatchingInlineSnapshot(` -"[kibana.0.spaces]: types that failed validation: -- [kibana.0.spaces.0.0]: expected value to equal [*] -- [kibana.0.spaces.1.0]: must be lower case, a-z, 0-9, '_', and '-' are allowed" -`); + "[kibana.0.spaces]: types that failed validation: + - [kibana.0.spaces.0.0]: expected value to equal [*] + - [kibana.0.spaces.1.0]: must be lower case, a-z, 0-9, '_', and '-' are allowed" + `); }); test(`can't assign space and global in same entry`, () => { @@ -120,10 +120,10 @@ describe('Put payload schema', () => { kibana: [{ spaces: ['*', 'foo-space'] }], }) ).toThrowErrorMatchingInlineSnapshot(` -"[kibana.0.spaces]: types that failed validation: -- [kibana.0.spaces.0.1]: expected value to equal [*] -- [kibana.0.spaces.1.0]: must be lower case, a-z, 0-9, '_', and '-' are allowed" -`); + "[kibana.0.spaces]: types that failed validation: + - [kibana.0.spaces.0.1]: expected value to equal [*] + - [kibana.0.spaces.1.0]: must be lower case, a-z, 0-9, '_', and '-' are allowed" + `); }); test(`only allows known Kibana space base privileges`, () => { @@ -424,8 +424,72 @@ describe('Put payload schema', () => { `); }); + test('passes through remote_cluster when specified', () => { + expect( + getPutPayloadSchema(() => basePrivilegeNamesMap).validate({ + elasticsearch: { + remote_cluster: [ + { + privileges: ['monitor_enrich'], + clusters: ['my_remote*'], + }, + ], + }, + }) + ).toMatchInlineSnapshot(` + Object { + "elasticsearch": Object { + "remote_cluster": Array [ + Object { + "clusters": Array [ + "my_remote*", + ], + "privileges": Array [ + "monitor_enrich", + ], + }, + ], + }, + } + `); + }); + + test(`doesn't allow empty privilege for remote_cluster`, () => { + expect(() => + getPutPayloadSchema(() => basePrivilegeNamesMap).validate({ + elasticsearch: { + remote_cluster: [ + { + privileges: [], + clusters: ['cluster1'], + }, + ], + }, + }) + ).toThrowErrorMatchingInlineSnapshot( + `"[elasticsearch.remote_cluster.0.privileges]: array size is [0], but cannot be smaller than [1]"` + ); + }); + + test(`doesn't allow empty clusters for remote_cluster`, () => { + expect(() => + getPutPayloadSchema(() => basePrivilegeNamesMap).validate({ + elasticsearch: { + remote_cluster: [ + { + privileges: ['enrich_monitor'], + clusters: [], + }, + ], + }, + }) + ).toThrowErrorMatchingInlineSnapshot( + `"[elasticsearch.remote_cluster.0.clusters]: array size is [0], but cannot be smaller than [1]"` + ); + }); + // This is important for backwards compatibility - test('does not set default value for remote_indices when not specified', () => { + test('does not set default value for remote_indices/remote_cluster when not specified', () => { expect(getPutPayloadSchema(() => basePrivilegeNamesMap).validate({})).toMatchInlineSnapshot(` Object { "elasticsearch": Object {}, diff --git a/x-pack/plugins/security/server/routes/authorization/roles/model/put_payload.ts b/x-pack/plugins/security/server/routes/authorization/roles/model/put_payload.ts index 9d0a82c1e6ac8..52c8178a651a7 100644 --- a/x-pack/plugins/security/server/routes/authorization/roles/model/put_payload.ts +++ b/x-pack/plugins/security/server/routes/authorization/roles/model/put_payload.ts @@ -19,6 +19,7 @@ export const transformPutPayloadToElasticsearchRole = ( ) => { const { elasticsearch = { + remote_cluster: undefined, cluster: undefined, indices: undefined, remote_indices: undefined, @@ -34,6 +35,7 @@ export const transformPutPayloadToElasticsearchRole = ( ...(rolePayload.description && { description: rolePayload.description }), metadata: rolePayload.metadata, cluster: elasticsearch.cluster || [], + remote_cluster: elasticsearch.remote_cluster, indices: elasticsearch.indices || [], remote_indices: elasticsearch.remote_indices, run_as: elasticsearch.run_as || [], diff --git a/x-pack/plugins/security/server/routes/authorization/roles/put.test.ts b/x-pack/plugins/security/server/routes/authorization/roles/put.test.ts index 4591bfaaea4aa..642aec90c4748 100644 --- a/x-pack/plugins/security/server/routes/authorization/roles/put.test.ts +++ b/x-pack/plugins/security/server/routes/authorization/roles/put.test.ts @@ -325,6 +325,7 @@ describe('PUT role', () => { body: { cluster: [], indices: [], + remote_cluster: undefined, remote_indices: undefined, run_as: [], applications: [], @@ -936,5 +937,59 @@ describe('PUT role', () => { result: undefined, }, }); + + putRoleTest(`creates role with remote_cluster privileges`, { + name: 'foo-role-remote-cluster', + payload: { + kibana: [], + elasticsearch: { + remote_cluster: [ + { + clusters: ['cluster1', 'cluster2'], + privileges: ['monitor_enrich'], + }, + { + clusters: ['cluster3', 'cluster4'], + privileges: ['monitor_enrich'], + }, + ], + }, + }, + apiResponses: { + get: () => ({}), + put: () => {}, + }, + asserts: { + recordSubFeaturePrivilegeUsage: false, + apiArguments: { + get: [{ name: 'foo-role-remote-cluster' }, { ignore: [404] }], + put: [ + { + name: 'foo-role-remote-cluster', + body: { + applications: [], + cluster: [], + indices: [], + remote_indices: undefined, + run_as: [], + remote_cluster: [ + { + clusters: ['cluster1', 'cluster2'], + privileges: ['monitor_enrich'], + }, + { + clusters: ['cluster3', 'cluster4'], + privileges: ['monitor_enrich'], + }, + ], + metadata: undefined, + }, + }, + ], + }, + statusCode: 204, + result: undefined, + }, + }); }); }); diff --git a/x-pack/plugins/security/server/routes/role_mapping/feature_check.test.ts b/x-pack/plugins/security/server/routes/role_mapping/feature_check.test.ts index d18fd1ff1d314..c0bf0041ed0ac 100644 --- a/x-pack/plugins/security/server/routes/role_mapping/feature_check.test.ts +++ b/x-pack/plugins/security/server/routes/role_mapping/feature_check.test.ts @@ -98,6 +98,7 @@ describe('GET role mappings feature check', () => { canUseStoredScripts: true, hasCompatibleRealms: true, canUseRemoteIndices: true, + canUseRemoteClusters: true, }, }, }); @@ -122,6 +123,7 @@ describe('GET role mappings feature check', () => { canUseStoredScripts: true, hasCompatibleRealms: true, canUseRemoteIndices: true, + canUseRemoteClusters: true, }, }, }); @@ -141,6 +143,7 @@ describe('GET role mappings feature check', () => { canUseStoredScripts: true, hasCompatibleRealms: true, canUseRemoteIndices: false, + canUseRemoteClusters: false, }, }, } @@ -166,6 +169,7 @@ describe('GET role mappings feature check', () => { canUseStoredScripts: false, hasCompatibleRealms: true, canUseRemoteIndices: true, + canUseRemoteClusters: true, }, }, }); @@ -190,6 +194,7 @@ describe('GET role mappings feature check', () => { canUseStoredScripts: true, hasCompatibleRealms: true, canUseRemoteIndices: true, + canUseRemoteClusters: true, }, }, }); @@ -218,6 +223,7 @@ describe('GET role mappings feature check', () => { canUseStoredScripts: true, hasCompatibleRealms: false, canUseRemoteIndices: true, + canUseRemoteClusters: true, }, }, }); @@ -249,6 +255,7 @@ describe('GET role mappings feature check', () => { canUseStoredScripts: true, hasCompatibleRealms: false, canUseRemoteIndices: false, + canUseRemoteClusters: false, }, }, } diff --git a/x-pack/plugins/security/server/routes/role_mapping/feature_check.ts b/x-pack/plugins/security/server/routes/role_mapping/feature_check.ts index 309cdfbeab456..6aca083dab1e2 100644 --- a/x-pack/plugins/security/server/routes/role_mapping/feature_check.ts +++ b/x-pack/plugins/security/server/routes/role_mapping/feature_check.ts @@ -131,7 +131,8 @@ async function getEnabledRoleMappingsFeatures(esClient: ElasticsearchClient, log hasCompatibleRealms, canUseStoredScripts, canUseInlineScripts, - canUseRemoteIndices: !!xpackUsage.remote_clusters, + canUseRemoteIndices: Boolean(xpackUsage.remote_clusters), + canUseRemoteClusters: Boolean(xpackUsage.remote_clusters), }; } diff --git a/x-pack/plugins/security/server/routes/views/login.test.ts b/x-pack/plugins/security/server/routes/views/login.test.ts index 086c0c785e6bc..87e9bf9e4495b 100644 --- a/x-pack/plugins/security/server/routes/views/login.test.ts +++ b/x-pack/plugins/security/server/routes/views/login.test.ts @@ -167,6 +167,7 @@ describe('Login view routes', () => { allowRoleDocumentLevelSecurity: true, allowRoleFieldLevelSecurity: false, allowRoleRemoteIndexPrivileges: false, + allowRemoteClusterPrivileges: false, layout: 'error-es-unavailable', showLinks: false, showRoleMappingsManagement: true, diff --git a/x-pack/test/api_integration/apis/security/builtin_es_privileges.ts b/x-pack/test/api_integration/apis/security/builtin_es_privileges.ts index 89587fe259683..8087ded821b5b 100644 --- a/x-pack/test/api_integration/apis/security/builtin_es_privileges.ts +++ b/x-pack/test/api_integration/apis/security/builtin_es_privileges.ts @@ -24,7 +24,7 @@ export default function ({ getService }: FtrProviderContext) { const sampleOfExpectedIndexPrivileges = ['create', 'index', 'delete']; const payload = response.body; - expect(Object.keys(payload).sort()).to.eql(['cluster', 'index']); + expect(Object.keys(payload).sort()).to.eql(['cluster', 'index', 'remote_cluster']); sampleOfExpectedClusterPrivileges.forEach((privilege) => expect(payload.cluster).to.contain(privilege) diff --git a/x-pack/test/functional/apps/security/index.ts b/x-pack/test/functional/apps/security/index.ts index 3260e61e67cbf..009c270d3c2a3 100644 --- a/x-pack/test/functional/apps/security/index.ts +++ b/x-pack/test/functional/apps/security/index.ts @@ -17,5 +17,6 @@ export default function ({ loadTestFile }: FtrProviderContext) { loadTestFile(require.resolve('./field_level_security')); loadTestFile(require.resolve('./user_email')); loadTestFile(require.resolve('./role_mappings')); + loadTestFile(require.resolve('./remote_cluster_security_roles')); }); } diff --git a/x-pack/test/functional/apps/security/remote_cluster_security_roles.ts b/x-pack/test/functional/apps/security/remote_cluster_security_roles.ts new file mode 100644 index 0000000000000..1525406b2fa02 --- /dev/null +++ b/x-pack/test/functional/apps/security/remote_cluster_security_roles.ts @@ -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 expect from '@kbn/expect'; +import { keyBy } from 'lodash'; +import { FtrProviderContext } from '../../ftr_provider_context'; + +const EDIT_ROLES_PATH = 'security/roles/edit'; + +export default function ({ getService, getPageObjects }: FtrProviderContext) { + const esArchiver = getService('esArchiver'); + const browser = getService('browser'); + const log = getService('log'); + const security = getService('security'); + const PageObjects = getPageObjects(['security', 'common', 'header', 'discover', 'settings']); + const kibanaServer = getService('kibanaServer'); + + describe('Remote Cluster Privileges', function () { + const customRole = 'rc-custom-role'; + + before('initialize tests', async () => { + await kibanaServer.savedObjects.cleanStandardList(); + await esArchiver.loadIfNeeded('x-pack/test/functional/es_archives/security/dlstest'); + await browser.setWindowSize(1600, 1000); + + await PageObjects.common.navigateToApp('settings'); + await PageObjects.settings.createIndexPattern('dlstest', null); + + await security.testUser.setRoles(['cluster_security_manager', 'kibana_admin']); + await PageObjects.settings.navigateTo(); + await PageObjects.security.clickElasticsearchRoles(); + }); + + it(`should add new role ${customRole} with remote cluster privileges`, async function () { + await PageObjects.security.addRole(customRole, { + elasticsearch: { + indices: [ + { + names: ['dlstest'], + privileges: ['read', 'view_index_metadata'], + }, + ], + remote_cluster: [ + { + clusters: ['cluster1', 'cluster2'], + privileges: ['monitor_enrich'], + }, + ], + }, + }); + const roles = keyBy(await PageObjects.security.getElasticsearchRoles(), 'rolename'); + log.debug('actualRoles = %j', roles); + expect(roles).to.have.key(customRole); + expect(roles[customRole].reserved).to.be(false); + }); + + it(`should update role ${customRole} with remote cluster privileges`, async function () { + await PageObjects.settings.clickLinkText(customRole); + const currentUrl = await browser.getCurrentUrl(); + + expect(currentUrl).to.contain(EDIT_ROLES_PATH); + + const { clusters: currentClusters, privileges: currentPrivileges } = + await PageObjects.security.getRemoteClusterPrivilege(0); + + expect(currentClusters).to.eql(['cluster1', 'cluster2']); + expect(currentPrivileges).to.eql(['monitor_enrich']); + + await PageObjects.security.deleteRemoteClusterPrivilege(0); + + await PageObjects.security.addRemoteClusterPrivilege({ + clusters: ['cluster3', 'cluster4'], + privileges: ['monitor_enrich'], + }); + + await PageObjects.security.saveRole(); + }); + + after('logout', async () => { + // NOTE: Logout needs to happen before anything else to avoid flaky behavior + await PageObjects.security.forceLogout(); + await security.role.delete(customRole); + await security.testUser.restoreDefaults(); + }); + }); +} diff --git a/x-pack/test/functional/page_objects/security_page.ts b/x-pack/test/functional/page_objects/security_page.ts index dc5ee34475ae6..f839bc3e49914 100644 --- a/x-pack/test/functional/page_objects/security_page.ts +++ b/x-pack/test/functional/page_objects/security_page.ts @@ -6,7 +6,7 @@ */ import { adminTestUser } from '@kbn/test'; -import { AuthenticatedUser, Role } from '@kbn/security-plugin/common'; +import { AuthenticatedUser, Role, RoleRemoteClusterPrivilege } from '@kbn/security-plugin/common'; import type { UserFormValues } from '@kbn/security-plugin/public/management/users/edit_user/user_form'; import { Key } from 'selenium-webdriver'; import { FtrService } from '../ftr_provider_context'; @@ -600,9 +600,54 @@ export class SecurityPageObject extends FtrService { return confirmText; } + async addRemoteClusterPrivilege(privilege: RoleRemoteClusterPrivilege, index = 0) { + this.log.debug('addRemoteClusterPrivilege, index = ', index); + + await this.testSubjects.click('addRemoteClusterPrivilegesButton'); + + for (const cluster of privilege.clusters) { + await this.comboBox.setCustom(`remoteClusterClustersInput${index}`, cluster); + } + + for (const clusterPrivilege of privilege.privileges) { + await this.comboBox.setCustom(`remoteClusterPrivilegesInput${index}`, clusterPrivilege); + } + } + + async saveRole() { + this.log.debug('click save button'); + await this.testSubjects.click('roleFormSaveButton'); + + // Signifies that the role management page redirected back to the role grid page, + // and successfully refreshed the grid + await this.testSubjects.existOrFail('roleRow'); + } + + async deleteRemoteClusterPrivilege(index: number) { + this.log.debug('deleteRemoteClusterPrivilege, index = ', index); + + await this.testSubjects.click(`deleteRemoteClusterPrivilegesButton${index}`); + } + + async getRemoteClusterPrivilege(index: number) { + this.log.debug('getRemoteClusterPrivilege, index = ', index); + const clusterOptions = await this.comboBox.getComboBoxSelectedOptions( + `remoteClusterClustersInput${index}` + ); + + const privilegeOptions = await this.comboBox.getComboBoxSelectedOptions( + `remoteClusterPrivilegesInput${index}` + ); + + return { + clusters: clusterOptions, + privileges: privilegeOptions, + }; + } + async addRole( roleName: string, - roleObj: { elasticsearch: Pick } + roleObj: { elasticsearch: Pick } ) { const self = this; @@ -667,12 +712,18 @@ export class SecurityPageObject extends FtrService { await addGrantedField(roleObj.elasticsearch.indices[0].field_security!.grant!); } - this.log.debug('click save button'); - await this.testSubjects.click('roleFormSaveButton'); + if (roleObj.elasticsearch.remote_cluster) { + this.log.debug('adding remote_cluster privileges'); - // Signifies that the role management page redirected back to the role grid page, - // and successfully refreshed the grid - await this.testSubjects.existOrFail('roleRow'); + for (const [ + index, + remoteClusterPrivilege, + ] of roleObj.elasticsearch.remote_cluster.entries()) { + await this.addRemoteClusterPrivilege(remoteClusterPrivilege, index); + } + } + + await this.saveRole(); } async selectRole(role: string) { From d87e04dad2ead85743ae6ee3f408e4e584276183 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Alejandro=20Fern=C3=A1ndez=20Haro?= Date: Wed, 8 May 2024 10:55:26 +0200 Subject: [PATCH 54/86] [Core Telemetry] Add more memory indicators (#182872) --- .../src/core_usage_data_service.test.ts | 3 ++ .../src/core_usage_data_service.ts | 3 ++ .../src/core_usage_data_service.mock.ts | 3 ++ .../src/core_usage_data.ts | 3 ++ .../collectors/core/core_usage_collector.ts | 14 +++++++ src/plugins/telemetry/schema/oss_plugins.json | 38 ++++++++++++++----- 6 files changed, 54 insertions(+), 10 deletions(-) diff --git a/packages/core/usage-data/core-usage-data-server-internal/src/core_usage_data_service.test.ts b/packages/core/usage-data/core-usage-data-server-internal/src/core_usage_data_service.test.ts index 11602704cf0f0..a2f5baacca07a 100644 --- a/packages/core/usage-data/core-usage-data-server-internal/src/core_usage_data_service.test.ts +++ b/packages/core/usage-data/core-usage-data-server-internal/src/core_usage_data_service.test.ts @@ -377,9 +377,12 @@ describe('CoreUsageDataService', () => { }, "environment": Object { "memory": Object { + "arrayBuffersBytes": 1, + "externalBytes": 1, "heapSizeLimit": 1, "heapTotalBytes": 1, "heapUsedBytes": 1, + "residentSetSizeBytes": 1, }, }, "services": Object { diff --git a/packages/core/usage-data/core-usage-data-server-internal/src/core_usage_data_service.ts b/packages/core/usage-data/core-usage-data-server-internal/src/core_usage_data_service.ts index 261db435a1a73..eaa2b0888147b 100644 --- a/packages/core/usage-data/core-usage-data-server-internal/src/core_usage_data_service.ts +++ b/packages/core/usage-data/core-usage-data-server-internal/src/core_usage_data_service.ts @@ -333,6 +333,9 @@ export class CoreUsageDataService }, environment: { memory: { + arrayBuffersBytes: this.opsMetrics.process.memory.array_buffers_in_bytes, + residentSetSizeBytes: this.opsMetrics.process.memory.resident_set_size_in_bytes, + externalBytes: this.opsMetrics.process.memory.external_in_bytes, heapSizeLimit: this.opsMetrics.process.memory.heap.size_limit, heapTotalBytes: this.opsMetrics.process.memory.heap.total_in_bytes, heapUsedBytes: this.opsMetrics.process.memory.heap.used_in_bytes, diff --git a/packages/core/usage-data/core-usage-data-server-mocks/src/core_usage_data_service.mock.ts b/packages/core/usage-data/core-usage-data-server-mocks/src/core_usage_data_service.mock.ts index 3b81d25460d9d..1c13f607912dc 100644 --- a/packages/core/usage-data/core-usage-data-server-mocks/src/core_usage_data_service.mock.ts +++ b/packages/core/usage-data/core-usage-data-server-mocks/src/core_usage_data_service.mock.ts @@ -128,6 +128,9 @@ const createStartContractMock = () => { }, environment: { memory: { + arrayBuffersBytes: 1, + externalBytes: 1, + residentSetSizeBytes: 1, heapSizeLimit: 1, heapTotalBytes: 1, heapUsedBytes: 1, diff --git a/packages/core/usage-data/core-usage-data-server/src/core_usage_data.ts b/packages/core/usage-data/core-usage-data-server/src/core_usage_data.ts index c10ad14d9f7f3..f3905c9879c66 100644 --- a/packages/core/usage-data/core-usage-data-server/src/core_usage_data.ts +++ b/packages/core/usage-data/core-usage-data-server/src/core_usage_data.ts @@ -38,6 +38,9 @@ export interface CoreServicesUsageData { */ export interface CoreEnvironmentUsageData { memory: { + arrayBuffersBytes: number; + residentSetSizeBytes: number; + externalBytes: number; heapTotalBytes: number; heapUsedBytes: number; /** V8 heap size limit */ diff --git a/src/plugins/kibana_usage_collection/server/collectors/core/core_usage_collector.ts b/src/plugins/kibana_usage_collection/server/collectors/core/core_usage_collector.ts index 8d5f0db7a669d..e8a6050b9ce59 100644 --- a/src/plugins/kibana_usage_collection/server/collectors/core/core_usage_collector.ts +++ b/src/plugins/kibana_usage_collection/server/collectors/core/core_usage_collector.ts @@ -342,6 +342,20 @@ export function getCoreUsageCollector( }, environment: { memory: { + arrayBuffersBytes: { + type: 'long', + _meta: { + description: + 'Memory allocated for array buffers. This is also included in the external value.', + }, + }, + externalBytes: { + type: 'long', + _meta: { + description: 'Memory usage of C++ objects bound to JavaScript objects managed by V8.', + }, + }, + residentSetSizeBytes: { type: 'long', _meta: { description: 'Node RSS.' } }, heapSizeLimit: { type: 'long', _meta: { description: 'Host memory heap size limit.' } }, heapTotalBytes: { type: 'long', diff --git a/src/plugins/telemetry/schema/oss_plugins.json b/src/plugins/telemetry/schema/oss_plugins.json index f5eb21f859bca..9810432cc3ab3 100644 --- a/src/plugins/telemetry/schema/oss_plugins.json +++ b/src/plugins/telemetry/schema/oss_plugins.json @@ -8017,6 +8017,24 @@ "properties": { "memory": { "properties": { + "arrayBuffersBytes": { + "type": "long", + "_meta": { + "description": "Memory allocated for array buffers. This is also included in the external value." + } + }, + "externalBytes": { + "type": "long", + "_meta": { + "description": "Memory usage of C++ objects bound to JavaScript objects managed by V8." + } + }, + "residentSetSizeBytes": { + "type": "long", + "_meta": { + "description": "Node RSS." + } + }, "heapSizeLimit": { "type": "long", "_meta": { @@ -10161,15 +10179,6 @@ "description": "Non-default value of setting." } }, - "observability:logsExplorer:allowedDataViews": { - "type": "array", - "items": { - "type": "keyword", - "_meta": { - "description": "Non-default value of setting." - } - } - }, "observability:aiAssistantLogsIndexPattern": { "type": "keyword", "_meta": { @@ -10188,6 +10197,15 @@ "description": "Non-default value of setting." } }, + "observability:logsExplorer:allowedDataViews": { + "type": "array", + "items": { + "type": "keyword", + "_meta": { + "description": "Non-default value of setting." + } + } + }, "banners:placement": { "type": "keyword", "_meta": { @@ -11893,4 +11911,4 @@ } } } -} \ No newline at end of file +} From eb5e32938289dbac7749ded47f5753a0a1b01317 Mon Sep 17 00:00:00 2001 From: Cristina Amico Date: Wed, 8 May 2024 10:58:24 +0200 Subject: [PATCH 55/86] [Fleet] Add support_agentless property in agent policy schema and preconfiguration (#182709) Closes https://github.com/elastic/kibana/issues/180377 ## Summary Add a new `support_agentless` property in agent policy and in preconfiguration; this property is only allowed when the environment has both `isServerless` set to `true` and `agentless` feature flag enabled, otherwise policy creation/update will throw error `supports_agentless is only allowed in serverless environments that support agentless feature`. No UI change is required for now as this property will be needed as part of a wider support to agentless policies. ## Testing ### Serverless - Run serverless env configured for agentless following [this guide](https://docs.elastic.dev/security-solution/cloud-security/serverless/develop-for-kibana#agentless-local-set-up) - Make sure to have `agentless` feature flag enabled - Create an agent policy with `support_agentless` property: ``` POST kbn:/api/fleet/agent_policies { "name": "New agent policy", "namespace": "default", "supports_agentless": true } ``` - Update an existing agent policy with the new property: ``` PUT kbn:/api/fleet/agent_policies/ { "name": "New agent policy", "supports_agentless": true } ``` - Create a preconfigured agent policy in kibana.dev.yml, and verify it that it's correct via `GET kbn:/api/fleet/agent_policies`: ``` xpack.fleet.agentPolicies: [ { "name": "Agentless Policy", "id": "agentless", "is_managed": true, "namespace": "default", "supports_agentless": true, }, ] ``` - Note that if `agentless` feature flag is disabled, any of the above will throw an error. ### Stateful Spin up a stateful env and verify that all of the previous commands fail with `400` and above error message. ### Checklist - [ ] [Documentation](https://www.elastic.co/guide/en/kibana/master/development-documentation.html) was added for features that require explanation or tutorials - [ ] [Unit or functional tests](https://www.elastic.co/guide/en/kibana/master/development-tests.html) were updated or added to match the most common scenarios --------- Co-authored-by: kibanamachine <42973632+kibanamachine@users.noreply.github.com> --- .../src/constants.ts | 2 +- .../current_fields.json | 1 + .../current_mappings.json | 3 + .../check_registered_types.test.ts | 2 +- .../plugins/fleet/common/openapi/bundled.json | 4 + .../plugins/fleet/common/openapi/bundled.yaml | 5 + .../components/schemas/agent_policy.yaml | 3 + .../fleet/common/types/models/agent_policy.ts | 1 + .../fleet/server/saved_objects/index.ts | 11 ++ .../server/services/agent_policy.test.ts | 158 +++++++++++++++++- .../fleet/server/services/agent_policy.ts | 25 ++- .../server/services/preconfiguration.test.ts | 116 ++++++++++++- .../fleet/server/services/preconfiguration.ts | 16 +- .../fleet/server/types/models/agent_policy.ts | 1 + 14 files changed, 336 insertions(+), 12 deletions(-) diff --git a/packages/core/saved-objects/core-saved-objects-base-server-internal/src/constants.ts b/packages/core/saved-objects/core-saved-objects-base-server-internal/src/constants.ts index f39d0d8ab26a8..d4861ae5808ad 100644 --- a/packages/core/saved-objects/core-saved-objects-base-server-internal/src/constants.ts +++ b/packages/core/saved-objects/core-saved-objects-base-server-internal/src/constants.ts @@ -182,7 +182,7 @@ export const HASH_TO_VERSION_MAP = { 'infrastructure-monitoring-log-view|c50526fc6040c5355ed027d34d05b35c': '10.0.0', 'infrastructure-ui-source|3d1b76c39bfb2cc8296b024d73854724': '10.0.0', 'ingest_manager_settings|b91ffb075799c78ffd7dbd51a279c8c9': '10.1.0', - 'ingest-agent-policies|0fd93cd11c019b118e93a9157c22057b': '10.1.0', + 'ingest-agent-policies|0ab9774bc7728d0c0f37d841570f2872': '10.2.0', 'ingest-download-sources|0b0f6828e59805bd07a650d80817c342': '10.0.0', 'ingest-outputs|b1237f7fdc0967709e75d65d208ace05': '10.6.0', 'ingest-package-policies|ca63c4c5a946704f045803a6b975dbc6': '10.9.0', diff --git a/packages/kbn-check-mappings-update-cli/current_fields.json b/packages/kbn-check-mappings-update-cli/current_fields.json index 8d0f793317f5c..65fd6af2ce919 100644 --- a/packages/kbn-check-mappings-update-cli/current_fields.json +++ b/packages/kbn-check-mappings-update-cli/current_fields.json @@ -510,6 +510,7 @@ "revision", "schema_version", "status", + "supports_agentless", "unenroll_timeout", "updated_at", "updated_by" diff --git a/packages/kbn-check-mappings-update-cli/current_mappings.json b/packages/kbn-check-mappings-update-cli/current_mappings.json index 4a1016cf62224..03a189b1549be 100644 --- a/packages/kbn-check-mappings-update-cli/current_mappings.json +++ b/packages/kbn-check-mappings-update-cli/current_mappings.json @@ -1711,6 +1711,9 @@ "status": { "type": "keyword" }, + "supports_agentless": { + "type": "boolean" + }, "unenroll_timeout": { "type": "integer" }, diff --git a/src/core/server/integration_tests/ci_checks/saved_objects/check_registered_types.test.ts b/src/core/server/integration_tests/ci_checks/saved_objects/check_registered_types.test.ts index 46893ca263afc..2fa22873190e5 100644 --- a/src/core/server/integration_tests/ci_checks/saved_objects/check_registered_types.test.ts +++ b/src/core/server/integration_tests/ci_checks/saved_objects/check_registered_types.test.ts @@ -108,7 +108,7 @@ describe('checking migration metadata changes on all registered SO types', () => "infra-custom-dashboards": "1a5994f2e05bb8a1609825ddbf5012f77c5c67f3", "infrastructure-monitoring-log-view": "5f86709d3c27aed7a8379153b08ee5d3d90d77f5", "infrastructure-ui-source": "113182d6895764378dfe7fa9fa027244f3a457c4", - "ingest-agent-policies": "d2ee0bf36a512c2ac744b0def1c822b7880f1f83", + "ingest-agent-policies": "803dc27e106440c41e8f3c3d8ee8bbb0821bcde2", "ingest-download-sources": "279a68147e62e4d8858c09ad1cf03bd5551ce58d", "ingest-outputs": "daafff49255ab700e07491376fe89f04fc998b91", "ingest-package-policies": "d63e091b2b3cf2eecaa46ae2533bdd5214a983fc", diff --git a/x-pack/plugins/fleet/common/openapi/bundled.json b/x-pack/plugins/fleet/common/openapi/bundled.json index 1e8a9ba75b0e8..38647d8218941 100644 --- a/x-pack/plugins/fleet/common/openapi/bundled.json +++ b/x-pack/plugins/fleet/common/openapi/bundled.json @@ -7602,6 +7602,10 @@ "type": "object", "description": "Advanced settings stored in the agent policy, e.g. agent_limits_go_max_procs", "nullable": true + }, + "supports_agentless": { + "type": "boolean", + "description": "Indicates whether the agent policy supports agentless integrations. Only allowed in a serverless environment." } }, "required": [ diff --git a/x-pack/plugins/fleet/common/openapi/bundled.yaml b/x-pack/plugins/fleet/common/openapi/bundled.yaml index 4f48786da4fbf..5b1cb40243649 100644 --- a/x-pack/plugins/fleet/common/openapi/bundled.yaml +++ b/x-pack/plugins/fleet/common/openapi/bundled.yaml @@ -4894,6 +4894,11 @@ components: Advanced settings stored in the agent policy, e.g. agent_limits_go_max_procs nullable: true + supports_agentless: + type: boolean + description: >- + Indicates whether the agent policy supports agentless integrations. + Only allowed in a serverless environment. required: - id - status diff --git a/x-pack/plugins/fleet/common/openapi/components/schemas/agent_policy.yaml b/x-pack/plugins/fleet/common/openapi/components/schemas/agent_policy.yaml index 070d72a5ec353..633e4e4ba89b8 100644 --- a/x-pack/plugins/fleet/common/openapi/components/schemas/agent_policy.yaml +++ b/x-pack/plugins/fleet/common/openapi/components/schemas/agent_policy.yaml @@ -73,6 +73,9 @@ properties: type: object description: Advanced settings stored in the agent policy, e.g. agent_limits_go_max_procs nullable: true + supports_agentless: + type: boolean + description: Indicates whether the agent policy supports agentless integrations. Only allowed in a serverless environment. required: - id - status diff --git a/x-pack/plugins/fleet/common/types/models/agent_policy.ts b/x-pack/plugins/fleet/common/types/models/agent_policy.ts index 1bff10bcdf564..a67293ebdecaa 100644 --- a/x-pack/plugins/fleet/common/types/models/agent_policy.ts +++ b/x-pack/plugins/fleet/common/types/models/agent_policy.ts @@ -41,6 +41,7 @@ export interface NewAgentPolicy { overrides?: { [key: string]: any } | null; advanced_settings?: { [key: string]: any } | null; keep_monitoring_alive?: boolean | null; + supports_agentless?: boolean | null; } // SO definition for this type is declared in server/types/interfaces diff --git a/x-pack/plugins/fleet/server/saved_objects/index.ts b/x-pack/plugins/fleet/server/saved_objects/index.ts index 6124205017dc5..22b5aa3f5fddb 100644 --- a/x-pack/plugins/fleet/server/saved_objects/index.ts +++ b/x-pack/plugins/fleet/server/saved_objects/index.ts @@ -164,6 +164,7 @@ export const getSavedObjectTypes = ( overrides: { type: 'flattened', index: false }, keep_monitoring_alive: { type: 'boolean' }, advanced_settings: { type: 'flattened', index: false }, + supports_agentless: { type: 'boolean' }, }, }, migrations: { @@ -184,6 +185,16 @@ export const getSavedObjectTypes = ( }, ], }, + '2': { + changes: [ + { + type: 'mappings_addition', + addedMappings: { + supports_agentless: { type: 'boolean' }, + }, + }, + ], + }, }, }, [OUTPUT_SAVED_OBJECT_TYPE]: { diff --git a/x-pack/plugins/fleet/server/services/agent_policy.test.ts b/x-pack/plugins/fleet/server/services/agent_policy.test.ts index f844fce46c83e..1f6ae15606c46 100644 --- a/x-pack/plugins/fleet/server/services/agent_policy.test.ts +++ b/x-pack/plugins/fleet/server/services/agent_policy.test.ts @@ -17,6 +17,7 @@ import { PackagePolicyRestrictionRelatedError, FleetUnauthorizedError, HostedAgentPolicyRestrictionRelatedError, + AgentPolicyInvalidError, } from '../errors'; import type { AgentPolicy, @@ -114,7 +115,7 @@ function getAgentPolicyCreateMock() { return soClient; } let mockedLogger: jest.Mocked; -describe('agent policy', () => { +describe('Agent policy', () => { beforeEach(() => { mockedLogger = loggerMock.create(); mockedAppContextService.getLogger.mockReturnValue(mockedLogger); @@ -228,6 +229,74 @@ describe('agent policy', () => { new FleetUnauthorizedError('Tamper protection requires Platinum license') ); }); + + it('should throw AgentPolicyInvalidError if support_agentless is defined in stateful', async () => { + jest + .spyOn(appContextService, 'getExperimentalFeatures') + .mockReturnValue({ agentless: false } as any); + jest + .spyOn(appContextService, 'getCloud') + .mockReturnValue({ isServerlessEnabled: false } as any); + + const soClient = getAgentPolicyCreateMock(); + const esClient = elasticsearchServiceMock.createClusterClient().asInternalUser; + + await expect( + agentPolicyService.create(soClient, esClient, { + name: 'test', + namespace: 'default', + supports_agentless: true, + }) + ).rejects.toThrowError( + new AgentPolicyInvalidError( + 'supports_agentless is only allowed in serverless environments that support the agentless feature' + ) + ); + }); + + it('should throw AgentPolicyInvalidError if agentless feature flag is disabled in serverless', async () => { + jest + .spyOn(appContextService, 'getExperimentalFeatures') + .mockReturnValue({ agentless: false } as any); + jest + .spyOn(appContextService, 'getCloud') + .mockReturnValue({ isServerlessEnabled: true } as any); + + const soClient = getAgentPolicyCreateMock(); + const esClient = elasticsearchServiceMock.createClusterClient().asInternalUser; + + await expect( + agentPolicyService.create(soClient, esClient, { + name: 'test', + namespace: 'default', + supports_agentless: true, + }) + ).rejects.toThrowError( + new AgentPolicyInvalidError( + 'supports_agentless is only allowed in serverless environments that support the agentless feature' + ) + ); + }); + + it('should not throw error if support_agentless is set if agentless feature flag is set in serverless', async () => { + jest + .spyOn(appContextService, 'getExperimentalFeatures') + .mockReturnValue({ agentless: true } as any); + jest + .spyOn(appContextService, 'getCloud') + .mockReturnValue({ isServerlessEnabled: true } as any); + + const soClient = getAgentPolicyCreateMock(); + const esClient = elasticsearchServiceMock.createClusterClient().asInternalUser; + + await expect( + agentPolicyService.create(soClient, esClient, { + name: 'test', + namespace: 'default', + supports_agentless: true, + }) + ).resolves.not.toThrow(); + }); }); // TODO: Add more test coverage to `get` service method @@ -781,6 +850,93 @@ describe('agent policy', () => { }) ).rejects.toThrowError(new Error('Cannot enable Agent Tamper Protection: reason')); }); + + it('should throw AgentPolicyInvalidError if support_agentless is defined in stateful', async () => { + jest + .spyOn(appContextService, 'getExperimentalFeatures') + .mockReturnValue({ agentless: false } as any); + jest + .spyOn(appContextService, 'getCloud') + .mockReturnValue({ isServerlessEnabled: false } as any); + + const soClient = getAgentPolicyCreateMock(); + const esClient = elasticsearchServiceMock.createClusterClient().asInternalUser; + soClient.get.mockResolvedValue({ + attributes: {}, + id: 'test-id', + type: 'mocked', + references: [], + }); + + await expect( + agentPolicyService.update(soClient, esClient, 'test-id', { + name: 'test', + namespace: 'default', + supports_agentless: true, + }) + ).rejects.toThrowError( + new AgentPolicyInvalidError( + 'supports_agentless is only allowed in serverless environments that support the agentless feature' + ) + ); + }); + + it('should throw AgentPolicyInvalidError if agentless flag is disabled in serverless', async () => { + jest + .spyOn(appContextService, 'getExperimentalFeatures') + .mockReturnValue({ agentless: false } as any); + jest + .spyOn(appContextService, 'getCloud') + .mockReturnValue({ isServerlessEnabled: true } as any); + + const soClient = getAgentPolicyCreateMock(); + const esClient = elasticsearchServiceMock.createClusterClient().asInternalUser; + soClient.get.mockResolvedValue({ + attributes: {}, + id: 'test-id', + type: 'mocked', + references: [], + }); + + await expect( + agentPolicyService.update(soClient, esClient, 'test-id', { + name: 'test', + namespace: 'default', + supports_agentless: true, + }) + ).rejects.toThrowError( + new AgentPolicyInvalidError( + 'supports_agentless is only allowed in serverless environments that support the agentless feature' + ) + ); + }); + + it('should not throw in serverless if support_agentless is set and agentless feature flag is set', async () => { + jest + .spyOn(appContextService, 'getExperimentalFeatures') + .mockReturnValue({ agentless: true } as any); + jest + .spyOn(appContextService, 'getCloud') + .mockReturnValue({ isServerlessEnabled: true } as any); + + const soClient = getAgentPolicyCreateMock(); + const esClient = elasticsearchServiceMock.createClusterClient().asInternalUser; + + soClient.get.mockResolvedValue({ + attributes: {}, + id: 'test-id', + type: 'mocked', + references: [], + }); + + await expect( + agentPolicyService.update(soClient, esClient, 'test-id', { + name: 'test', + namespace: 'default', + supports_agentless: true, + }) + ).resolves.not.toThrow(); + }); }); describe('deployPolicy', () => { diff --git a/x-pack/plugins/fleet/server/services/agent_policy.ts b/x-pack/plugins/fleet/server/services/agent_policy.ts index 51b3e0d7972c1..a75028be59548 100644 --- a/x-pack/plugins/fleet/server/services/agent_policy.ts +++ b/x-pack/plugins/fleet/server/services/agent_policy.ts @@ -71,13 +71,12 @@ import type { FetchAllAgentPoliciesOptions, FetchAllAgentPolicyIdsOptions, FleetServerPolicy, - Installation, - Output, PackageInfo, } from '../../common/types'; import { AgentPolicyNameExistsError, AgentPolicyNotFoundError, + AgentPolicyInvalidError, FleetError, FleetUnauthorizedError, HostedAgentPolicyRestrictionRelatedError, @@ -88,6 +87,8 @@ import type { FullAgentConfigMap } from '../../common/types/models/agent_cm'; import { fullAgentConfigMapToYaml } from '../../common/services/agent_cm_to_yaml'; +import { appContextService } from '.'; + import { mapAgentPolicySavedObjectToAgentPolicy } from './agent_policies/utils'; import { @@ -102,7 +103,6 @@ import { incrementPackagePolicyCopyName } from './package_policies'; import { outputService } from './output'; import { agentPolicyUpdateEventHandler } from './agent_policy_update'; import { escapeSearchQueryPhrase, normalizeKuery } from './saved_object'; -import { appContextService } from './app_context'; import { getFullAgentPolicy, validateOutputForPolicy } from './agent_policies'; import { auditLoggingService } from './audit_logging'; import { licenseService } from './license'; @@ -317,6 +317,8 @@ class AgentPolicyService { ); } + this.checkAgentless(agentPolicy); + await this.requireUniqueName(soClient, agentPolicy); await validateOutputForPolicy(soClient, agentPolicy); @@ -581,6 +583,7 @@ class AgentPolicyService { } } this.checkTamperProtectionLicense(agentPolicy); + this.checkAgentless(agentPolicy); await this.checkForValidUninstallToken(agentPolicy, id); if (agentPolicy?.is_protected && !policyHasEndpointSecurity(existingAgentPolicy)) { @@ -653,6 +656,7 @@ class AgentPolicyService { 'monitoring_output_id', 'download_source_id', 'fleet_server_host_id', + 'supports_agentless', ]), ...newAgentPolicyProps, }, @@ -1474,17 +1478,26 @@ class AgentPolicyService { } } } + private checkAgentless(agentPolicy: Partial) { + const cloudSetup = appContextService.getCloud(); + if ( + (!cloudSetup?.isServerlessEnabled || + !appContextService.getExperimentalFeatures().agentless) && + agentPolicy?.supports_agentless !== undefined + ) { + throw new AgentPolicyInvalidError( + 'supports_agentless is only allowed in serverless environments that support the agentless feature' + ); + } + } } export const agentPolicyService = new AgentPolicyService(); -// TODO: remove unused parameters export async function addPackageToAgentPolicy( soClient: SavedObjectsClientContract, esClient: ElasticsearchClient, - packageToInstall: Installation, agentPolicy: AgentPolicy, - defaultOutput: Output, packageInfo: PackageInfo, packagePolicyName?: string, packagePolicyId?: string | number, diff --git a/x-pack/plugins/fleet/server/services/preconfiguration.test.ts b/x-pack/plugins/fleet/server/services/preconfiguration.test.ts index fd5dfad737241..004d4b83a460a 100644 --- a/x-pack/plugins/fleet/server/services/preconfiguration.test.ts +++ b/x-pack/plugins/fleet/server/services/preconfiguration.test.ts @@ -22,6 +22,8 @@ import type { AgentPolicy, NewPackagePolicy, Output, DownloadSource } from '../t import { AGENT_POLICY_SAVED_OBJECT_TYPE } from '../constants'; +import { appContextService } from './app_context'; + import * as agentPolicy from './agent_policy'; import { @@ -300,6 +302,10 @@ jest.mock('./app_context', () => ({ generateTokenForPolicyId: jest.fn(), }), getExternalCallbacks: jest.fn(), + getCloud: jest.fn(), + getExperimentalFeatures: jest.fn().mockReturnValue({ + agentless: false, + }), }, })); @@ -461,7 +467,7 @@ describe('policy preconfiguration', () => { ); }); - it('should install prelease packages if needed', async () => { + it('should install prerelease packages if needed', async () => { const soClient = getPutPreconfiguredPackagesMock(); const esClient = elasticsearchServiceMock.createClusterClient().asInternalUser; @@ -845,6 +851,7 @@ describe('policy preconfiguration', () => { it('should not create a policy and throw an error if package is not installed for an unknown reason', async () => { const soClient = getPutPreconfiguredPackagesMock(); const esClient = elasticsearchServiceMock.createClusterClient().asInternalUser; + const policies: PreconfiguredAgentPolicy[] = [ { name: 'Test policy', @@ -875,6 +882,113 @@ describe('policy preconfiguration', () => { ); }); + it('should return a non fatal error if support_agentless is defined in stateful', async () => { + const soClient = getPutPreconfiguredPackagesMock(); + const esClient = elasticsearchServiceMock.createClusterClient().asInternalUser; + jest.mocked(appContextService.getExperimentalFeatures).mockReturnValue({ + agentless: true, + } as any); + + jest + .spyOn(appContextService, 'getCloud') + .mockReturnValue({ isServerlessEnabled: false } as any); + + const policies: PreconfiguredAgentPolicy[] = [ + { + name: 'Test policy', + namespace: 'default', + id: 'test-id', + supports_agentless: true, + package_policies: [], + }, + ]; + + const { nonFatalErrors } = await ensurePreconfiguredPackagesAndPolicies( + soClient, + esClient, + policies, + [{ name: 'CANNOT_MATCH', version: 'x.y.z' }], + mockDefaultOutput, + mockDefaultDownloadService, + DEFAULT_SPACE_ID + ); + // @ts-ignore-next-line + expect(nonFatalErrors[0].error.toString()).toEqual( + 'FleetError: `supports_agentless` is only allowed in serverless environments that support the agentless feature' + ); + }); + + it('should not return an error if support_agentless is defined in serverless and agentless is enabled', async () => { + const soClient = getPutPreconfiguredPackagesMock(); + const esClient = elasticsearchServiceMock.createClusterClient().asInternalUser; + jest.mocked(appContextService.getExperimentalFeatures).mockReturnValue({ + agentless: true, + } as any); + + jest + .spyOn(appContextService, 'getCloud') + .mockReturnValue({ isServerlessEnabled: true } as any); + + const policies: PreconfiguredAgentPolicy[] = [ + { + name: 'Test policy', + namespace: 'default', + id: 'test-id', + supports_agentless: true, + package_policies: [], + }, + ]; + + const { policies: resPolicies, nonFatalErrors } = + await ensurePreconfiguredPackagesAndPolicies( + soClient, + esClient, + policies, + [{ name: 'CANNOT_MATCH', version: 'x.y.z' }], + mockDefaultOutput, + mockDefaultDownloadService, + DEFAULT_SPACE_ID + ); + expect(nonFatalErrors.length).toBe(0); + expect(resPolicies[0].id).toEqual('test-id'); + }); + + it('should return an error if agentless feature flag is disabled on serverless', async () => { + const soClient = getPutPreconfiguredPackagesMock(); + const esClient = elasticsearchServiceMock.createClusterClient().asInternalUser; + jest.mocked(appContextService.getExperimentalFeatures).mockReturnValue({ + agentless: false, + } as any); + + jest + .spyOn(appContextService, 'getCloud') + .mockReturnValue({ isServerlessEnabled: true } as any); + + const policies: PreconfiguredAgentPolicy[] = [ + { + name: 'Test policy', + namespace: 'default', + id: 'test-id', + supports_agentless: true, + package_policies: [], + }, + ]; + + const { nonFatalErrors } = await ensurePreconfiguredPackagesAndPolicies( + soClient, + esClient, + policies, + [{ name: 'CANNOT_MATCH', version: 'x.y.z' }], + mockDefaultOutput, + mockDefaultDownloadService, + DEFAULT_SPACE_ID + ); + // @ts-ignore-next-line + expect(nonFatalErrors[0].error.toString()).toEqual( + 'FleetError: `supports_agentless` is only allowed in serverless environments that support the agentless feature' + ); + }); + it('should not attempt to recreate or modify an agent policy if its ID is unchanged', async () => { const soClient = getPutPreconfiguredPackagesMock(); const esClient = elasticsearchServiceMock.createClusterClient().asInternalUser; diff --git a/x-pack/plugins/fleet/server/services/preconfiguration.ts b/x-pack/plugins/fleet/server/services/preconfiguration.ts index 877fb343b6507..26f633cc8f021 100644 --- a/x-pack/plugins/fleet/server/services/preconfiguration.ts +++ b/x-pack/plugins/fleet/server/services/preconfiguration.ts @@ -59,6 +59,7 @@ export async function ensurePreconfiguredPackagesAndPolicies( spaceId: string ): Promise { const logger = appContextService.getLogger(); + const cloudSetup = appContextService.getCloud(); // Validate configured packages to ensure there are no version conflicts const packageNames = groupBy(packages, (pkg) => pkg.name); @@ -160,6 +161,19 @@ export async function ensurePreconfiguredPackagesAndPolicies( ); } + if ( + (!cloudSetup?.isServerlessEnabled || + !appContextService.getExperimentalFeatures().agentless) && + preconfiguredAgentPolicy?.supports_agentless !== undefined + ) { + throw new FleetError( + i18n.translate('xpack.fleet.preconfiguration.support_agentless', { + defaultMessage: + '`supports_agentless` is only allowed in serverless environments that support the agentless feature', + }) + ); + } + const { created, policy } = await agentPolicyService.ensurePreconfiguredAgentPolicy( soClient, esClient, @@ -372,9 +386,7 @@ async function addPreconfiguredPolicyPackages( await addPackageToAgentPolicy( soClient, esClient, - installedPackage, agentPolicy, - defaultOutput, packageInfo, name, id, diff --git a/x-pack/plugins/fleet/server/types/models/agent_policy.ts b/x-pack/plugins/fleet/server/types/models/agent_policy.ts index 748a5c81c1bfb..ed2a50854c58b 100644 --- a/x-pack/plugins/fleet/server/types/models/agent_policy.ts +++ b/x-pack/plugins/fleet/server/types/models/agent_policy.ts @@ -83,6 +83,7 @@ export const AgentPolicyBaseSchema = { ) ), ...getSettingsAPISchema('AGENT_POLICY_ADVANCED_SETTINGS'), + supports_agentless: schema.maybe(schema.boolean({ defaultValue: false })), }; export const NewAgentPolicySchema = schema.object({ From 810e8201187bdb1c3066e26d042a2edd8d67154b Mon Sep 17 00:00:00 2001 From: Marco Liberati Date: Wed, 8 May 2024 11:43:32 +0200 Subject: [PATCH 56/86] Fix treeshake on shared-ux packages (#182790) ## Summary This PR should fix some regression due to some previous tree-shake configs from #182348 . The fix tells now webpack to always import css, so final bundle size will increase back again (not all of it, but a good 70%). --- packages/shared-ux/avatar/solution/package.json | 2 +- packages/shared-ux/button/exit_full_screen/package.json | 2 +- packages/shared-ux/chrome/navigation/package.json | 2 +- packages/shared-ux/file/file_picker/impl/package.json | 2 +- packages/shared-ux/page/solution_nav/package.json | 2 +- 5 files changed, 5 insertions(+), 5 deletions(-) diff --git a/packages/shared-ux/avatar/solution/package.json b/packages/shared-ux/avatar/solution/package.json index 84cd3fb6e597d..7ebb65ba7cd32 100644 --- a/packages/shared-ux/avatar/solution/package.json +++ b/packages/shared-ux/avatar/solution/package.json @@ -3,5 +3,5 @@ "private": true, "version": "1.0.0", "license": "SSPL-1.0 OR Elastic License 2.0", - "sideEffects": false + "sideEffects": ["*.scss"] } \ No newline at end of file diff --git a/packages/shared-ux/button/exit_full_screen/package.json b/packages/shared-ux/button/exit_full_screen/package.json index 0cbd7067a2465..338264b5ecbf5 100644 --- a/packages/shared-ux/button/exit_full_screen/package.json +++ b/packages/shared-ux/button/exit_full_screen/package.json @@ -3,5 +3,5 @@ "private": true, "version": "1.0.0", "license": "SSPL-1.0 OR Elastic License 2.0", - "sideEffects": false + "sideEffects": ["*.scss"] } \ No newline at end of file diff --git a/packages/shared-ux/chrome/navigation/package.json b/packages/shared-ux/chrome/navigation/package.json index 3409c5e815049..74a4a5b42a923 100644 --- a/packages/shared-ux/chrome/navigation/package.json +++ b/packages/shared-ux/chrome/navigation/package.json @@ -3,5 +3,5 @@ "private": true, "version": "1.0.0", "license": "SSPL-1.0 OR Elastic License 2.0", - "sideEffects": false + "sideEffects": ["*.scss"] } \ No newline at end of file diff --git a/packages/shared-ux/file/file_picker/impl/package.json b/packages/shared-ux/file/file_picker/impl/package.json index b2e7d0fb87403..1f6ae6648a081 100644 --- a/packages/shared-ux/file/file_picker/impl/package.json +++ b/packages/shared-ux/file/file_picker/impl/package.json @@ -3,5 +3,5 @@ "private": true, "version": "1.0.0", "license": "SSPL-1.0 OR Elastic License 2.0", - "sideEffects": false + "sideEffects": ["*.scss"] } diff --git a/packages/shared-ux/page/solution_nav/package.json b/packages/shared-ux/page/solution_nav/package.json index f133dbd40daab..53a5979da78b1 100644 --- a/packages/shared-ux/page/solution_nav/package.json +++ b/packages/shared-ux/page/solution_nav/package.json @@ -3,5 +3,5 @@ "private": true, "version": "1.0.0", "license": "SSPL-1.0 OR Elastic License 2.0", - "sideEffects": false + "sideEffects": ["*.scss"] } \ No newline at end of file From 216ecd774e7c041e806dfa624d456716f4c1fbfb Mon Sep 17 00:00:00 2001 From: Katerina Date: Wed, 8 May 2024 13:30:30 +0300 Subject: [PATCH 57/86] [APM] Add advanced setting for enabling multi signal views in APM (#182862) ## Summary close #182678 key: `observability:apmEnableMultiSignal` ![image](https://github.com/elastic/kibana/assets/3369346/d45a60f2-4d7e-42d8-9a29-2af69bcb0326) --- .../settings/setting_ids/index.ts | 1 + .../settings/observability_project/index.ts | 1 + .../server/collectors/management/schema.ts | 4 ++++ .../server/collectors/management/types.ts | 1 + src/plugins/telemetry/schema/oss_plugins.json | 6 ++++++ .../observability/common/ui_settings_keys.ts | 1 + .../observability/server/ui_settings.ts | 18 ++++++++++++++++++ 7 files changed, 32 insertions(+) diff --git a/packages/kbn-management/settings/setting_ids/index.ts b/packages/kbn-management/settings/setting_ids/index.ts index f4a30dac6cb12..93646978aa1a6 100644 --- a/packages/kbn-management/settings/setting_ids/index.ts +++ b/packages/kbn-management/settings/setting_ids/index.ts @@ -139,6 +139,7 @@ export const OBSERVABILITY_APM_ENABLE_SERVICE_INVENTORY_TABLE_SEARCH_BAR = 'observability:apmEnableServiceInventoryTableSearchBar'; export const OBSERVABILITY_LOGS_EXPLORER_ALLOWED_DATA_VIEWS_ID = 'observability:logsExplorer:allowedDataViews'; +export const OBSERVABILITY_APM_ENABLE_MULTI_SIGNAL = 'observability:apmEnableMultiSignal'; // Reporting settings export const XPACK_REPORTING_CUSTOM_PDF_LOGO_ID = 'xpackReporting:customPdfLogo'; diff --git a/packages/serverless/settings/observability_project/index.ts b/packages/serverless/settings/observability_project/index.ts index b6cd0a21fb0f3..e9b5ceeee5eed 100644 --- a/packages/serverless/settings/observability_project/index.ts +++ b/packages/serverless/settings/observability_project/index.ts @@ -32,4 +32,5 @@ export const OBSERVABILITY_PROJECT_SETTINGS = [ settings.OBSERVABILITY_LOGS_EXPLORER_ALLOWED_DATA_VIEWS_ID, settings.OBSERVABILITY_APM_ENABLE_TABLE_SEARCH_BAR, settings.OBSERVABILITY_APM_ENABLE_SERVICE_INVENTORY_TABLE_SEARCH_BAR, + settings.OBSERVABILITY_APM_ENABLE_MULTI_SIGNAL, ]; diff --git a/src/plugins/kibana_usage_collection/server/collectors/management/schema.ts b/src/plugins/kibana_usage_collection/server/collectors/management/schema.ts index 1cf68fdf92f36..fc4786dd5ca3f 100644 --- a/src/plugins/kibana_usage_collection/server/collectors/management/schema.ts +++ b/src/plugins/kibana_usage_collection/server/collectors/management/schema.ts @@ -468,6 +468,10 @@ export const stackManagementSchema: MakeSchemaFrom = { type: 'boolean', _meta: { description: 'Non-default value of setting.' }, }, + 'observability:apmEnableMultiSignal': { + type: 'boolean', + _meta: { description: 'Non-default value of setting.' }, + }, 'observability:apmAWSLambdaPriceFactor': { type: 'text', _meta: { description: 'Non-default value of setting.' }, diff --git a/src/plugins/kibana_usage_collection/server/collectors/management/types.ts b/src/plugins/kibana_usage_collection/server/collectors/management/types.ts index 8464207aaa1d6..bc1c315edae29 100644 --- a/src/plugins/kibana_usage_collection/server/collectors/management/types.ts +++ b/src/plugins/kibana_usage_collection/server/collectors/management/types.ts @@ -161,6 +161,7 @@ export interface UsageStats { 'observability:apmTraceExplorerTab': boolean; 'observability:apmEnableCriticalPath': boolean; 'observability:apmEnableProfilingIntegration': boolean; + 'observability:apmEnableMultiSignal': boolean; 'observability:profilingShowErrorFrames': boolean; 'securitySolution:enableGroupedNav': boolean; 'securitySolution:showRelatedIntegrations': boolean; diff --git a/src/plugins/telemetry/schema/oss_plugins.json b/src/plugins/telemetry/schema/oss_plugins.json index 9810432cc3ab3..717e5ebabbe1b 100644 --- a/src/plugins/telemetry/schema/oss_plugins.json +++ b/src/plugins/telemetry/schema/oss_plugins.json @@ -10167,6 +10167,12 @@ "description": "Non-default value of setting." } }, + "observability:apmEnableMultiSignal": { + "type": "boolean", + "_meta": { + "description": "Non-default value of setting." + } + }, "observability:apmAWSLambdaPriceFactor": { "type": "text", "_meta": { diff --git a/x-pack/plugins/observability_solution/observability/common/ui_settings_keys.ts b/x-pack/plugins/observability_solution/observability/common/ui_settings_keys.ts index 87f60b977691c..46bbfa2c08757 100644 --- a/x-pack/plugins/observability_solution/observability/common/ui_settings_keys.ts +++ b/x-pack/plugins/observability_solution/observability/common/ui_settings_keys.ts @@ -24,6 +24,7 @@ export const enableInfrastructureAssetCustomDashboards = export const enableAwsLambdaMetrics = 'observability:enableAwsLambdaMetrics'; export const enableAgentExplorerView = 'observability:apmAgentExplorerView'; export const apmEnableTableSearchBar = 'observability:apmEnableTableSearchBar'; +export const apmEnableMultiSignal = 'observability:apmEnableMultiSignal'; export const apmEnableServiceInventoryTableSearchBar = 'observability:apmEnableServiceInventoryTableSearchBar'; export const apmAWSLambdaPriceFactor = 'observability:apmAWSLambdaPriceFactor'; diff --git a/x-pack/plugins/observability_solution/observability/server/ui_settings.ts b/x-pack/plugins/observability_solution/observability/server/ui_settings.ts index 2b5468e0715f8..6ce519dbbc496 100644 --- a/x-pack/plugins/observability_solution/observability/server/ui_settings.ts +++ b/x-pack/plugins/observability_solution/observability/server/ui_settings.ts @@ -21,6 +21,7 @@ import { apmLabsButton, enableAgentExplorerView, apmEnableTableSearchBar, + apmEnableMultiSignal, enableAwsLambdaMetrics, apmAWSLambdaPriceFactor, apmAWSLambdaRequestCostPerMillion, @@ -326,6 +327,23 @@ export const uiSettings: Record = { requiresPageReload: true, type: 'boolean', }, + [apmEnableMultiSignal]: { + category: [observabilityFeatureId], + name: i18n.translate('xpack.observability.apmEnableMultiSignal', { + defaultMessage: 'Multi signal APM', + }), + description: i18n.translate('xpack.observability.apmEnableMultiSignalDescription', { + defaultMessage: + '{technicalPreviewLabel} Enable the multi-signal feature in APM, which allows you to monitor services from logs and traces.', + values: { + technicalPreviewLabel: `[${technicalPreviewLabel}]`, + }, + }), + schema: schema.boolean(), + value: false, + requiresPageReload: true, + type: 'boolean', + }, [apmEnableServiceInventoryTableSearchBar]: { category: [observabilityFeatureId], name: i18n.translate('xpack.observability.apmEnableServiceInventoryTableSearchBar', { From aa1df6d911993dde6ab434aafc74d73c690f897c Mon Sep 17 00:00:00 2001 From: Jan Monschke Date: Wed, 8 May 2024 12:34:23 +0200 Subject: [PATCH 58/86] [Threat Hunting Investigations] Show the correct stats in unified field list (#180850) ## Summary Fixes https://github.com/elastic/security-team/issues/9077 Enables correct rendering of top values in the unified field list through a new `dataService` for timeline. This `timelineDataService` is synced with the current timeline's range filter, the selected `indexPattern` and the special `combinedQuery` that timeline is based on. ### Example Two values for `event.category` are present in the current timeline's alerts (`behavior` and `process`): Screenshot 2024-04-15 at 22 06 33 When filtering for a specific `_id`, only the `process` value is showing and the counts are also correct (`1`): Screenshot 2024-04-15 at 22 06 56 ### A wild bugfix appeared While working on this change, I noticed some irregularities that stemmed from a race condition between updates of the filters in redux and in filter manager. In a worst case scenario, this race condition could lead to marking unchanged timelines as changed when opened. Before this fix/refactoring, `filterManager` updates where propagated from a subscription in `QueryBarTimeline`, which is quite deep in the component tree. This resulted in prop drilling (`setFilter`) and bubbling up of changes to where they are handled (`QueryBarTimeline` -> `SearchOrFilter` -> `StatefulSearchOrFilter`). Before: ```mermaid flowchart TD subgraph Redux Store end Store -- filters,setFilters --> StatefulSearchOrFilter StatefulSearchOrFilter -. setFilters(filters) .-> Store StatefulSearchOrFilter -- prop:filters,onFiltersUpdated --> FilterItems --> FilterItem FilterItem -. onRemove .-> FilterItems FilterItems -. onFiltersUpdated(filters) .-> StatefulSearchOrFilter StatefulSearchOrFilter -- prop:setFilters,filters --> SearchOrFilter SearchOrFilter -. setFilters(filters) .-> StatefulSearchOrFilter SearchOrFilter -- prop:setFilters,filters --> QueryBarTimeline QueryBarTimeline -. setFilters(filters) .-> SearchOrFilter QueryBarTimeline ==> |subscribe| TimelineFilterManager TimelineFilterManager -.-> |next| QueryBarTimeline FilterIn ~~~ TimelineFilterManager FilterOut ~~~ TimelineFilterManager DisableFilter ~~~ TimelineFilterManager FilterIn -.-> TimelineFilterManager FilterOut -.-> TimelineFilterManager DisableFilter -.-> TimelineFilterManager ``` In this refactoring, `StatefulSearchOrFilter` is directly subscribing to filter manager changes and `setFilters` has been removed, making `QueryBarTimeline` a proper leaf node. `StatefulSearchOrFilter` now also contains all of the synchronization code between filter manager and redux. After: ```mermaid flowchart TD subgraph Redux Store end Store -- filters,setFilters --> StatefulSearchOrFilter StatefulSearchOrFilter -. setFilters(filters) .-> Store StatefulSearchOrFilter -- prop:filters,onFiltersUpdated --> FilterItems FilterItems -. onFiltersUpdated(filters) .-> StatefulSearchOrFilter StatefulSearchOrFilter -- prop:filters --> SearchOrFilter SearchOrFilter -- prop:setFilters,filters --> QueryBarTimeline StatefulSearchOrFilter ==> |subscribe| TimelineFilterManager TimelineFilterManager -.-> |next| StatefulSearchOrFilter subgraph FilterManager FilterIn ~~~ TimelineFilterManager FilterOut ~~~ TimelineFilterManager DisableFilter ~~~ TimelineFilterManager FilterIn -.-> TimelineFilterManager FilterOut -.-> TimelineFilterManager DisableFilter -.-> TimelineFilterManager end ``` ### - make sure `unifiedComponentsInTimelineEnabled` is enabled before testing this PR ### Checklist - [x] memoize `combinedQueries` - [x] [Unit or functional tests](https://www.elastic.co/guide/en/kibana/master/development-tests.html) were updated or added to match the most common scenarios --------- Co-authored-by: Kibana Machine <42973632+kibanamachine@users.noreply.github.com> --- x-pack/plugins/security_solution/kibana.jsonc | 1 + .../filter/cell_action/filter_in.test.ts | 6 +- .../actions/filter/cell_action/filter_in.ts | 5 +- .../filter/cell_action/filter_out.test.ts | 10 ++- .../actions/filter/cell_action/filter_out.ts | 5 +- .../actions/filter/lens/create_action.test.ts | 2 +- .../actions/filter/lens/create_action.ts | 13 +++- .../hover_actions/use_hover_action_items.tsx | 5 +- .../containers/sourcerer/index.test.tsx | 28 +++++++++ .../common/containers/sourcerer/index.tsx | 17 +++-- .../common/lib/kibana/kibana_react.mock.ts | 13 ++-- .../public/common/lib/kuery/index.ts | 10 ++- .../public/plugin_services.ts | 45 ++++++++++--- .../timelines/components/timeline/helpers.tsx | 6 ++ .../timeline/query_bar/eql/index.tsx | 8 +-- .../timeline/query_bar/index.test.tsx | 9 +-- .../components/timeline/query_bar/index.tsx | 50 ++------------- .../timeline/search_or_filter/index.tsx | 36 ++++++++--- .../search_or_filter/search_or_filter.tsx | 3 - .../components/timeline/tabs/index.test.tsx | 8 +++ .../timeline/tabs/query/index.test.tsx | 4 ++ .../components/timeline/tabs/query/index.tsx | 63 ++++++++++++++----- .../unified_components/index.test.tsx | 7 +-- .../timeline/unified_components/index.tsx | 12 ++-- .../plugins/security_solution/public/types.ts | 4 +- .../cypress/tasks/search_bar.ts | 3 + 26 files changed, 244 insertions(+), 129 deletions(-) diff --git a/x-pack/plugins/security_solution/kibana.jsonc b/x-pack/plugins/security_solution/kibana.jsonc index c9f4b85b8c3d8..14741ec4c37e0 100644 --- a/x-pack/plugins/security_solution/kibana.jsonc +++ b/x-pack/plugins/security_solution/kibana.jsonc @@ -53,6 +53,7 @@ "notifications", "savedSearch", "unifiedDocViewer", + "charts" ], "optionalPlugins": [ "cloudExperiments", diff --git a/x-pack/plugins/security_solution/public/actions/filter/cell_action/filter_in.test.ts b/x-pack/plugins/security_solution/public/actions/filter/cell_action/filter_in.test.ts index 178757d835785..bb395829bcdff 100644 --- a/x-pack/plugins/security_solution/public/actions/filter/cell_action/filter_in.test.ts +++ b/x-pack/plugins/security_solution/public/actions/filter/cell_action/filter_in.test.ts @@ -108,7 +108,7 @@ describe('createFilterInCellActionFactory', () => { it('should execute using generic filterManager', async () => { await filterInAction.execute(dataTableContext); expect(mockGlobalFilterManager.addFilters).toHaveBeenCalled(); - expect(services.timelineFilterManager.addFilters).not.toHaveBeenCalled(); + expect(services.timelineDataService.query.filterManager.addFilters).not.toHaveBeenCalled(); }); it('should show warning if value type is unsupported', async () => { @@ -122,7 +122,7 @@ describe('createFilterInCellActionFactory', () => { ], }); expect(mockGlobalFilterManager.addFilters).not.toHaveBeenCalled(); - expect(services.timelineFilterManager.addFilters).not.toHaveBeenCalled(); + expect(services.timelineDataService.query.filterManager.addFilters).not.toHaveBeenCalled(); expect(mockWarningToast).toHaveBeenCalled(); }); }); @@ -135,7 +135,7 @@ describe('createFilterInCellActionFactory', () => { it('should execute using timeline filterManager', async () => { await filterInAction.execute(timelineContext); - expect(services.timelineFilterManager.addFilters).toHaveBeenCalled(); + expect(services.timelineDataService.query.filterManager.addFilters).toHaveBeenCalled(); expect(mockGlobalFilterManager.addFilters).not.toHaveBeenCalled(); }); }); diff --git a/x-pack/plugins/security_solution/public/actions/filter/cell_action/filter_in.ts b/x-pack/plugins/security_solution/public/actions/filter/cell_action/filter_in.ts index fb85c32963d01..3a92021089361 100644 --- a/x-pack/plugins/security_solution/public/actions/filter/cell_action/filter_in.ts +++ b/x-pack/plugins/security_solution/public/actions/filter/cell_action/filter_in.ts @@ -29,6 +29,9 @@ export const createFilterInCellActionFactory = ({ }) => { const { filterManager } = services.data.query; const { notifications } = services; + const { + query: { filterManager: timelineFilterManager }, + } = services.timelineDataService; const genericFilterInActionFactory = createFilterInActionFactory({ filterManager, notifications, @@ -65,7 +68,7 @@ export const createFilterInCellActionFactory = ({ const addFilter = metadata?.negateFilters === true ? addFilterOut : addFilterIn; if (metadata?.scopeId && isTimelineScope(metadata.scopeId)) { - addFilter({ filterManager: services.timelineFilterManager, fieldName, value, dataViewId }); + addFilter({ filterManager: timelineFilterManager, fieldName, value, dataViewId }); } else { addFilter({ filterManager, fieldName, value, dataViewId }); } diff --git a/x-pack/plugins/security_solution/public/actions/filter/cell_action/filter_out.test.ts b/x-pack/plugins/security_solution/public/actions/filter/cell_action/filter_out.test.ts index 23e7fb7e3f662..43238b1d988e8 100644 --- a/x-pack/plugins/security_solution/public/actions/filter/cell_action/filter_out.test.ts +++ b/x-pack/plugins/security_solution/public/actions/filter/cell_action/filter_out.test.ts @@ -105,7 +105,9 @@ describe('createFilterOutCellActionFactory', () => { it('should execute using generic filterManager', async () => { await filterOutAction.execute(dataTableContext); expect(mockGlobalFilterManager.addFilters).toHaveBeenCalled(); - expect(mockServices.timelineFilterManager.addFilters).not.toHaveBeenCalled(); + expect( + mockServices.timelineDataService.query.filterManager.addFilters + ).not.toHaveBeenCalled(); }); it('should show warning if value type is unsupported', async () => { @@ -119,7 +121,9 @@ describe('createFilterOutCellActionFactory', () => { ], }); expect(mockGlobalFilterManager.addFilters).not.toHaveBeenCalled(); - expect(mockServices.timelineFilterManager.addFilters).not.toHaveBeenCalled(); + expect( + mockServices.timelineDataService.query.filterManager.addFilters + ).not.toHaveBeenCalled(); expect(mockWarningToast).toHaveBeenCalled(); }); }); @@ -132,7 +136,7 @@ describe('createFilterOutCellActionFactory', () => { it('should execute using timeline filterManager', async () => { await filterOutAction.execute(timelineContext); - expect(mockServices.timelineFilterManager.addFilters).toHaveBeenCalled(); + expect(mockServices.timelineDataService.query.filterManager.addFilters).toHaveBeenCalled(); expect(mockGlobalFilterManager.addFilters).not.toHaveBeenCalled(); }); }); diff --git a/x-pack/plugins/security_solution/public/actions/filter/cell_action/filter_out.ts b/x-pack/plugins/security_solution/public/actions/filter/cell_action/filter_out.ts index bbc433e94256b..f177413901448 100644 --- a/x-pack/plugins/security_solution/public/actions/filter/cell_action/filter_out.ts +++ b/x-pack/plugins/security_solution/public/actions/filter/cell_action/filter_out.ts @@ -29,6 +29,9 @@ export const createFilterOutCellActionFactory = ({ }) => { const { filterManager } = services.data.query; const { notifications } = services; + const { + query: { filterManager: timelineFilterManager }, + } = services.timelineDataService; const genericFilterOutActionFactory = createFilterOutActionFactory({ filterManager, @@ -65,7 +68,7 @@ export const createFilterOutCellActionFactory = ({ const addFilter = metadata?.negateFilters === true ? addFilterIn : addFilterOut; if (metadata?.scopeId && isTimelineScope(metadata.scopeId)) { - addFilter({ filterManager: services.timelineFilterManager, fieldName, value, dataViewId }); + addFilter({ filterManager: timelineFilterManager, fieldName, value, dataViewId }); } else { addFilter({ filterManager, fieldName, value, dataViewId }); } diff --git a/x-pack/plugins/security_solution/public/actions/filter/lens/create_action.test.ts b/x-pack/plugins/security_solution/public/actions/filter/lens/create_action.test.ts index 1efbbc9960146..d8f004f063ecb 100644 --- a/x-pack/plugins/security_solution/public/actions/filter/lens/create_action.test.ts +++ b/x-pack/plugins/security_solution/public/actions/filter/lens/create_action.test.ts @@ -26,7 +26,7 @@ jest.mock('../../../timelines/store', () => ({ describe('createFilterLensAction', () => { const mockServices = { - timelineFilterManager: 'mockTimelineFilterManager', + timelineDataService: { query: { filterManager: 'mockTimelineFilterManager' } }, data: { query: { filterManager: 'mockFilterManager' } }, application: { currentAppId$: of('appId') }, topValuesPopover: { diff --git a/x-pack/plugins/security_solution/public/actions/filter/lens/create_action.ts b/x-pack/plugins/security_solution/public/actions/filter/lens/create_action.ts index ecfe71bc3a112..a6d69bf1b3530 100644 --- a/x-pack/plugins/security_solution/public/actions/filter/lens/create_action.ts +++ b/x-pack/plugins/security_solution/public/actions/filter/lens/create_action.ts @@ -46,7 +46,16 @@ export const createFilterLensAction = ({ services, negate, }: CreateFilterLensActionParams) => { - const { application, notifications, data: dataService, topValuesPopover } = services; + const { + application, + notifications, + data: dataService, + topValuesPopover, + timelineDataService, + } = services; + const { + query: { filterManager: timelineFilterManager }, + } = timelineDataService; let currentAppId: string | undefined; application.currentAppId$.subscribe((appId) => { @@ -93,7 +102,7 @@ export const createFilterLensAction = ({ const timeline = getTimelineById(store.getState(), TimelineId.active); // timeline is open add the filter to timeline, otherwise add filter to global filters const filterManager = timeline?.show - ? services.timelineFilterManager + ? timelineFilterManager : dataService.query.filterManager; // If value type is value_count, we want to filter an `Exists` filter instead of a `Term` filter diff --git a/x-pack/plugins/security_solution/public/common/components/hover_actions/use_hover_action_items.tsx b/x-pack/plugins/security_solution/public/common/components/hover_actions/use_hover_action_items.tsx index 866acee43b6d5..188a10c06036c 100644 --- a/x-pack/plugins/security_solution/public/common/components/hover_actions/use_hover_action_items.tsx +++ b/x-pack/plugins/security_solution/public/common/components/hover_actions/use_hover_action_items.tsx @@ -82,7 +82,10 @@ export const useHoverActionItems = ({ }: UseHoverActionItemsProps): UseHoverActionItems => { const kibana = useKibana(); const dispatch = useDispatch(); - const { timelines, timelineFilterManager, analytics, i18n, theme } = kibana.services; + const { timelines, timelineDataService, analytics, i18n, theme } = kibana.services; + const { + query: { filterManager: timelineFilterManager }, + } = timelineDataService; const dataViewId = useDataViewId(getSourcererScopeId(scopeId ?? '')); // Common actions used by the alert table and alert flyout diff --git a/x-pack/plugins/security_solution/public/common/containers/sourcerer/index.test.tsx b/x-pack/plugins/security_solution/public/common/containers/sourcerer/index.test.tsx index eb218e626f176..88b58e46adbf8 100644 --- a/x-pack/plugins/security_solution/public/common/containers/sourcerer/index.test.tsx +++ b/x-pack/plugins/security_solution/public/common/containers/sourcerer/index.test.tsx @@ -664,6 +664,34 @@ describe('Sourcerer Hooks', () => { expect(result.current.indexPattern).toHaveProperty('getName'); }); }); + + it('should update the title of the data view according to the selected patterns', async () => { + const { result, rerender } = renderHook( + () => useSourcererDataView(), + { + wrapper: ({ children }) => {children}, + } + ); + + expect(result.current.sourcererDataView?.title).toBe( + 'apm-*-transaction*,auditbeat-*,endgame-*,filebeat-*,logs-*,packetbeat-*,traces-apm*,winlogbeat-*,-*elastic-cloud-logs-*' + ); + + const testPatterns = ['anotherTestPattern', 'justATestPattern']; + await act(async () => { + store.dispatch( + sourcererActions.setSelectedDataView({ + id: SourcererScopeName.default, + selectedDataViewId: 'security-solution-default', + selectedPatterns: testPatterns, + }) + ); + + await rerender(); + + expect(result.current.sourcererDataView?.title).toBe(testPatterns.join(',')); + }); + }); }); }); diff --git a/x-pack/plugins/security_solution/public/common/containers/sourcerer/index.tsx b/x-pack/plugins/security_solution/public/common/containers/sourcerer/index.tsx index 0a8985d5bfb86..6ae176890291d 100644 --- a/x-pack/plugins/security_solution/public/common/containers/sourcerer/index.tsx +++ b/x-pack/plugins/security_solution/public/common/containers/sourcerer/index.tsx @@ -445,11 +445,18 @@ export const useSourcererDataView = ( } }, [missingPatterns, selectedDataView, selectedPatterns]); - const sourcererDataView = useMemo( - () => - selectedDataView == null || missingPatterns.length > 0 ? legacyDataView : selectedDataView, - [legacyDataView, missingPatterns.length, selectedDataView] - ); + const sourcererDataView = useMemo(() => { + const _dv = + selectedDataView == null || missingPatterns.length > 0 ? legacyDataView : selectedDataView; + // Make sure the title is up to date, so that the correct index patterns are used everywhere + return { + ..._dv, + dataView: { + ..._dv.dataView, + title: selectedPatterns.join(','), + }, + }; + }, [legacyDataView, missingPatterns.length, selectedDataView, selectedPatterns]); const indicesExist = useMemo(() => { if (loading || sourcererDataView.loading) { diff --git a/x-pack/plugins/security_solution/public/common/lib/kibana/kibana_react.mock.ts b/x-pack/plugins/security_solution/public/common/lib/kibana/kibana_react.mock.ts index d3aa07d0f6cda..f20679d68884c 100644 --- a/x-pack/plugins/security_solution/public/common/lib/kibana/kibana_react.mock.ts +++ b/x-pack/plugins/security_solution/public/common/lib/kibana/kibana_react.mock.ts @@ -14,7 +14,6 @@ import { coreMock, themeServiceMock } from '@kbn/core/public/mocks'; import { KibanaContextProvider } from '@kbn/kibana-react-plugin/public'; import { dataPluginMock } from '@kbn/data-plugin/public/mocks'; import { securityMock } from '@kbn/security-plugin/public/mocks'; -import { createFilterManagerMock } from '@kbn/data-plugin/public/query/filter_manager/filter_manager.mock'; import { DEFAULT_APP_REFRESH_INTERVAL, @@ -128,7 +127,7 @@ export const createStartServicesMock = ( const guidedOnboarding = guidedOnboardingMock.createStart(); const cloud = cloudMock.createStart(); const mockSetHeaderActionMenu = jest.fn(); - const mockTimelineFilterManager = createFilterManagerMock(); + const timelineDataService = dataPluginMock.createStartContract(); const alerting = alertingPluginMock.createStartContract(); /* @@ -136,17 +135,17 @@ export const createStartServicesMock = ( * when data service is passed through as a prop * * */ - data.query.timefilter.timefilter.getAbsoluteTime = jest.fn(() => ({ + timelineDataService.query.timefilter.timefilter.getAbsoluteTime = jest.fn(() => ({ from: '2021-08-31T22:00:00.000Z', to: '2022-09-01T09:16:29.553Z', })); - data.query.timefilter.timefilter.getTime = jest.fn(() => { + timelineDataService.query.timefilter.timefilter.getTime = jest.fn(() => { return { from: 'now-15m', to: 'now' }; }); - data.query.timefilter.timefilter.getRefreshInterval = jest.fn(() => { + timelineDataService.query.timefilter.timefilter.getRefreshInterval = jest.fn(() => { return { pause: true, value: 1000 }; }); - data.query.timefilter.timefilter.calculateBounds = jest.fn(calculateBounds); + timelineDataService.query.timefilter.timefilter.calculateBounds = jest.fn(calculateBounds); /** ************************************************* */ return { @@ -251,7 +250,7 @@ export const createStartServicesMock = ( fieldFormats: fieldFormatsMock, dataViewFieldEditor: indexPatternFieldEditorPluginMock.createStartContract(), upselling: new UpsellingService(), - timelineFilterManager: mockTimelineFilterManager, + timelineDataService, alerting, } as unknown as StartServices; }; diff --git a/x-pack/plugins/security_solution/public/common/lib/kuery/index.ts b/x-pack/plugins/security_solution/public/common/lib/kuery/index.ts index 487917f381b9b..5018abe6bdf62 100644 --- a/x-pack/plugins/security_solution/public/common/lib/kuery/index.ts +++ b/x-pack/plugins/security_solution/public/common/lib/kuery/index.ts @@ -231,6 +231,12 @@ export const convertToBuildEsQuery = ({ } }; +export interface CombinedQuery { + filterQuery: string | undefined; + kqlError: Error | undefined; + baseKqlQuery: Query; +} + export const combineQueries = ({ config, dataProviders = [], @@ -239,7 +245,7 @@ export const combineQueries = ({ filters = [], kqlQuery, kqlMode, -}: CombineQueries): { filterQuery: string | undefined; kqlError: Error | undefined } | null => { +}: CombineQueries): CombinedQuery | null => { const kuery: Query = { query: '', language: kqlQuery.language }; if (isDataProviderEmpty(dataProviders) && isEmpty(kqlQuery.query) && isEmpty(filters)) { return null; @@ -254,6 +260,7 @@ export const combineQueries = ({ return { filterQuery, kqlError, + baseKqlQuery: kuery, }; } @@ -281,5 +288,6 @@ export const combineQueries = ({ return { filterQuery, kqlError, + baseKqlQuery: kuery, }; }; diff --git a/x-pack/plugins/security_solution/public/plugin_services.ts b/x-pack/plugins/security_solution/public/plugin_services.ts index dceb1597715cf..1ce2292e2d9bf 100644 --- a/x-pack/plugins/security_solution/public/plugin_services.ts +++ b/x-pack/plugins/security_solution/public/plugin_services.ts @@ -6,7 +6,7 @@ */ import type { AppMountParameters, CoreSetup, CoreStart, PackageInfo } from '@kbn/core/public'; -import { FilterManager, NowProvider, QueryService } from '@kbn/data-plugin/public'; +import { NowProvider, QueryService } from '@kbn/data-plugin/public'; import type { DataPublicPluginStart, QueryStart } from '@kbn/data-plugin/public'; import { Storage } from '@kbn/kibana-utils-plugin/public'; import { initTelemetry, TelemetryService } from './common/lib/telemetry'; @@ -31,6 +31,7 @@ import type { export class PluginServices { private readonly telemetry: TelemetryService = new TelemetryService(); private readonly queryService: QueryService = new QueryService(); + private readonly timelineQueryService: QueryService = new QueryService(); private readonly storage = new Storage(localStorage); private readonly sessionStorage = new Storage(sessionStorage); @@ -69,7 +70,13 @@ export class PluginServices { { prebuiltRulesPackageVersion: this.prebuiltRulesPackageVersion } ); - this.queryService?.setup({ + this.queryService.setup({ + uiSettings: coreSetup.uiSettings, + storage: this.storage, + nowProvider: new NowProvider(), + }); + + this.timelineQueryService.setup({ uiSettings: coreSetup.uiSettings, storage: this.storage, nowProvider: new NowProvider(), @@ -92,6 +99,7 @@ export class PluginServices { public stop() { this.queryService.stop(); + this.timelineQueryService.stop(); licenseService.stop(); } @@ -105,12 +113,23 @@ export class PluginServices { const { savedObjectsTaggingOss, ...plugins } = startPlugins; - const query = this.queryService.start({ - uiSettings: coreStart.uiSettings, - storage: this.storage, - http: coreStart.http, - }); - const customDataService = this.startCustomDataService(query, startPlugins.data); + const customDataService = this.startCustomDataService( + this.queryService.start({ + uiSettings: coreStart.uiSettings, + storage: this.storage, + http: coreStart.http, + }), + startPlugins.data + ); + + const timelineDataService = this.startTimelineDataService( + this.timelineQueryService.start({ + uiSettings: coreStart.uiSettings, + storage: this.storage, + http: coreStart.http, + }), + startPlugins.data + ); return { ...coreStart, @@ -128,8 +147,8 @@ export class PluginServices { contentManagement: startPlugins.contentManagement, telemetry: this.telemetry.start(), customDataService, + timelineDataService, topValuesPopover: new TopValuesPopoverService(), - timelineFilterManager: new FilterManager(coreStart.uiSettings), }; } @@ -150,4 +169,12 @@ export class PluginServices { customDataService.query.filterManager._name = 'customFilterManager'; return customDataService; }; + + private startTimelineDataService = (query: QueryStart, data: DataPublicPluginStart) => { + // Used in the unified timeline + return { + ...data, + query, + }; + }; } diff --git a/x-pack/plugins/security_solution/public/timelines/components/timeline/helpers.tsx b/x-pack/plugins/security_solution/public/timelines/components/timeline/helpers.tsx index 0f22f4ea15cac..82ea7bac73fad 100644 --- a/x-pack/plugins/security_solution/public/timelines/components/timeline/helpers.tsx +++ b/x-pack/plugins/security_solution/public/timelines/components/timeline/helpers.tsx @@ -7,6 +7,7 @@ import { isEmpty, isNumber } from 'lodash/fp'; +import type { Filter } from '@kbn/es-query'; import { elementOrChildrenHasFocus, getFocusedAriaColindexCell, @@ -280,3 +281,8 @@ export const buildIsOneOfQueryMatch = ({ export const isPrimitiveArray = (value: unknown): value is Array => Array.isArray(value) && (value.every((x) => typeof x === 'string') || value.every((x) => typeof x === 'number')); + +export const TIMELINE_FILTER_DROP_AREA = 'timeline-filter-drop-area'; + +export const getNonDropAreaFilters = (filters: Filter[] = []) => + filters.filter((f: Filter) => f.meta.controlledBy !== TIMELINE_FILTER_DROP_AREA); diff --git a/x-pack/plugins/security_solution/public/timelines/components/timeline/query_bar/eql/index.tsx b/x-pack/plugins/security_solution/public/timelines/components/timeline/query_bar/eql/index.tsx index 8e165a2303036..0758ec73271b0 100644 --- a/x-pack/plugins/security_solution/public/timelines/components/timeline/query_bar/eql/index.tsx +++ b/x-pack/plugins/security_solution/public/timelines/components/timeline/query_bar/eql/index.tsx @@ -8,7 +8,7 @@ import { isEmpty, isEqual } from 'lodash'; import React, { memo, useCallback, useEffect, useMemo, useRef, useState } from 'react'; import { useDispatch } from 'react-redux'; -import styled from 'styled-components'; +import { css } from '@emotion/css'; import type { EqlOptionsSelected, @@ -64,7 +64,7 @@ const schema: FormSchema = { }, }; -const HiddenUseField = styled(UseField)` +const hiddenUseFieldClassName = css` display: none; `; @@ -188,8 +188,8 @@ export const EqlQueryBarTimeline = memo(({ timelineId }: { timelineId: string }) return (
- - + + { isRefreshPaused={true} refreshInterval={3000} savedQueryId={null} - setFilters={mockSetFilters} setSavedQueryId={mockSetSavedQueryId} timelineId="timline-real-id" updateReduxTime={mockUpdateReduxTime} @@ -123,7 +122,6 @@ describe('Timeline QueryBar ', () => { isRefreshPaused={true} refreshInterval={3000} savedQueryId={null} - setFilters={mockSetFilters} setSavedQueryId={mockSetSavedQueryId} timelineId="timeline-real-id" updateReduxTime={mockUpdateReduxTime} @@ -161,7 +159,6 @@ describe('Timeline QueryBar ', () => { isRefreshPaused={true} refreshInterval={3000} savedQueryId={null} - setFilters={mockSetFilters} setSavedQueryId={mockSetSavedQueryId} timelineId="timeline-real-id" updateReduxTime={mockUpdateReduxTime} @@ -201,7 +198,6 @@ describe('Timeline QueryBar ', () => { isRefreshPaused={true} refreshInterval={3000} savedQueryId={null} - setFilters={mockSetFilters} setSavedQueryId={mockSetSavedQueryId} timelineId="timeline-real-id" updateReduxTime={mockUpdateReduxTime} @@ -239,7 +235,6 @@ describe('Timeline QueryBar ', () => { isRefreshPaused={true} refreshInterval={3000} savedQueryId={null} - setFilters={mockSetFilters} setSavedQueryId={mockSetSavedQueryId} timelineId="timeline-real-id" updateReduxTime={mockUpdateReduxTime} diff --git a/x-pack/plugins/security_solution/public/timelines/components/timeline/query_bar/index.tsx b/x-pack/plugins/security_solution/public/timelines/components/timeline/query_bar/index.tsx index 73d83469413c4..749c3512cbd20 100644 --- a/x-pack/plugins/security_solution/public/timelines/components/timeline/query_bar/index.tsx +++ b/x-pack/plugins/security_solution/public/timelines/components/timeline/query_bar/index.tsx @@ -6,10 +6,8 @@ */ import { isEmpty } from 'lodash/fp'; -import React, { memo, useCallback, useState, useEffect } from 'react'; +import React, { memo, useCallback, useState, useEffect, useMemo } from 'react'; import { useDispatch } from 'react-redux'; -import { Subscription } from 'rxjs'; -import deepEqual from 'fast-deep-equal'; import type { Filter, Query } from '@kbn/es-query'; import { FilterStateStore } from '@kbn/es-query'; @@ -25,7 +23,7 @@ import { useSavedQueryServices } from '../../../../common/utils/saved_query_serv import type { DispatchUpdateReduxTime } from '../../../../common/components/super_date_picker'; import { QueryBar } from '../../../../common/components/query_bar'; import type { DataProvider } from '../data_providers/data_provider'; -import { buildGlobalQuery } from '../helpers'; +import { TIMELINE_FILTER_DROP_AREA, buildGlobalQuery, getNonDropAreaFilters } from '../helpers'; import { timelineActions } from '../../../store'; import type { KueryFilterQuery, KueryFilterQueryKind } from '../../../../../common/types/timeline'; @@ -40,7 +38,6 @@ export interface QueryBarTimelineComponentProps { isRefreshPaused: boolean; refreshInterval: number; savedQueryId: string | null; - setFilters: (filters: Filter[]) => void; setSavedQueryId: (savedQueryId: string | null) => void; timelineId: string; to: string; @@ -84,11 +81,6 @@ const SearchBarContainer = styled.div` } `; -export const TIMELINE_FILTER_DROP_AREA = 'timeline-filter-drop-area'; - -const getNonDropAreaFilters = (filters: Filter[] = []) => - filters.filter((f: Filter) => f.meta.controlledBy !== TIMELINE_FILTER_DROP_AREA); - // eslint-disable-next-line react/display-name export const QueryBarTimeline = memo( ({ @@ -101,7 +93,6 @@ export const QueryBarTimeline = memo( kqlMode, isRefreshPaused, savedQueryId, - setFilters, setSavedQueryId, refreshInterval, timelineId, @@ -122,9 +113,8 @@ export const QueryBarTimeline = memo( query: filterQuery != null ? filterQuery.expression : '', language: filterQuery != null ? filterQuery.kind : 'kuery', }); - const [queryBarFilters, setQueryBarFilters] = useState( - getNonDropAreaFilters(filters) - ); + const queryBarFilters = useMemo(() => getNonDropAreaFilters(filters), [filters]); + const [dataProvidersDsl, setDataProvidersDsl] = useState( convertKueryToElasticSearchQuery(buildGlobalQuery(dataProviders, browserFields), indexPattern) ); @@ -147,38 +137,6 @@ export const QueryBarTimeline = memo( [dispatch, indexPattern, timelineId] ); - useEffect(() => { - let isSubscribed = true; - const subscriptions = new Subscription(); - filterManager.setFilters(filters); - - subscriptions.add( - filterManager.getUpdates$().subscribe({ - next: () => { - if (isSubscribed) { - const filterWithoutDropArea = getNonDropAreaFilters(filterManager.getFilters()); - setFilters(filterWithoutDropArea); - setQueryBarFilters(filterWithoutDropArea); - } - }, - }) - ); - - return () => { - isSubscribed = false; - subscriptions.unsubscribe(); - }; - // eslint-disable-next-line react-hooks/exhaustive-deps - }, []); - - useEffect(() => { - const filterWithoutDropArea = getNonDropAreaFilters(filterManager.getFilters()); - if (!deepEqual(filters, filterWithoutDropArea)) { - filterManager.setFilters(filters); - } - // eslint-disable-next-line react-hooks/exhaustive-deps - }, [filters]); - useEffect(() => { setFilterQueryConverted({ query: filterQuery != null ? filterQuery.expression : '', diff --git a/x-pack/plugins/security_solution/public/timelines/components/timeline/search_or_filter/index.tsx b/x-pack/plugins/security_solution/public/timelines/components/timeline/search_or_filter/index.tsx index cdd6fc793082f..0145922910e63 100644 --- a/x-pack/plugins/security_solution/public/timelines/components/timeline/search_or_filter/index.tsx +++ b/x-pack/plugins/security_solution/public/timelines/components/timeline/search_or_filter/index.tsx @@ -31,6 +31,7 @@ import { timelineDefaults } from '../../../store/defaults'; import { dispatchUpdateReduxTime } from '../../../../common/components/super_date_picker'; import { SearchOrFilter } from './search_or_filter'; import { setDataProviderVisibility } from '../../../store/actions'; +import { getNonDropAreaFilters } from '../helpers'; import * as i18n from './translations'; const FilterItemsContainer = styled(EuiFlexGroup)``; @@ -110,19 +111,37 @@ const StatefulSearchOrFilterComponent = React.memo( const arrDataView = useMemo(() => (dataView != null ? [dataView] : []), [dataView]); + // Keep filter manager in sync with redux filters + useEffect(() => { + if (!deepEqual(filterManager.getFilters(), filters)) { + filterManager.setFilters(filters); + } + }, [filterManager, filters]); + + // When a filter update comes in through the filter manager, update redux + useEffect(() => { + const subscription = filterManager.getUpdates$().subscribe(() => { + const filtersWithoutDropArea = getNonDropAreaFilters(filterManager.getFilters()); + if (!deepEqual(filtersWithoutDropArea, filters)) { + setFilters({ + id: timelineId, + filters: filtersWithoutDropArea, + }); + } + }); + return () => { + subscription.unsubscribe(); + }; + }, [filterManager, timelineId, setFilters, filters]); + + // Sync redux filters with updated from const onFiltersUpdated = useCallback( (newFilters: Filter[]) => { - filterManager.setFilters(newFilters); - }, - [filterManager] - ); - - const setFiltersInTimeline = useCallback( - (newFilters: Filter[]) => setFilters({ id: timelineId, filters: newFilters, - }), + }); + }, [timelineId, setFilters] ); @@ -180,7 +199,6 @@ const StatefulSearchOrFilterComponent = React.memo( kqlMode={kqlMode} refreshInterval={refreshInterval} savedQueryId={savedQueryId} - setFilters={setFiltersInTimeline} setSavedQueryId={setSavedQueryInTimeline} timelineId={timelineId} to={to} diff --git a/x-pack/plugins/security_solution/public/timelines/components/timeline/search_or_filter/search_or_filter.tsx b/x-pack/plugins/security_solution/public/timelines/components/timeline/search_or_filter/search_or_filter.tsx index 16f053b4abb75..e6c8d403d4cce 100644 --- a/x-pack/plugins/security_solution/public/timelines/components/timeline/search_or_filter/search_or_filter.tsx +++ b/x-pack/plugins/security_solution/public/timelines/components/timeline/search_or_filter/search_or_filter.tsx @@ -41,7 +41,6 @@ interface Props { timelineId: string; updateKqlMode: ({ id, kqlMode }: { id: string; kqlMode: KqlMode }) => void; refreshInterval: number; - setFilters: (filters: Filter[]) => void; setSavedQueryId: (savedQueryId: string | null) => void; filters: Filter[]; savedQueryId: string | null; @@ -79,7 +78,6 @@ export const SearchOrFilter = React.memo( timelineId, refreshInterval, savedQueryId, - setFilters, setSavedQueryId, to, toStr, @@ -129,7 +127,6 @@ export const SearchOrFilter = React.memo( isRefreshPaused={isRefreshPaused} refreshInterval={refreshInterval} savedQueryId={savedQueryId} - setFilters={setFilters} setSavedQueryId={setSavedQueryId} timelineId={timelineId} to={to} diff --git a/x-pack/plugins/security_solution/public/timelines/components/timeline/tabs/index.test.tsx b/x-pack/plugins/security_solution/public/timelines/components/timeline/tabs/index.test.tsx index 4d0a8f5cfd363..a3048347a6b7f 100644 --- a/x-pack/plugins/security_solution/public/timelines/components/timeline/tabs/index.test.tsx +++ b/x-pack/plugins/security_solution/public/timelines/components/timeline/tabs/index.test.tsx @@ -16,6 +16,14 @@ import { TimelineType } from '../../../../../common/api/timeline'; import { useEsqlAvailability } from '../../../../common/hooks/esql/use_esql_availability'; import { render, screen, waitFor } from '@testing-library/react'; +jest.mock('react-router-dom', () => { + const original = jest.requireActual('react-router-dom'); + return { + ...original, + useLocation: () => ({}), + }; +}); + jest.mock('../../../../common/hooks/esql/use_esql_availability', () => ({ useEsqlAvailability: jest.fn().mockReturnValue({ isEsqlAdvancedSettingEnabled: true, diff --git a/x-pack/plugins/security_solution/public/timelines/components/timeline/tabs/query/index.test.tsx b/x-pack/plugins/security_solution/public/timelines/components/timeline/tabs/query/index.test.tsx index ff95229f9dc60..0dcbe36e09769 100644 --- a/x-pack/plugins/security_solution/public/timelines/components/timeline/tabs/query/index.test.tsx +++ b/x-pack/plugins/security_solution/public/timelines/components/timeline/tabs/query/index.test.tsx @@ -55,6 +55,10 @@ mockUseResizeObserver.mockImplementation(() => ({})); jest.mock('../../../../../common/lib/kibana'); +jest.mock('../../../../containers/use_timeline_data_filters', () => ({ + useTimelineDataFilters: jest.fn().mockReturnValue({ from: 'now-15m', to: 'now' }), +})); + describe('Timeline', () => { let props = {} as QueryTabContentComponentProps; const sort: Sort[] = [ diff --git a/x-pack/plugins/security_solution/public/timelines/components/timeline/tabs/query/index.tsx b/x-pack/plugins/security_solution/public/timelines/components/timeline/tabs/query/index.tsx index d557116ea6bf2..ed3cd15314444 100644 --- a/x-pack/plugins/security_solution/public/timelines/components/timeline/tabs/query/index.tsx +++ b/x-pack/plugins/security_solution/public/timelines/components/timeline/tabs/query/index.tsx @@ -16,6 +16,7 @@ import { getEsQueryConfig } from '@kbn/data-plugin/common'; import { DataLoadingState } from '@kbn/unified-data-table'; import { useDeepEqualSelector } from '../../../../../common/hooks/use_selector'; import { useIsExperimentalFeatureEnabled } from '../../../../../common/hooks/use_experimental_features'; +import { useTimelineDataFilters } from '../../../../containers/use_timeline_data_filters'; import { InputsModelId } from '../../../../../common/store/inputs/constants'; import { useInvalidFilterQuery } from '../../../../../common/hooks/use_invalid_filter_query'; import { timelineActions, timelineSelectors } from '../../../../store'; @@ -40,6 +41,8 @@ import { inputsSelectors } from '../../../../../common/store'; import { SourcererScopeName } from '../../../../../common/store/sourcerer/model'; import { timelineDefaults } from '../../../../store/defaults'; import { useSourcererDataView } from '../../../../../common/containers/sourcerer'; +import { isActiveTimeline } from '../../../../../helpers'; + import type { TimelineModel } from '../../../../store/model'; import { DetailsPanel } from '../../../side_panel'; import { UnifiedTimelineBody } from '../../body/unified_timeline_body'; @@ -105,7 +108,11 @@ export const QueryTabContentComponent: React.FC = ({ selectedPatterns, } = useSourcererDataView(SourcererScopeName.timeline); - const { uiSettings, timelineFilterManager } = useKibana().services; + const { uiSettings, timelineDataService } = useKibana().services; + const { + query: { filterManager: timelineFilterManager }, + } = timelineDataService; + const unifiedComponentsInTimelineEnabled = useIsExperimentalFeatureEnabled( 'unifiedComponentsInTimelineEnabled' ); @@ -127,15 +134,17 @@ export const QueryTabContentComponent: React.FC = ({ [kqlQueryExpression, kqlQueryLanguage] ); - const combinedQueries = combineQueries({ - config: esQueryConfig, - dataProviders, - indexPattern, - browserFields, - filters, - kqlQuery, - kqlMode, - }); + const combinedQueries = useMemo(() => { + return combineQueries({ + config: esQueryConfig, + dataProviders, + indexPattern, + browserFields, + filters, + kqlQuery, + kqlMode, + }); + }, [esQueryConfig, dataProviders, indexPattern, browserFields, filters, kqlQuery, kqlMode]); useInvalidFilterQuery({ id: timelineId, @@ -163,12 +172,14 @@ export const QueryTabContentComponent: React.FC = ({ [combinedQueries, end, loadingSourcerer, start] ); - const timelineQuerySortField = sort.map(({ columnId, columnType, esTypes, sortDirection }) => ({ - field: columnId, - direction: sortDirection as Direction, - esTypes: esTypes ?? [], - type: columnType, - })); + const timelineQuerySortField = useMemo(() => { + return sort.map(({ columnId, columnType, esTypes, sortDirection }) => ({ + field: columnId, + direction: sortDirection as Direction, + esTypes: esTypes ?? [], + type: columnType, + })); + }, [sort]); const { augmentedColumnHeaders, defaultColumns, timelineQueryFieldsFromColumns } = useTimelineColumns(columns); @@ -226,6 +237,26 @@ export const QueryTabContentComponent: React.FC = ({ // is not getting refreshed when using browser navigation. const showEventsCountBadge = !isBlankTimeline && totalCount >= 0; + // + // Sync the timerange + const timelineFilters = useTimelineDataFilters(isActiveTimeline(timelineId)); + useEffect(() => { + timelineDataService.query.timefilter.timefilter.setTime({ + from: timelineFilters.from, + to: timelineFilters.to, + }); + }, [timelineDataService.query.timefilter.timefilter, timelineFilters.from, timelineFilters.to]); + + // Sync the base query + useEffect(() => { + timelineDataService.query.queryString.setQuery( + // We're using the base query of all combined queries here, to account for all + // of timeline's query dependencies (data providers, query etc.) + combinedQueries?.baseKqlQuery || { language: kqlQueryLanguage, query: '' } + ); + }, [timelineDataService, combinedQueries, kqlQueryLanguage]); + // + if (unifiedComponentsInTimelineEnabled) { return ( { const kibanaServiceMock: StartServices = { ...createStartServicesMock(), storage: storageMock, - timelineFilterManager: mockTimelineFilterManager, }; afterEach(() => { @@ -571,7 +568,9 @@ describe('unified timeline', () => { fireEvent.click(screen.getByTestId(`timelineFieldListPanelAddExistFilter-${field.name}`)); await waitFor(() => { - expect(mockTimelineFilterManager.addFilters).toHaveBeenNthCalledWith( + expect( + kibanaServiceMock.timelineDataService.query.filterManager.addFilters + ).toHaveBeenNthCalledWith( 1, expect.arrayContaining([ expect.objectContaining({ diff --git a/x-pack/plugins/security_solution/public/timelines/components/timeline/unified_components/index.tsx b/x-pack/plugins/security_solution/public/timelines/components/timeline/unified_components/index.tsx index fcdbb347fa9fc..b4daa07f11c40 100644 --- a/x-pack/plugins/security_solution/public/timelines/components/timeline/unified_components/index.tsx +++ b/x-pack/plugins/security_solution/public/timelines/components/timeline/unified_components/index.tsx @@ -158,14 +158,17 @@ const UnifiedTimelineComponent: React.FC = ({ dataViews, dataViewFieldEditor, application: { capabilities }, - data: dataPluginContract, uiActions, charts, docLinks, analytics, - timelineFilterManager, + timelineDataService, }, } = useKibana(); + const { + query: { filterManager: timelineFilterManager }, + } = timelineDataService; + const [eventIdsAddingNotes, setEventIdsAddingNotes] = useState>(new Set()); const onToggleShowNotes = useCallback( (eventId: string) => { @@ -179,12 +182,13 @@ const UnifiedTimelineComponent: React.FC = ({ }, [eventIdsAddingNotes] ); + const fieldListSidebarServices: UnifiedFieldListSidebarContainerProps['services'] = useMemo( () => ({ fieldFormats, dataViews, dataViewFieldEditor, - data: dataPluginContract, + data: timelineDataService, uiActions, charts, core: { @@ -197,7 +201,7 @@ const UnifiedTimelineComponent: React.FC = ({ fieldFormats, dataViews, dataViewFieldEditor, - dataPluginContract, + timelineDataService, uiActions, charts, uiSettings, diff --git a/x-pack/plugins/security_solution/public/types.ts b/x-pack/plugins/security_solution/public/types.ts index 1bd539bd52b6c..eb891e3145dd2 100644 --- a/x-pack/plugins/security_solution/public/types.ts +++ b/x-pack/plugins/security_solution/public/types.ts @@ -9,7 +9,7 @@ import type { Observable } from 'rxjs'; import type { CoreStart, AppMountParameters, AppLeaveHandler } from '@kbn/core/public'; import type { HomePublicPluginSetup } from '@kbn/home-plugin/public'; -import type { DataPublicPluginStart, FilterManager } from '@kbn/data-plugin/public'; +import type { DataPublicPluginStart } from '@kbn/data-plugin/public'; import type { FieldFormatsStartCommon } from '@kbn/field-formats-plugin/common'; import type { EmbeddableStart } from '@kbn/embeddable-plugin/public'; import type { LensPublicStart } from '@kbn/lens-plugin/public'; @@ -185,7 +185,7 @@ export type StartServices = CoreStart & telemetry: TelemetryClientStart; customDataService: DataPublicPluginStart; topValuesPopover: TopValuesPopoverService; - timelineFilterManager: FilterManager; + timelineDataService: DataPublicPluginStart; }; export type StartRenderServices = Pick< diff --git a/x-pack/test/security_solution_cypress/cypress/tasks/search_bar.ts b/x-pack/test/security_solution_cypress/cypress/tasks/search_bar.ts index bd6ca6775c12f..b1849738677a6 100644 --- a/x-pack/test/security_solution_cypress/cypress/tasks/search_bar.ts +++ b/x-pack/test/security_solution_cypress/cypress/tasks/search_bar.ts @@ -52,6 +52,9 @@ export const removeKqlFilter = () => { }; export const fillAddFilterForm = ({ key, operator, value }: SearchBarFilter) => { + // workaround for field input sometimes not focusing correctly + cy.get(ADD_FILTER_FORM_FIELD_INPUT).click(); + // /workaround cy.get(ADD_FILTER_FORM_FIELD_INPUT).type(`${key}{downarrow}{enter}`); cy.get(ADD_FILTER_FORM_OPERATOR_FIELD).type(`${operator}{downarrow}{enter}`); From de3fa8e2c7228b349ce4c5ab1a60e669262524b0 Mon Sep 17 00:00:00 2001 From: Pablo Machado Date: Wed, 8 May 2024 13:04:11 +0200 Subject: [PATCH 59/86] [SecuritySolution] [UI] Re-score entity when asset criticality changes (#182234) ## Summary Update the risk score when the user updates asset criticality. https://github.com/elastic/kibana/assets/1490444/58d2beb3-87f3-4b0d-afe8-b8a67e76d426 https://github.com/elastic/kibana/assets/1490444/2d185b48-9260-40cb-a27c-5539aaeaffc4 ### Tech breakdown #### Required changes * Update asset criticality APIs to use `refresh: 'wait_for'` * Update all risk score APIs in the UI to be `inspected` so we can refetch it from anywhere. * Update all risk score APIs to use the data stream index to reflect the change. * Update flyout risk score loading state #### Sequence of events * Whenever asset criticality for an entity changes, wait for the response * Call `calculateEntityRiskScore` * Waits for `calculateEntityRiskScore` response * invalidate/refetch all risk score API calls on the UI to display the new risk score ```mermaid sequenceDiagram participant FE as Client participant BE as Server FE->>BE: Assign Asset Criticality BE->>FE: Asset Criticality Response FE->>BE: Recalculate Risk Score BE->>FE: Risk Score Response FE->>BE: Fetch visualizations 1 FE->>BE: Fetch visualizations 2 FE->>BE: Fetch visualizations 3 BE->>FE: Visualizations responses ``` #### Affected components: * Expandable flyout (user/host) * Entity Details page (user/host) #### Why we don't have cypres tests? * We can test this feature on Cypress because we don't run the risk engine. Instead, we fake the API response for the risk engine status. * To be able to cypress test this feature, first, we need to reliably (no flakyness) enable the risk engine. ### Checklist Delete any items that are not applicable to this PR. - [x] Any text added follows [EUI's writing guidelines](https://elastic.github.io/eui/#/guidelines/writing), uses sentence case text and includes [i18n support](https://github.com/elastic/kibana/blob/main/packages/kbn-i18n/README.md) - [x] [Unit or functional tests](https://www.elastic.co/guide/en/kibana/master/development-tests.html) were updated or added to match the most common scenarios --- .../asset_criticality/common.gen.ts | 14 +++ .../asset_criticality/common.schema.yaml | 13 +++ .../entity_calculation_route.gen.ts | 4 + .../entity_calculation_route.schema.yaml | 4 + .../common/hooks/use_inspect_query.test.tsx | 85 --------------- .../public/common/hooks/use_inspect_query.ts | 44 -------- .../public/entity_analytics/api/api.ts | 26 ++++- .../use_calculate_entity_risk_score.test.ts | 103 ++++++++++++++++++ .../hooks/use_calculate_entity_risk_score.ts | 58 ++++++++++ .../use_refetch_overview_page_risk_score.ts | 27 +++++ .../api/hooks/use_refetch_query_by_id.ts | 16 +++ .../public/entity_analytics/common/utils.ts | 5 + .../asset_criticality_selector.tsx | 45 +++++--- .../use_asset_criticality.ts | 10 +- .../tabs/risk_inputs/risk_inputs_tab.tsx | 16 +++ .../risk_summary.stories.tsx | 1 + .../risk_summary_flyout/risk_summary.test.tsx | 24 ++++ .../risk_summary_flyout/risk_summary.tsx | 27 +++-- .../explore/hosts/pages/details/index.tsx | 27 ++++- .../explore/network/pages/details/index.tsx | 9 +- .../explore/users/pages/details/index.tsx | 27 ++++- .../host_right/content.stories.tsx | 6 + .../entity_details/host_right/content.tsx | 10 +- .../entity_details/host_right/index.test.tsx | 16 --- .../entity_details/host_right/index.tsx | 20 +++- .../user_right/content.stories.tsx | 10 ++ .../entity_details/user_right/content.tsx | 10 +- .../entity_details/user_right/index.test.tsx | 16 --- .../entity_details/user_right/index.tsx | 20 +++- .../components/host_overview/index.tsx | 25 ++++- .../components/user_overview/index.tsx | 25 ++++- .../overview/pages/detection_response.tsx | 6 +- .../asset_criticality_data_client.ts | 9 +- .../asset_criticality/routes/delete.ts | 15 ++- .../asset_criticality/routes/upsert.ts | 5 +- .../calculate_and_persist_risk_scores.ts | 4 +- .../risk_score/risk_engine_data_writer.ts | 2 + .../risk_score/risk_score_service.ts | 1 + .../routes/entity_calculation.test.ts | 16 ++- .../risk_score/routes/entity_calculation.ts | 14 ++- .../server/lib/entity_analytics/types.ts | 1 + 41 files changed, 587 insertions(+), 229 deletions(-) delete mode 100644 x-pack/plugins/security_solution/public/common/hooks/use_inspect_query.test.tsx delete mode 100644 x-pack/plugins/security_solution/public/common/hooks/use_inspect_query.ts create mode 100644 x-pack/plugins/security_solution/public/entity_analytics/api/hooks/use_calculate_entity_risk_score.test.ts create mode 100644 x-pack/plugins/security_solution/public/entity_analytics/api/hooks/use_calculate_entity_risk_score.ts create mode 100644 x-pack/plugins/security_solution/public/entity_analytics/api/hooks/use_refetch_overview_page_risk_score.ts create mode 100644 x-pack/plugins/security_solution/public/entity_analytics/api/hooks/use_refetch_query_by_id.ts diff --git a/x-pack/plugins/security_solution/common/api/entity_analytics/asset_criticality/common.gen.ts b/x-pack/plugins/security_solution/common/api/entity_analytics/asset_criticality/common.gen.ts index 3da400bdef9e0..141991327fb2d 100644 --- a/x-pack/plugins/security_solution/common/api/entity_analytics/asset_criticality/common.gen.ts +++ b/x-pack/plugins/security_solution/common/api/entity_analytics/asset_criticality/common.gen.ts @@ -40,6 +40,20 @@ export const CreateAssetCriticalityRecord = AssetCriticalityRecordIdParts.merge( * The criticality level of the asset. */ criticality_level: z.enum(['low_impact', 'medium_impact', 'high_impact', 'extreme_impact']), + /** + * If 'wait_for' the request will wait for the index refresh. + */ + refresh: z.literal('wait_for').optional(), + }) +); + +export type DeleteAssetCriticalityRecord = z.infer; +export const DeleteAssetCriticalityRecord = AssetCriticalityRecordIdParts.merge( + z.object({ + /** + * If 'wait_for' the request will wait for the index refresh. + */ + refresh: z.literal('wait_for').optional(), }) ); diff --git a/x-pack/plugins/security_solution/common/api/entity_analytics/asset_criticality/common.schema.yaml b/x-pack/plugins/security_solution/common/api/entity_analytics/asset_criticality/common.schema.yaml index 9fa0c7bcfce18..3d3e82524109d 100644 --- a/x-pack/plugins/security_solution/common/api/entity_analytics/asset_criticality/common.schema.yaml +++ b/x-pack/plugins/security_solution/common/api/entity_analytics/asset_criticality/common.schema.yaml @@ -50,8 +50,21 @@ components: type: string enum: [low_impact, medium_impact, high_impact, extreme_impact] description: The criticality level of the asset. + refresh: + type: string + enum: [wait_for] + description: If 'wait_for' the request will wait for the index refresh. required: - criticality_level + DeleteAssetCriticalityRecord: + allOf: + - $ref: '#/components/schemas/AssetCriticalityRecordIdParts' + - type: object + properties: + refresh: + type: string + enum: [wait_for] + description: If 'wait_for' the request will wait for the index refresh. AssetCriticalityRecord: allOf: - $ref: '#/components/schemas/CreateAssetCriticalityRecord' diff --git a/x-pack/plugins/security_solution/common/api/entity_analytics/risk_engine/entity_calculation_route.gen.ts b/x-pack/plugins/security_solution/common/api/entity_analytics/risk_engine/entity_calculation_route.gen.ts index c583616198313..f4d7c393f6e7f 100644 --- a/x-pack/plugins/security_solution/common/api/entity_analytics/risk_engine/entity_calculation_route.gen.ts +++ b/x-pack/plugins/security_solution/common/api/entity_analytics/risk_engine/entity_calculation_route.gen.ts @@ -28,6 +28,10 @@ export const RiskScoresEntityCalculationRequest = z.object({ * Used to define the type of entity. */ identifier_type: IdentifierType, + /** + * If 'wait_for' the request will wait for the index refresh. + */ + refresh: z.literal('wait_for').optional(), }); export type RiskScoresEntityCalculationResponse = z.infer< diff --git a/x-pack/plugins/security_solution/common/api/entity_analytics/risk_engine/entity_calculation_route.schema.yaml b/x-pack/plugins/security_solution/common/api/entity_analytics/risk_engine/entity_calculation_route.schema.yaml index de5f01f850187..1229cf0fb6615 100644 --- a/x-pack/plugins/security_solution/common/api/entity_analytics/risk_engine/entity_calculation_route.schema.yaml +++ b/x-pack/plugins/security_solution/common/api/entity_analytics/risk_engine/entity_calculation_route.schema.yaml @@ -50,6 +50,10 @@ components: identifier_type: description: Used to define the type of entity. $ref: './common.schema.yaml#/components/schemas/IdentifierType' + refresh: + type: string + enum: [wait_for] + description: If 'wait_for' the request will wait for the index refresh. RiskScoresEntityCalculationResponse: type: object diff --git a/x-pack/plugins/security_solution/public/common/hooks/use_inspect_query.test.tsx b/x-pack/plugins/security_solution/public/common/hooks/use_inspect_query.test.tsx deleted file mode 100644 index 1bf2de3242ac7..0000000000000 --- a/x-pack/plugins/security_solution/public/common/hooks/use_inspect_query.test.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 { renderHook } from '@testing-library/react-hooks'; -import { useInspectQuery } from './use_inspect_query'; - -import { useGlobalTime } from '../containers/use_global_time'; - -jest.mock('../containers/use_global_time'); - -const QUERY_ID = 'tes_query_id'; - -const RESPONSE = { - inspect: { dsl: [], response: [] }, - isPartial: false, - isRunning: false, - total: 0, - loaded: 0, - rawResponse: { - took: 0, - timed_out: false, - _shards: { - total: 0, - successful: 0, - failed: 0, - skipped: 0, - }, - results: { - hits: { - total: 0, - }, - }, - hits: { - total: 0, - max_score: 0, - hits: [], - }, - }, - totalCount: 0, - enrichments: [], -}; - -describe('useInspectQuery', () => { - let deleteQuery: jest.Mock; - let setQuery: jest.Mock; - - beforeEach(() => { - deleteQuery = jest.fn(); - setQuery = jest.fn(); - (useGlobalTime as jest.Mock).mockImplementation(() => ({ - deleteQuery, - setQuery, - isInitializing: false, - })); - }); - - it('it calls setQuery', () => { - renderHook(() => useInspectQuery(QUERY_ID, false, RESPONSE)); - - expect(setQuery).toHaveBeenCalledTimes(1); - expect(setQuery.mock.calls[0][0].id).toBe(QUERY_ID); - }); - - it("doesn't call setQuery when response is undefined", () => { - renderHook(() => useInspectQuery(QUERY_ID, false, undefined)); - - expect(setQuery).not.toHaveBeenCalled(); - }); - - it("doesn't call setQuery when loading", () => { - renderHook(() => useInspectQuery(QUERY_ID, true)); - - expect(setQuery).not.toHaveBeenCalled(); - }); - - it('calls deleteQuery when unmouting', () => { - const result = renderHook(() => useInspectQuery(QUERY_ID, false, RESPONSE)); - result.unmount(); - - expect(deleteQuery).toHaveBeenCalledWith({ id: QUERY_ID }); - }); -}); diff --git a/x-pack/plugins/security_solution/public/common/hooks/use_inspect_query.ts b/x-pack/plugins/security_solution/public/common/hooks/use_inspect_query.ts deleted file mode 100644 index 4c0cb1c4fcdca..0000000000000 --- a/x-pack/plugins/security_solution/public/common/hooks/use_inspect_query.ts +++ /dev/null @@ -1,44 +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 { noop } from 'lodash'; -import { useEffect } from 'react'; -import type { FactoryQueryTypes, StrategyResponseType } from '../../../common/search_strategy'; -import { getInspectResponse } from '../../helpers'; -import { useGlobalTime } from '../containers/use_global_time'; -import type { Refetch, RefetchKql } from '../store/inputs/model'; - -/** - * Add and remove query response from global input store. - */ -export const useInspectQuery = ( - id: string, - loading: boolean, - response?: StrategyResponseType, - refetch: Refetch | RefetchKql = noop -) => { - const { deleteQuery, setQuery, isInitializing } = useGlobalTime(); - - useEffect(() => { - if (!loading && !isInitializing && response?.inspect) { - setQuery({ - id, - inspect: getInspectResponse(response, { - dsl: [], - response: [], - }), - loading, - refetch, - }); - } - - return () => { - if (deleteQuery) { - deleteQuery({ id }); - } - }; - }, [deleteQuery, setQuery, loading, response, isInitializing, id, refetch]); -}; diff --git a/x-pack/plugins/security_solution/public/entity_analytics/api/api.ts b/x-pack/plugins/security_solution/public/entity_analytics/api/api.ts index fb14efde91a26..225ae72c57616 100644 --- a/x-pack/plugins/security_solution/public/entity_analytics/api/api.ts +++ b/x-pack/plugins/security_solution/public/entity_analytics/api/api.ts @@ -6,6 +6,10 @@ */ import { useMemo } from 'react'; +import type { + RiskScoresEntityCalculationRequest, + RiskScoresEntityCalculationResponse, +} from '../../../common/api/entity_analytics/risk_engine/entity_calculation_route.gen'; import type { AssetCriticalityCsvUploadResponse } from '../../../common/entity_analytics/asset_criticality/types'; import type { AssetCriticalityRecord } from '../../../common/api/entity_analytics/asset_criticality'; import type { RiskScoreEntity } from '../../../common/search_strategy'; @@ -21,6 +25,7 @@ import { RISK_SCORE_INDEX_STATUS_API_URL, RISK_ENGINE_SETTINGS_URL, ASSET_CRITICALITY_CSV_UPLOAD_URL, + RISK_SCORE_ENTITY_CALCULATION_URL, } from '../../../common/constants'; import type { @@ -97,6 +102,17 @@ export const useEntityAnalyticsRoutes = () => { method: 'POST', }); + /** + * Calculate and stores risk score for an entity + */ + const calculateEntityRiskScore = (params: RiskScoresEntityCalculationRequest) => { + return http.fetch(RISK_SCORE_ENTITY_CALCULATION_URL, { + version: '1', + method: 'POST', + body: JSON.stringify(params), + }); + }; + /** * Get risk engine privileges */ @@ -119,7 +135,9 @@ export const useEntityAnalyticsRoutes = () => { * Create asset criticality */ const createAssetCriticality = async ( - params: Pick + params: Pick & { + refresh?: 'wait_for'; + } ): Promise => http.fetch(ASSET_CRITICALITY_URL, { version: '1', @@ -128,16 +146,17 @@ export const useEntityAnalyticsRoutes = () => { id_value: params.idValue, id_field: params.idField, criticality_level: params.criticalityLevel, + refresh: params.refresh, }), }); const deleteAssetCriticality = async ( - params: Pick + params: Pick & { refresh?: 'wait_for' } ): Promise<{ deleted: true }> => { await http.fetch(ASSET_CRITICALITY_URL, { version: '1', method: 'DELETE', - query: { id_value: params.idValue, id_field: params.idField }, + query: { id_value: params.idValue, id_field: params.idField, refresh: params.refresh }, }); // spoof a response to allow us to better distnguish a delete from a create in use_asset_criticality.ts @@ -219,6 +238,7 @@ export const useEntityAnalyticsRoutes = () => { uploadAssetCriticalityFile, getRiskScoreIndexStatus, fetchRiskEngineSettings, + calculateEntityRiskScore, }; }, [http]); }; diff --git a/x-pack/plugins/security_solution/public/entity_analytics/api/hooks/use_calculate_entity_risk_score.test.ts b/x-pack/plugins/security_solution/public/entity_analytics/api/hooks/use_calculate_entity_risk_score.test.ts new file mode 100644 index 0000000000000..106fb9404372d --- /dev/null +++ b/x-pack/plugins/security_solution/public/entity_analytics/api/hooks/use_calculate_entity_risk_score.test.ts @@ -0,0 +1,103 @@ +/* + * Copyright 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 { act, renderHook } from '@testing-library/react-hooks'; +import { TestProviders } from '../../../common/mock'; +import { RiskScoreEntity } from '../../../../common/search_strategy'; +import { useCalculateEntityRiskScore } from './use_calculate_entity_risk_score'; +import { RiskEngineStatus } from '../../../../common/entity_analytics/risk_engine'; +import { waitFor } from '@testing-library/react'; + +const enabledRiskEngineStatus = { + risk_engine_status: RiskEngineStatus.ENABLED, +}; +const disabledRiskEngineStatus = { + risk_engine_status: RiskEngineStatus.DISABLED, +}; + +const mockUseRiskEngineStatus = jest.fn(); +jest.mock('./use_risk_engine_status', () => ({ + useRiskEngineStatus: () => mockUseRiskEngineStatus(), +})); + +const mockCalculateEntityRiskScore = jest.fn(); +jest.mock('../api', () => ({ + useEntityAnalyticsRoutes: () => ({ + calculateEntityRiskScore: mockCalculateEntityRiskScore, + }), +})); + +const mockAddError = jest.fn(); +jest.mock('../../../common/hooks/use_app_toasts', () => ({ + useAppToasts: jest.fn().mockReturnValue({ + addError: () => mockAddError(), + }), +})); + +const identifierType = RiskScoreEntity.user; +const identifier = 'test-user'; +const options = { + onSuccess: jest.fn(), +}; + +describe('useRiskScoreData', () => { + beforeEach(() => { + jest.clearAllMocks(); + mockUseRiskEngineStatus.mockReturnValue({ data: enabledRiskEngineStatus }); + mockCalculateEntityRiskScore.mockResolvedValue({}); + }); + + it('should call calculateEntityRiskScore API when the callback function is called', async () => { + const { result } = renderHook( + () => useCalculateEntityRiskScore(identifierType, identifier, options), + { wrapper: TestProviders } + ); + + await act(async () => { + result.current.calculateEntityRiskScore(); + + await waitFor(() => + expect(mockCalculateEntityRiskScore).toHaveBeenCalledWith( + expect.objectContaining({ + identifier_type: identifierType, + identifier, + }) + ) + ); + }); + }); + + it('should NOT call calculateEntityRiskScore API when risk engine is disabled', async () => { + mockUseRiskEngineStatus.mockReturnValue({ + data: disabledRiskEngineStatus, + }); + const { result } = renderHook( + () => useCalculateEntityRiskScore(identifierType, identifier, options), + { wrapper: TestProviders } + ); + + await act(async () => { + result.current.calculateEntityRiskScore(); + + await waitFor(() => expect(mockCalculateEntityRiskScore).not.toHaveBeenCalled()); + }); + }); + + it('should display a toast error when the API returns an error', async () => { + mockCalculateEntityRiskScore.mockRejectedValue({}); + const { result } = renderHook( + () => useCalculateEntityRiskScore(identifierType, identifier, options), + { wrapper: TestProviders } + ); + + await act(async () => { + result.current.calculateEntityRiskScore(); + + await waitFor(() => expect(mockAddError).toHaveBeenCalled()); + }); + }); +}); diff --git a/x-pack/plugins/security_solution/public/entity_analytics/api/hooks/use_calculate_entity_risk_score.ts b/x-pack/plugins/security_solution/public/entity_analytics/api/hooks/use_calculate_entity_risk_score.ts new file mode 100644 index 0000000000000..ff1eb5c46a702 --- /dev/null +++ b/x-pack/plugins/security_solution/public/entity_analytics/api/hooks/use_calculate_entity_risk_score.ts @@ -0,0 +1,58 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import { useCallback } from 'react'; + +import { i18n } from '@kbn/i18n'; +import { useMutation } from '@tanstack/react-query'; +import { useEntityAnalyticsRoutes } from '../api'; +import { useAppToasts } from '../../../common/hooks/use_app_toasts'; +import { useRiskEngineStatus } from './use_risk_engine_status'; +import { RiskScoreEntity, RiskEngineStatus } from '../../../../common/entity_analytics/risk_engine'; + +export const useCalculateEntityRiskScore = ( + identifierType: RiskScoreEntity, + identifier: string, + { onSuccess }: { onSuccess: () => void } +) => { + const { addError } = useAppToasts(); + const { data: riskEngineStatus } = useRiskEngineStatus(); + const { calculateEntityRiskScore } = useEntityAnalyticsRoutes(); + + const onError = useCallback( + (error: unknown) => { + addError(error, { + title: i18n.translate('xpack.securitySolution.entityDetails.userPanel.error', { + defaultMessage: 'There was a problem calculating the {entity} risk score', + values: { entity: identifierType === RiskScoreEntity.host ? "host's" : "user's" }, + }), + }); + }, + [addError, identifierType] + ); + + const { mutate, isLoading, data } = useMutation(calculateEntityRiskScore, { + onSuccess, + onError, + }); + + const calculateEntityRiskScoreCb = useCallback(async () => { + if (riskEngineStatus?.risk_engine_status === RiskEngineStatus.ENABLED) { + mutate({ + identifier_type: identifierType, + identifier, + refresh: 'wait_for', + }); + } + }, [riskEngineStatus?.risk_engine_status, mutate, identifierType, identifier]); + + return { + isLoading, + calculateEntityRiskScore: calculateEntityRiskScoreCb, + data, + }; +}; diff --git a/x-pack/plugins/security_solution/public/entity_analytics/api/hooks/use_refetch_overview_page_risk_score.ts b/x-pack/plugins/security_solution/public/entity_analytics/api/hooks/use_refetch_overview_page_risk_score.ts new file mode 100644 index 0000000000000..bf0c3db69b53c --- /dev/null +++ b/x-pack/plugins/security_solution/public/entity_analytics/api/hooks/use_refetch_overview_page_risk_score.ts @@ -0,0 +1,27 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import { TableId } from '@kbn/securitysolution-data-table'; +import { useCallback } from 'react'; +import type { Refetch } from '../../../common/types'; +import { useRefetchQueryById } from './use_refetch_query_by_id'; + +export const useRefetchOverviewPageRiskScore = (overviewRiskScoreQueryId: string) => { + const refetchOverviewRiskScore = useRefetchQueryById(overviewRiskScoreQueryId); + const refetchAlertsRiskInputs = useRefetchQueryById(TableId.alertsRiskInputs); + + const refetchRiskScore = useCallback(() => { + if (refetchOverviewRiskScore) { + (refetchOverviewRiskScore as Refetch)(); + } + + if (refetchAlertsRiskInputs) { + (refetchAlertsRiskInputs as Refetch)(); + } + }, [refetchAlertsRiskInputs, refetchOverviewRiskScore]); + return refetchRiskScore; +}; diff --git a/x-pack/plugins/security_solution/public/entity_analytics/api/hooks/use_refetch_query_by_id.ts b/x-pack/plugins/security_solution/public/entity_analytics/api/hooks/use_refetch_query_by_id.ts new file mode 100644 index 0000000000000..331855560da7c --- /dev/null +++ b/x-pack/plugins/security_solution/public/entity_analytics/api/hooks/use_refetch_query_by_id.ts @@ -0,0 +1,16 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import { useMemo } from 'react'; +import { useDeepEqualSelector } from '../../../common/hooks/use_selector'; +import { inputsSelectors } from '../../../common/store'; + +export const useRefetchQueryById = (QueryId: string) => { + const getGlobalQuery = useMemo(() => inputsSelectors.globalQueryByIdSelector(), []); + const { refetch } = useDeepEqualSelector((state) => getGlobalQuery(state, QueryId)); + return refetch; +}; diff --git a/x-pack/plugins/security_solution/public/entity_analytics/common/utils.ts b/x-pack/plugins/security_solution/public/entity_analytics/common/utils.ts index 69080b13631e3..3756780e18ae6 100644 --- a/x-pack/plugins/security_solution/public/entity_analytics/common/utils.ts +++ b/x-pack/plugins/security_solution/public/entity_analytics/common/utils.ts @@ -63,3 +63,8 @@ export enum HostRiskScoreQueryId { */ export const formatRiskScore = (riskScore: number) => (Math.round(riskScore * 100) / 100).toFixed(2); + +export const FIRST_RECORD_PAGINATION = { + cursorStart: 0, + querySize: 1, +}; diff --git a/x-pack/plugins/security_solution/public/entity_analytics/components/asset_criticality/asset_criticality_selector.tsx b/x-pack/plugins/security_solution/public/entity_analytics/components/asset_criticality/asset_criticality_selector.tsx index 587ef695ff94c..e29dca9d48f3d 100644 --- a/x-pack/plugins/security_solution/public/entity_analytics/components/asset_criticality/asset_criticality_selector.tsx +++ b/x-pack/plugins/security_solution/public/entity_analytics/components/asset_criticality/asset_criticality_selector.tsx @@ -39,10 +39,14 @@ import { PICK_ASSET_CRITICALITY } from './translations'; import { AssetCriticalityBadge } from './asset_criticality_badge'; import type { Entity, State } from './use_asset_criticality'; import { useAssetCriticalityData, useAssetCriticalityPrivileges } from './use_asset_criticality'; -import type { CriticalityLevelWithUnassigned } from '../../../../common/entity_analytics/asset_criticality/types'; +import type { + CriticalityLevel, + CriticalityLevelWithUnassigned, +} from '../../../../common/entity_analytics/asset_criticality/types'; interface Props { entity: Entity; + onChange?: () => void; } const AssetCriticalitySelectorComponent: React.FC<{ criticality: State; @@ -52,6 +56,15 @@ const AssetCriticalitySelectorComponent: React.FC<{ const [visible, toggleModal] = useToggle(false); const sFontSize = useEuiFontSize('s').fontSize; + const onSave = (value: CriticalityLevelWithUnassigned) => { + criticality.mutation.mutate({ + criticalityLevel: value, + idField: `${entity.type}.name`, + idValue: entity.name, + }); + toggleModal(false); + }; + return ( <> {criticality.query.isLoading || criticality.mutation.isLoading ? ( @@ -121,7 +134,11 @@ const AssetCriticalitySelectorComponent: React.FC<{
)} {visible ? ( - + ) : null} ); @@ -130,12 +147,13 @@ const AssetCriticalitySelectorComponent: React.FC<{ export const AssetCriticalitySelector = React.memo(AssetCriticalitySelectorComponent); AssetCriticalitySelector.displayName = 'AssetCriticalitySelector'; -const AssetCriticalityAccordionComponent: React.FC = ({ entity }) => { +const AssetCriticalityAccordionComponent: React.FC = ({ entity, onChange }) => { const { euiTheme } = useEuiTheme(); const privileges = useAssetCriticalityPrivileges(entity.name); const criticality = useAssetCriticalityData({ entity, enabled: !!privileges.data?.has_read_permissions, + onChange, }); if (privileges.isLoading || !privileges.data?.has_read_permissions) { @@ -191,15 +209,19 @@ export const AssetCriticalityTitle = () => ( ); interface ModalProps { - criticality: State; + initialCriticalityLevel: CriticalityLevel | undefined; toggle: (nextValue: boolean) => void; - entity: Entity; + onSave: (value: CriticalityLevelWithUnassigned) => void; } -const AssetCriticalityModal: React.FC = ({ criticality, entity, toggle }) => { +const AssetCriticalityModal: React.FC = ({ + initialCriticalityLevel, + toggle, + onSave, +}) => { const basicSelectId = useGeneratedHtmlId({ prefix: 'basicSelect' }); const [value, setNewValue] = useState( - criticality.query.data?.criticality_level ?? 'unassigned' + initialCriticalityLevel ?? 'unassigned' ); return ( @@ -228,14 +250,7 @@ const AssetCriticalityModal: React.FC = ({ criticality, entity, togg { - criticality.mutation.mutate({ - criticalityLevel: value, - idField: `${entity.type}.name`, - idValue: entity.name, - }); - toggle(false); - }} + onClick={() => onSave(value)} fill data-test-subj="asset-criticality-modal-save-btn" > diff --git a/x-pack/plugins/security_solution/public/entity_analytics/components/asset_criticality/use_asset_criticality.ts b/x-pack/plugins/security_solution/public/entity_analytics/components/asset_criticality/use_asset_criticality.ts index 403ca5c656bf0..c56b394236326 100644 --- a/x-pack/plugins/security_solution/public/entity_analytics/components/asset_criticality/use_asset_criticality.ts +++ b/x-pack/plugins/security_solution/public/entity_analytics/components/asset_criticality/use_asset_criticality.ts @@ -46,9 +46,11 @@ export const useAssetCriticalityPrivileges = ( export const useAssetCriticalityData = ({ entity, enabled = true, + onChange, }: { entity: Entity; enabled?: boolean; + onChange?: () => void; }): State => { const QC = useQueryClient(); const QUERY_KEY = [ASSET_CRITICALITY_KEY, entity.name]; @@ -71,18 +73,24 @@ export const useAssetCriticalityData = ({ >({ mutationFn: (params: Params) => { if (params.criticalityLevel === 'unassigned') { - return deleteAssetCriticality({ idField: params.idField, idValue: params.idValue }); + return deleteAssetCriticality({ + idField: params.idField, + idValue: params.idValue, + refresh: 'wait_for', + }); } return createAssetCriticality({ idField: params.idField, idValue: params.idValue, criticalityLevel: params.criticalityLevel, + refresh: 'wait_for', }); }, onSuccess: (data) => { const queryData = 'deleted' in data ? null : data; QC.setQueryData(QUERY_KEY, queryData); + onChange?.(); }, }); diff --git a/x-pack/plugins/security_solution/public/entity_analytics/components/entity_details_flyout/tabs/risk_inputs/risk_inputs_tab.tsx b/x-pack/plugins/security_solution/public/entity_analytics/components/entity_details_flyout/tabs/risk_inputs/risk_inputs_tab.tsx index 80b425bec15bb..48f004cbd7069 100644 --- a/x-pack/plugins/security_solution/public/entity_analytics/components/entity_details_flyout/tabs/risk_inputs/risk_inputs_tab.tsx +++ b/x-pack/plugins/security_solution/public/entity_analytics/components/entity_details_flyout/tabs/risk_inputs/risk_inputs_tab.tsx @@ -14,6 +14,8 @@ import { useUiSetting$ } from '@kbn/kibana-react-plugin/public'; import { ALERT_RULE_NAME } from '@kbn/rule-data-utils'; import { get } from 'lodash/fp'; +import { useGlobalTime } from '../../../../../common/containers/use_global_time'; +import { useQueryInspector } from '../../../../../common/components/page/manage_query'; import { formatRiskScore } from '../../../../common'; import type { InputAlert, @@ -45,7 +47,10 @@ const FIRST_RECORD_PAGINATION = { querySize: 1, }; +export const RISK_INPUTS_TAB_QUERY_ID = 'RiskInputsTabQuery'; + export const RiskInputsTab = ({ entityType, entityName }: RiskInputsTabProps) => { + const { setQuery, deleteQuery } = useGlobalTime(); const [selectedItems, setSelectedItems] = useState([]); const nameFilterQuery = useMemo(() => { @@ -60,6 +65,8 @@ export const RiskInputsTab = ({ entityType, entityName }: RiskInputsTabProps) => data: riskScoreData, error: riskScoreError, loading: loadingRiskScore, + inspect: inspectRiskScore, + refetch, } = useRiskScore({ riskEntity: entityType, filterQuery: nameFilterQuery, @@ -68,6 +75,15 @@ export const RiskInputsTab = ({ entityType, entityName }: RiskInputsTabProps) => skip: nameFilterQuery === undefined, }); + useQueryInspector({ + deleteQuery, + inspect: inspectRiskScore, + loading: loadingRiskScore, + queryId: RISK_INPUTS_TAB_QUERY_ID, + refetch, + setQuery, + }); + const riskScore = riskScoreData && riskScoreData.length > 0 ? riskScoreData[0] : undefined; const alerts = useRiskContributingAlerts({ riskScore }); diff --git a/x-pack/plugins/security_solution/public/entity_analytics/components/risk_summary_flyout/risk_summary.stories.tsx b/x-pack/plugins/security_solution/public/entity_analytics/components/risk_summary_flyout/risk_summary.stories.tsx index cece761cd9d6f..b48629cbbe26f 100644 --- a/x-pack/plugins/security_solution/public/entity_analytics/components/risk_summary_flyout/risk_summary.stories.tsx +++ b/x-pack/plugins/security_solution/public/entity_analytics/components/risk_summary_flyout/risk_summary.stories.tsx @@ -26,6 +26,7 @@ export const Default: Story = () => { openDetailsPanel={() => {}} riskScoreData={{ ...mockRiskScoreState, data: [] }} queryId={'testQuery'} + recalculatingScore={false} />
diff --git a/x-pack/plugins/security_solution/public/entity_analytics/components/risk_summary_flyout/risk_summary.test.tsx b/x-pack/plugins/security_solution/public/entity_analytics/components/risk_summary_flyout/risk_summary.test.tsx index c7debcdbdc965..56a84c340dee3 100644 --- a/x-pack/plugins/security_solution/public/entity_analytics/components/risk_summary_flyout/risk_summary.test.tsx +++ b/x-pack/plugins/security_solution/public/entity_analytics/components/risk_summary_flyout/risk_summary.test.tsx @@ -49,6 +49,7 @@ describe('RiskSummary', () => { riskScoreData={mockHostRiskScoreState} queryId={'testQuery'} openDetailsPanel={() => {}} + recalculatingScore={false} /> ); @@ -79,6 +80,7 @@ describe('RiskSummary', () => { riskScoreData={mockHostRiskScoreState} queryId={'testQuery'} openDetailsPanel={() => {}} + recalculatingScore={false} /> ); @@ -110,12 +112,28 @@ describe('RiskSummary', () => { riskScoreData={{ ...mockHostRiskScoreState, data: undefined }} queryId={'testQuery'} openDetailsPanel={() => {}} + recalculatingScore={false} /> ); expect(getByTestId('risk-summary-table')).toBeInTheDocument(); }); + it('risk summary header does not render link when riskScoreData is loading', () => { + const { queryByTestId } = render( + + {}} + recalculatingScore={false} + /> + + ); + + expect(queryByTestId('riskInputsTitleLink')).not.toBeInTheDocument(); + }); + it('renders visualization embeddable', () => { const { getByTestId } = render( @@ -123,6 +141,7 @@ describe('RiskSummary', () => { riskScoreData={mockHostRiskScoreState} queryId={'testQuery'} openDetailsPanel={() => {}} + recalculatingScore={false} /> ); @@ -137,6 +156,7 @@ describe('RiskSummary', () => { riskScoreData={mockHostRiskScoreState} queryId={'testQuery'} openDetailsPanel={() => {}} + recalculatingScore={false} /> ); @@ -151,6 +171,7 @@ describe('RiskSummary', () => { riskScoreData={mockHostRiskScoreState} queryId={'testQuery'} openDetailsPanel={() => {}} + recalculatingScore={false} /> ); @@ -177,6 +198,7 @@ describe('RiskSummary', () => { riskScoreData={mockHostRiskScoreState} queryId={'testQuery'} openDetailsPanel={() => {}} + recalculatingScore={false} /> ); @@ -198,6 +220,7 @@ describe('RiskSummary', () => { riskScoreData={mockUserRiskScoreState} queryId={'testQuery'} openDetailsPanel={() => {}} + recalculatingScore={false} /> ); @@ -219,6 +242,7 @@ describe('RiskSummary', () => { riskScoreData={mockUserRiskScoreState} queryId={'testQuery'} openDetailsPanel={() => {}} + recalculatingScore={false} /> ); diff --git a/x-pack/plugins/security_solution/public/entity_analytics/components/risk_summary_flyout/risk_summary.tsx b/x-pack/plugins/security_solution/public/entity_analytics/components/risk_summary_flyout/risk_summary.tsx index dc3471d46254c..b7a88353ddd4a 100644 --- a/x-pack/plugins/security_solution/public/entity_analytics/components/risk_summary_flyout/risk_summary.tsx +++ b/x-pack/plugins/security_solution/public/entity_analytics/components/risk_summary_flyout/risk_summary.tsx @@ -49,12 +49,14 @@ import { export interface RiskSummaryProps { riskScoreData: RiskScoreState; + recalculatingScore: boolean; queryId: string; openDetailsPanel: (tab: EntityDetailsLeftPanelTab) => void; } const RiskSummaryComponent = ({ riskScoreData, + recalculatingScore, queryId, openDetailsPanel, }: RiskSummaryProps) => { @@ -119,11 +121,13 @@ const RiskSummaryComponent = ({ [entityData?.name, riskData] ); + const riskDataTimestamp = riskData?.['@timestamp']; const timerange = useMemo(() => { const from = dateMath.parse(LAST_30_DAYS.from)?.toISOString() ?? LAST_30_DAYS.from; const to = dateMath.parse(LAST_30_DAYS.to)?.toISOString() ?? LAST_30_DAYS.to; return { from, to }; - }, []); + // eslint-disable-next-line react-hooks/exhaustive-deps + }, [riskDataTimestamp]); // Update the timerange whenever the risk score timestamp changes to include new entries return ( ({ defaultMessage="View risk contributions" /> ), - link: { - callback: () => openDetailsPanel(EntityDetailsLeftPanelTab.RISK_INPUTS), - tooltip: ( - - ), - }, + link: riskScoreData.loading + ? undefined + : { + callback: () => openDetailsPanel(EntityDetailsLeftPanelTab.RISK_INPUTS), + tooltip: ( + + ), + }, iconType: 'arrowStart', }} expand={{ @@ -265,6 +271,7 @@ const RiskSummaryComponent = ({ columns={columns} items={rows} compressed + loading={riskScoreData.loading || recalculatingScore} />
diff --git a/x-pack/plugins/security_solution/public/explore/hosts/pages/details/index.tsx b/x-pack/plugins/security_solution/public/explore/hosts/pages/details/index.tsx index 08260caa4eb91..dda6437ba783d 100644 --- a/x-pack/plugins/security_solution/public/explore/hosts/pages/details/index.tsx +++ b/x-pack/plugins/security_solution/public/explore/hosts/pages/details/index.tsx @@ -20,6 +20,7 @@ import type { Filter } from '@kbn/es-query'; import { buildEsQuery } from '@kbn/es-query'; import { getEsQueryConfig } from '@kbn/data-plugin/common'; import { tableDefaults, dataTableSelectors, TableId } from '@kbn/securitysolution-data-table'; +import { useCalculateEntityRiskScore } from '../../../../entity_analytics/api/hooks/use_calculate_entity_risk_score'; import { useAssetCriticalityData, useAssetCriticalityPrivileges, @@ -33,7 +34,7 @@ import { useSignalIndex } from '../../../../detections/containers/detection_engi import { useAlertsPrivileges } from '../../../../detections/containers/detection_engine/alerts/use_alerts_privileges'; import { InputsModelId } from '../../../../common/store/inputs/constants'; import type { HostItem } from '../../../../../common/search_strategy'; -import { LastEventIndexKey } from '../../../../../common/search_strategy'; +import { LastEventIndexKey, RiskScoreEntity } from '../../../../../common/search_strategy'; import { SecurityPageName } from '../../../../app/types'; import { FiltersGlobal } from '../../../../common/components/filters_global'; import { HeaderPage } from '../../../../common/components/header_page'; @@ -44,7 +45,10 @@ import { hasMlUserPermissions } from '../../../../../common/machine_learning/has import { useMlCapabilities } from '../../../../common/components/ml/hooks/use_ml_capabilities'; import { scoreIntervalToDateTime } from '../../../../common/components/ml/score/score_interval_to_datetime'; import { TabNavigation } from '../../../../common/components/navigation/tab_navigation'; -import { HostOverview } from '../../../../overview/components/host_overview'; +import { + HostOverview, + HOST_OVERVIEW_RISK_SCORE_QUERY_ID, +} from '../../../../overview/components/host_overview'; import { SiemSearchBar } from '../../../../common/components/search_bar'; import { SecuritySolutionPageWrapper } from '../../../../common/components/page_wrapper'; import { useGlobalTime } from '../../../../common/containers/use_global_time'; @@ -75,6 +79,7 @@ import { AlertCountByRuleByStatus } from '../../../../common/components/alert_co import { useLicense } from '../../../../common/hooks/use_license'; import { ResponderActionButton } from '../../../../detections/components/endpoint_responder/responder_action_button'; import { useHasSecurityCapability } from '../../../../helper_hooks'; +import { useRefetchOverviewPageRiskScore } from '../../../../entity_analytics/api/hooks/use_refetch_overview_page_risk_score'; const ES_HOST_FIELD = 'host.name'; const HostOverviewManage = manageQuery(HostOverview); @@ -175,12 +180,26 @@ const HostDetailsComponent: React.FC = ({ detailName, hostDeta [detailName] ); + const additionalFilters = useMemo( + () => (rawFilteredQuery ? [rawFilteredQuery] : []), + [rawFilteredQuery] + ); + const entity = useMemo(() => ({ type: 'host' as const, name: detailName }), [detailName]); const privileges = useAssetCriticalityPrivileges(entity.name); + + const refetchRiskScore = useRefetchOverviewPageRiskScore(HOST_OVERVIEW_RISK_SCORE_QUERY_ID); + const { calculateEntityRiskScore } = useCalculateEntityRiskScore( + RiskScoreEntity.host, + detailName, + { onSuccess: refetchRiskScore } + ); + const canReadAssetCriticality = !!privileges.data?.has_read_permissions; const criticality = useAssetCriticalityData({ entity, enabled: canReadAssetCriticality, + onChange: calculateEntityRiskScore, }); return ( @@ -259,14 +278,14 @@ const HostDetailsComponent: React.FC = ({ detailName, hostDeta
diff --git a/x-pack/plugins/security_solution/public/explore/network/pages/details/index.tsx b/x-pack/plugins/security_solution/public/explore/network/pages/details/index.tsx index f0356b9125dc3..f7e30dd47bf93 100644 --- a/x-pack/plugins/security_solution/public/explore/network/pages/details/index.tsx +++ b/x-pack/plugins/security_solution/public/explore/network/pages/details/index.tsx @@ -124,6 +124,11 @@ const NetworkDetailsComponent: React.FC = () => { } }, [globalFilters, indexPattern, networkDetailsFilter, query, uiSettings]); + const additionalFilters = useMemo( + () => (rawFilteredQuery ? [rawFilteredQuery] : []), + [rawFilteredQuery] + ); + const stringifiedAdditionalFilters = JSON.stringify(rawFilteredQuery); useInvalidFilterQuery({ id: ID, @@ -226,14 +231,14 @@ const NetworkDetailsComponent: React.FC = () => {
diff --git a/x-pack/plugins/security_solution/public/explore/users/pages/details/index.tsx b/x-pack/plugins/security_solution/public/explore/users/pages/details/index.tsx index 88d9b260c8d38..4e61c7083d038 100644 --- a/x-pack/plugins/security_solution/public/explore/users/pages/details/index.tsx +++ b/x-pack/plugins/security_solution/public/explore/users/pages/details/index.tsx @@ -20,6 +20,7 @@ import { getEsQueryConfig } from '@kbn/data-plugin/common'; import type { Filter } from '@kbn/es-query'; import { buildEsQuery } from '@kbn/es-query'; import { dataTableSelectors, TableId } from '@kbn/securitysolution-data-table'; +import { useCalculateEntityRiskScore } from '../../../../entity_analytics/api/hooks/use_calculate_entity_risk_score'; import { useAssetCriticalityData, useAssetCriticalityPrivileges, @@ -60,10 +61,13 @@ import { } from '../../../../common/hooks/use_selector'; import { useInvalidFilterQuery } from '../../../../common/hooks/use_invalid_filter_query'; import { LastEventTime } from '../../../../common/components/last_event_time'; -import { LastEventIndexKey } from '../../../../../common/search_strategy'; +import { LastEventIndexKey, RiskScoreEntity } from '../../../../../common/search_strategy'; import { AnomalyTableProvider } from '../../../../common/components/ml/anomaly/anomaly_table_provider'; -import { UserOverview } from '../../../../overview/components/user_overview'; +import { + UserOverview, + USER_OVERVIEW_RISK_SCORE_QUERY_ID, +} from '../../../../overview/components/user_overview'; import { useObservedUserDetails } from '../../containers/users/observed_details'; import { useQueryInspector } from '../../../../common/components/page/manage_query'; import { scoreIntervalToDateTime } from '../../../../common/components/ml/score/score_interval_to_datetime'; @@ -73,6 +77,7 @@ import { hasMlUserPermissions } from '../../../../../common/machine_learning/has import { useMlCapabilities } from '../../../../common/components/ml/hooks/use_ml_capabilities'; import { EmptyPrompt } from '../../../../common/components/empty_prompt'; import { useHasSecurityCapability } from '../../../../helper_hooks'; +import { useRefetchOverviewPageRiskScore } from '../../../../entity_analytics/api/hooks/use_refetch_overview_page_risk_score'; const QUERY_ID = 'UsersDetailsQueryId'; const ES_USER_FIELD = 'user.name'; @@ -180,10 +185,24 @@ const UsersDetailsComponent: React.FC = ({ const entity = useMemo(() => ({ type: 'user' as const, name: detailName }), [detailName]); const privileges = useAssetCriticalityPrivileges(entity.name); + + const refetchRiskScore = useRefetchOverviewPageRiskScore(USER_OVERVIEW_RISK_SCORE_QUERY_ID); + const { calculateEntityRiskScore } = useCalculateEntityRiskScore( + RiskScoreEntity.user, + detailName, + { onSuccess: refetchRiskScore } + ); + + const additionalFilters = useMemo( + () => (rawFilteredQuery ? [rawFilteredQuery] : []), + [rawFilteredQuery] + ); + const canReadAssetCriticality = !!privileges.data?.has_read_permissions; const criticality = useAssetCriticalityData({ entity, enabled: canReadAssetCriticality, + onChange: calculateEntityRiskScore, }); return ( @@ -250,14 +269,14 @@ const UsersDetailsComponent: React.FC = ({
diff --git a/x-pack/plugins/security_solution/public/flyout/entity_details/host_right/content.stories.tsx b/x-pack/plugins/security_solution/public/flyout/entity_details/host_right/content.stories.tsx index 4d998153cda1b..3bca4be245646 100644 --- a/x-pack/plugins/security_solution/public/flyout/entity_details/host_right/content.stories.tsx +++ b/x-pack/plugins/security_solution/public/flyout/entity_details/host_right/content.stories.tsx @@ -35,6 +35,8 @@ storiesOf('Components/HostPanelContent', module) isDraggable={false} openDetailsPanel={() => {}} hostName={'test-host-name'} + onAssetCriticalityChange={() => {}} + recalculatingScore={false} /> )) .add('no observed data', () => ( @@ -58,6 +60,8 @@ storiesOf('Components/HostPanelContent', module) isDraggable={false} openDetailsPanel={() => {}} hostName={'test-host-name'} + onAssetCriticalityChange={() => {}} + recalculatingScore={false} /> )) .add('loading', () => ( @@ -81,5 +85,7 @@ storiesOf('Components/HostPanelContent', module) isDraggable={false} openDetailsPanel={() => {}} hostName={'test-host-name'} + onAssetCriticalityChange={() => {}} + recalculatingScore={false} /> )); diff --git a/x-pack/plugins/security_solution/public/flyout/entity_details/host_right/content.tsx b/x-pack/plugins/security_solution/public/flyout/entity_details/host_right/content.tsx index 64d5ea41898a0..a2d7b7b733ee0 100644 --- a/x-pack/plugins/security_solution/public/flyout/entity_details/host_right/content.tsx +++ b/x-pack/plugins/security_solution/public/flyout/entity_details/host_right/content.tsx @@ -26,16 +26,20 @@ interface HostPanelContentProps { isDraggable: boolean; openDetailsPanel: (tab: EntityDetailsLeftPanelTab) => void; hostName: string; + onAssetCriticalityChange: () => void; + recalculatingScore: boolean; } export const HostPanelContent = ({ hostName, observedHost, riskScoreState, + recalculatingScore, contextID, scopeId, isDraggable, openDetailsPanel, + onAssetCriticalityChange, }: HostPanelContentProps) => { const observedFields = useObservedHostFields(observedHost); @@ -45,13 +49,17 @@ export const HostPanelContent = ({ <> )} - + { expect(getByTestId('securitySolutionFlyoutNavigationExpandDetailButton')).toBeInTheDocument(); }); - it('renders loading state when risk score is loading', () => { - mockedHostRiskScore.mockReturnValue({ - ...mockHostRiskScoreState, - data: undefined, - loading: true, - }); - - const { getByTestId } = render( - - - - ); - - expect(getByTestId('securitySolutionFlyoutLoading')).toBeInTheDocument(); - }); - it('renders loading state when observed host is loading', () => { mockedUseObservedHost.mockReturnValue({ ...mockObservedHostData, diff --git a/x-pack/plugins/security_solution/public/flyout/entity_details/host_right/index.tsx b/x-pack/plugins/security_solution/public/flyout/entity_details/host_right/index.tsx index 3d649ad360cd0..2c58eb0eb324c 100644 --- a/x-pack/plugins/security_solution/public/flyout/entity_details/host_right/index.tsx +++ b/x-pack/plugins/security_solution/public/flyout/entity_details/host_right/index.tsx @@ -9,6 +9,10 @@ import React, { useCallback, useMemo } from 'react'; import type { FlyoutPanelProps } from '@kbn/expandable-flyout'; import { useExpandableFlyoutApi } from '@kbn/expandable-flyout'; +import { useRefetchQueryById } from '../../../entity_analytics/api/hooks/use_refetch_query_by_id'; +import { RISK_INPUTS_TAB_QUERY_ID } from '../../../entity_analytics/components/entity_details_flyout/tabs/risk_inputs/risk_inputs_tab'; +import type { Refetch } from '../../../common/types'; +import { useCalculateEntityRiskScore } from '../../../entity_analytics/api/hooks/use_calculate_entity_risk_score'; import { useKibana } from '../../../common/lib/kibana/kibana_react'; import { hostToCriteria } from '../../../common/components/ml/criteria/host_to_criteria'; import { useRiskScore } from '../../../entity_analytics/api/hooks/use_risk_score'; @@ -68,6 +72,18 @@ export const HostPanel = ({ contextID, scopeId, hostName, isDraggable }: HostPan const hostRiskData = hostRisk && hostRisk.length > 0 ? hostRisk[0] : undefined; const isRiskScoreExist = !!hostRiskData?.host.risk; + const refetchRiskInputsTab = useRefetchQueryById(RISK_INPUTS_TAB_QUERY_ID); + const refetchRiskScore = useCallback(() => { + refetch(); + (refetchRiskInputsTab as Refetch | null)?.(); + }, [refetch, refetchRiskInputsTab]); + + const { isLoading: recalculatingScore, calculateEntityRiskScore } = useCalculateEntityRiskScore( + RiskScoreEntity.host, + hostName, + { onSuccess: refetchRiskScore } + ); + useQueryInspector({ deleteQuery, inspect: inspectRiskScore, @@ -98,7 +114,7 @@ export const HostPanel = ({ contextID, scopeId, hostName, isDraggable }: HostPan const openDefaultPanel = useCallback(() => openTabPanel(), [openTabPanel]); const observedHost = useObservedHost(hostName); - if (riskScoreState.loading || observedHost.isLoading) { + if (observedHost.isLoading) { return ; } @@ -134,6 +150,8 @@ export const HostPanel = ({ contextID, scopeId, hostName, isDraggable }: HostPan scopeId={scopeId} isDraggable={!!isDraggable} openDetailsPanel={openTabPanel} + recalculatingScore={recalculatingScore} + onAssetCriticalityChange={calculateEntityRiskScore} /> ); diff --git a/x-pack/plugins/security_solution/public/flyout/entity_details/user_right/content.stories.tsx b/x-pack/plugins/security_solution/public/flyout/entity_details/user_right/content.stories.tsx index 64fa6dcd80913..57705099edc05 100644 --- a/x-pack/plugins/security_solution/public/flyout/entity_details/user_right/content.stories.tsx +++ b/x-pack/plugins/security_solution/public/flyout/entity_details/user_right/content.stories.tsx @@ -39,6 +39,8 @@ storiesOf('Components/UserPanelContent', module) isDraggable={false} openDetailsPanel={() => {}} userName={'test-user-name'} + onAssetCriticalityChange={() => {}} + recalculatingScore={false} /> )) .add('integration disabled', () => ( @@ -55,6 +57,8 @@ storiesOf('Components/UserPanelContent', module) isDraggable={false} openDetailsPanel={() => {}} userName={'test-user-name'} + onAssetCriticalityChange={() => {}} + recalculatingScore={false} /> )) .add('no managed data', () => ( @@ -71,6 +75,8 @@ storiesOf('Components/UserPanelContent', module) isDraggable={false} openDetailsPanel={() => {}} userName={'test-user-name'} + onAssetCriticalityChange={() => {}} + recalculatingScore={false} /> )) .add('no observed data', () => ( @@ -107,6 +113,8 @@ storiesOf('Components/UserPanelContent', module) isDraggable={false} openDetailsPanel={() => {}} userName={'test-user-name'} + onAssetCriticalityChange={() => {}} + recalculatingScore={false} /> )) .add('loading', () => ( @@ -147,5 +155,7 @@ storiesOf('Components/UserPanelContent', module) isDraggable={false} openDetailsPanel={() => {}} userName={'test-user-name'} + onAssetCriticalityChange={() => {}} + recalculatingScore={false} /> )); diff --git a/x-pack/plugins/security_solution/public/flyout/entity_details/user_right/content.tsx b/x-pack/plugins/security_solution/public/flyout/entity_details/user_right/content.tsx index 7c40e4b30507f..46e5e9beaa3aa 100644 --- a/x-pack/plugins/security_solution/public/flyout/entity_details/user_right/content.tsx +++ b/x-pack/plugins/security_solution/public/flyout/entity_details/user_right/content.tsx @@ -29,9 +29,11 @@ interface UserPanelContentProps { observedUser: ObservedEntityData; managedUser: ManagedUserData; riskScoreState: RiskScoreState; + recalculatingScore: boolean; contextID: string; scopeId: string; isDraggable: boolean; + onAssetCriticalityChange: () => void; openDetailsPanel: (tab: EntityDetailsLeftPanelTab) => void; } @@ -40,10 +42,12 @@ export const UserPanelContent = ({ observedUser, managedUser, riskScoreState, + recalculatingScore, contextID, scopeId, isDraggable, openDetailsPanel, + onAssetCriticalityChange, }: UserPanelContentProps) => { const observedFields = useObservedUserItems(observedUser); const isManagedUserEnable = useIsExperimentalFeatureEnabled('newUserDetailsFlyoutManagedUser'); @@ -54,13 +58,17 @@ export const UserPanelContent = ({ <> )} - + { expect(getByTestId('securitySolutionFlyoutNavigationExpandDetailButton')).toBeInTheDocument(); }); - it('renders loading state when risk score is loading', () => { - mockedUseRiskScore.mockReturnValue({ - ...mockRiskScoreState, - data: undefined, - loading: true, - }); - - const { getByTestId } = render( - - - - ); - - expect(getByTestId('securitySolutionFlyoutLoading')).toBeInTheDocument(); - }); - it('renders loading state when observed user is loading', () => { mockedUseObservedUser.mockReturnValue({ ...mockObservedUser, diff --git a/x-pack/plugins/security_solution/public/flyout/entity_details/user_right/index.tsx b/x-pack/plugins/security_solution/public/flyout/entity_details/user_right/index.tsx index a342a1318bb24..3aac81f343016 100644 --- a/x-pack/plugins/security_solution/public/flyout/entity_details/user_right/index.tsx +++ b/x-pack/plugins/security_solution/public/flyout/entity_details/user_right/index.tsx @@ -8,6 +8,10 @@ import React, { useCallback, useMemo } from 'react'; import type { FlyoutPanelProps } from '@kbn/expandable-flyout'; import { useExpandableFlyoutApi } from '@kbn/expandable-flyout'; +import { useRefetchQueryById } from '../../../entity_analytics/api/hooks/use_refetch_query_by_id'; +import type { Refetch } from '../../../common/types'; +import { RISK_INPUTS_TAB_QUERY_ID } from '../../../entity_analytics/components/entity_details_flyout/tabs/risk_inputs/risk_inputs_tab'; +import { useCalculateEntityRiskScore } from '../../../entity_analytics/api/hooks/use_calculate_entity_risk_score'; import { useKibana } from '../../../common/lib/kibana/kibana_react'; import { useRiskScore } from '../../../entity_analytics/api/hooks/use_risk_score'; import { ManagedUserDatasetKey } from '../../../../common/search_strategy/security_solution/users/managed_details'; @@ -70,6 +74,18 @@ export const UserPanel = ({ contextID, scopeId, userName, isDraggable }: UserPan const { data: userRisk } = riskScoreState; const userRiskData = userRisk && userRisk.length > 0 ? userRisk[0] : undefined; + const refetchRiskInputsTab = useRefetchQueryById(RISK_INPUTS_TAB_QUERY_ID); + const refetchRiskScore = useCallback(() => { + refetch(); + (refetchRiskInputsTab as Refetch | null)?.(); + }, [refetch, refetchRiskInputsTab]); + + const { isLoading: recalculatingScore, calculateEntityRiskScore } = useCalculateEntityRiskScore( + RiskScoreEntity.user, + userName, + { onSuccess: refetchRiskScore } + ); + useQueryInspector({ deleteQuery, inspect, @@ -108,7 +124,7 @@ export const UserPanel = ({ contextID, scopeId, userName, isDraggable }: UserPan !!managedUser.data?.[ManagedUserDatasetKey.OKTA] || !!managedUser.data?.[ManagedUserDatasetKey.ENTRA]; - if (riskScoreState.loading || observedUser.isLoading || managedUser.isLoading) { + if (observedUser.isLoading || managedUser.isLoading) { return ; } @@ -144,6 +160,8 @@ export const UserPanel = ({ contextID, scopeId, userName, isDraggable }: UserPan managedUser={managedUser} observedUser={observedUserWithAnomalies} riskScoreState={riskScoreState} + recalculatingScore={recalculatingScore} + onAssetCriticalityChange={calculateEntityRiskScore} contextID={contextID} scopeId={scopeId} isDraggable={!!isDraggable} 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 92ff143585117..6b499b085a23c 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 @@ -10,6 +10,9 @@ import { euiDarkVars as darkTheme, euiLightVars as lightTheme } from '@kbn/ui-th import { getOr } from 'lodash/fp'; import React, { useCallback, useMemo } from 'react'; import styled from 'styled-components'; +import { useGlobalTime } from '../../../common/containers/use_global_time'; +import { useQueryInspector } from '../../../common/components/page/manage_query'; +import { FIRST_RECORD_PAGINATION } from '../../../entity_analytics/common'; import { useRiskScore } from '../../../entity_analytics/api/hooks/use_risk_score'; import type { HostItem } from '../../../../common/search_strategy'; import { buildHostNamesFilter, RiskScoreEntity } from '../../../../common/search_strategy'; @@ -63,6 +66,8 @@ const HostRiskOverviewWrapper = styled(EuiFlexGroup)` width: ${({ $width }: { $width: string }) => $width}; `; +export const HOST_OVERVIEW_RISK_SCORE_QUERY_ID = 'riskInputsTabQuery'; + export const HostOverview = React.memo( ({ anomaliesData, @@ -88,11 +93,29 @@ export const HostOverview = React.memo( () => (hostName ? buildHostNamesFilter([hostName]) : undefined), [hostName] ); + const { deleteQuery, setQuery } = useGlobalTime(); - const { data: hostRisk, isAuthorized } = useRiskScore({ + const { + data: hostRisk, + isAuthorized, + inspect: inspectRiskScore, + loading: loadingRiskScore, + refetch: refetchRiskScore, + } = useRiskScore({ filterQuery, riskEntity: RiskScoreEntity.host, skip: hostName == null, + onlyLatest: false, + pagination: FIRST_RECORD_PAGINATION, + }); + + useQueryInspector({ + deleteQuery, + inspect: inspectRiskScore, + loading: loadingRiskScore, + queryId: HOST_OVERVIEW_RISK_SCORE_QUERY_ID, + refetch: refetchRiskScore, + setQuery, }); const getDefaultRenderer = useCallback( 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 bd9e56dffee8d..321f87a3b5984 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 @@ -10,6 +10,9 @@ import { euiDarkVars as darkTheme, euiLightVars as lightTheme } from '@kbn/ui-th import { getOr } from 'lodash/fp'; import React, { useCallback, useMemo } from 'react'; import styled from 'styled-components'; +import { useGlobalTime } from '../../../common/containers/use_global_time'; +import { FIRST_RECORD_PAGINATION } from '../../../entity_analytics/common'; +import { useQueryInspector } from '../../../common/components/page/manage_query'; import { useRiskScore } from '../../../entity_analytics/api/hooks/use_risk_score'; import { buildUserNamesFilter, RiskScoreEntity } from '../../../../common/search_strategy'; import type { DescriptionList } from '../../../../common/utility_types'; @@ -61,6 +64,8 @@ const UserRiskOverviewWrapper = styled(EuiFlexGroup)` width: ${({ $width }: { $width: string }) => $width}; `; +export const USER_OVERVIEW_RISK_SCORE_QUERY_ID = 'riskInputsTabQuery'; + export const UserOverview = React.memo( ({ anomaliesData, @@ -86,11 +91,29 @@ export const UserOverview = React.memo( () => (userName ? buildUserNamesFilter([userName]) : undefined), [userName] ); + const { deleteQuery, setQuery } = useGlobalTime(); - const { data: userRisk, isAuthorized } = useRiskScore({ + const { + data: userRisk, + isAuthorized, + inspect: inspectRiskScore, + loading: loadingRiskScore, + refetch: refetchRiskScore, + } = useRiskScore({ filterQuery, skip: userName == null, riskEntity: RiskScoreEntity.user, + onlyLatest: false, + pagination: FIRST_RECORD_PAGINATION, + }); + + useQueryInspector({ + deleteQuery, + inspect: inspectRiskScore, + loading: loadingRiskScore, + queryId: USER_OVERVIEW_RISK_SCORE_QUERY_ID, + refetch: refetchRiskScore, + setQuery, }); const getDefaultRenderer = useCallback( diff --git a/x-pack/plugins/security_solution/public/overview/pages/detection_response.tsx b/x-pack/plugins/security_solution/public/overview/pages/detection_response.tsx index edfda063ac5ba..3da5612254215 100644 --- a/x-pack/plugins/security_solution/public/overview/pages/detection_response.tsx +++ b/x-pack/plugins/security_solution/public/overview/pages/detection_response.tsx @@ -4,7 +4,7 @@ * 2.0; you may not use this file except in compliance with the Elastic License * 2.0. */ -import React from 'react'; +import React, { useMemo } from 'react'; import { EuiFlexGroup, EuiFlexItem, EuiLoadingSpinner } from '@elastic/eui'; import type { DocLinks } from '@kbn/doc-links'; import { APP_ID } from '../../../common'; @@ -43,6 +43,8 @@ const DetectionResponseComponent = () => { const canReadCases = userCasesPermissions.read; const canReadAlerts = hasKibanaREAD && hasIndexRead; const isSocTrendsEnabled = useIsExperimentalFeatureEnabled('socTrendsEnabled'); + const additionalFilters = useMemo(() => (filterQuery ? [filterQuery] : []), [filterQuery]); + if (!canReadAlerts && !canReadCases) { return docLinks.siem.privileges} />; } @@ -66,7 +68,7 @@ const DetectionResponseComponent = () => { )} diff --git a/x-pack/plugins/security_solution/server/lib/entity_analytics/asset_criticality/asset_criticality_data_client.ts b/x-pack/plugins/security_solution/server/lib/entity_analytics/asset_criticality/asset_criticality_data_client.ts index 81f0386a6c96c..fd5c2921972f3 100644 --- a/x-pack/plugins/security_solution/server/lib/entity_analytics/asset_criticality/asset_criticality_data_client.ts +++ b/x-pack/plugins/security_solution/server/lib/entity_analytics/asset_criticality/asset_criticality_data_client.ts @@ -141,7 +141,10 @@ export class AssetCriticalityDataClient { } } - public async upsert(record: AssetCriticalityUpsert): Promise { + public async upsert( + record: AssetCriticalityUpsert, + refresh = 'wait_for' as const + ): Promise { const id = createId(record); const doc = { id_field: record.idField, @@ -153,6 +156,7 @@ export class AssetCriticalityDataClient { await this.options.esClient.update({ id, index: this.getIndex(), + refresh: refresh ?? false, body: { doc, doc_as_upsert: true, @@ -240,10 +244,11 @@ export class AssetCriticalityDataClient { return { errors, stats }; }; - public async delete(idParts: AssetCriticalityIdParts) { + public async delete(idParts: AssetCriticalityIdParts, refresh = 'wait_for' as const) { await this.options.esClient.delete({ id: createId(idParts), index: this.getIndex(), + refresh: refresh ?? false, }); } } diff --git a/x-pack/plugins/security_solution/server/lib/entity_analytics/asset_criticality/routes/delete.ts b/x-pack/plugins/security_solution/server/lib/entity_analytics/asset_criticality/routes/delete.ts index f9630542283ef..6f1d677d414c5 100644 --- a/x-pack/plugins/security_solution/server/lib/entity_analytics/asset_criticality/routes/delete.ts +++ b/x-pack/plugins/security_solution/server/lib/entity_analytics/asset_criticality/routes/delete.ts @@ -12,7 +12,7 @@ import { APP_ID, ENABLE_ASSET_CRITICALITY_SETTING, } from '../../../../../common/constants'; -import { AssetCriticalityRecordIdParts } from '../../../../../common/api/entity_analytics/asset_criticality'; +import { DeleteAssetCriticalityRecord } from '../../../../../common/api/entity_analytics/asset_criticality'; import { buildRouteValidationWithZod } from '../../../../utils/build_validation/route_validation'; import { checkAndInitAssetCriticalityResources } from '../check_and_init_asset_criticality_resources'; import { assertAdvancedSettingsEnabled } from '../../utils/assert_advanced_setting_enabled'; @@ -36,7 +36,7 @@ export const assetCriticalityDeleteRoute = ( version: '1', validate: { request: { - query: buildRouteValidationWithZod(AssetCriticalityRecordIdParts), + query: buildRouteValidationWithZod(DeleteAssetCriticalityRecord), }, }, }, @@ -59,10 +59,13 @@ export const assetCriticalityDeleteRoute = ( await checkAndInitAssetCriticalityResources(context, logger); const assetCriticalityClient = securitySolution.getAssetCriticalityDataClient(); - await assetCriticalityClient.delete({ - idField: request.query.id_field, - idValue: request.query.id_value, - }); + await assetCriticalityClient.delete( + { + idField: request.query.id_field, + idValue: request.query.id_value, + }, + request.query.refresh + ); return response.ok(); } catch (e) { diff --git a/x-pack/plugins/security_solution/server/lib/entity_analytics/asset_criticality/routes/upsert.ts b/x-pack/plugins/security_solution/server/lib/entity_analytics/asset_criticality/routes/upsert.ts index 3e460b3f4e543..8a6d475695962 100644 --- a/x-pack/plugins/security_solution/server/lib/entity_analytics/asset_criticality/routes/upsert.ts +++ b/x-pack/plugins/security_solution/server/lib/entity_analytics/asset_criticality/routes/upsert.ts @@ -55,7 +55,10 @@ export const assetCriticalityUpsertRoute = ( criticalityLevel: request.body.criticality_level, }; - const result = await assetCriticalityClient.upsert(assetCriticalityRecord); + const result = await assetCriticalityClient.upsert( + assetCriticalityRecord, + request.body.refresh + ); securitySolution.getAuditLogger()?.log({ message: 'User attempted to assign the asset criticality level for an entity', diff --git a/x-pack/plugins/security_solution/server/lib/entity_analytics/risk_score/calculate_and_persist_risk_scores.ts b/x-pack/plugins/security_solution/server/lib/entity_analytics/risk_score/calculate_and_persist_risk_scores.ts index 09fe204fe69e1..aa67d4abf78ba 100644 --- a/x-pack/plugins/security_solution/server/lib/entity_analytics/risk_score/calculate_and_persist_risk_scores.ts +++ b/x-pack/plugins/security_solution/server/lib/entity_analytics/risk_score/calculate_and_persist_risk_scores.ts @@ -21,7 +21,7 @@ export const calculateAndPersistRiskScores = async ( riskScoreDataClient: RiskScoreDataClient; } ): Promise => { - const { riskScoreDataClient, spaceId, returnScores, ...rest } = params; + const { riskScoreDataClient, spaceId, returnScores, refresh, ...rest } = params; const writer = await riskScoreDataClient.getWriter({ namespace: spaceId, @@ -40,7 +40,7 @@ export const calculateAndPersistRiskScores = async ( ); } - const { errors, docs_written: scoresWritten } = await writer.bulk(scores); + const { errors, docs_written: scoresWritten } = await writer.bulk({ ...scores, refresh }); const result = { after_keys: afterKeys, errors, scores_written: scoresWritten }; diff --git a/x-pack/plugins/security_solution/server/lib/entity_analytics/risk_score/risk_engine_data_writer.ts b/x-pack/plugins/security_solution/server/lib/entity_analytics/risk_score/risk_engine_data_writer.ts index e43b44ab01894..e140090ea55e4 100644 --- a/x-pack/plugins/security_solution/server/lib/entity_analytics/risk_score/risk_engine_data_writer.ts +++ b/x-pack/plugins/security_solution/server/lib/entity_analytics/risk_score/risk_engine_data_writer.ts @@ -18,6 +18,7 @@ interface WriterBulkResponse { interface BulkParams { host?: RiskScore[]; user?: RiskScore[]; + refresh?: 'wait_for'; } export interface RiskEngineDataWriter { @@ -42,6 +43,7 @@ export class RiskEngineDataWriter implements RiskEngineDataWriter { const { errors, items, took } = await this.options.esClient.bulk({ operations: this.buildBulkOperations(params), + refresh: params.refresh ?? false, }); return { diff --git a/x-pack/plugins/security_solution/server/lib/entity_analytics/risk_score/risk_score_service.ts b/x-pack/plugins/security_solution/server/lib/entity_analytics/risk_score/risk_score_service.ts index bfc86643a6fd0..b326f50f767a4 100644 --- a/x-pack/plugins/security_solution/server/lib/entity_analytics/risk_score/risk_score_service.ts +++ b/x-pack/plugins/security_solution/server/lib/entity_analytics/risk_score/risk_score_service.ts @@ -44,6 +44,7 @@ export interface RiskScoreServiceFactoryParams { riskEngineDataClient: RiskEngineDataClient; riskScoreDataClient: RiskScoreDataClient; spaceId: string; + refresh?: 'wait_for'; } export const riskScoreServiceFactory = ({ diff --git a/x-pack/plugins/security_solution/server/lib/entity_analytics/risk_score/routes/entity_calculation.test.ts b/x-pack/plugins/security_solution/server/lib/entity_analytics/risk_score/routes/entity_calculation.test.ts index 1ba609e885dda..dbb8459d0ae42 100644 --- a/x-pack/plugins/security_solution/server/lib/entity_analytics/risk_score/routes/entity_calculation.test.ts +++ b/x-pack/plugins/security_solution/server/lib/entity_analytics/risk_score/routes/entity_calculation.test.ts @@ -92,7 +92,9 @@ describe('entity risk score calculation route', () => { expect(response.status).toEqual(200); expect(mockRiskScoreService.calculateAndPersistScores).toHaveBeenCalledWith( - expect.objectContaining({ filter: [{ term: { 'host.name': 'test-host-name' } }] }) + expect.objectContaining({ + filter: { bool: { filter: [{ term: { 'host.name': 'test-host-name' } }] } }, + }) ); }); @@ -118,9 +120,9 @@ describe('entity risk score calculation route', () => { expect(response.body).toEqual({ message: 'No Risk engine configuration found', - status_code: 405, + status_code: 400, }); - expect(response.status).toEqual(405); + expect(response.status).toEqual(400); }); it('returns an error if the risk engine is disabled', async () => { @@ -133,9 +135,9 @@ describe('entity risk score calculation route', () => { expect(response.body).toEqual({ message: 'Risk engine is disabled', - status_code: 405, + status_code: 400, }); - expect(response.status).toEqual(405); + expect(response.status).toEqual(400); }); it('filter by user provided filter when it is defined', async () => { @@ -149,7 +151,9 @@ describe('entity risk score calculation route', () => { expect(response.status).toEqual(200); expect(mockRiskScoreService.calculateAndPersistScores).toHaveBeenCalledWith( - expect.objectContaining({ filter: expect.arrayContaining([userFilter]) }) + expect.objectContaining({ + filter: { bool: { filter: expect.arrayContaining([userFilter]) } }, + }) ); }); }); diff --git a/x-pack/plugins/security_solution/server/lib/entity_analytics/risk_score/routes/entity_calculation.ts b/x-pack/plugins/security_solution/server/lib/entity_analytics/risk_score/routes/entity_calculation.ts index 497e9ac189100..98b4149f70230 100644 --- a/x-pack/plugins/security_solution/server/lib/entity_analytics/risk_score/routes/entity_calculation.ts +++ b/x-pack/plugins/security_solution/server/lib/entity_analytics/risk_score/routes/entity_calculation.ts @@ -69,7 +69,7 @@ export const riskScoreEntityCalculationRoute = ( logger ); - const { identifier_type: identifierType, identifier } = request.body; + const { identifier_type: identifierType, identifier, refresh } = request.body; try { const entityAnalyticsConfig = await riskScoreService.getConfigurationWithDefaults( @@ -78,7 +78,7 @@ export const riskScoreEntityCalculationRoute = ( if (entityAnalyticsConfig == null) { return siemResponse.error({ - statusCode: 405, + statusCode: 400, body: 'No Risk engine configuration found', }); } @@ -94,7 +94,7 @@ export const riskScoreEntityCalculationRoute = ( if (!enabled) { return siemResponse.error({ - statusCode: 405, + statusCode: 400, body: 'Risk engine is disabled', }); } @@ -112,6 +112,7 @@ export const riskScoreEntityCalculationRoute = ( const identifierFilter = { term: { [getFieldForIdentifier(identifierType)]: identifier }, }; + const filter = isEmpty(userFilter) ? [identifierFilter] : [userFilter, identifierFilter]; const result: CalculateAndPersistScoresResponse = @@ -119,13 +120,18 @@ export const riskScoreEntityCalculationRoute = ( pageSize, identifierType, index, - filter, + filter: { + bool: { + filter, + }, + }, range, runtimeMappings, weights: [], alertSampleSizePerShard, afterKeys, returnScores: true, + refresh, }); if (result.errors.length) { diff --git a/x-pack/plugins/security_solution/server/lib/entity_analytics/types.ts b/x-pack/plugins/security_solution/server/lib/entity_analytics/types.ts index d41edbd215642..a71912d2dffa4 100644 --- a/x-pack/plugins/security_solution/server/lib/entity_analytics/types.ts +++ b/x-pack/plugins/security_solution/server/lib/entity_analytics/types.ts @@ -52,6 +52,7 @@ export interface CalculateAndPersistScoresParams { weights?: RiskWeights; alertSampleSizePerShard?: number; returnScores?: boolean; + refresh?: 'wait_for'; } export interface CalculateAndPersistScoresResponse { From 922900654288002f120f65f32f0d50f27d0ab1cb Mon Sep 17 00:00:00 2001 From: Stratoula Kalafateli Date: Wed, 8 May 2024 13:21:53 +0200 Subject: [PATCH 60/86] [ES|QL] Enable serverless tests (#181570) ## Summary Adds tests for testing ES|QL in serverless deployments. I am adding the _esql_view in Discover for now but I also want to add the dashboard esql tests too Flaky test runner (25 times) https://buildkite.com/elastic/kibana-flaky-test-suite-runner/builds/5859 --------- Co-authored-by: Kibana Machine <42973632+kibanamachine@users.noreply.github.com> --- .../services/deployment_agnostic_services.ts | 1 + .../common/discover/esql/_esql_view.ts | 530 ++++++++++++++++++ .../test_suites/common/discover/esql/index.ts | 14 + .../common_configs/config.group6.ts | 1 + .../search/common_configs/config.group6.ts | 1 + .../security/common_configs/config.group6.ts | 1 + 6 files changed, 548 insertions(+) create mode 100644 x-pack/test_serverless/functional/test_suites/common/discover/esql/_esql_view.ts create mode 100644 x-pack/test_serverless/functional/test_suites/common/discover/esql/index.ts diff --git a/x-pack/test_serverless/functional/services/deployment_agnostic_services.ts b/x-pack/test_serverless/functional/services/deployment_agnostic_services.ts index 0bbae5c25cdd5..f710dca081668 100644 --- a/x-pack/test_serverless/functional/services/deployment_agnostic_services.ts +++ b/x-pack/test_serverless/functional/services/deployment_agnostic_services.ts @@ -52,6 +52,7 @@ const deploymentAgnosticFunctionalServices = _.pick(functionalServices, [ 'menuToggle', 'ml', 'monacoEditor', + 'esql', 'pieChart', 'pipelineEditor', 'pipelineList', diff --git a/x-pack/test_serverless/functional/test_suites/common/discover/esql/_esql_view.ts b/x-pack/test_serverless/functional/test_suites/common/discover/esql/_esql_view.ts new file mode 100644 index 0000000000000..5f051ac77bba0 --- /dev/null +++ b/x-pack/test_serverless/functional/test_suites/common/discover/esql/_esql_view.ts @@ -0,0 +1,530 @@ +/* + * Copyright 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'; + +export default function ({ getService, getPageObjects }: FtrProviderContext) { + const esArchiver = getService('esArchiver'); + const kibanaServer = getService('kibanaServer'); + const log = getService('log'); + const dataGrid = getService('dataGrid'); + const testSubjects = getService('testSubjects'); + const monacoEditor = getService('monacoEditor'); + const inspector = getService('inspector'); + const retry = getService('retry'); + const browser = getService('browser'); + const find = getService('find'); + const esql = getService('esql'); + const dashboardAddPanel = getService('dashboardAddPanel'); + const PageObjects = getPageObjects([ + 'svlCommonPage', + 'common', + 'discover', + 'dashboard', + 'header', + 'timePicker', + 'unifiedFieldList', + ]); + + const defaultSettings = { + defaultIndex: 'logstash-*', + }; + + describe('discover esql view', async function () { + before(async () => { + await kibanaServer.savedObjects.cleanStandardList(); + log.debug('load kibana index with default index pattern'); + await kibanaServer.importExport.load('test/functional/fixtures/kbn_archiver/discover'); + // and load a set of makelogs data + await esArchiver.loadIfNeeded('test/functional/fixtures/es_archiver/logstash_functional'); + await kibanaServer.uiSettings.replace(defaultSettings); + await PageObjects.svlCommonPage.loginAsAdmin(); + await PageObjects.common.navigateToApp('discover'); + await PageObjects.header.waitUntilLoadingHasFinished(); + await PageObjects.timePicker.setDefaultAbsoluteRange(); + }); + + describe('test', () => { + it('should render esql view correctly', async function () { + await PageObjects.unifiedFieldList.waitUntilSidebarHasLoaded(); + + await testSubjects.existOrFail('showQueryBarMenu'); + await testSubjects.existOrFail('superDatePickerToggleQuickMenuButton'); + await testSubjects.existOrFail('addFilter'); + await testSubjects.existOrFail('dscViewModeDocumentButton'); + await testSubjects.existOrFail('unifiedHistogramChart'); + await testSubjects.existOrFail('discoverQueryHits'); + await testSubjects.existOrFail('discoverAlertsButton'); + await testSubjects.existOrFail('shareTopNavButton'); + await testSubjects.existOrFail('docTableExpandToggleColumn'); + await testSubjects.existOrFail('dataGridColumnSortingButton'); + await testSubjects.existOrFail('fieldListFiltersFieldSearch'); + await testSubjects.existOrFail('fieldListFiltersFieldTypeFilterToggle'); + await testSubjects.click('field-@message-showDetails'); + await testSubjects.existOrFail('discoverFieldListPanelEdit-@message'); + + await PageObjects.discover.selectTextBaseLang(); + await PageObjects.unifiedFieldList.waitUntilSidebarHasLoaded(); + + await testSubjects.existOrFail('fieldListFiltersFieldSearch'); + await testSubjects.existOrFail('TextBasedLangEditor'); + await testSubjects.existOrFail('superDatePickerToggleQuickMenuButton'); + + await testSubjects.missingOrFail('showQueryBarMenu'); + await testSubjects.missingOrFail('addFilter'); + await testSubjects.missingOrFail('dscViewModeDocumentButton'); + // when Lens suggests a table, we render an ESQL based histogram + await testSubjects.existOrFail('unifiedHistogramChart'); + await testSubjects.existOrFail('discoverQueryHits'); + await testSubjects.existOrFail('discoverAlertsButton'); + await testSubjects.existOrFail('shareTopNavButton'); + await testSubjects.existOrFail('dataGridColumnSortingButton'); + await testSubjects.existOrFail('docTableExpandToggleColumn'); + await testSubjects.existOrFail('fieldListFiltersFieldTypeFilterToggle'); + await testSubjects.click('field-@message-showDetails'); + await testSubjects.missingOrFail('discoverFieldListPanelEditItem'); + }); + + it('should perform test query correctly', async function () { + await PageObjects.discover.selectTextBaseLang(); + const testQuery = `from logstash-* | limit 10 | stats countB = count(bytes) by geo.dest | sort countB`; + + await monacoEditor.setCodeEditorValue(testQuery); + await testSubjects.click('querySubmitButton'); + await PageObjects.header.waitUntilLoadingHasFinished(); + await PageObjects.discover.waitUntilSearchingHasFinished(); + // here Lens suggests a XY so it is rendered + await testSubjects.existOrFail('unifiedHistogramChart'); + await testSubjects.existOrFail('xyVisChart'); + const cell = await dataGrid.getCellElement(0, 2); + expect(await cell.getVisibleText()).to.be('1'); + }); + + it('should render when switching to a time range with no data, then back to a time range with data', async () => { + await PageObjects.discover.selectTextBaseLang(); + const testQuery = `from logstash-* | limit 10 | stats countB = count(bytes) by geo.dest | sort countB`; + await monacoEditor.setCodeEditorValue(testQuery); + await testSubjects.click('querySubmitButton'); + await PageObjects.header.waitUntilLoadingHasFinished(); + await PageObjects.discover.waitUntilSearchingHasFinished(); + let cell = await dataGrid.getCellElement(0, 2); + expect(await cell.getVisibleText()).to.be('1'); + await PageObjects.timePicker.setAbsoluteRange( + 'Sep 19, 2015 @ 06:31:44.000', + 'Sep 19, 2015 @ 06:31:44.000' + ); + await PageObjects.header.waitUntilLoadingHasFinished(); + await PageObjects.discover.waitUntilSearchingHasFinished(); + await testSubjects.existOrFail('discoverNoResults'); + await PageObjects.timePicker.setDefaultAbsoluteRange(); + await PageObjects.header.waitUntilLoadingHasFinished(); + await PageObjects.discover.waitUntilSearchingHasFinished(); + cell = await dataGrid.getCellElement(0, 2); + expect(await cell.getVisibleText()).to.be('1'); + }); + + it('should query an index pattern that doesnt translate to a dataview correctly', async function () { + await PageObjects.discover.selectTextBaseLang(); + const testQuery = `from logstash* | limit 10 | stats countB = count(bytes) by geo.dest | sort countB`; + + await monacoEditor.setCodeEditorValue(testQuery); + await testSubjects.click('querySubmitButton'); + await PageObjects.header.waitUntilLoadingHasFinished(); + + const cell = await dataGrid.getCellElement(0, 2); + expect(await cell.getVisibleText()).to.be('1'); + }); + + it('should render correctly if there are empty fields', async function () { + await PageObjects.discover.selectTextBaseLang(); + const testQuery = `from logstash-* | limit 10 | keep machine.ram_range, bytes`; + + await monacoEditor.setCodeEditorValue(testQuery); + await testSubjects.click('querySubmitButton'); + await PageObjects.header.waitUntilLoadingHasFinished(); + await PageObjects.discover.waitUntilSearchingHasFinished(); + const cell = await dataGrid.getCellElement(0, 3); + expect(await cell.getVisibleText()).to.be(' - '); + expect(await dataGrid.getHeaders()).to.eql([ + 'Control column', + 'Select column', + 'Numberbytes', + 'machine.ram_range', + ]); + }); + + it('should work without a FROM statement', async function () { + await PageObjects.discover.selectTextBaseLang(); + const testQuery = `ROW a = 1, b = "two", c = null`; + + await monacoEditor.setCodeEditorValue(testQuery); + await testSubjects.click('querySubmitButton'); + await PageObjects.header.waitUntilLoadingHasFinished(); + + await PageObjects.discover.dragFieldToTable('a'); + const cell = await dataGrid.getCellElement(0, 2); + expect(await cell.getVisibleText()).to.be('1'); + }); + }); + + describe('errors', () => { + it('should show error messages for syntax errors in query', async function () { + await PageObjects.discover.selectTextBaseLang(); + const brokenQueries = [ + 'from logstash-* | limit 10*', + 'from logstash-* | limit A', + 'from logstash-* | where a*', + 'limit 10', + ]; + for (const testQuery of brokenQueries) { + await monacoEditor.setCodeEditorValue(testQuery); + await testSubjects.click('querySubmitButton'); + await PageObjects.header.waitUntilLoadingHasFinished(); + await PageObjects.discover.waitUntilSearchingHasFinished(); + // error in fetching documents because of the invalid query + await PageObjects.discover.showsErrorCallout(); + const message = await testSubjects.getVisibleText('discoverErrorCalloutMessage'); + expect(message).to.contain( + "[esql] > Couldn't parse Elasticsearch ES|QL query. Check your query and try again." + ); + expect(message).to.not.contain('undefined'); + if (message.includes('line')) { + expect((await monacoEditor.getCurrentMarkers('kibanaCodeEditor')).length).to.eql(1); + } + } + }); + }); + + describe('switch modal', () => { + beforeEach(async () => { + await PageObjects.common.navigateToApp('discover'); + await PageObjects.timePicker.setDefaultAbsoluteRange(); + }); + + it('should show switch modal when switching to a data view', async () => { + await PageObjects.discover.selectTextBaseLang(); + await PageObjects.header.waitUntilLoadingHasFinished(); + await PageObjects.discover.waitUntilSearchingHasFinished(); + await PageObjects.discover.selectIndexPattern('logstash-*', false); + await retry.try(async () => { + await testSubjects.existOrFail('unifiedSearch_switch_modal'); + }); + }); + + it('should not show switch modal when switching to a data view while a saved search is open', async () => { + await PageObjects.discover.selectTextBaseLang(); + const testQuery = 'from logstash-* | limit 100 | drop @timestamp'; + await monacoEditor.setCodeEditorValue(testQuery); + await testSubjects.click('querySubmitButton'); + await PageObjects.header.waitUntilLoadingHasFinished(); + await PageObjects.discover.waitUntilSearchingHasFinished(); + await PageObjects.discover.selectIndexPattern('logstash-*', false); + await retry.try(async () => { + await testSubjects.existOrFail('unifiedSearch_switch_modal'); + }); + await find.clickByCssSelector( + '[data-test-subj="unifiedSearch_switch_modal"] .euiModal__closeIcon' + ); + await retry.try(async () => { + await testSubjects.missingOrFail('unifiedSearch_switch_modal'); + }); + await PageObjects.discover.saveSearch('esql_test'); + await PageObjects.discover.selectIndexPattern('logstash-*'); + await testSubjects.missingOrFail('unifiedSearch_switch_modal'); + }); + + it('should show switch modal when switching to a data view while a saved search with unsaved changes is open', async () => { + await PageObjects.discover.selectTextBaseLang(); + await PageObjects.header.waitUntilLoadingHasFinished(); + await PageObjects.discover.waitUntilSearchingHasFinished(); + await PageObjects.discover.saveSearch('esql_test2'); + const testQuery = 'from logstash-* | limit 100 | drop @timestamp'; + await monacoEditor.setCodeEditorValue(testQuery); + await testSubjects.click('querySubmitButton'); + await PageObjects.header.waitUntilLoadingHasFinished(); + await PageObjects.discover.waitUntilSearchingHasFinished(); + await PageObjects.discover.selectIndexPattern('logstash-*', false); + await retry.try(async () => { + await testSubjects.existOrFail('unifiedSearch_switch_modal'); + }); + }); + }); + + describe('inspector', () => { + beforeEach(async () => { + await PageObjects.common.navigateToApp('discover'); + await PageObjects.timePicker.setDefaultAbsoluteRange(); + }); + + it('shows Discover and Lens requests in Inspector', async () => { + await PageObjects.discover.selectTextBaseLang(); + await PageObjects.header.waitUntilLoadingHasFinished(); + await PageObjects.discover.waitUntilSearchingHasFinished(); + await inspector.open(); + const requestNames = await inspector.getRequestNames(); + expect(requestNames).to.contain('Table'); + expect(requestNames).to.contain('Visualization'); + }); + }); + + describe('query history', () => { + beforeEach(async () => { + await PageObjects.common.navigateToApp('discover'); + await PageObjects.timePicker.setDefaultAbsoluteRange(); + }); + + it('should see my current query in the history', async () => { + await PageObjects.discover.selectTextBaseLang(); + await PageObjects.header.waitUntilLoadingHasFinished(); + await PageObjects.discover.waitUntilSearchingHasFinished(); + await PageObjects.unifiedFieldList.waitUntilSidebarHasLoaded(); + + await testSubjects.click('TextBasedLangEditor-expand'); + await testSubjects.click('TextBasedLangEditor-toggle-query-history-button'); + const historyItems = await esql.getHistoryItems(); + log.debug(historyItems); + const queryAdded = historyItems.some((item) => { + return item[1] === 'from logstash-* | limit 10'; + }); + + expect(queryAdded).to.be(true); + }); + + it('updating the query should add this to the history', async () => { + await PageObjects.discover.selectTextBaseLang(); + await PageObjects.header.waitUntilLoadingHasFinished(); + await PageObjects.discover.waitUntilSearchingHasFinished(); + await PageObjects.unifiedFieldList.waitUntilSidebarHasLoaded(); + + const testQuery = 'from logstash-* | limit 100 | drop @timestamp'; + await monacoEditor.setCodeEditorValue(testQuery); + await testSubjects.click('querySubmitButton'); + await PageObjects.header.waitUntilLoadingHasFinished(); + await PageObjects.discover.waitUntilSearchingHasFinished(); + + await testSubjects.click('TextBasedLangEditor-expand'); + await testSubjects.click('TextBasedLangEditor-toggle-query-history-button'); + const historyItems = await esql.getHistoryItems(); + log.debug(historyItems); + const queryAdded = historyItems.some((item) => { + return item[1] === 'from logstash-* | limit 100 | drop @timestamp'; + }); + + expect(queryAdded).to.be(true); + }); + + it('should select a query from the history and submit it', async () => { + await PageObjects.discover.selectTextBaseLang(); + await PageObjects.header.waitUntilLoadingHasFinished(); + await PageObjects.discover.waitUntilSearchingHasFinished(); + await PageObjects.unifiedFieldList.waitUntilSidebarHasLoaded(); + + await testSubjects.click('TextBasedLangEditor-expand'); + await testSubjects.click('TextBasedLangEditor-toggle-query-history-button'); + // click a history item + await esql.clickHistoryItem(1); + + const historyItems = await esql.getHistoryItems(); + log.debug(historyItems); + const queryAdded = historyItems.some((item) => { + return item[1] === 'from logstash-* | limit 100 | drop @timestamp'; + }); + + expect(queryAdded).to.be(true); + }); + + it('should add a failed query to the history', async () => { + await PageObjects.discover.selectTextBaseLang(); + await PageObjects.header.waitUntilLoadingHasFinished(); + await PageObjects.discover.waitUntilSearchingHasFinished(); + await PageObjects.unifiedFieldList.waitUntilSidebarHasLoaded(); + + const testQuery = 'from logstash-* | limit 100 | woof and meow'; + await monacoEditor.setCodeEditorValue(testQuery); + await testSubjects.click('querySubmitButton'); + await PageObjects.header.waitUntilLoadingHasFinished(); + await PageObjects.discover.waitUntilSearchingHasFinished(); + await PageObjects.unifiedFieldList.waitUntilSidebarHasLoaded(); + await testSubjects.click('TextBasedLangEditor-expand'); + await testSubjects.click('TextBasedLangEditor-toggle-query-history-button'); + await testSubjects.click('TextBasedLangEditor-queryHistory-runQuery-button'); + const historyItem = await esql.getHistoryItem(0); + await historyItem.findByTestSubject('TextBasedLangEditor-queryHistory-error'); + }); + }); + + describe('sorting', () => { + it('should sort correctly', async () => { + const savedSearchName = 'testSorting'; + + await PageObjects.discover.selectTextBaseLang(); + await PageObjects.header.waitUntilLoadingHasFinished(); + await PageObjects.discover.waitUntilSearchingHasFinished(); + + const testQuery = 'from logstash-* | sort @timestamp | limit 100'; + await monacoEditor.setCodeEditorValue(testQuery); + await testSubjects.click('querySubmitButton'); + await PageObjects.header.waitUntilLoadingHasFinished(); + await PageObjects.discover.waitUntilSearchingHasFinished(); + await PageObjects.unifiedFieldList.waitUntilSidebarHasLoaded(); + + await PageObjects.unifiedFieldList.clickFieldListItemAdd('bytes'); + + await PageObjects.header.waitUntilLoadingHasFinished(); + await PageObjects.discover.waitUntilSearchingHasFinished(); + + await retry.waitFor('first cell contains an initial value', async () => { + const cell = await dataGrid.getCellElement(0, 2); + const text = await cell.getVisibleText(); + return text === '1,623'; + }); + + expect(await testSubjects.getVisibleText('dataGridColumnSortingButton')).to.be( + 'Sort fields' + ); + + await dataGrid.clickDocSortDesc('bytes', 'Sort High-Low'); + + await PageObjects.discover.waitUntilSearchingHasFinished(); + + await retry.waitFor('first cell contains the highest value', async () => { + const cell = await dataGrid.getCellElement(0, 2); + const text = await cell.getVisibleText(); + return text === '483'; + }); + + expect(await testSubjects.getVisibleText('dataGridColumnSortingButton')).to.be( + 'Sort fields\n1' + ); + + await PageObjects.discover.saveSearch(savedSearchName); + + await PageObjects.header.waitUntilLoadingHasFinished(); + await PageObjects.discover.waitUntilSearchingHasFinished(); + + await retry.waitFor('first cell contains the same highest value', async () => { + const cell = await dataGrid.getCellElement(0, 2); + const text = await cell.getVisibleText(); + return text === '483'; + }); + + await browser.refresh(); + + await PageObjects.header.waitUntilLoadingHasFinished(); + await PageObjects.discover.waitUntilSearchingHasFinished(); + + await retry.waitFor('first cell contains the same highest value after reload', async () => { + const cell = await dataGrid.getCellElement(0, 2); + const text = await cell.getVisibleText(); + return text === '483'; + }); + + await PageObjects.discover.clickNewSearchButton(); + + await PageObjects.header.waitUntilLoadingHasFinished(); + await PageObjects.discover.waitUntilSearchingHasFinished(); + + await PageObjects.discover.loadSavedSearch(savedSearchName); + + await PageObjects.header.waitUntilLoadingHasFinished(); + await PageObjects.discover.waitUntilSearchingHasFinished(); + + await retry.waitFor( + 'first cell contains the same highest value after reopening', + async () => { + const cell = await dataGrid.getCellElement(0, 2); + const text = await cell.getVisibleText(); + return text === '483'; + } + ); + + await dataGrid.clickDocSortDesc('bytes', 'Sort Low-High'); + + await PageObjects.discover.waitUntilSearchingHasFinished(); + + await retry.waitFor('first cell contains the lowest value', async () => { + const cell = await dataGrid.getCellElement(0, 2); + const text = await cell.getVisibleText(); + return text === '0'; + }); + + expect(await testSubjects.getVisibleText('dataGridColumnSortingButton')).to.be( + 'Sort fields\n1' + ); + + await PageObjects.unifiedFieldList.clickFieldListItemAdd('extension'); + + await PageObjects.header.waitUntilLoadingHasFinished(); + await PageObjects.discover.waitUntilSearchingHasFinished(); + + await dataGrid.clickDocSortDesc('extension', 'Sort A-Z'); + + await retry.waitFor('first cell contains the lowest value for extension', async () => { + const cell = await dataGrid.getCellElement(0, 3); + const text = await cell.getVisibleText(); + return text === 'css'; + }); + + expect(await testSubjects.getVisibleText('dataGridColumnSortingButton')).to.be( + 'Sort fields\n2' + ); + + await browser.refresh(); + + await PageObjects.header.waitUntilLoadingHasFinished(); + await PageObjects.discover.waitUntilSearchingHasFinished(); + + await retry.waitFor('first cell contains the same lowest value after reload', async () => { + const cell = await dataGrid.getCellElement(0, 2); + const text = await cell.getVisibleText(); + return text === '0'; + }); + + await retry.waitFor( + 'first cell contains the same lowest value for extension after reload', + async () => { + const cell = await dataGrid.getCellElement(0, 3); + const text = await cell.getVisibleText(); + return text === 'css'; + } + ); + + await PageObjects.discover.saveSearch(savedSearchName); + + await PageObjects.common.navigateToApp('dashboard'); + await PageObjects.dashboard.clickNewDashboard(); + await PageObjects.timePicker.setDefaultAbsoluteRange(); + await dashboardAddPanel.clickOpenAddPanel(); + await dashboardAddPanel.addSavedSearch(savedSearchName); + await PageObjects.header.waitUntilLoadingHasFinished(); + + await retry.waitFor( + 'first cell contains the same lowest value as dashboard panel', + async () => { + const cell = await dataGrid.getCellElement(0, 2); + const text = await cell.getVisibleText(); + return text === '0'; + } + ); + + await retry.waitFor( + 'first cell contains the lowest value for extension as dashboard panel', + async () => { + const cell = await dataGrid.getCellElement(0, 3); + const text = await cell.getVisibleText(); + return text === 'css'; + } + ); + + expect(await testSubjects.getVisibleText('dataGridColumnSortingButton')).to.be( + 'Sort fields\n2' + ); + }); + }); + }); +} diff --git a/x-pack/test_serverless/functional/test_suites/common/discover/esql/index.ts b/x-pack/test_serverless/functional/test_suites/common/discover/esql/index.ts new file mode 100644 index 0000000000000..54122d2ca827d --- /dev/null +++ b/x-pack/test_serverless/functional/test_suites/common/discover/esql/index.ts @@ -0,0 +1,14 @@ +/* + * Copyright 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 { FtrProviderContext } from '../../../../ftr_provider_context'; + +export default function ({ loadTestFile }: FtrProviderContext) { + describe('discover/esql', function () { + loadTestFile(require.resolve('./_esql_view')); + }); +} diff --git a/x-pack/test_serverless/functional/test_suites/observability/common_configs/config.group6.ts b/x-pack/test_serverless/functional/test_suites/observability/common_configs/config.group6.ts index 9891e7b8ee488..be9fb04bb40b8 100644 --- a/x-pack/test_serverless/functional/test_suites/observability/common_configs/config.group6.ts +++ b/x-pack/test_serverless/functional/test_suites/observability/common_configs/config.group6.ts @@ -17,6 +17,7 @@ export default async function ({ readConfigFile }: FtrConfigProviderContext) { require.resolve('../../common/discover/x_pack'), require.resolve('../../common/discover_ml_uptime/discover'), require.resolve('../../common/context'), + require.resolve('../../common/discover/esql'), ], junit: { reportName: 'Serverless Observability Functional Tests - Common Group 6', diff --git a/x-pack/test_serverless/functional/test_suites/search/common_configs/config.group6.ts b/x-pack/test_serverless/functional/test_suites/search/common_configs/config.group6.ts index 25b3a8802a6f0..78496e3b4aedd 100644 --- a/x-pack/test_serverless/functional/test_suites/search/common_configs/config.group6.ts +++ b/x-pack/test_serverless/functional/test_suites/search/common_configs/config.group6.ts @@ -17,6 +17,7 @@ export default async function ({ readConfigFile }: FtrConfigProviderContext) { require.resolve('../../common/discover/x_pack'), require.resolve('../../common/discover_ml_uptime/discover'), require.resolve('../../common/context'), + require.resolve('../../common/discover/esql'), ], junit: { reportName: 'Serverless Search Functional Tests - Common Group 6', diff --git a/x-pack/test_serverless/functional/test_suites/security/common_configs/config.group6.ts b/x-pack/test_serverless/functional/test_suites/security/common_configs/config.group6.ts index 8ebd1f6958ec7..9c263cf4c198e 100644 --- a/x-pack/test_serverless/functional/test_suites/security/common_configs/config.group6.ts +++ b/x-pack/test_serverless/functional/test_suites/security/common_configs/config.group6.ts @@ -19,6 +19,7 @@ export default async function ({ readConfigFile }: FtrConfigProviderContext) { // https://github.com/elastic/kibana/issues/172365 // require.resolve('../../common/discover_ml_uptime/discover'), require.resolve('../../common/context'), + require.resolve('../../common/discover/esql'), ], junit: { reportName: 'Serverless Security Functional Tests - Common Group 6', From ca18e9891d23f8e43e994a5e592aa3843f15c394 Mon Sep 17 00:00:00 2001 From: Maxim Palenov Date: Wed, 8 May 2024 13:35:37 +0200 Subject: [PATCH 61/86] [Security Solution] Adjust OpenAPI specs bundler for doc requirements (#181944) **Addresses:** https://github.com/elastic/security-team/issues/7981 **Relates to:** https://github.com/elastic/kibana/pull/171526 ## Summary This PR adjusts OpenAPI Bundler (`kbn-openapi-bundler` package) based on Docs Engineering team requirements. Main requirements include producing one valid OpenAPI spec bundle file. After adjustments OpenAPI Bundler one valid OpenAPI spec bundle file per API version e.g. `2023-10-31-my-oas.bundled.schema.yaml`. ## Details This PR further improves https://github.com/elastic/kibana/pull/171526 to satisfy Docs Engineering team requirements and includes the following adjustments and improvements - [x] Produce one valid OpenAPI spec file per API version - [x] Make `outputFilePath` independent from `rootDir` `outputFilePath` can be an absolute or relative to node.js working directory path. Additionally it can contain `{version}` placeholder to adjust where API version is placed in the result bundle file name. API prepends the result bundle file name if `{version}` is omitted. - [x] Reduce folded `allOf` items Inlined schemas lead to `allOf` folder into each other as well as having multiple object schemas which could be merged. Docs Engineering team stated potential problems related to folded `allOf` items. - [x] Prevent bundling incompatible source OpenAPI schemas like `3.0.3` and `3.1.0` - [x] Make sure to bundle path item's `summary`, `description` and `properties` - [x] Make sure to bundle all shared components (not only `schemas`) Besides the changes above PR contains minor bug fixing and improvements. **Note:** It intentionally doesn't include bundling configuration changes like integration it into PR's build pipeline and focuses only on functional changes. Bundling configuration will be addressed separately to avoid spreading reviewers focus. --- packages/kbn-openapi-bundler/README.md | 22 +- .../src/__test__/bundle_refs.test.ts | 407 +++++++++++ .../src/__test__/bundle_simple_specs.test.ts | 77 +++ .../src/__test__/bundle_specs.ts | 79 +++ ..._specs_with_multiple_modifications.test.ts | 32 + .../src/__test__/circular.test.ts | 228 +++++++ .../__test__/complex_specs/common.schema.yaml | 70 ++ .../src/__test__/complex_specs/expected.yaml | 172 +++++ .../spec1.schema.yaml} | 3 +- .../__test__/complex_specs/spec2.schema.yaml | 26 + .../__test__/complex_specs/spec3.schema.yaml | 45 ++ .../expected.yaml | 40 -- .../spec1.schema.yaml | 21 - .../spec2.schema.yaml | 21 - .../spec1.schema.yaml | 23 - .../spec2.schema.yaml | 21 - .../src/__test__/create_oas_document.ts | 31 + .../different_endpoint_versions.test.ts | 88 +++ .../different_endpoint_versions/expected.yaml | 44 -- .../version1.schema.yaml | 18 - .../version2.schema.yaml | 20 - .../__test__/different_oas_versions.test.ts | 64 ++ .../different_openapi_versions/expected.yaml | 42 -- .../spec1.schema.yaml | 18 - .../spec2.schema.yaml | 18 - .../src/__test__/inline_ref.test.ts | 227 +++++++ .../src/__test__/inline_ref/expected.yaml | 50 -- .../src/__test__/inline_ref/spec.schema.yaml | 52 -- .../modify_partial_node/expected.yaml | 26 - .../modify_partial_node/spec.schema.yaml | 26 - .../__test__/modify_partial_ref/expected.yaml | 26 - .../modify_partial_ref/spec.schema.yaml | 31 - .../modify_required_node/expected.yaml | 29 - .../modify_required_node/spec.schema.yaml | 23 - .../modify_required_ref/expected.yaml | 29 - .../modify_required_ref/spec.schema.yaml | 28 - .../src/__test__/omit_unused_schemas.test.ts | 144 ++++ .../recursive_ref_specs/common.schema.yaml | 21 - .../recursive_ref_specs/expected.yaml | 50 -- .../recursive_ref_specs/spec1.schema.yaml | 15 - .../recursive_ref_specs/spec2.schema.yaml | 15 - .../src/__test__/recursive_spec/expected.yaml | 27 - .../__test__/recursive_spec/spec.schema.yaml | 23 - .../src/__test__/reduce_all_of.test.ts | 640 ++++++++++++++++++ .../src/__test__/remove_props.test.ts | 210 ++++++ .../__test__/self_recursive_ref/expected.yaml | 24 - .../self_recursive_ref/spec.schema.yaml | 22 - .../src/__test__/skip_internal/expected.yaml | 31 - .../__test__/skip_internal/spec.schema.yaml | 57 -- .../skip_internal_endpoint/expected.yaml | 22 - .../skip_internal_endpoint/spec1.schema.yaml | 18 - .../skip_internal_endpoint/spec2.schema.yaml | 18 - .../src/__test__/skip_nodes.test.ts | 168 +++++ .../spec_with_external_ref/common.schema.yaml | 13 - .../spec_with_external_ref/expected.yaml | 25 - .../spec_with_local_ref/expected.yaml | 25 - .../spec_with_local_ref/spec.schema.yaml | 23 - .../__test__/two_simple_specs/expected.yaml | 42 -- .../two_simple_specs/spec1.schema.yaml | 18 - .../two_simple_specs/spec2.schema.yaml | 18 - .../common.schema.yaml | 13 - .../two_specs_with_external_ref/expected.yaml | 42 -- .../spec1.schema.yaml | 15 - .../spec2.schema.yaml | 15 - .../src/__test__/x_modify.test.ts | 340 ++++++++++ .../src/bundler/bundle_document.ts | 14 +- .../document_processors/bundle_refs.ts | 81 ++- .../document_processors/modify_partial.ts | 4 +- .../document_processors/modify_required.ts | 4 +- .../flatten_folded_all_of_items.ts | 61 ++ .../reduce_all_of_items/index.ts | 11 + .../merge_non_conflicting_all_of_items.ts | 149 ++++ .../unfold_single_all_of_item.ts | 51 ++ .../document_processors/remove_props.ts | 4 +- .../remove_unused_components.ts | 6 +- .../document_processors/skip_internal_path.ts | 2 +- .../skip_node_with_internal_prop.ts | 2 +- .../document_processors/utils/inline_ref.ts | 6 +- .../src/bundler/merge_documents.ts | 142 ---- .../create_blank_oas_document.ts | 46 ++ .../src/bundler/merge_documents/index.ts | 9 + .../merge_documents/merge_documents.ts | 101 +++ .../bundler/merge_documents/merge_paths.ts | 159 +++++ .../merge_shared_components.ts | 54 ++ .../src/bundler/process_document.test.ts | 24 +- .../src/bundler/process_document.ts | 33 +- .../kbn-openapi-bundler/src/bundler/types.ts | 61 +- .../src/openapi_bundler.test.ts | 162 ----- .../src/openapi_bundler.ts | 110 ++- .../src/utils/insert_by_json_pointer.ts | 19 +- .../src/utils/write_yaml_document.ts | 20 +- .../engine_settings_route.schema.yaml | 5 +- .../entity_calculation_route.schema.yaml | 19 +- .../scripts/openapi/bundle.js | 10 +- 94 files changed, 4004 insertions(+), 1636 deletions(-) create mode 100644 packages/kbn-openapi-bundler/src/__test__/bundle_refs.test.ts create mode 100644 packages/kbn-openapi-bundler/src/__test__/bundle_simple_specs.test.ts create mode 100644 packages/kbn-openapi-bundler/src/__test__/bundle_specs.ts create mode 100644 packages/kbn-openapi-bundler/src/__test__/bundle_specs_with_multiple_modifications.test.ts create mode 100644 packages/kbn-openapi-bundler/src/__test__/circular.test.ts create mode 100644 packages/kbn-openapi-bundler/src/__test__/complex_specs/common.schema.yaml create mode 100644 packages/kbn-openapi-bundler/src/__test__/complex_specs/expected.yaml rename packages/kbn-openapi-bundler/src/__test__/{spec_with_external_ref/spec.schema.yaml => complex_specs/spec1.schema.yaml} (87%) create mode 100644 packages/kbn-openapi-bundler/src/__test__/complex_specs/spec2.schema.yaml create mode 100644 packages/kbn-openapi-bundler/src/__test__/complex_specs/spec3.schema.yaml delete mode 100644 packages/kbn-openapi-bundler/src/__test__/conflicting_but_equal_refs_in_different_specs/expected.yaml delete mode 100644 packages/kbn-openapi-bundler/src/__test__/conflicting_but_equal_refs_in_different_specs/spec1.schema.yaml delete mode 100644 packages/kbn-openapi-bundler/src/__test__/conflicting_but_equal_refs_in_different_specs/spec2.schema.yaml delete mode 100644 packages/kbn-openapi-bundler/src/__test__/conflicting_refs_in_different_specs/spec1.schema.yaml delete mode 100644 packages/kbn-openapi-bundler/src/__test__/conflicting_refs_in_different_specs/spec2.schema.yaml create mode 100644 packages/kbn-openapi-bundler/src/__test__/create_oas_document.ts create mode 100644 packages/kbn-openapi-bundler/src/__test__/different_endpoint_versions.test.ts delete mode 100644 packages/kbn-openapi-bundler/src/__test__/different_endpoint_versions/expected.yaml delete mode 100644 packages/kbn-openapi-bundler/src/__test__/different_endpoint_versions/version1.schema.yaml delete mode 100644 packages/kbn-openapi-bundler/src/__test__/different_endpoint_versions/version2.schema.yaml create mode 100644 packages/kbn-openapi-bundler/src/__test__/different_oas_versions.test.ts delete mode 100644 packages/kbn-openapi-bundler/src/__test__/different_openapi_versions/expected.yaml delete mode 100644 packages/kbn-openapi-bundler/src/__test__/different_openapi_versions/spec1.schema.yaml delete mode 100644 packages/kbn-openapi-bundler/src/__test__/different_openapi_versions/spec2.schema.yaml create mode 100644 packages/kbn-openapi-bundler/src/__test__/inline_ref.test.ts delete mode 100644 packages/kbn-openapi-bundler/src/__test__/inline_ref/expected.yaml delete mode 100644 packages/kbn-openapi-bundler/src/__test__/inline_ref/spec.schema.yaml delete mode 100644 packages/kbn-openapi-bundler/src/__test__/modify_partial_node/expected.yaml delete mode 100644 packages/kbn-openapi-bundler/src/__test__/modify_partial_node/spec.schema.yaml delete mode 100644 packages/kbn-openapi-bundler/src/__test__/modify_partial_ref/expected.yaml delete mode 100644 packages/kbn-openapi-bundler/src/__test__/modify_partial_ref/spec.schema.yaml delete mode 100644 packages/kbn-openapi-bundler/src/__test__/modify_required_node/expected.yaml delete mode 100644 packages/kbn-openapi-bundler/src/__test__/modify_required_node/spec.schema.yaml delete mode 100644 packages/kbn-openapi-bundler/src/__test__/modify_required_ref/expected.yaml delete mode 100644 packages/kbn-openapi-bundler/src/__test__/modify_required_ref/spec.schema.yaml create mode 100644 packages/kbn-openapi-bundler/src/__test__/omit_unused_schemas.test.ts delete mode 100644 packages/kbn-openapi-bundler/src/__test__/recursive_ref_specs/common.schema.yaml delete mode 100644 packages/kbn-openapi-bundler/src/__test__/recursive_ref_specs/expected.yaml delete mode 100644 packages/kbn-openapi-bundler/src/__test__/recursive_ref_specs/spec1.schema.yaml delete mode 100644 packages/kbn-openapi-bundler/src/__test__/recursive_ref_specs/spec2.schema.yaml delete mode 100644 packages/kbn-openapi-bundler/src/__test__/recursive_spec/expected.yaml delete mode 100644 packages/kbn-openapi-bundler/src/__test__/recursive_spec/spec.schema.yaml create mode 100644 packages/kbn-openapi-bundler/src/__test__/reduce_all_of.test.ts create mode 100644 packages/kbn-openapi-bundler/src/__test__/remove_props.test.ts delete mode 100644 packages/kbn-openapi-bundler/src/__test__/self_recursive_ref/expected.yaml delete mode 100644 packages/kbn-openapi-bundler/src/__test__/self_recursive_ref/spec.schema.yaml delete mode 100644 packages/kbn-openapi-bundler/src/__test__/skip_internal/expected.yaml delete mode 100644 packages/kbn-openapi-bundler/src/__test__/skip_internal/spec.schema.yaml delete mode 100644 packages/kbn-openapi-bundler/src/__test__/skip_internal_endpoint/expected.yaml delete mode 100644 packages/kbn-openapi-bundler/src/__test__/skip_internal_endpoint/spec1.schema.yaml delete mode 100644 packages/kbn-openapi-bundler/src/__test__/skip_internal_endpoint/spec2.schema.yaml create mode 100644 packages/kbn-openapi-bundler/src/__test__/skip_nodes.test.ts delete mode 100644 packages/kbn-openapi-bundler/src/__test__/spec_with_external_ref/common.schema.yaml delete mode 100644 packages/kbn-openapi-bundler/src/__test__/spec_with_external_ref/expected.yaml delete mode 100644 packages/kbn-openapi-bundler/src/__test__/spec_with_local_ref/expected.yaml delete mode 100644 packages/kbn-openapi-bundler/src/__test__/spec_with_local_ref/spec.schema.yaml delete mode 100644 packages/kbn-openapi-bundler/src/__test__/two_simple_specs/expected.yaml delete mode 100644 packages/kbn-openapi-bundler/src/__test__/two_simple_specs/spec1.schema.yaml delete mode 100644 packages/kbn-openapi-bundler/src/__test__/two_simple_specs/spec2.schema.yaml delete mode 100644 packages/kbn-openapi-bundler/src/__test__/two_specs_with_external_ref/common.schema.yaml delete mode 100644 packages/kbn-openapi-bundler/src/__test__/two_specs_with_external_ref/expected.yaml delete mode 100644 packages/kbn-openapi-bundler/src/__test__/two_specs_with_external_ref/spec1.schema.yaml delete mode 100644 packages/kbn-openapi-bundler/src/__test__/two_specs_with_external_ref/spec2.schema.yaml create mode 100644 packages/kbn-openapi-bundler/src/__test__/x_modify.test.ts create mode 100644 packages/kbn-openapi-bundler/src/bundler/document_processors/reduce_all_of_items/flatten_folded_all_of_items.ts create mode 100644 packages/kbn-openapi-bundler/src/bundler/document_processors/reduce_all_of_items/index.ts create mode 100644 packages/kbn-openapi-bundler/src/bundler/document_processors/reduce_all_of_items/merge_non_conflicting_all_of_items.ts create mode 100644 packages/kbn-openapi-bundler/src/bundler/document_processors/reduce_all_of_items/unfold_single_all_of_item.ts delete mode 100644 packages/kbn-openapi-bundler/src/bundler/merge_documents.ts create mode 100644 packages/kbn-openapi-bundler/src/bundler/merge_documents/create_blank_oas_document.ts create mode 100644 packages/kbn-openapi-bundler/src/bundler/merge_documents/index.ts create mode 100644 packages/kbn-openapi-bundler/src/bundler/merge_documents/merge_documents.ts create mode 100644 packages/kbn-openapi-bundler/src/bundler/merge_documents/merge_paths.ts create mode 100644 packages/kbn-openapi-bundler/src/bundler/merge_documents/merge_shared_components.ts delete mode 100644 packages/kbn-openapi-bundler/src/openapi_bundler.test.ts diff --git a/packages/kbn-openapi-bundler/README.md b/packages/kbn-openapi-bundler/README.md index 4a82cb9c20339..0a096b3f28152 100644 --- a/packages/kbn-openapi-bundler/README.md +++ b/packages/kbn-openapi-bundler/README.md @@ -1,15 +1,15 @@ # OpenAPI Specs Bundler for Kibana -`@kbn/openapi-bundler` is a tool for transforming multiple OpenAPI specification files (source specs) into a single bundled specification file (target spec). -This can be used for API docs generation purposes. This approach allows you to: +`@kbn/openapi-bundler` is a tool for transforming multiple OpenAPI specification files (source specs) into a bundled specification file(s) (target spec). The number of resulting bundles depends on a number of versions +used in the OpenAPI specification files. The package can be used for API documentation generation purposes. This approach allows you to: -- Abstract away the knowledge of where you keep your OpenAPI specs, how many specs there are, and how to find them. The Docs team should only know where a single file is located - the bundle. +- Abstract away the knowledge of where you keep your OpenAPI specs, how many specs are there, and how to find them. Consumer should only know where result files are located - the bundles. - Omit internal API endpoints from the bundle. - Omit API endpoints that are hidden behind a feature flag and haven't been released yet. - Omit parts of schemas that are hidden behind a feature flag (e.g. a new property added to an existing response schema). - Omit custom OpenAPI attributes from the bundle, such as `x-codegen-enabled`, `x-internal`, and `x-modify` (see below). - Transform the target schema according to the custom OpenAPI attributes, such as `x-modify`. -- Resolve references and inline some of them for better readability. The bundled file contains only local references and paths. +- Resolve references, inline some of them and merge allOf object schemas for better readability. The bundled file contains only local references and paths. ## Getting started @@ -22,16 +22,22 @@ Currently package supports only programmatic API. As the next step you need to c ```ts require('../../../../../src/setup_node_env'); const { bundle } = require('@kbn/openapi-bundler'); -const { resolve } = require('path'); +const { join, resolve } = require('path'); // define ROOT as `my-plugin` instead of `my-plugin/scripts/openapi` // pay attention to this constant when your script's location is different const ROOT = resolve(__dirname, '../..'); bundle({ - rootDir: ROOT, // Root path e.g. plugin root directory - sourceGlob: './**/*.schema.yaml', // Glob pattern to find OpenAPI specification files - outputFilePath: './target/openapi/my-plugin.bundled.schema.yaml', // + // Root path e.g. plugin root directory + rootDir: ROOT, + // Glob pattern to find OpenAPI specification files, relative to `rootDir` + sourceGlob: './**/*.schema.yaml', + // Output file path. Absolute or related to the node.js working directory. + // It may contain `{version}` placeholder which is optional. `{version}` placeholder + // will be replaced with the bundled specs version or filename will be prepended with + // version when placeholder is omitted, e.g. `2023-10-31-my-plugin.bundled.schema.yaml`. + outputFilePath: join(ROOT, 'target/openapi/my-plugin-{version}.bundled.schema.yaml'), }); ``` diff --git a/packages/kbn-openapi-bundler/src/__test__/bundle_refs.test.ts b/packages/kbn-openapi-bundler/src/__test__/bundle_refs.test.ts new file mode 100644 index 0000000000000..3d5472d4d8308 --- /dev/null +++ b/packages/kbn-openapi-bundler/src/__test__/bundle_refs.test.ts @@ -0,0 +1,407 @@ +/* + * Copyright 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 { OpenAPIV3 } from 'openapi-types'; +import { bundleSpecs } from './bundle_specs'; +import { createOASDocument } from './create_oas_document'; + +describe('OpenAPI Bundler - bundle references', () => { + it('bundles files with external references', async () => { + const spec1 = createOASDocument({ + paths: { + '/api/some_api': { + get: { + responses: { + '200': { + description: 'Successful response', + content: { + 'application/json': { + schema: { + $ref: './common.schema.yaml#/components/schemas/TestSchema', + }, + }, + }, + }, + }, + }, + }, + }, + }); + const spec2 = createOASDocument({ + paths: { + '/api/some_api': { + post: { + responses: { + '200': { + description: 'Successful response', + content: { + 'application/json': { + schema: { + $ref: './common.schema.yaml#/components/schemas/TestSchema', + }, + }, + }, + }, + }, + }, + }, + }, + }); + const commonSpec = createOASDocument({ + info: { + version: 'not set', + }, + components: { + schemas: { + TestSchema: { + type: 'string', + enum: ['value1', 'value2'], + }, + }, + }, + }); + + const [bundledSpec] = Object.values( + await bundleSpecs({ + 1: spec1, + 2: spec2, + common: commonSpec, + }) + ); + + expect(bundledSpec.paths['/api/some_api']!.get!.responses['200']).toMatchObject({ + content: { + 'application/json': { + schema: { + $ref: '#/components/schemas/TestSchema', + }, + }, + }, + }); + expect(bundledSpec.paths['/api/some_api']!.post!.responses['200']).toMatchObject({ + content: { + 'application/json': { + schema: { + $ref: '#/components/schemas/TestSchema', + }, + }, + }, + }); + expect(bundledSpec.components!.schemas).toMatchObject({ + TestSchema: commonSpec.components!.schemas!.TestSchema, + }); + }); + + it('bundles one file with a local reference', async () => { + const spec = createOASDocument({ + paths: { + '/api/some_api': { + get: { + responses: { + '200': { + description: 'Successful response', + content: { + 'application/json': { + schema: { + $ref: '#/components/schemas/TestSchema', + }, + }, + }, + }, + }, + }, + }, + }, + components: { + schemas: { + TestSchema: { + type: 'string', + enum: ['value1', 'value2'], + }, + }, + }, + }); + + const [bundledSpec] = Object.values( + await bundleSpecs({ + 1: spec, + }) + ); + + expect(bundledSpec.paths['/api/some_api']).toEqual({ + get: expect.objectContaining({ + responses: expect.objectContaining({ + '200': expect.objectContaining({ + content: { + 'application/json': { + schema: { + $ref: '#/components/schemas/TestSchema', + }, + }, + }, + }), + }), + }), + }); + expect(bundledSpec.components!.schemas!.TestSchema).toEqual( + spec.components!.schemas!.TestSchema + ); + }); + + it('bundles one file with an external reference', async () => { + const spec = createOASDocument({ + paths: { + '/api/some_api': { + get: { + responses: { + '200': { + description: 'Successful response', + content: { + 'application/json': { + schema: { + $ref: './common.schema.yaml#/components/schemas/TestSchema', + }, + }, + }, + }, + }, + }, + }, + }, + }); + const commonSpec = createOASDocument({ + info: { + version: 'not set', + }, + components: { + schemas: { + TestSchema: { + type: 'string', + enum: ['value1', 'value2'], + }, + }, + }, + }); + + const [bundledSpec] = Object.values( + await bundleSpecs({ + 1: spec, + common: commonSpec, + }) + ); + + expect(bundledSpec.paths['/api/some_api']).toEqual({ + get: expect.objectContaining({ + responses: expect.objectContaining({ + '200': expect.objectContaining({ + content: { + 'application/json': { + schema: { + $ref: '#/components/schemas/TestSchema', + }, + }, + }, + }), + }), + }), + }); + expect(bundledSpec.components!.schemas!.TestSchema).toMatchObject( + commonSpec.components!.schemas!.TestSchema + ); + }); + + it('bundles conflicting but equal references', async () => { + const ConflictTestSchema: OpenAPIV3.SchemaObject = { + type: 'integer', + minimum: 1, + }; + const spec1 = createOASDocument({ + paths: { + '/api/some_api': { + get: { + responses: { + '200': { + description: 'Successful response', + content: { + 'application/json': { + schema: { + $ref: '#/components/schemas/ConflictTestSchema', + }, + }, + }, + }, + }, + }, + }, + }, + components: { + schemas: { ConflictTestSchema }, + }, + }); + const spec2 = createOASDocument({ + paths: { + '/api/some_api': { + put: { + responses: { + '200': { + description: 'Successful response', + content: { + 'application/json': { + schema: { + $ref: '#/components/schemas/ConflictTestSchema', + }, + }, + }, + }, + }, + }, + }, + }, + components: { + schemas: { ConflictTestSchema }, + }, + }); + + const { '2023-10-31.yaml': bundledSpec } = await bundleSpecs({ '1': spec1, '2': spec2 }); + + expect(bundledSpec.paths['/api/some_api']).toEqual({ + get: spec1.paths['/api/some_api']!.get, + put: spec2.paths['/api/some_api']!.put, + }); + expect(bundledSpec.components).toMatchObject({ schemas: { ConflictTestSchema } }); + }); + + it('DOES NOT bundle external conflicting references encountered in on spec file', async () => { + const spec = createOASDocument({ + paths: { + '/api/some_api': { + get: { + responses: { + '200': { + description: 'Successful response', + content: { + 'application/json': { + schema: { + type: 'object', + properties: { + fieldA: { + $ref: './common_a.schema.yaml#/components/schemas/ConflictTestSchema', + }, + fieldB: { + $ref: './common_b.schema.yaml#/components/schemas/ConflictTestSchema', + }, + }, + }, + }, + }, + }, + }, + }, + }, + }, + }); + const commonSpecA = createOASDocument({ + components: { + schemas: { + ConflictTestSchema: { + type: 'string', + enum: ['value1', 'value2'], + }, + }, + }, + }); + const commonSpecB = createOASDocument({ + components: { + schemas: { + ConflictTestSchema: { + type: 'object', + properties: { + someField: { + type: 'string', + }, + }, + }, + }, + }, + }); + + await expect( + bundleSpecs({ + 1: spec, + common_a: commonSpecA, + common_b: commonSpecB, + }) + ).rejects.toThrowError(/\/components\/schemas\/ConflictTestSchema/); + }); + + it('DOES NOT bundle conflicting references encountered in separate specs', async () => { + const spec1 = createOASDocument({ + paths: { + '/api/some_api': { + get: { + responses: { + '200': { + description: 'Successful response', + content: { + 'application/json': { + schema: { + $ref: '#/components/schemas/ConflictTestSchema', + }, + }, + }, + }, + }, + }, + }, + }, + components: { + schemas: { + ConflictTestSchema: { + type: 'string', + enum: ['value1', 'value2'], + }, + }, + }, + }); + const spec2 = createOASDocument({ + paths: { + '/api/some_api': { + put: { + responses: { + '200': { + description: 'Successful response', + content: { + 'application/json': { + schema: { + $ref: '#/components/schemas/ConflictTestSchema', + }, + }, + }, + }, + }, + }, + }, + }, + components: { + schemas: { + ConflictTestSchema: { + type: 'integer', + minimum: 1, + }, + }, + }, + }); + + await expect( + bundleSpecs({ + 1: spec1, + 2: spec2, + }) + ).rejects.toThrowError(/\/components\/schemas\/ConflictTestSchema/); + }); +}); diff --git a/packages/kbn-openapi-bundler/src/__test__/bundle_simple_specs.test.ts b/packages/kbn-openapi-bundler/src/__test__/bundle_simple_specs.test.ts new file mode 100644 index 0000000000000..15ef0e8215908 --- /dev/null +++ b/packages/kbn-openapi-bundler/src/__test__/bundle_simple_specs.test.ts @@ -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 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 { bundleSpecs } from './bundle_specs'; +import { createOASDocument } from './create_oas_document'; + +describe('OpenAPI Bundler - simple specs', () => { + it('bundles two simple specs', async () => { + const spec1 = createOASDocument({ + paths: { + '/api/some_api': { + get: { + responses: { + '200': { + description: 'Successful response', + content: { + 'application/json': { + schema: { + type: 'object', + properties: { + fieldA: { + type: 'integer', + }, + }, + }, + }, + }, + }, + }, + }, + }, + }, + }); + const spec2 = createOASDocument({ + paths: { + '/api/some_api': { + post: { + responses: { + '200': { + description: 'Successful response', + content: { + 'application/json': { + schema: { + type: 'object', + properties: { + fieldB: { + type: 'string', + }, + }, + }, + }, + }, + }, + }, + }, + }, + }, + }); + + const [bundledSpec] = Object.values( + await bundleSpecs({ + 1: spec1, + 2: spec2, + }) + ); + + expect(bundledSpec.paths['/api/some_api']).toEqual({ + get: spec1.paths['/api/some_api']?.get, + post: spec2.paths['/api/some_api']?.post, + }); + }); +}); diff --git a/packages/kbn-openapi-bundler/src/__test__/bundle_specs.ts b/packages/kbn-openapi-bundler/src/__test__/bundle_specs.ts new file mode 100644 index 0000000000000..599f81c0e4c85 --- /dev/null +++ b/packages/kbn-openapi-bundler/src/__test__/bundle_specs.ts @@ -0,0 +1,79 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0 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 { join } from 'path'; +import { + existsSync, + mkdirSync, + readdirSync, + readFileSync, + rmdirSync, + unlinkSync, + writeFileSync, +} from 'fs'; +import { dump, load } from 'js-yaml'; +import { OpenAPIV3 } from 'openapi-types'; +import { bundle } from '../openapi_bundler'; + +const ROOT_PATH = join(__dirname, '..', '..'); + +export async function bundleSpecs( + oasSpecs: Record +): Promise> { + const randomStr = (Math.random() + 1).toString(36).substring(7); + const folderToBundlePath = join(ROOT_PATH, 'target', 'oas-test', randomStr); + const resultFolderPath = join(ROOT_PATH, 'target', 'oas-test-bundled-result', randomStr); + const bundledFilePathTemplate = join(resultFolderPath, '{version}.yaml'); + + dumpSpecs(folderToBundlePath, oasSpecs); + + await bundleFolder(folderToBundlePath, bundledFilePathTemplate); + + return readBundledSpecs(resultFolderPath); +} + +function removeFolder(folderPath: string): void { + if (existsSync(folderPath)) { + for (const fileName of readdirSync(folderPath)) { + unlinkSync(join(folderPath, fileName)); + } + + rmdirSync(folderPath); + } +} + +function dumpSpecs(folderPath: string, oasSpecs: Record): void { + removeFolder(folderPath); + mkdirSync(folderPath, { recursive: true }); + + for (const [fileName, oasSpec] of Object.entries(oasSpecs)) { + writeFileSync(join(folderPath, `${fileName}.schema.yaml`), dump(oasSpec)); + } +} + +export function readBundledSpecs(folderPath: string): Record { + const bundledSpecs: Record = {}; + + for (const fileName of readdirSync(folderPath)) { + const yaml = readFileSync(join(folderPath, fileName), { encoding: 'utf8' }); + + bundledSpecs[fileName] = load(yaml); + } + + return bundledSpecs; +} + +export async function bundleFolder( + folderToBundlePath: string, + bundledFilePathTemplate: string +): Promise { + await bundle({ + sourceGlob: join(folderToBundlePath, '*.schema.yaml'), + outputFilePath: bundledFilePathTemplate, + }); +} diff --git a/packages/kbn-openapi-bundler/src/__test__/bundle_specs_with_multiple_modifications.test.ts b/packages/kbn-openapi-bundler/src/__test__/bundle_specs_with_multiple_modifications.test.ts new file mode 100644 index 0000000000000..ed57d745f2ee4 --- /dev/null +++ b/packages/kbn-openapi-bundler/src/__test__/bundle_specs_with_multiple_modifications.test.ts @@ -0,0 +1,32 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0 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 { readFileSync } from 'fs'; +import { load } from 'js-yaml'; +import { join } from 'path'; +import { bundleFolder, readBundledSpecs } from './bundle_specs'; + +const ROOT_PATH = join(__dirname, '..', '..'); + +describe('OpenAPI Bundler - specs with multiple modifications', () => { + it('bundles specs performing multiple modifications without interference', async () => { + const folderToBundlePath = join(__dirname, 'complex_specs'); + const outputFolderPath = join(ROOT_PATH, 'target', 'complex_specs_test'); + const bundledFilePathTemplate = join(outputFolderPath, 'oas-test-bundle-{version}.yaml'); + + await bundleFolder(folderToBundlePath, bundledFilePathTemplate); + + const [bundledSpec] = Object.values(readBundledSpecs(outputFolderPath)); + + const expected = load( + readFileSync(join(folderToBundlePath, 'expected.yaml'), { encoding: 'utf8' }) + ); + + expect(bundledSpec).toEqual(expected); + }); +}); diff --git a/packages/kbn-openapi-bundler/src/__test__/circular.test.ts b/packages/kbn-openapi-bundler/src/__test__/circular.test.ts new file mode 100644 index 0000000000000..8d72f28c3779f --- /dev/null +++ b/packages/kbn-openapi-bundler/src/__test__/circular.test.ts @@ -0,0 +1,228 @@ +/* + * Copyright 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 { dump } from 'js-yaml'; +import { OpenAPIV3 } from 'openapi-types'; +import { bundleSpecs } from './bundle_specs'; +import { createOASDocument } from './create_oas_document'; + +describe('OpenAPI Bundler - circular specs', () => { + it('bundles recursive spec', async () => { + const recursiveSchema: OpenAPIV3.SchemaObject = { + type: 'object', + properties: { + fieldA: { + type: 'integer', + }, + }, + }; + recursiveSchema.properties!.fieldB = recursiveSchema; + + const spec = createOASDocument({ + paths: { + '/api/some_api': { + get: { + responses: { + '200': { + description: 'Successful response', + content: { + 'application/json': { + schema: recursiveSchema, + }, + }, + }, + }, + }, + }, + }, + }); + + const [bundledSpec] = Object.values( + await bundleSpecs({ + 1: spec, + }) + ); + + expect(dump(bundledSpec.paths['/api/some_api']!.get!.responses['200'])).toMatchInlineSnapshot(` +"description: Successful response +content: + application/json: + schema: &ref_0 + type: object + properties: + fieldA: + type: integer + fieldB: *ref_0 +" +`); + }); + + it('bundles specs with recursive references', async () => { + const spec1 = createOASDocument({ + paths: { + '/api/some_api': { + get: { + responses: { + '200': { + description: 'Successful response', + content: { + 'application/json': { + schema: { + $ref: './common.schema.yaml#/components/schemas/CircularTestSchema', + }, + }, + }, + }, + }, + }, + }, + }, + }); + const spec2 = createOASDocument({ + paths: { + '/api/some_api': { + post: { + responses: { + '200': { + description: 'Successful response', + content: { + 'application/json': { + schema: { + $ref: './common.schema.yaml#/components/schemas/CircularTestSchema', + }, + }, + }, + }, + }, + }, + }, + }, + }); + const commonSpec = createOASDocument({ + info: { + version: 'not set', + }, + components: { + schemas: { + CircularTestSchema: { + type: 'object', + properties: { + field: { + $ref: '#/components/schemas/AnotherCircularTestSchema', + }, + }, + }, + AnotherCircularTestSchema: { + anyOf: [ + { $ref: '#/components/schemas/CircularTestSchema' }, + { type: 'string', enum: ['value1', 'value2'] }, + ], + }, + }, + }, + }); + + const [bundledSpec] = Object.values( + await bundleSpecs({ + 1: spec1, + 2: spec2, + common: commonSpec, + }) + ); + + expect(bundledSpec.paths['/api/some_api']).toEqual({ + get: expect.objectContaining({ + responses: expect.objectContaining({ + '200': expect.objectContaining({ + content: { + 'application/json': { + schema: { + $ref: '#/components/schemas/CircularTestSchema', + }, + }, + }, + }), + }), + }), + post: expect.objectContaining({ + responses: expect.objectContaining({ + '200': expect.objectContaining({ + content: { + 'application/json': { + schema: { + $ref: '#/components/schemas/CircularTestSchema', + }, + }, + }, + }), + }), + }), + }); + expect(bundledSpec.components).toMatchObject({ schemas: commonSpec.components!.schemas }); + }); + + it('bundles spec with a self-recursive reference', async () => { + const spec = createOASDocument({ + paths: { + '/api/some_api': { + get: { + responses: { + '200': { + description: 'Successful response', + content: { + 'application/json': { + schema: { + $ref: '#/components/schemas/CircularTestSchema', + }, + }, + }, + }, + }, + }, + }, + }, + components: { + schemas: { + CircularTestSchema: { + type: 'object', + properties: { + field: { + $ref: '#/components/schemas/CircularTestSchema', + }, + }, + }, + }, + }, + }); + + const [bundledSpec] = Object.values( + await bundleSpecs({ + 1: spec, + }) + ); + + expect(bundledSpec.paths['/api/some_api']).toEqual({ + get: expect.objectContaining({ + responses: expect.objectContaining({ + '200': expect.objectContaining({ + content: { + 'application/json': { + schema: { + $ref: '#/components/schemas/CircularTestSchema', + }, + }, + }, + }), + }), + }), + }); + expect(bundledSpec.components!.schemas!.CircularTestSchema).toEqual( + spec.components!.schemas!.CircularTestSchema + ); + }); +}); diff --git a/packages/kbn-openapi-bundler/src/__test__/complex_specs/common.schema.yaml b/packages/kbn-openapi-bundler/src/__test__/complex_specs/common.schema.yaml new file mode 100644 index 0000000000000..aaa7af54a2fd1 --- /dev/null +++ b/packages/kbn-openapi-bundler/src/__test__/complex_specs/common.schema.yaml @@ -0,0 +1,70 @@ +openapi: 3.0.3 +info: + title: Test endpoint + version: 'no applicable' +paths: {} + +components: + schemas: + FieldSchemaA: + type: object + properties: + fieldX: + type: string + fieldY: + type: integer + + SchemaA: + type: object + properties: + schemaAField1: + type: string + enum: + - value1 + - value2 + schemaAField2: + type: integer + required: + - schemaAField1 + - schemaAField2 + + SchemaB: + allOf: + - $ref: '#/components/schemas/SharedSchema' + - $ref: '#/components/schemas/SchemaA' + - type: object + properties: + schemaBField: + type: boolean + + SharedSchema: + x-inline: true + type: object + properties: + fieldA: + type: string + fieldRef: + $ref: '#/components/schemas/FieldSchemaA' + x-modify: required + fieldB: + type: boolean + + SharedSchemaWithAllOf: + x-inline: true + allOf: + - type: object + properties: + sharedSchemaFieldX: + type: string + sharedSchemaFieldY: + type: string + commonField: + type: string + required: + - commonField + - type: object + properties: + sharedSchemaField1: + type: string + sharedSchemaField2: + type: string diff --git a/packages/kbn-openapi-bundler/src/__test__/complex_specs/expected.yaml b/packages/kbn-openapi-bundler/src/__test__/complex_specs/expected.yaml new file mode 100644 index 0000000000000..9a7660f14070e --- /dev/null +++ b/packages/kbn-openapi-bundler/src/__test__/complex_specs/expected.yaml @@ -0,0 +1,172 @@ +openapi: 3.0.3 +info: + title: Bundled OpenAPI specs + version: '2023-10-31' +servers: + - url: 'http://{kibana_host}:{port}' + variables: + kibana_host: + default: localhost + port: + default: '5601' +security: + - BasicAuth: [] + +paths: + /api/some_api: + get: + operationId: TestEndpointGet + responses: + '200': + description: Successful response + content: + application/json: + schema: + type: object + properties: + fieldA: + type: string + fieldRef: + type: object + properties: + fieldX: + type: string + fieldY: + type: integer + required: + - fieldX + - fieldY + fieldB: + type: boolean + post: + operationId: TestEndpointPost + responses: + '200': + description: Successful response + content: + application/json: + schema: + anyOf: + - type: object + properties: + localField1: + type: string + localField2: + type: string + required: + - localField1 + - type: object + properties: + schemaAField1: + type: string + enum: + - value1 + - value2 + schemaAField2: + type: integer + - type: object + properties: + fieldA: + type: string + fieldRef: + type: object + properties: + fieldX: + type: string + fieldY: + type: integer + required: + - fieldX + - fieldY + fieldB: + type: boolean + put: + operationId: TestEndpointPut + responses: + '200': + description: Successful response + content: + application/json: + schema: + oneOf: + - $ref: '#/components/schemas/SchemaWithOptionalFields' + - $ref: '#/components/schemas/SchemaB' + +components: + securitySchemes: + BasicAuth: + type: http + scheme: basic + schemas: + SchemaWithOptionalFields: + type: object + properties: + fieldA: + type: boolean + fieldB: + type: object + properties: + fieldA: + type: string + fieldRef: + type: object + properties: + fieldX: + type: string + fieldY: + type: integer + required: + - fieldX + - fieldY + fieldB: + type: boolean + sharedSchemaFieldX: + type: string + sharedSchemaFieldY: + type: string + commonField: + type: string + sharedSchemaField1: + type: string + sharedSchemaField2: + type: string + localSchemaFieldA: + type: number + localSchemaFieldB: + type: string + required: + - commonField + SchemaA: + type: object + properties: + schemaAField1: + type: string + enum: + - value1 + - value2 + schemaAField2: + type: integer + required: + - schemaAField1 + - schemaAField2 + SchemaB: + allOf: + - type: object + properties: + fieldA: + type: string + fieldRef: + type: object + properties: + fieldX: + type: string + fieldY: + type: integer + required: + - fieldX + - fieldY + fieldB: + type: boolean + schemaBField: + type: boolean + - $ref: '#/components/schemas/SchemaA' diff --git a/packages/kbn-openapi-bundler/src/__test__/spec_with_external_ref/spec.schema.yaml b/packages/kbn-openapi-bundler/src/__test__/complex_specs/spec1.schema.yaml similarity index 87% rename from packages/kbn-openapi-bundler/src/__test__/spec_with_external_ref/spec.schema.yaml rename to packages/kbn-openapi-bundler/src/__test__/complex_specs/spec1.schema.yaml index b1d910fa5e963..0d6656fde5b68 100644 --- a/packages/kbn-openapi-bundler/src/__test__/spec_with_external_ref/spec.schema.yaml +++ b/packages/kbn-openapi-bundler/src/__test__/complex_specs/spec1.schema.yaml @@ -12,4 +12,5 @@ paths: content: application/json: schema: - $ref: './common.schema.yaml#/components/schemas/TestSchema' + $ref: './common.schema.yaml#/components/schemas/SharedSchema' + x-modify: partial diff --git a/packages/kbn-openapi-bundler/src/__test__/complex_specs/spec2.schema.yaml b/packages/kbn-openapi-bundler/src/__test__/complex_specs/spec2.schema.yaml new file mode 100644 index 0000000000000..a79a78f94950d --- /dev/null +++ b/packages/kbn-openapi-bundler/src/__test__/complex_specs/spec2.schema.yaml @@ -0,0 +1,26 @@ +openapi: 3.0.3 +info: + title: Test endpoint + version: '2023-10-31' +paths: + /api/some_api: + post: + operationId: TestEndpointPost + responses: + '200': + description: Successful response + content: + application/json: + schema: + anyOf: + - type: object + properties: + localField1: + type: string + localField2: + type: string + required: + - localField1 + - $ref: './common.schema.yaml#/components/schemas/SchemaA' + x-modify: partial + - $ref: './common.schema.yaml#/components/schemas/SharedSchema' diff --git a/packages/kbn-openapi-bundler/src/__test__/complex_specs/spec3.schema.yaml b/packages/kbn-openapi-bundler/src/__test__/complex_specs/spec3.schema.yaml new file mode 100644 index 0000000000000..d249210fff2d2 --- /dev/null +++ b/packages/kbn-openapi-bundler/src/__test__/complex_specs/spec3.schema.yaml @@ -0,0 +1,45 @@ +openapi: 3.0.3 +info: + title: Test endpoint + version: '2023-10-31' +paths: + /api/some_api: + put: + x-codegen-enabled: true + operationId: TestEndpointPut + responses: + '200': + description: Successful response + content: + application/json: + schema: + oneOf: + - $ref: '#/components/schemas/SchemaWithOptionalFields' + - $ref: './common.schema.yaml#/components/schemas/SchemaB' + +components: + schemas: + SchemaWithOptionalFields: + allOf: + - type: object + properties: + fieldA: + type: boolean + fieldB: + $ref: './common.schema.yaml#/components/schemas/SharedSchema' + - $ref: './common.schema.yaml#/components/schemas/SharedSchemaWithAllOf' + - $ref: '#/components/schemas/LocalSchemaWithAllOf' + x-inline: true + + LocalSchemaWithAllOf: + allOf: + - type: object + properties: + localSchemaFieldA: + type: number + localSchemaFieldB: + type: string + commonField: + type: string + required: + - commonField diff --git a/packages/kbn-openapi-bundler/src/__test__/conflicting_but_equal_refs_in_different_specs/expected.yaml b/packages/kbn-openapi-bundler/src/__test__/conflicting_but_equal_refs_in_different_specs/expected.yaml deleted file mode 100644 index d8eb6a8b66c68..0000000000000 --- a/packages/kbn-openapi-bundler/src/__test__/conflicting_but_equal_refs_in_different_specs/expected.yaml +++ /dev/null @@ -1,40 +0,0 @@ -spec1.schema.yaml: - openapi: 3.0.3 - info: - title: Test endpoint - version: '2023-10-31' - paths: - /api/some_api: - get: - operationId: TestEndpointGet - responses: - '200': - description: Successful response - content: - application/json: - schema: - $ref: './shared_components.schema.yaml#/components/schemas/ConflictTestSchema' - -spec2.schema.yaml: - openapi: 3.0.3 - info: - title: Another test endpoint - version: '2023-10-31' - paths: - /api/another_api: - put: - operationId: AnotherTestEndpointPut - responses: - '200': - description: Successful response - content: - application/json: - schema: - $ref: './shared_components.schema.yaml#/components/schemas/ConflictTestSchema' - -shared_components.schema.yaml: - components: - schemas: - ConflictTestSchema: - type: integer - minimum: 1 diff --git a/packages/kbn-openapi-bundler/src/__test__/conflicting_but_equal_refs_in_different_specs/spec1.schema.yaml b/packages/kbn-openapi-bundler/src/__test__/conflicting_but_equal_refs_in_different_specs/spec1.schema.yaml deleted file mode 100644 index a44cd371ba326..0000000000000 --- a/packages/kbn-openapi-bundler/src/__test__/conflicting_but_equal_refs_in_different_specs/spec1.schema.yaml +++ /dev/null @@ -1,21 +0,0 @@ -openapi: 3.0.3 -info: - title: Test endpoint - version: '2023-10-31' -paths: - /api/some_api: - get: - operationId: TestEndpointGet - responses: - '200': - description: Successful response - content: - application/json: - schema: - $ref: '#/components/schemas/ConflictTestSchema' - -components: - schemas: - ConflictTestSchema: - type: integer - minimum: 1 diff --git a/packages/kbn-openapi-bundler/src/__test__/conflicting_but_equal_refs_in_different_specs/spec2.schema.yaml b/packages/kbn-openapi-bundler/src/__test__/conflicting_but_equal_refs_in_different_specs/spec2.schema.yaml deleted file mode 100644 index 4a5670f8ae5f5..0000000000000 --- a/packages/kbn-openapi-bundler/src/__test__/conflicting_but_equal_refs_in_different_specs/spec2.schema.yaml +++ /dev/null @@ -1,21 +0,0 @@ -openapi: 3.0.3 -info: - title: Another test endpoint - version: '2023-10-31' -paths: - /api/another_api: - put: - operationId: AnotherTestEndpointPut - responses: - '200': - description: Successful response - content: - application/json: - schema: - $ref: '#/components/schemas/ConflictTestSchema' - -components: - schemas: - ConflictTestSchema: - type: integer - minimum: 1 diff --git a/packages/kbn-openapi-bundler/src/__test__/conflicting_refs_in_different_specs/spec1.schema.yaml b/packages/kbn-openapi-bundler/src/__test__/conflicting_refs_in_different_specs/spec1.schema.yaml deleted file mode 100644 index 765811b78a619..0000000000000 --- a/packages/kbn-openapi-bundler/src/__test__/conflicting_refs_in_different_specs/spec1.schema.yaml +++ /dev/null @@ -1,23 +0,0 @@ -openapi: 3.0.3 -info: - title: Test endpoint - version: '2023-10-31' -paths: - /api/some_api: - get: - operationId: TestEndpointGet - responses: - '200': - description: Successful response - content: - application/json: - schema: - $ref: '#/components/schemas/ConflictTestSchema' - -components: - schemas: - ConflictTestSchema: - type: string - enum: - - value1 - - value2 diff --git a/packages/kbn-openapi-bundler/src/__test__/conflicting_refs_in_different_specs/spec2.schema.yaml b/packages/kbn-openapi-bundler/src/__test__/conflicting_refs_in_different_specs/spec2.schema.yaml deleted file mode 100644 index 4a5670f8ae5f5..0000000000000 --- a/packages/kbn-openapi-bundler/src/__test__/conflicting_refs_in_different_specs/spec2.schema.yaml +++ /dev/null @@ -1,21 +0,0 @@ -openapi: 3.0.3 -info: - title: Another test endpoint - version: '2023-10-31' -paths: - /api/another_api: - put: - operationId: AnotherTestEndpointPut - responses: - '200': - description: Successful response - content: - application/json: - schema: - $ref: '#/components/schemas/ConflictTestSchema' - -components: - schemas: - ConflictTestSchema: - type: integer - minimum: 1 diff --git a/packages/kbn-openapi-bundler/src/__test__/create_oas_document.ts b/packages/kbn-openapi-bundler/src/__test__/create_oas_document.ts new file mode 100644 index 0000000000000..c91e535e0cf12 --- /dev/null +++ b/packages/kbn-openapi-bundler/src/__test__/create_oas_document.ts @@ -0,0 +1,31 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0 and the Server Side Public License, v 1; you may not use this file except + * in compliance with, at your election, the Elastic License 2.0 or the Server + * Side Public License, v 1. + */ + +import { OpenAPIV3 } from 'openapi-types'; + +export function createOASDocument(overrides: { + openapi?: string; + info?: Partial; + paths?: OpenAPIV3.PathsObject; + components?: OpenAPIV3.ComponentsObject; +}): OpenAPIV3.Document { + return { + openapi: overrides.openapi ?? '3.0.3', + info: { + title: 'Test endpoint', + version: '2023-10-31', + ...overrides.info, + }, + paths: { + ...overrides.paths, + }, + components: { + ...overrides.components, + }, + }; +} diff --git a/packages/kbn-openapi-bundler/src/__test__/different_endpoint_versions.test.ts b/packages/kbn-openapi-bundler/src/__test__/different_endpoint_versions.test.ts new file mode 100644 index 0000000000000..5def26293084b --- /dev/null +++ b/packages/kbn-openapi-bundler/src/__test__/different_endpoint_versions.test.ts @@ -0,0 +1,88 @@ +/* + * Copyright 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 { bundleSpecs } from './bundle_specs'; +import { createOASDocument } from './create_oas_document'; + +describe('OpenAPI Bundler - different API versions', () => { + it('bundles one endpoint with different versions', async () => { + const spec1 = createOASDocument({ + info: { + version: '2023-10-31', + }, + paths: { + '/api/some_api': { + get: { + responses: { + '200': { + description: 'Successful response', + content: { + 'application/json': { + schema: { + type: 'object', + properties: { + field1: { + type: 'integer', + }, + }, + }, + }, + }, + }, + }, + }, + }, + }, + }); + const spec2 = createOASDocument({ + info: { + version: '2023-11-11', + }, + paths: { + '/api/some_api': { + put: { + responses: { + '200': { + description: 'Successful response', + content: { + 'application/json': { + schema: { + type: 'object', + properties: { + field1: { + type: 'integer', + }, + field2: { + type: 'string', + }, + }, + }, + }, + }, + }, + }, + }, + }, + }, + }); + + const bundledSpecs = await bundleSpecs({ + 1: spec1, + 2: spec2, + }); + + expect(bundledSpecs).toEqual({ + '2023-10-31.yaml': expect.objectContaining({ + paths: spec1.paths, + }), + '2023-11-11.yaml': expect.objectContaining({ + paths: spec2.paths, + }), + }); + }); +}); diff --git a/packages/kbn-openapi-bundler/src/__test__/different_endpoint_versions/expected.yaml b/packages/kbn-openapi-bundler/src/__test__/different_endpoint_versions/expected.yaml deleted file mode 100644 index 0b916b7b17ac2..0000000000000 --- a/packages/kbn-openapi-bundler/src/__test__/different_endpoint_versions/expected.yaml +++ /dev/null @@ -1,44 +0,0 @@ -version1.schema.yaml: - openapi: 3.0.3 - info: - title: Test endpoint GET - version: '2023-10-31' - paths: - /api/some_api: - get: - operationId: TestEndpointGet - responses: - '200': - description: Successful response - content: - application/json: - schema: - type: object - properties: - field1: - type: integer - -version2.schema.yaml: - openapi: 3.0.3 - info: - title: Test endpoint GET - version: '2023-11-11' - paths: - /api/some_api: - get: - operationId: TestEndpointGet - responses: - '200': - description: Successful response - content: - application/json: - schema: - type: object - properties: - field1: - type: integer - field2: - type: string - -shared_components.schema.yaml: - components: {} diff --git a/packages/kbn-openapi-bundler/src/__test__/different_endpoint_versions/version1.schema.yaml b/packages/kbn-openapi-bundler/src/__test__/different_endpoint_versions/version1.schema.yaml deleted file mode 100644 index 5b7f6a8718fcf..0000000000000 --- a/packages/kbn-openapi-bundler/src/__test__/different_endpoint_versions/version1.schema.yaml +++ /dev/null @@ -1,18 +0,0 @@ -openapi: 3.0.3 -info: - title: Test endpoint GET - version: '2023-10-31' -paths: - /api/some_api: - get: - operationId: TestEndpointGet - responses: - '200': - description: Successful response - content: - application/json: - schema: - type: object - properties: - field1: - type: integer diff --git a/packages/kbn-openapi-bundler/src/__test__/different_endpoint_versions/version2.schema.yaml b/packages/kbn-openapi-bundler/src/__test__/different_endpoint_versions/version2.schema.yaml deleted file mode 100644 index 4492f449ba2fe..0000000000000 --- a/packages/kbn-openapi-bundler/src/__test__/different_endpoint_versions/version2.schema.yaml +++ /dev/null @@ -1,20 +0,0 @@ -openapi: 3.0.3 -info: - title: Test endpoint GET - version: '2023-11-11' -paths: - /api/some_api: - get: - operationId: TestEndpointGet - responses: - '200': - description: Successful response - content: - application/json: - schema: - type: object - properties: - field1: - type: integer - field2: - type: string diff --git a/packages/kbn-openapi-bundler/src/__test__/different_oas_versions.test.ts b/packages/kbn-openapi-bundler/src/__test__/different_oas_versions.test.ts new file mode 100644 index 0000000000000..949f4f882ff4e --- /dev/null +++ b/packages/kbn-openapi-bundler/src/__test__/different_oas_versions.test.ts @@ -0,0 +1,64 @@ +/* + * Copyright 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 { bundleSpecs } from './bundle_specs'; +import { createOASDocument } from './create_oas_document'; + +describe('OpenAPI Bundler - different OAS versions', () => { + it('DOES NOT bundle specs with different OpenAPI versions', async () => { + const spec1 = createOASDocument({ + openapi: '3.0.3', + paths: { + '/api/some_api': { + get: { + responses: { + '200': { + description: 'Successful response', + content: { + 'application/json': { + schema: { + type: 'string', + }, + }, + }, + }, + }, + }, + }, + }, + }); + const spec2 = createOASDocument({ + openapi: '3.1.0', + paths: { + '/api/some_api': { + put: { + responses: { + '200': { + description: 'Successful response', + content: { + 'application/json': { + schema: { + type: 'boolean', + }, + }, + }, + }, + }, + }, + }, + }, + }); + + await expect( + bundleSpecs({ + 1: spec1, + 2: spec2, + }) + ).rejects.toThrowError(new RegExp('^OpenAPI specs must use the same OpenAPI version')); + }); +}); diff --git a/packages/kbn-openapi-bundler/src/__test__/different_openapi_versions/expected.yaml b/packages/kbn-openapi-bundler/src/__test__/different_openapi_versions/expected.yaml deleted file mode 100644 index 3aa6c7051ebcf..0000000000000 --- a/packages/kbn-openapi-bundler/src/__test__/different_openapi_versions/expected.yaml +++ /dev/null @@ -1,42 +0,0 @@ -spec1.schema.yaml: - openapi: 3.0.3 - info: - title: Test endpoint GET - version: '2023-10-31' - paths: - /api/some_api: - get: - operationId: TestEndpointGet - responses: - '200': - description: Successful response - content: - application/json: - schema: - type: object - properties: - field1: - type: integer - -spec2.schema.yaml: - openapi: 3.1.0 - info: - title: Test endpoint POST - version: '2023-10-31' - paths: - /api/some_api: - post: - operationId: TestEndpointPost - responses: - '200': - description: Successful response - content: - application/json: - schema: - type: object - properties: - field2: - type: string - -shared_components.schema.yaml: - components: {} diff --git a/packages/kbn-openapi-bundler/src/__test__/different_openapi_versions/spec1.schema.yaml b/packages/kbn-openapi-bundler/src/__test__/different_openapi_versions/spec1.schema.yaml deleted file mode 100644 index 5b7f6a8718fcf..0000000000000 --- a/packages/kbn-openapi-bundler/src/__test__/different_openapi_versions/spec1.schema.yaml +++ /dev/null @@ -1,18 +0,0 @@ -openapi: 3.0.3 -info: - title: Test endpoint GET - version: '2023-10-31' -paths: - /api/some_api: - get: - operationId: TestEndpointGet - responses: - '200': - description: Successful response - content: - application/json: - schema: - type: object - properties: - field1: - type: integer diff --git a/packages/kbn-openapi-bundler/src/__test__/different_openapi_versions/spec2.schema.yaml b/packages/kbn-openapi-bundler/src/__test__/different_openapi_versions/spec2.schema.yaml deleted file mode 100644 index e437e40e6698e..0000000000000 --- a/packages/kbn-openapi-bundler/src/__test__/different_openapi_versions/spec2.schema.yaml +++ /dev/null @@ -1,18 +0,0 @@ -openapi: 3.1.0 -info: - title: Test endpoint POST - version: '2023-10-31' -paths: - /api/some_api: - post: - operationId: TestEndpointPost - responses: - '200': - description: Successful response - content: - application/json: - schema: - type: object - properties: - field2: - type: string diff --git a/packages/kbn-openapi-bundler/src/__test__/inline_ref.test.ts b/packages/kbn-openapi-bundler/src/__test__/inline_ref.test.ts new file mode 100644 index 0000000000000..913afd934de09 --- /dev/null +++ b/packages/kbn-openapi-bundler/src/__test__/inline_ref.test.ts @@ -0,0 +1,227 @@ +/* + * Copyright 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 { bundleSpecs } from './bundle_specs'; +import { createOASDocument } from './create_oas_document'; + +describe('OpenAPI Bundler - inline references', () => { + it('inlines local references', async () => { + const spec = createOASDocument({ + paths: { + '/api/some_api': { + get: { + responses: { + '200': { + description: 'Successful response', + content: { + 'application/json': { + schema: { + anyOf: [ + { $ref: '#/components/schemas/SchemaToInline' }, + { $ref: '#/components/schemas/SchemaNotToInline1' }, + { $ref: '#/components/schemas/SchemaNotToInline2' }, + ], + }, + }, + }, + }, + }, + }, + }, + }, + components: { + schemas: { + SchemaToInline: { + // @ts-expect-error OpenAPIV3.Document doesn't allow to add custom props to components.schemas + 'x-inline': true, + type: 'object', + properties: { + field1: { + type: 'string', + enum: ['value1'], + }, + field2: { + type: 'integer', + minimum: 1, + }, + }, + }, + SchemaNotToInline1: { + // @ts-expect-error OpenAPIV3.Document doesn't allow to add custom props to components.schemas + 'x-inline': false, + type: 'object', + properties: { + field1: { + type: 'string', + enum: ['value1'], + }, + field2: { + type: 'integer', + minimum: 1, + }, + }, + }, + SchemaNotToInline2: { + type: 'object', + properties: { + field1: { + type: 'string', + enum: ['value1'], + }, + field2: { + type: 'integer', + minimum: 1, + }, + }, + }, + }, + }, + }); + + const [bundledSpec] = Object.values( + await bundleSpecs({ + 1: spec, + }) + ); + + expect(bundledSpec.paths['/api/some_api']!.get!.responses['200']).toMatchObject({ + content: { + 'application/json': { + schema: { + anyOf: expect.arrayContaining([ + { + type: 'object', + properties: { + field1: { + type: 'string', + enum: ['value1'], + }, + field2: { + type: 'integer', + minimum: 1, + }, + }, + }, + ]), + }, + }, + }, + }); + expect(Object.keys(bundledSpec.components!.schemas!)).toEqual([ + 'SchemaNotToInline1', + 'SchemaNotToInline2', + ]); + }); + + it('inlines external references', async () => { + const spec = createOASDocument({ + paths: { + '/api/some_api': { + get: { + responses: { + '200': { + description: 'Successful response', + content: { + 'application/json': { + schema: { + anyOf: [ + { $ref: './common.schema.yaml#/components/schemas/SchemaToInline' }, + { $ref: './common.schema.yaml#/components/schemas/SchemaNotToInline1' }, + { $ref: './common.schema.yaml#/components/schemas/SchemaNotToInline2' }, + ], + }, + }, + }, + }, + }, + }, + }, + }, + }); + const commonSpec = createOASDocument({ + components: { + schemas: { + SchemaToInline: { + // @ts-expect-error OpenAPIV3.Document doesn't allow to add custom props to components.schemas + 'x-inline': true, + type: 'object', + properties: { + field1: { + type: 'string', + enum: ['value1'], + }, + field2: { + type: 'integer', + minimum: 1, + }, + }, + }, + SchemaNotToInline1: { + // @ts-expect-error OpenAPIV3.Document doesn't allow to add custom props to components.schemas + 'x-inline': false, + type: 'object', + properties: { + field1: { + type: 'string', + enum: ['value1'], + }, + field2: { + type: 'integer', + minimum: 1, + }, + }, + }, + SchemaNotToInline2: { + type: 'object', + properties: { + field1: { + type: 'string', + enum: ['value1'], + }, + field2: { + type: 'integer', + minimum: 1, + }, + }, + }, + }, + }, + }); + + const [bundledSpec] = Object.values( + await bundleSpecs({ + 1: spec, + common: commonSpec, + }) + ); + + expect(bundledSpec.paths['/api/some_api']!.get!.responses['200']).toMatchObject({ + content: { + 'application/json': { + schema: { + anyOf: expect.arrayContaining([ + { + type: 'object', + properties: { + field1: { + type: 'string', + enum: ['value1'], + }, + field2: { + type: 'integer', + minimum: 1, + }, + }, + }, + ]), + }, + }, + }, + }); + }); +}); diff --git a/packages/kbn-openapi-bundler/src/__test__/inline_ref/expected.yaml b/packages/kbn-openapi-bundler/src/__test__/inline_ref/expected.yaml deleted file mode 100644 index 270886caa051e..0000000000000 --- a/packages/kbn-openapi-bundler/src/__test__/inline_ref/expected.yaml +++ /dev/null @@ -1,50 +0,0 @@ -spec.schema.yaml: - openapi: 3.0.3 - info: - title: Test endpoint GET - version: '2023-10-31' - paths: - /api/some_api: - get: - operationId: TestEndpointGet - responses: - '200': - description: Successful response - content: - application/json: - schema: - anyOf: - - type: object - properties: - field1: - type: string - enum: [value1] - field2: - type: integer - minimum: 1 - - $ref: './shared_components.schema.yaml#/components/schemas/TestSchema2' - - $ref: './shared_components.schema.yaml#/components/schemas/TestSchema3' - -shared_components.schema.yaml: - components: - schemas: - TestSchema2: - x-inline: false - type: object - properties: - field1: - type: string - enum: [value1] - field2: - type: integer - minimum: 1 - - TestSchema3: - type: object - properties: - field1: - type: string - enum: [value1] - field2: - type: integer - minimum: 1 diff --git a/packages/kbn-openapi-bundler/src/__test__/inline_ref/spec.schema.yaml b/packages/kbn-openapi-bundler/src/__test__/inline_ref/spec.schema.yaml deleted file mode 100644 index f5cdb2694a5c8..0000000000000 --- a/packages/kbn-openapi-bundler/src/__test__/inline_ref/spec.schema.yaml +++ /dev/null @@ -1,52 +0,0 @@ -openapi: 3.0.3 -info: - title: Test endpoint GET - version: '2023-10-31' -paths: - /api/some_api: - get: - operationId: TestEndpointGet - responses: - '200': - description: Successful response - content: - application/json: - schema: - anyOf: - - $ref: '#/components/schemas/TestSchema1' - - $ref: '#/components/schemas/TestSchema2' - - $ref: '#/components/schemas/TestSchema3' - -components: - schemas: - TestSchema1: - x-inline: true - type: object - properties: - field1: - type: string - enum: [value1] - field2: - type: integer - minimum: 1 - - TestSchema2: - x-inline: false - type: object - properties: - field1: - type: string - enum: [value1] - field2: - type: integer - minimum: 1 - - TestSchema3: - type: object - properties: - field1: - type: string - enum: [value1] - field2: - type: integer - minimum: 1 diff --git a/packages/kbn-openapi-bundler/src/__test__/modify_partial_node/expected.yaml b/packages/kbn-openapi-bundler/src/__test__/modify_partial_node/expected.yaml deleted file mode 100644 index fa679d0c3f8c0..0000000000000 --- a/packages/kbn-openapi-bundler/src/__test__/modify_partial_node/expected.yaml +++ /dev/null @@ -1,26 +0,0 @@ -spec.schema.yaml: - openapi: 3.0.3 - info: - title: Test endpoint GET - version: '2023-10-31' - paths: - /api/some_api: - get: - operationId: TestEndpointGet - responses: - '200': - description: Successful response - content: - application/json: - schema: - type: object - properties: - field1: - type: string - enum: [value1] - field2: - type: integer - minimum: 1 - -shared_components.schema.yaml: - components: {} diff --git a/packages/kbn-openapi-bundler/src/__test__/modify_partial_node/spec.schema.yaml b/packages/kbn-openapi-bundler/src/__test__/modify_partial_node/spec.schema.yaml deleted file mode 100644 index 9646051aab907..0000000000000 --- a/packages/kbn-openapi-bundler/src/__test__/modify_partial_node/spec.schema.yaml +++ /dev/null @@ -1,26 +0,0 @@ -openapi: 3.0.3 -info: - title: Test endpoint GET - version: '2023-10-31' -paths: - /api/some_api: - get: - operationId: TestEndpointGet - responses: - '200': - description: Successful response - content: - application/json: - schema: - x-modify: partial - type: object - properties: - field1: - type: string - enum: [value1] - field2: - type: integer - minimum: 1 - required: - - field1 - - field2 diff --git a/packages/kbn-openapi-bundler/src/__test__/modify_partial_ref/expected.yaml b/packages/kbn-openapi-bundler/src/__test__/modify_partial_ref/expected.yaml deleted file mode 100644 index fa679d0c3f8c0..0000000000000 --- a/packages/kbn-openapi-bundler/src/__test__/modify_partial_ref/expected.yaml +++ /dev/null @@ -1,26 +0,0 @@ -spec.schema.yaml: - openapi: 3.0.3 - info: - title: Test endpoint GET - version: '2023-10-31' - paths: - /api/some_api: - get: - operationId: TestEndpointGet - responses: - '200': - description: Successful response - content: - application/json: - schema: - type: object - properties: - field1: - type: string - enum: [value1] - field2: - type: integer - minimum: 1 - -shared_components.schema.yaml: - components: {} diff --git a/packages/kbn-openapi-bundler/src/__test__/modify_partial_ref/spec.schema.yaml b/packages/kbn-openapi-bundler/src/__test__/modify_partial_ref/spec.schema.yaml deleted file mode 100644 index 547bb4cd913be..0000000000000 --- a/packages/kbn-openapi-bundler/src/__test__/modify_partial_ref/spec.schema.yaml +++ /dev/null @@ -1,31 +0,0 @@ -openapi: 3.0.3 -info: - title: Test endpoint GET - version: '2023-10-31' -paths: - /api/some_api: - get: - operationId: TestEndpointGet - responses: - '200': - description: Successful response - content: - application/json: - schema: - $ref: '#/components/schemas/TestSchema' - x-modify: partial - -components: - schemas: - TestSchema: - type: object - properties: - field1: - type: string - enum: [value1] - field2: - type: integer - minimum: 1 - required: - - field1 - - field2 diff --git a/packages/kbn-openapi-bundler/src/__test__/modify_required_node/expected.yaml b/packages/kbn-openapi-bundler/src/__test__/modify_required_node/expected.yaml deleted file mode 100644 index 3b075e3cf803b..0000000000000 --- a/packages/kbn-openapi-bundler/src/__test__/modify_required_node/expected.yaml +++ /dev/null @@ -1,29 +0,0 @@ -spec.schema.yaml: - openapi: 3.0.3 - info: - title: Test endpoint GET - version: '2023-10-31' - paths: - /api/some_api: - get: - operationId: TestEndpointGet - responses: - '200': - description: Successful response - content: - application/json: - schema: - type: object - properties: - field1: - type: string - enum: [value1] - field2: - type: integer - minimum: 1 - required: - - field1 - - field2 - -shared_components.schema.yaml: - components: {} diff --git a/packages/kbn-openapi-bundler/src/__test__/modify_required_node/spec.schema.yaml b/packages/kbn-openapi-bundler/src/__test__/modify_required_node/spec.schema.yaml deleted file mode 100644 index 68d478ea8caaa..0000000000000 --- a/packages/kbn-openapi-bundler/src/__test__/modify_required_node/spec.schema.yaml +++ /dev/null @@ -1,23 +0,0 @@ -openapi: 3.0.3 -info: - title: Test endpoint GET - version: '2023-10-31' -paths: - /api/some_api: - get: - operationId: TestEndpointGet - responses: - '200': - description: Successful response - content: - application/json: - schema: - x-modify: required - type: object - properties: - field1: - type: string - enum: [value1] - field2: - type: integer - minimum: 1 diff --git a/packages/kbn-openapi-bundler/src/__test__/modify_required_ref/expected.yaml b/packages/kbn-openapi-bundler/src/__test__/modify_required_ref/expected.yaml deleted file mode 100644 index 3b075e3cf803b..0000000000000 --- a/packages/kbn-openapi-bundler/src/__test__/modify_required_ref/expected.yaml +++ /dev/null @@ -1,29 +0,0 @@ -spec.schema.yaml: - openapi: 3.0.3 - info: - title: Test endpoint GET - version: '2023-10-31' - paths: - /api/some_api: - get: - operationId: TestEndpointGet - responses: - '200': - description: Successful response - content: - application/json: - schema: - type: object - properties: - field1: - type: string - enum: [value1] - field2: - type: integer - minimum: 1 - required: - - field1 - - field2 - -shared_components.schema.yaml: - components: {} diff --git a/packages/kbn-openapi-bundler/src/__test__/modify_required_ref/spec.schema.yaml b/packages/kbn-openapi-bundler/src/__test__/modify_required_ref/spec.schema.yaml deleted file mode 100644 index 0f02e3e905e23..0000000000000 --- a/packages/kbn-openapi-bundler/src/__test__/modify_required_ref/spec.schema.yaml +++ /dev/null @@ -1,28 +0,0 @@ -openapi: 3.0.3 -info: - title: Test endpoint GET - version: '2023-10-31' -paths: - /api/some_api: - get: - operationId: TestEndpointGet - responses: - '200': - description: Successful response - content: - application/json: - schema: - $ref: '#/components/schemas/TestSchema' - x-modify: required - -components: - schemas: - TestSchema: - type: object - properties: - field1: - type: string - enum: [value1] - field2: - type: integer - minimum: 1 diff --git a/packages/kbn-openapi-bundler/src/__test__/omit_unused_schemas.test.ts b/packages/kbn-openapi-bundler/src/__test__/omit_unused_schemas.test.ts new file mode 100644 index 0000000000000..b714ba5ddf834 --- /dev/null +++ b/packages/kbn-openapi-bundler/src/__test__/omit_unused_schemas.test.ts @@ -0,0 +1,144 @@ +/* + * Copyright 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 { bundleSpecs } from './bundle_specs'; +import { createOASDocument } from './create_oas_document'; + +describe('OpenAPI Bundler - omit unused schemas', () => { + it('omits unused local schema', async () => { + const spec = createOASDocument({ + paths: { + '/api/some_api': { + get: { + responses: { + '200': { + description: 'Successful response', + content: { + 'application/json': { + schema: { + type: 'string', + }, + }, + }, + }, + }, + }, + }, + }, + components: { + schemas: { + TestSchema: { + type: 'string', + enum: ['value1', 'value2'], + }, + }, + }, + }); + + const [bundledSpec] = Object.values( + await bundleSpecs({ + 1: spec, + }) + ); + + expect(bundledSpec.components).not.toMatchObject({ schemas: expect.anything() }); + }); + + it('omits unused external schema', async () => { + const spec = createOASDocument({ + paths: { + '/api/some_api': { + get: { + responses: { + '200': { + description: 'Successful response', + content: { + 'application/json': { + schema: { + $ref: './common.schema.yaml#/components/schemas/SchemaA', + }, + }, + }, + }, + }, + }, + }, + }, + components: { + schemas: { + TestSchema: { + type: 'string', + enum: ['value1', 'value2'], + }, + }, + }, + }); + const commonSpec = createOASDocument({ + components: { + schemas: { + SchemaA: { + type: 'number', + }, + SchemaB: { + type: 'string', + }, + }, + }, + }); + + const [bundledSpec] = Object.values( + await bundleSpecs({ + 1: spec, + common: commonSpec, + }) + ); + + expect(bundledSpec.components!.schemas).toEqual({ SchemaA: expect.anything() }); + }); + + it('omits inlined schemas', async () => { + const spec = createOASDocument({ + paths: { + '/api/some_api': { + get: { + responses: { + '200': { + description: 'Successful response', + content: { + 'application/json': { + schema: { $ref: './common.schema.yaml#/components/schemas/SchemaToInline' }, + }, + }, + }, + }, + }, + }, + }, + }); + const commonSpec = createOASDocument({ + components: { + schemas: { + SchemaToInline: { + // @ts-expect-error custom prop + 'x-inline': true, + type: 'string', + }, + }, + }, + }); + + const [bundledSpec] = Object.values( + await bundleSpecs({ + 1: spec, + common: commonSpec, + }) + ); + + expect(bundledSpec.components).not.toMatchObject({ schemas: expect.anything() }); + }); +}); diff --git a/packages/kbn-openapi-bundler/src/__test__/recursive_ref_specs/common.schema.yaml b/packages/kbn-openapi-bundler/src/__test__/recursive_ref_specs/common.schema.yaml deleted file mode 100644 index 6e0ec47b773c5..0000000000000 --- a/packages/kbn-openapi-bundler/src/__test__/recursive_ref_specs/common.schema.yaml +++ /dev/null @@ -1,21 +0,0 @@ -openapi: 3.0.3 -info: - title: Test endpoint - version: '2023-10-31' -paths: {} - -components: - schemas: - CircularTestSchema: - type: string - data: - items: - $ref: '#/components/schemas/AnotherCircularTestSchema' - - AnotherCircularTestSchema: - anyof: - - $ref: '#/components/schemas/CircularTestSchema' - - type: string - enum: - - value1 - - value2 diff --git a/packages/kbn-openapi-bundler/src/__test__/recursive_ref_specs/expected.yaml b/packages/kbn-openapi-bundler/src/__test__/recursive_ref_specs/expected.yaml deleted file mode 100644 index cce50159ca39f..0000000000000 --- a/packages/kbn-openapi-bundler/src/__test__/recursive_ref_specs/expected.yaml +++ /dev/null @@ -1,50 +0,0 @@ -spec1.schema.yaml: - openapi: 3.0.3 - info: - title: Test endpoint GET - version: '2023-10-31' - paths: - /api/some_api: - get: - operationId: TestEndpointGet - responses: - '200': - description: Successful response - content: - application/json: - schema: - $ref: './shared_components.schema.yaml#/components/schemas/CircularTestSchema' - -spec2.schema.yaml: - openapi: 3.0.3 - info: - title: Test endpoint POST - version: '2023-10-31' - paths: - /api/some_api: - post: - operationId: TestEndpointPost - responses: - '200': - description: Successful response - content: - application/json: - schema: - $ref: './shared_components.schema.yaml#/components/schemas/CircularTestSchema' - -shared_components.schema.yaml: - components: - schemas: - CircularTestSchema: - type: string - data: - items: - $ref: '#/components/schemas/AnotherCircularTestSchema' - - AnotherCircularTestSchema: - anyof: - - $ref: '#/components/schemas/CircularTestSchema' - - type: string - enum: - - value1 - - value2 diff --git a/packages/kbn-openapi-bundler/src/__test__/recursive_ref_specs/spec1.schema.yaml b/packages/kbn-openapi-bundler/src/__test__/recursive_ref_specs/spec1.schema.yaml deleted file mode 100644 index 2e64f53087f84..0000000000000 --- a/packages/kbn-openapi-bundler/src/__test__/recursive_ref_specs/spec1.schema.yaml +++ /dev/null @@ -1,15 +0,0 @@ -openapi: 3.0.3 -info: - title: Test endpoint GET - version: '2023-10-31' -paths: - /api/some_api: - get: - operationId: TestEndpointGet - responses: - '200': - description: Successful response - content: - application/json: - schema: - $ref: './common.schema.yaml#/components/schemas/CircularTestSchema' diff --git a/packages/kbn-openapi-bundler/src/__test__/recursive_ref_specs/spec2.schema.yaml b/packages/kbn-openapi-bundler/src/__test__/recursive_ref_specs/spec2.schema.yaml deleted file mode 100644 index 92ebc5f4468e5..0000000000000 --- a/packages/kbn-openapi-bundler/src/__test__/recursive_ref_specs/spec2.schema.yaml +++ /dev/null @@ -1,15 +0,0 @@ -openapi: 3.0.3 -info: - title: Test endpoint POST - version: '2023-10-31' -paths: - /api/some_api: - post: - operationId: TestEndpointPost - responses: - '200': - description: Successful response - content: - application/json: - schema: - $ref: './common.schema.yaml#/components/schemas/CircularTestSchema' diff --git a/packages/kbn-openapi-bundler/src/__test__/recursive_spec/expected.yaml b/packages/kbn-openapi-bundler/src/__test__/recursive_spec/expected.yaml deleted file mode 100644 index b5bb0cffb6390..0000000000000 --- a/packages/kbn-openapi-bundler/src/__test__/recursive_spec/expected.yaml +++ /dev/null @@ -1,27 +0,0 @@ -spec.schema.yaml: - openapi: 3.0.3 - info: - title: Test endpoint - version: '2023-10-31' - paths: - /api/some_api: - get: - operationId: TestEndpointGet - responses: - '200': - description: Successful response - content: - application/json: - schema: &ref0 - type: object - properties: - - name: field1 - required: false - schema: *ref0 - - field2: - required: false - schema: - type: string - -shared_components.schema.yaml: - components: {} diff --git a/packages/kbn-openapi-bundler/src/__test__/recursive_spec/spec.schema.yaml b/packages/kbn-openapi-bundler/src/__test__/recursive_spec/spec.schema.yaml deleted file mode 100644 index f9e3d8b2c590e..0000000000000 --- a/packages/kbn-openapi-bundler/src/__test__/recursive_spec/spec.schema.yaml +++ /dev/null @@ -1,23 +0,0 @@ -openapi: 3.0.3 -info: - title: Test endpoint - version: '2023-10-31' -paths: - /api/some_api: - get: - operationId: TestEndpointGet - responses: - '200': - description: Successful response - content: - application/json: - schema: &ref0 - type: object - properties: - - name: field1 - required: false - schema: *ref0 - - field2: - required: false - schema: - type: string diff --git a/packages/kbn-openapi-bundler/src/__test__/reduce_all_of.test.ts b/packages/kbn-openapi-bundler/src/__test__/reduce_all_of.test.ts new file mode 100644 index 0000000000000..8d79f8d77ea09 --- /dev/null +++ b/packages/kbn-openapi-bundler/src/__test__/reduce_all_of.test.ts @@ -0,0 +1,640 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0 and the Server Side Public License, v 1; you may not use this file except + * in compliance with, at your election, the Elastic License 2.0 or the Server + * Side Public License, v 1. + */ + +import { bundleSpecs } from './bundle_specs'; +import { createOASDocument } from './create_oas_document'; + +describe('OpenAPI Bundler - reduce allOf item', () => { + it('flatten folded allOfs', async () => { + const spec = createOASDocument({ + paths: { + '/api/some_api': { + get: { + responses: { + '200': { + description: 'Successful response', + content: { + 'application/json': { + schema: { + allOf: [ + { + allOf: [ + { + allOf: [ + { $ref: '#/components/schemas/SchemaA' }, + { + type: 'object', + properties: { + fieldA: { type: 'string' }, + }, + required: ['fieldA'], + }, + ], + }, + ], + }, + { $ref: '#/components/schemas/SchemaB' }, + ], + }, + }, + }, + }, + }, + }, + }, + }, + components: { + schemas: { + SchemaA: { + type: 'object', + properties: { + fieldX: { type: 'string' }, + }, + }, + SchemaB: { + type: 'object', + properties: { + fieldX: { type: 'string' }, + }, + }, + }, + }, + }); + + const [bundledSpec] = Object.values( + await bundleSpecs({ + 1: spec, + }) + ); + + expect(bundledSpec.paths['/api/some_api']!.get?.responses['200']).toMatchObject({ + content: { + 'application/json': { + schema: { + allOf: [ + { $ref: '#/components/schemas/SchemaA' }, + { + type: 'object', + properties: { + fieldA: { type: 'string' }, + }, + required: ['fieldA'], + }, + { $ref: '#/components/schemas/SchemaB' }, + ], + }, + }, + }, + }); + }); + + it('unfolds single allOf item', async () => { + const spec = createOASDocument({ + paths: { + '/api/some_api': { + get: { + responses: { + '200': { + description: 'Successful response', + content: { + 'application/json': { + schema: { + allOf: [ + { + type: 'string', + }, + ], + }, + }, + }, + }, + }, + }, + }, + }, + }); + + const [bundledSpec] = Object.values( + await bundleSpecs({ + 1: spec, + }) + ); + + expect(bundledSpec.paths['/api/some_api']!.get?.responses['200']).toMatchObject({ + content: { + 'application/json': { + schema: { type: 'string' }, + }, + }, + }); + }); + + it('merges non conflicting allOf object schema items', async () => { + const spec = createOASDocument({ + paths: { + '/api/some_api': { + get: { + responses: { + '200': { + description: 'Successful response', + content: { + 'application/json': { + schema: { + allOf: [ + { $ref: '#/components/schemas/SchemaA' }, + { + type: 'object', + properties: { + fieldA: { + type: 'string', + }, + }, + }, + { $ref: '#/components/schemas/SchemaB' }, + { + type: 'object', + properties: { + fieldB: { + type: 'string', + }, + }, + required: ['fieldB'], + }, + { $ref: '#/components/schemas/SchemaC' }, + { + type: 'object', + properties: { + fieldC: { + type: 'string', + }, + }, + required: ['fieldC'], + }, + ], + }, + }, + }, + }, + }, + }, + }, + }, + components: { + schemas: { + SchemaA: { + type: 'object', + properties: { + fieldX: { type: 'string' }, + }, + }, + SchemaB: { + type: 'object', + properties: { + fieldY: { type: 'string' }, + }, + }, + SchemaC: { + type: 'object', + properties: { + fieldZ: { type: 'string' }, + }, + }, + }, + }, + }); + + const [bundledSpec] = Object.values( + await bundleSpecs({ + 1: spec, + }) + ); + + expect(bundledSpec.paths['/api/some_api']!.get?.responses['200']).toMatchObject({ + content: { + 'application/json': { + schema: { + allOf: [ + { + type: 'object', + properties: { + fieldA: { + type: 'string', + }, + fieldB: { + type: 'string', + }, + fieldC: { + type: 'string', + }, + }, + required: ['fieldB', 'fieldC'], + }, + { $ref: '#/components/schemas/SchemaA' }, + { $ref: '#/components/schemas/SchemaB' }, + { $ref: '#/components/schemas/SchemaC' }, + ], + }, + }, + }, + }); + }); + + it('DOES NOT merge conflicting incompatible allOf object schema items', async () => { + const spec = createOASDocument({ + paths: { + '/api/some_api': { + get: { + responses: { + '200': { + description: 'Successful response', + content: { + 'application/json': { + schema: { + allOf: [ + { + type: 'object', + properties: { + fieldA: { + type: 'string', + }, + }, + }, + { + type: 'object', + properties: { + fieldB: { + type: 'string', + }, + }, + required: ['fieldB'], + }, + { + type: 'object', + properties: { + fieldA: { + type: 'boolean', + }, + }, + }, + ], + }, + }, + }, + }, + }, + }, + }, + }, + }); + + const [bundledSpec] = Object.values( + await bundleSpecs({ + 1: spec, + }) + ); + + expect(bundledSpec.paths['/api/some_api']!.get?.responses['200']).toMatchObject({ + content: { + 'application/json': { + schema: { + allOf: [ + { + type: 'object', + properties: { + fieldA: { + type: 'string', + }, + }, + }, + { + type: 'object', + properties: { + fieldB: { + type: 'string', + }, + }, + required: ['fieldB'], + }, + { + type: 'object', + properties: { + fieldA: { + type: 'boolean', + }, + }, + }, + ], + }, + }, + }, + }); + }); + + it('merges allOf object schema items with inlined references', async () => { + const spec = createOASDocument({ + paths: { + '/api/some_api': { + get: { + responses: { + '200': { + description: 'Successful response', + content: { + 'application/json': { + schema: { + allOf: [ + { + type: 'string', + enum: ['value1'], + }, + { + type: 'object', + properties: { + fieldA: { + type: 'string', + }, + }, + }, + { + $ref: '#/components/schemas/SchemaA', + }, + { + type: 'object', + properties: { + fieldB: { + type: 'string', + }, + }, + required: ['fieldB'], + }, + { + $ref: '#/components/schemas/SchemaAToInline', + }, + { + $ref: '#/components/schemas/SchemaB', + }, + { + type: 'object', + properties: { + stringField: { + type: 'string', + }, + }, + required: ['stringField'], + }, + ], + }, + }, + }, + }, + }, + }, + }, + }, + components: { + schemas: { + SchemaAToInline: { + // @ts-expect-error OpenAPIV3.Document doesn't allow to add custom props to components.schemas + 'x-inline': true, + allOf: [ + { + type: 'string', + enum: ['SchemaAToInline-value1'], + }, + { + type: 'object', + properties: { + enumField: { + type: 'string', + enum: ['SchemaAToInline-value2'], + }, + integerField: { + type: 'integer', + minimum: 1, + }, + }, + }, + { + $ref: './common.schema.yaml#/components/schemas/SchemaBToInline', + }, + ], + }, + SchemaA: { + type: 'object', + properties: { + fieldX: { type: 'string' }, + }, + }, + SchemaB: { + type: 'object', + properties: { + fieldY: { type: 'string' }, + }, + }, + }, + }, + }); + const commonSpec = createOASDocument({ + components: { + schemas: { + SchemaBToInline: { + // @ts-expect-error OpenAPIV3.Document doesn't allow to add custom props to components.schemas + 'x-inline': true, + allOf: [ + { + type: 'string', + enum: ['SchemaBToInline-value1', 'SchemaBToInline-value2'], + }, + { + type: 'object', + properties: { + fieldD: { + type: 'string', + }, + fieldE: { + type: 'string', + }, + }, + required: ['fieldE'], + }, + ], + }, + }, + }, + }); + + const [bundledSpec] = Object.values( + await bundleSpecs({ + 1: spec, + common: commonSpec, + }) + ); + + expect(bundledSpec.paths['/api/some_api']!.get?.responses['200']).toMatchObject({ + content: { + 'application/json': { + schema: { + allOf: [ + { + type: 'object', + properties: { + fieldA: { + type: 'string', + }, + fieldB: { + type: 'string', + }, + enumField: { + type: 'string', + enum: ['SchemaAToInline-value2'], + }, + integerField: { + type: 'integer', + minimum: 1, + }, + fieldD: { + type: 'string', + }, + fieldE: { + type: 'string', + }, + stringField: { + type: 'string', + }, + }, + required: ['fieldB', 'fieldE', 'stringField'], + }, + { + type: 'string', + enum: ['value1'], + }, + { + $ref: '#/components/schemas/SchemaA', + }, + { + type: 'string', + enum: ['SchemaAToInline-value1'], + }, + { + type: 'string', + enum: ['SchemaBToInline-value1', 'SchemaBToInline-value2'], + }, + { + $ref: '#/components/schemas/SchemaB', + }, + ], + }, + }, + }, + }); + }); + + it('merges allOf object schema items inlined in different document branches with extra field', async () => { + const spec = createOASDocument({ + paths: { + '/api/some_api': { + get: { + responses: { + '200': { + description: 'Successful response', + content: { + 'application/json': { + schema: { + type: 'object', + properties: { + responseSchemaFieldA: { + $ref: '#/components/schemas/SchemaToInline', + }, + responseSchemaFieldB: { + $ref: '#/components/schemas/MySchema', + }, + }, + }, + }, + }, + }, + }, + }, + }, + }, + components: { + schemas: { + MySchema: { + allOf: [ + { + $ref: '#/components/schemas/SchemaToInline', + }, + { + type: 'object', + properties: { + mySchemaSubfield: { + type: 'boolean', + }, + }, + }, + ], + }, + SchemaToInline: { + // @ts-expect-error OpenAPIV3.Document doesn't allow to add custom props to components.schemas + 'x-inline': true, + allOf: [ + { + type: 'object', + properties: { + SchemaToInlineField1: { + type: 'string', + }, + }, + }, + { + type: 'object', + properties: { + SchemaToInlineField2: { + type: 'number', + }, + }, + required: ['field2'], + }, + ], + }, + }, + }, + }); + const [bundledSpec] = Object.values( + await bundleSpecs({ + 1: spec, + }) + ); + + expect(bundledSpec.paths['/api/some_api']!.get?.responses['200']).toMatchObject({ + content: { + 'application/json': { + schema: { + type: 'object', + properties: { + responseSchemaFieldA: { + type: 'object', + properties: { + SchemaToInlineField1: { + type: 'string', + }, + SchemaToInlineField2: { + type: 'number', + }, + }, + required: ['field2'], + }, + responseSchemaFieldB: { + $ref: '#/components/schemas/MySchema', + }, + }, + }, + }, + }, + }); + }); +}); diff --git a/packages/kbn-openapi-bundler/src/__test__/remove_props.test.ts b/packages/kbn-openapi-bundler/src/__test__/remove_props.test.ts new file mode 100644 index 0000000000000..d9ab67386f3c2 --- /dev/null +++ b/packages/kbn-openapi-bundler/src/__test__/remove_props.test.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 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 { OpenAPIV3 } from 'openapi-types'; +import { bundleSpecs } from './bundle_specs'; +import { createOASDocument } from './create_oas_document'; + +describe('OpenAPI Bundler - remove custom x- props', () => { + it('removes "x-codegen-enabled" property', async () => { + const spec1 = createOASDocument({ + paths: { + '/api/some_api': { + get: { + // @ts-expect-error custom prop + 'x-codegen-enabled': true, + responses: { + '200': { + description: 'Successful response', + content: { + 'application/json': { + schema: { + type: 'object', + properties: { + field1: { + type: 'integer', + }, + }, + }, + }, + }, + }, + }, + }, + }, + }, + }); + const spec2 = createOASDocument({ + paths: { + '/api/some_api': { + post: { + // @ts-expect-error custom prop + 'x-codegen-enabled': false, + responses: { + '200': { + description: 'Successful response', + content: { + 'application/json': { + schema: { + type: 'object', + properties: { + field2: { + type: 'string', + }, + }, + }, + }, + }, + }, + }, + }, + }, + }, + }); + const spec3 = createOASDocument({ + paths: { + '/api/some_api': { + put: { + // @ts-expect-error custom prop + 'x-codegen-enabled': undefined, + responses: { + '200': { + description: 'Successful response', + content: { + 'application/json': { + schema: { + type: 'object', + properties: { + field2: { + type: 'string', + }, + }, + }, + }, + }, + }, + }, + }, + }, + }, + }); + + const [bundledSpec] = Object.values( + await bundleSpecs({ + 1: spec1, + 2: spec2, + 3: spec3, + }) + ); + + expect(bundledSpec.paths['/api/some_api']!.get).not.toMatchObject({ + 'x-codegen-enabled': expect.anything(), + }); + expect(bundledSpec.paths['/api/some_api']!.post).not.toMatchObject({ + 'x-codegen-enabled': expect.anything(), + }); + expect(bundledSpec.paths['/api/some_api']!.put).not.toMatchObject({ + 'x-codegen-enabled': expect.anything(), + }); + }); + + it('removes "x-inline" property', async () => { + const spec = createOASDocument({ + paths: { + '/api/some_api': { + get: { + operationId: 'TestEndpointGet', + responses: { + '200': { + description: 'Successful response', + content: { + 'application/json': { + schema: { + $ref: '#/components/schemas/SchemaToInline', + }, + }, + }, + }, + }, + }, + }, + }, + components: { + schemas: { + SchemaToInline: { + // @ts-expect-error OpenAPIV3.Document doesn't allow to add custom props to components.schemas + 'x-inline': true, + type: 'string', + }, + }, + }, + }); + + const [bundledSpec] = Object.values( + await bundleSpecs({ + 1: spec, + }) + ); + + const bundledSchema = ( + bundledSpec.paths['/api/some_api']!.get?.responses['200'] as OpenAPIV3.ResponseObject + ).content!['application/json'].schema; + + expect(bundledSchema).not.toMatchObject({ + 'x-inline': expect.anything(), + }); + }); + + it('removes "x-modify" property', async () => { + const spec = createOASDocument({ + paths: { + '/api/some_api': { + get: { + operationId: 'TestEndpointGet', + responses: { + '200': { + description: 'Successful response', + content: { + 'application/json': { + schema: { + // @ts-expect-error custom prop + 'x-modify': 'required', + type: 'object', + properties: { + field1: { + type: 'string', + }, + field2: { + type: 'integer', + }, + }, + }, + }, + }, + }, + }, + }, + }, + }, + }); + + const [bundledSpec] = Object.values( + await bundleSpecs({ + 1: spec, + }) + ); + + const bundledSchema = ( + bundledSpec.paths['/api/some_api']!.get?.responses['200'] as OpenAPIV3.ResponseObject + ).content!['application/json'].schema; + + expect(bundledSchema).not.toMatchObject({ + 'x-modify': expect.anything(), + }); + }); +}); diff --git a/packages/kbn-openapi-bundler/src/__test__/self_recursive_ref/expected.yaml b/packages/kbn-openapi-bundler/src/__test__/self_recursive_ref/expected.yaml deleted file mode 100644 index 2b75720a069b1..0000000000000 --- a/packages/kbn-openapi-bundler/src/__test__/self_recursive_ref/expected.yaml +++ /dev/null @@ -1,24 +0,0 @@ -spec.schema.yaml: - openapi: 3.0.3 - info: - title: Test endpoint - version: '2023-10-31' - paths: - /api/some_api: - get: - operationId: TestEndpointGet - responses: - '200': - description: Successful response - content: - application/json: - schema: - $ref: './shared_components.schema.yaml#/components/schemas/CircularTestSchema' - -shared_components.schema.yaml: - components: - schemas: - CircularTestSchema: - type: string - data: - $ref: '#/components/schemas/CircularTestSchema' diff --git a/packages/kbn-openapi-bundler/src/__test__/self_recursive_ref/spec.schema.yaml b/packages/kbn-openapi-bundler/src/__test__/self_recursive_ref/spec.schema.yaml deleted file mode 100644 index d90a117818455..0000000000000 --- a/packages/kbn-openapi-bundler/src/__test__/self_recursive_ref/spec.schema.yaml +++ /dev/null @@ -1,22 +0,0 @@ -openapi: 3.0.3 -info: - title: Test endpoint - version: '2023-10-31' -paths: - /api/some_api: - get: - operationId: TestEndpointGet - responses: - '200': - description: Successful response - content: - application/json: - schema: - $ref: '#/components/schemas/CircularTestSchema' - -components: - schemas: - CircularTestSchema: - type: string - data: - $ref: '#/components/schemas/CircularTestSchema' diff --git a/packages/kbn-openapi-bundler/src/__test__/skip_internal/expected.yaml b/packages/kbn-openapi-bundler/src/__test__/skip_internal/expected.yaml deleted file mode 100644 index d8f6d6cb474bf..0000000000000 --- a/packages/kbn-openapi-bundler/src/__test__/skip_internal/expected.yaml +++ /dev/null @@ -1,31 +0,0 @@ -spec.schema.yaml: - openapi: 3.0.3 - info: - title: Test endpoint GET - version: '2023-10-31' - paths: - /api/some_api: - get: - operationId: TestEndpointGet - responses: - '200': - description: Successful response - content: - application/json: - schema: - anyOf: - - $ref: './shared_components.schema.yaml#/components/schemas/TestSchema1' - - type: object - -shared_components.schema.yaml: - components: - schemas: - TestSchema1: - type: object - properties: - field1: - type: string - enum: [value1] - field2: - type: integer - minimum: 1 diff --git a/packages/kbn-openapi-bundler/src/__test__/skip_internal/spec.schema.yaml b/packages/kbn-openapi-bundler/src/__test__/skip_internal/spec.schema.yaml deleted file mode 100644 index 1d172978a4240..0000000000000 --- a/packages/kbn-openapi-bundler/src/__test__/skip_internal/spec.schema.yaml +++ /dev/null @@ -1,57 +0,0 @@ -openapi: 3.0.3 -info: - title: Test endpoint GET - version: '2023-10-31' -paths: - /api/some_api: - get: - operationId: TestEndpointGet - responses: - '200': - description: Successful response - content: - application/json: - schema: - anyOf: - - $ref: '#/components/schemas/TestSchema1' - - $ref: '#/components/schemas/TestSchema2' - x-internal: true - - type: object - properties: - x-internal: true - field1: - $ref: '#/components/schemas/TestSchema3' - -components: - schemas: - TestSchema1: - # x-internal is not supported here - # x-internal: true - type: object - properties: - field1: - type: string - enum: [value1] - field2: - type: integer - minimum: 1 - - TestSchema2: - type: object - properties: - field1: - type: string - enum: [value1] - field2: - type: integer - minimum: 1 - - TestSchema3: - type: object - properties: - field1: - type: string - enum: [value1] - field2: - type: integer - minimum: 1 diff --git a/packages/kbn-openapi-bundler/src/__test__/skip_internal_endpoint/expected.yaml b/packages/kbn-openapi-bundler/src/__test__/skip_internal_endpoint/expected.yaml deleted file mode 100644 index 3015eb607287a..0000000000000 --- a/packages/kbn-openapi-bundler/src/__test__/skip_internal_endpoint/expected.yaml +++ /dev/null @@ -1,22 +0,0 @@ -spec1.schema.yaml: - openapi: 3.0.3 - info: - title: Test endpoint GET - version: '2023-10-31' - paths: - /api/some_api: - get: - operationId: TestEndpointGet - responses: - '200': - description: Successful response - content: - application/json: - schema: - type: object - properties: - field1: - type: integer - -shared_components.schema.yaml: - components: {} diff --git a/packages/kbn-openapi-bundler/src/__test__/skip_internal_endpoint/spec1.schema.yaml b/packages/kbn-openapi-bundler/src/__test__/skip_internal_endpoint/spec1.schema.yaml deleted file mode 100644 index 5b7f6a8718fcf..0000000000000 --- a/packages/kbn-openapi-bundler/src/__test__/skip_internal_endpoint/spec1.schema.yaml +++ /dev/null @@ -1,18 +0,0 @@ -openapi: 3.0.3 -info: - title: Test endpoint GET - version: '2023-10-31' -paths: - /api/some_api: - get: - operationId: TestEndpointGet - responses: - '200': - description: Successful response - content: - application/json: - schema: - type: object - properties: - field1: - type: integer diff --git a/packages/kbn-openapi-bundler/src/__test__/skip_internal_endpoint/spec2.schema.yaml b/packages/kbn-openapi-bundler/src/__test__/skip_internal_endpoint/spec2.schema.yaml deleted file mode 100644 index 5a53977b69100..0000000000000 --- a/packages/kbn-openapi-bundler/src/__test__/skip_internal_endpoint/spec2.schema.yaml +++ /dev/null @@ -1,18 +0,0 @@ -openapi: 3.0.3 -info: - title: Test endpoint POST - version: '2023-10-31' -paths: - /internal/some_api: - post: - operationId: TestEndpointPost - responses: - '200': - description: Successful response - content: - application/json: - schema: - type: object - properties: - field2: - type: string diff --git a/packages/kbn-openapi-bundler/src/__test__/skip_nodes.test.ts b/packages/kbn-openapi-bundler/src/__test__/skip_nodes.test.ts new file mode 100644 index 0000000000000..35b1de2b3a0bc --- /dev/null +++ b/packages/kbn-openapi-bundler/src/__test__/skip_nodes.test.ts @@ -0,0 +1,168 @@ +/* + * Copyright 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 { bundleSpecs } from './bundle_specs'; +import { createOASDocument } from './create_oas_document'; + +describe('OpenAPI Bundler - skip nodes like internal endpoints', () => { + it('skips nodes with x-internal property', async () => { + const spec = createOASDocument({ + paths: { + '/api/some_api': { + get: { + responses: { + '200': { + description: 'Successful response', + content: { + 'application/json': { + schema: { + anyOf: [ + { + $ref: '#/components/schemas/TestSchema1', + }, + { + $ref: '#/components/schemas/TestSchema2', + // @ts-expect-error custom prop + 'x-internal': true, + }, + { + type: 'object', + properties: { + field1: { + type: 'string', + }, + internalField: { + 'x-internal': true, + type: 'string', + }, + }, + }, + ], + }, + }, + }, + }, + }, + }, + }, + }, + components: { + schemas: { + TestSchema1: { + type: 'object', + properties: { + field1: { + type: 'string', + enum: ['value1'], + }, + field2: { + type: 'integer', + minimum: 1, + }, + }, + }, + TestSchema2: { + type: 'string', + }, + }, + }, + }); + + const [bundledSpec] = Object.values( + await bundleSpecs({ + 1: spec, + }) + ); + + expect(bundledSpec.paths['/api/some_api']!.get!.responses['200']).toMatchObject({ + content: { + 'application/json': { + schema: { + anyOf: [ + { + $ref: '#/components/schemas/TestSchema1', + }, + { + type: 'object', + properties: { + field1: { + type: 'string', + }, + }, + }, + ], + }, + }, + }, + }); + }); + + it('skips endpoints starting with /internal', async () => { + const spec1 = createOASDocument({ + paths: { + '/api/some_api': { + get: { + operationId: 'TestEndpointGet', + responses: { + '200': { + description: 'Successful response', + content: { + 'application/json': { + schema: { + type: 'object', + properties: { + field1: { + type: 'integer', + }, + }, + }, + }, + }, + }, + }, + }, + }, + }, + }); + const spec2 = createOASDocument({ + paths: { + '/internal/some_api': { + post: { + operationId: 'TestEndpointPost', + responses: { + '200': { + description: 'Successful response', + content: { + 'application/json': { + schema: { + type: 'object', + properties: { + field2: { + type: 'string', + }, + }, + }, + }, + }, + }, + }, + }, + }, + }, + }); + + const [bundledSpec] = Object.values( + await bundleSpecs({ + 1: spec1, + 2: spec2, + }) + ); + + expect(Object.keys(bundledSpec.paths)).not.toContain('/internal/some_api'); + }); +}); diff --git a/packages/kbn-openapi-bundler/src/__test__/spec_with_external_ref/common.schema.yaml b/packages/kbn-openapi-bundler/src/__test__/spec_with_external_ref/common.schema.yaml deleted file mode 100644 index b710c4e8b114b..0000000000000 --- a/packages/kbn-openapi-bundler/src/__test__/spec_with_external_ref/common.schema.yaml +++ /dev/null @@ -1,13 +0,0 @@ -openapi: 3.0.3 -info: - title: Test endpoint - version: '2023-10-31' -paths: {} - -components: - schemas: - TestSchema: - type: string - enum: - - value1 - - value2 diff --git a/packages/kbn-openapi-bundler/src/__test__/spec_with_external_ref/expected.yaml b/packages/kbn-openapi-bundler/src/__test__/spec_with_external_ref/expected.yaml deleted file mode 100644 index 48c9045d62ce5..0000000000000 --- a/packages/kbn-openapi-bundler/src/__test__/spec_with_external_ref/expected.yaml +++ /dev/null @@ -1,25 +0,0 @@ -spec.schema.yaml: - openapi: 3.0.3 - info: - title: Test endpoint - version: '2023-10-31' - paths: - /api/some_api: - get: - operationId: TestEndpointGet - responses: - '200': - description: Successful response - content: - application/json: - schema: - $ref: './shared_components.schema.yaml#/components/schemas/TestSchema' - -shared_components.schema.yaml: - components: - schemas: - TestSchema: - type: string - enum: - - value1 - - value2 diff --git a/packages/kbn-openapi-bundler/src/__test__/spec_with_local_ref/expected.yaml b/packages/kbn-openapi-bundler/src/__test__/spec_with_local_ref/expected.yaml deleted file mode 100644 index 48c9045d62ce5..0000000000000 --- a/packages/kbn-openapi-bundler/src/__test__/spec_with_local_ref/expected.yaml +++ /dev/null @@ -1,25 +0,0 @@ -spec.schema.yaml: - openapi: 3.0.3 - info: - title: Test endpoint - version: '2023-10-31' - paths: - /api/some_api: - get: - operationId: TestEndpointGet - responses: - '200': - description: Successful response - content: - application/json: - schema: - $ref: './shared_components.schema.yaml#/components/schemas/TestSchema' - -shared_components.schema.yaml: - components: - schemas: - TestSchema: - type: string - enum: - - value1 - - value2 diff --git a/packages/kbn-openapi-bundler/src/__test__/spec_with_local_ref/spec.schema.yaml b/packages/kbn-openapi-bundler/src/__test__/spec_with_local_ref/spec.schema.yaml deleted file mode 100644 index 2339d5eb7aa59..0000000000000 --- a/packages/kbn-openapi-bundler/src/__test__/spec_with_local_ref/spec.schema.yaml +++ /dev/null @@ -1,23 +0,0 @@ -openapi: 3.0.3 -info: - title: Test endpoint - version: '2023-10-31' -paths: - /api/some_api: - get: - operationId: TestEndpointGet - responses: - '200': - description: Successful response - content: - application/json: - schema: - $ref: '#/components/schemas/TestSchema' - -components: - schemas: - TestSchema: - type: string - enum: - - value1 - - value2 diff --git a/packages/kbn-openapi-bundler/src/__test__/two_simple_specs/expected.yaml b/packages/kbn-openapi-bundler/src/__test__/two_simple_specs/expected.yaml deleted file mode 100644 index dbe9fdb445e86..0000000000000 --- a/packages/kbn-openapi-bundler/src/__test__/two_simple_specs/expected.yaml +++ /dev/null @@ -1,42 +0,0 @@ -spec1.schema.yaml: - openapi: 3.0.3 - info: - title: Test endpoint GET - version: '2023-10-31' - paths: - /api/some_api: - get: - operationId: TestEndpointGet - responses: - '200': - description: Successful response - content: - application/json: - schema: - type: object - properties: - field1: - type: integer - -spec2.schema.yaml: - openapi: 3.0.3 - info: - title: Test endpoint POST - version: '2023-10-31' - paths: - /api/some_api: - post: - operationId: TestEndpointPost - responses: - '200': - description: Successful response - content: - application/json: - schema: - type: object - properties: - field2: - type: string - -shared_components.schema.yaml: - components: {} diff --git a/packages/kbn-openapi-bundler/src/__test__/two_simple_specs/spec1.schema.yaml b/packages/kbn-openapi-bundler/src/__test__/two_simple_specs/spec1.schema.yaml deleted file mode 100644 index 5b7f6a8718fcf..0000000000000 --- a/packages/kbn-openapi-bundler/src/__test__/two_simple_specs/spec1.schema.yaml +++ /dev/null @@ -1,18 +0,0 @@ -openapi: 3.0.3 -info: - title: Test endpoint GET - version: '2023-10-31' -paths: - /api/some_api: - get: - operationId: TestEndpointGet - responses: - '200': - description: Successful response - content: - application/json: - schema: - type: object - properties: - field1: - type: integer diff --git a/packages/kbn-openapi-bundler/src/__test__/two_simple_specs/spec2.schema.yaml b/packages/kbn-openapi-bundler/src/__test__/two_simple_specs/spec2.schema.yaml deleted file mode 100644 index c3ba67e0b46ea..0000000000000 --- a/packages/kbn-openapi-bundler/src/__test__/two_simple_specs/spec2.schema.yaml +++ /dev/null @@ -1,18 +0,0 @@ -openapi: 3.0.3 -info: - title: Test endpoint POST - version: '2023-10-31' -paths: - /api/some_api: - post: - operationId: TestEndpointPost - responses: - '200': - description: Successful response - content: - application/json: - schema: - type: object - properties: - field2: - type: string diff --git a/packages/kbn-openapi-bundler/src/__test__/two_specs_with_external_ref/common.schema.yaml b/packages/kbn-openapi-bundler/src/__test__/two_specs_with_external_ref/common.schema.yaml deleted file mode 100644 index b710c4e8b114b..0000000000000 --- a/packages/kbn-openapi-bundler/src/__test__/two_specs_with_external_ref/common.schema.yaml +++ /dev/null @@ -1,13 +0,0 @@ -openapi: 3.0.3 -info: - title: Test endpoint - version: '2023-10-31' -paths: {} - -components: - schemas: - TestSchema: - type: string - enum: - - value1 - - value2 diff --git a/packages/kbn-openapi-bundler/src/__test__/two_specs_with_external_ref/expected.yaml b/packages/kbn-openapi-bundler/src/__test__/two_specs_with_external_ref/expected.yaml deleted file mode 100644 index d3040ae511b2c..0000000000000 --- a/packages/kbn-openapi-bundler/src/__test__/two_specs_with_external_ref/expected.yaml +++ /dev/null @@ -1,42 +0,0 @@ -spec1.schema.yaml: - openapi: 3.0.3 - info: - title: Test endpoint GET - version: '2023-10-31' - paths: - /api/some_api: - get: - operationId: TestEndpointGet - responses: - '200': - description: Successful response - content: - application/json: - schema: - $ref: './shared_components.schema.yaml#/components/schemas/TestSchema' - -spec2.schema.yaml: - openapi: 3.0.3 - info: - title: Test endpoint POST - version: '2023-10-31' - paths: - /api/some_api: - post: - operationId: TestEndpointPost - responses: - '200': - description: Successful response - content: - application/json: - schema: - $ref: './shared_components.schema.yaml#/components/schemas/TestSchema' - -shared_components.schema.yaml: - components: - schemas: - TestSchema: - type: string - enum: - - value1 - - value2 diff --git a/packages/kbn-openapi-bundler/src/__test__/two_specs_with_external_ref/spec1.schema.yaml b/packages/kbn-openapi-bundler/src/__test__/two_specs_with_external_ref/spec1.schema.yaml deleted file mode 100644 index c08570d69311c..0000000000000 --- a/packages/kbn-openapi-bundler/src/__test__/two_specs_with_external_ref/spec1.schema.yaml +++ /dev/null @@ -1,15 +0,0 @@ -openapi: 3.0.3 -info: - title: Test endpoint GET - version: '2023-10-31' -paths: - /api/some_api: - get: - operationId: TestEndpointGet - responses: - '200': - description: Successful response - content: - application/json: - schema: - $ref: './common.schema.yaml#/components/schemas/TestSchema' diff --git a/packages/kbn-openapi-bundler/src/__test__/two_specs_with_external_ref/spec2.schema.yaml b/packages/kbn-openapi-bundler/src/__test__/two_specs_with_external_ref/spec2.schema.yaml deleted file mode 100644 index 9dec5566875bb..0000000000000 --- a/packages/kbn-openapi-bundler/src/__test__/two_specs_with_external_ref/spec2.schema.yaml +++ /dev/null @@ -1,15 +0,0 @@ -openapi: 3.0.3 -info: - title: Test endpoint POST - version: '2023-10-31' -paths: - /api/some_api: - post: - operationId: TestEndpointPost - responses: - '200': - description: Successful response - content: - application/json: - schema: - $ref: './common.schema.yaml#/components/schemas/TestSchema' diff --git a/packages/kbn-openapi-bundler/src/__test__/x_modify.test.ts b/packages/kbn-openapi-bundler/src/__test__/x_modify.test.ts new file mode 100644 index 0000000000000..cdc53e8369345 --- /dev/null +++ b/packages/kbn-openapi-bundler/src/__test__/x_modify.test.ts @@ -0,0 +1,340 @@ +/* + * Copyright 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 { bundleSpecs } from './bundle_specs'; +import { createOASDocument } from './create_oas_document'; + +describe('OpenAPI Bundler - x-modify', () => { + it('inlines references with x-modify property', async () => { + const spec = createOASDocument({ + paths: { + '/api/some_api': { + get: { + responses: { + '200': { + description: 'Successful response', + content: { + 'application/json': { + schema: { + anyOf: [ + { + $ref: '#/components/schemas/SchemaWithRequiredFields', + // @ts-expect-error custom prop + 'x-modify': 'partial', + }, + { + $ref: '#/components/schemas/SchemaWithOptionalFields', + 'x-modify': 'required', + }, + ], + }, + }, + }, + }, + }, + }, + }, + }, + components: { + schemas: { + SchemaWithRequiredFields: { + type: 'object', + properties: { + fieldA: { + type: 'string', + enum: ['value1'], + }, + fieldB: { + type: 'integer', + minimum: 1, + }, + }, + required: ['fieldA', 'fieldB'], + }, + SchemaWithOptionalFields: { + type: 'object', + properties: { + fieldC: { + type: 'string', + enum: ['value1'], + }, + fieldD: { + type: 'integer', + minimum: 1, + }, + }, + }, + }, + }, + }); + + const [bundledSpec] = Object.values( + await bundleSpecs({ + 1: spec, + }) + ); + + expect(bundledSpec.paths['/api/some_api']!.get!.responses['200']).toMatchObject({ + content: { + 'application/json': { + schema: { + anyOf: [ + { + type: 'object', + properties: { + fieldA: { + type: 'string', + enum: ['value1'], + }, + fieldB: { + type: 'integer', + minimum: 1, + }, + }, + }, + { + type: 'object', + properties: { + fieldC: { + type: 'string', + enum: ['value1'], + }, + fieldD: { + type: 'integer', + minimum: 1, + }, + }, + required: ['fieldC', 'fieldD'], + }, + ], + }, + }, + }, + }); + }); + + it('makes properties in an object schema node partial', async () => { + const spec = createOASDocument({ + paths: { + '/api/some_api': { + get: { + responses: { + '200': { + description: 'Successful response', + content: { + 'application/json': { + schema: { + // @ts-expect-error custom prop + 'x-modify': 'partial', + type: 'object', + properties: { + fieldA: { + type: 'string', + enum: ['value1'], + }, + fieldB: { + type: 'integer', + minimum: 1, + }, + }, + required: ['fieldA', 'fieldB'], + }, + }, + }, + }, + }, + }, + }, + }, + }); + + const [bundledSpec] = Object.values( + await bundleSpecs({ + 1: spec, + }) + ); + + expect(bundledSpec.paths['/api/some_api']!.get!.responses['200']).toMatchObject({ + content: { + 'application/json': { + schema: expect.not.objectContaining({ + required: expect.anything(), + }), + }, + }, + }); + }); + + it('makes properties in a referenced object schema node partial', async () => { + const spec = createOASDocument({ + paths: { + '/api/some_api': { + get: { + responses: { + '200': { + description: 'Successful response', + content: { + 'application/json': { + schema: { + $ref: '#/components/schemas/TestSchema', + // @ts-expect-error custom prop + 'x-modify': 'partial', + }, + }, + }, + }, + }, + }, + }, + }, + components: { + schemas: { + TestSchema: { + type: 'object', + properties: { + fieldA: { + type: 'string', + enum: ['value1'], + }, + fieldB: { + type: 'integer', + minimum: 1, + }, + }, + required: ['fieldA', 'fieldB'], + }, + }, + }, + }); + + const [bundledSpec] = Object.values( + await bundleSpecs({ + 1: spec, + }) + ); + + expect(bundledSpec.paths['/api/some_api']!.get!.responses['200']).toMatchObject({ + content: { + 'application/json': { + schema: expect.not.objectContaining({ + required: expect.anything(), + }), + }, + }, + }); + }); + + it('makes properties in an object schema node required', async () => { + const spec = createOASDocument({ + paths: { + '/api/some_api': { + get: { + responses: { + '200': { + description: 'Successful response', + content: { + 'application/json': { + schema: { + // @ts-expect-error custom prop + 'x-modify': 'required', + type: 'object', + properties: { + fieldA: { + type: 'string', + enum: ['value1'], + }, + fieldB: { + type: 'integer', + minimum: 1, + }, + }, + }, + }, + }, + }, + }, + }, + }, + }, + }); + + const [bundledSpec] = Object.values( + await bundleSpecs({ + 1: spec, + }) + ); + + expect(bundledSpec.paths['/api/some_api']!.get!.responses['200']).toMatchObject({ + content: { + 'application/json': { + schema: expect.objectContaining({ + required: ['fieldA', 'fieldB'], + }), + }, + }, + }); + }); + + it('makes properties in a referenced object schema node required', async () => { + const spec = createOASDocument({ + paths: { + '/api/some_api': { + get: { + responses: { + '200': { + description: 'Successful response', + content: { + 'application/json': { + schema: { + $ref: '#/components/schemas/TestSchema', + // @ts-expect-error custom prop + 'x-modify': 'required', + }, + }, + }, + }, + }, + }, + }, + }, + components: { + schemas: { + TestSchema: { + type: 'object', + properties: { + fieldA: { + type: 'string', + enum: ['value1'], + }, + fieldB: { + type: 'integer', + minimum: 1, + }, + }, + }, + }, + }, + }); + + const [bundledSpec] = Object.values( + await bundleSpecs({ + 1: spec, + }) + ); + + expect(bundledSpec.paths['/api/some_api']!.get!.responses['200']).toMatchObject({ + content: { + 'application/json': { + schema: expect.objectContaining({ + required: ['fieldA', 'fieldB'], + }), + }, + }, + }); + }); +}); diff --git a/packages/kbn-openapi-bundler/src/bundler/bundle_document.ts b/packages/kbn-openapi-bundler/src/bundler/bundle_document.ts index 1f6884a87f677..502ede318ca6d 100644 --- a/packages/kbn-openapi-bundler/src/bundler/bundle_document.ts +++ b/packages/kbn-openapi-bundler/src/bundler/bundle_document.ts @@ -19,6 +19,11 @@ import { createModifyRequiredProcessor } from './document_processors/modify_requ import { X_CODEGEN_ENABLED, X_INLINE, X_INTERNAL, X_MODIFY } from './known_custom_props'; import { RemoveUnusedComponentsProcessor } from './document_processors/remove_unused_components'; import { isPlainObjectType } from '../utils/is_plain_object_type'; +import { + createFlattenFoldedAllOfItemsProcessor, + createMergeNonConflictingAllOfItemsProcessor, + createUnfoldSingleAllOfItemProcessor, +} from './document_processors/reduce_all_of_items'; export class SkipException extends Error { constructor(public documentPath: string, message: string) { @@ -72,7 +77,10 @@ export async function bundleDocument(absoluteDocumentPath: string): Promise `schemas` -> `SomeSchema` and `$ref` property's - * values is updated to `#/components/schemas/SomeSchema`. + * values are updated to be local e.g. `#/components/schemas/SomeSchema`. * - * Conditional dereference means inlining references when `inliningPredicate()` returns `true`. If `inliningPredicate` - * is not passed only bundling happens. + * Some references get inlined based on a condition (conditional dereference). It's controlled by inlining + * property whose value should be `true`. `inliningPropName` specifies inlining property name e.g. `x-inline`. + * Nodes having `x-inline: true` will be inlined. */ -export class BundleRefProcessor { - private refs: ResolvedRef[] = []; +export class BundleRefProcessor implements DocumentNodeProcessor { + private refs = new Map(); + private nodesToInline = new Set>(); constructor(private inliningPropName: string) {} - ref(node: RefNode, resolvedRef: ResolvedRef, context: TraverseDocumentContext): void { - if (!resolvedRef.pointer.startsWith('/components/schemas')) { - throw new Error(`$ref pointer must start with "/components/schemas"`); + onNodeEnter(node: Readonly): void { + if (hasProp(node, this.inliningPropName, true)) { + this.nodesToInline.add(node); } + } - if ( - hasProp(node, this.inliningPropName, true) || - hasProp(resolvedRef.refNode, this.inliningPropName, true) - ) { - inlineRef(node, resolvedRef); + onRefNodeLeave(node: RefNode, resolvedRef: ResolvedRef, context: TraverseDocumentContext): void { + if (!resolvedRef.pointer.startsWith('/components')) { + throw new Error( + `$ref pointer ${chalk.yellow( + resolvedRef.pointer + )} must start with "/components" at ${chalk.bold(resolvedRef.absolutePath)}` + ); + } - delete node[this.inliningPropName]; + if (this.nodesToInline.has(node) || this.nodesToInline.has(resolvedRef.refNode)) { + inlineRef(node, resolvedRef); } else { const rootDocument = this.extractRootDocument(context); @@ -46,16 +63,34 @@ export class BundleRefProcessor { rootDocument.components = {}; } + const ref = this.refs.get(resolvedRef.pointer); + + if (ref && !deepEqual(ref.refNode, resolvedRef.refNode)) { + const documentAbsolutePath = + this.extractParentContext(context).resolvedDocument.absolutePath; + + throw new Error( + `❌ Unable to bundle ${chalk.bold( + documentAbsolutePath + )} due to conflicts in references. Schema ${chalk.yellow( + ref.pointer + )} is defined in ${chalk.blue(ref.absolutePath)} and in ${chalk.magenta( + resolvedRef.absolutePath + )} but has not matching definitions.` + ); + } + node.$ref = this.saveComponent( resolvedRef, rootDocument.components as Record ); - this.refs.push(resolvedRef); + + this.refs.set(resolvedRef.pointer, resolvedRef); } } - getBundledRefs(): ResolvedRef[] { - return this.refs; + getBundledRefs(): IterableIterator { + return this.refs.values(); } private saveComponent(ref: ResolvedRef, components: Record): string { @@ -64,11 +99,15 @@ export class BundleRefProcessor { return `#${ref.pointer}`; } - private extractRootDocument(context: TraverseDocumentContext): Document { + private extractParentContext(context: TraverseDocumentContext): TraverseRootDocumentContext { while (isChildContext(context)) { context = context.parentContext; } - return context.resolvedDocument.document; + return context; + } + + private extractRootDocument(context: TraverseDocumentContext): Document { + return this.extractParentContext(context).resolvedDocument.document; } } diff --git a/packages/kbn-openapi-bundler/src/bundler/document_processors/modify_partial.ts b/packages/kbn-openapi-bundler/src/bundler/document_processors/modify_partial.ts index 13c876b7579ca..5d667eff1bc80 100644 --- a/packages/kbn-openapi-bundler/src/bundler/document_processors/modify_partial.ts +++ b/packages/kbn-openapi-bundler/src/bundler/document_processors/modify_partial.ts @@ -17,7 +17,7 @@ import { X_MODIFY } from '../known_custom_props'; */ export function createModifyPartialProcessor(): DocumentNodeProcessor { return { - ref(node, resolvedRef) { + onRefNodeLeave(node, resolvedRef) { if (!hasProp(node, X_MODIFY, 'partial')) { return; } @@ -27,7 +27,7 @@ export function createModifyPartialProcessor(): DocumentNodeProcessor { delete node.required; }, - leave(node) { + onNodeLeave(node) { if (!hasProp(node, X_MODIFY, 'partial')) { return; } diff --git a/packages/kbn-openapi-bundler/src/bundler/document_processors/modify_required.ts b/packages/kbn-openapi-bundler/src/bundler/document_processors/modify_required.ts index 14a9ac2ea25c6..769672d64a39d 100644 --- a/packages/kbn-openapi-bundler/src/bundler/document_processors/modify_required.ts +++ b/packages/kbn-openapi-bundler/src/bundler/document_processors/modify_required.ts @@ -20,7 +20,7 @@ import { inlineRef } from './utils/inline_ref'; */ export function createModifyRequiredProcessor(): DocumentNodeProcessor { return { - ref(node, resolvedRef) { + onRefNodeLeave(node, resolvedRef) { if (!hasProp(node, X_MODIFY, 'required')) { return; } @@ -48,7 +48,7 @@ export function createModifyRequiredProcessor(): DocumentNodeProcessor { node.required = Object.keys(resolvedRef.refNode.properties); }, - leave(node) { + onNodeLeave(node) { if (!hasProp(node, X_MODIFY, 'required')) { return; } diff --git a/packages/kbn-openapi-bundler/src/bundler/document_processors/reduce_all_of_items/flatten_folded_all_of_items.ts b/packages/kbn-openapi-bundler/src/bundler/document_processors/reduce_all_of_items/flatten_folded_all_of_items.ts new file mode 100644 index 0000000000000..dcf4b82a42af5 --- /dev/null +++ b/packages/kbn-openapi-bundler/src/bundler/document_processors/reduce_all_of_items/flatten_folded_all_of_items.ts @@ -0,0 +1,61 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0 and the Server Side Public License, v 1; you may not use this file except + * in compliance with, at your election, the Elastic License 2.0 or the Server + * Side Public License, v 1. + */ + +import { DocumentNodeProcessor } from '../../types'; + +/** + * Creates a node processor to flatten folded `allOf` items. Folded means `allOf` has items + * which are another `allOf`s instead of being e.g. object schemas. + * + * Folded `allOf` schemas is usually a result of inlining references. + * + * Example: + * + * The following folded `allOf`s + * + * ```yaml + * allOf: + * - allOf: + * - type: object + * properties: + * fieldA: + * $ref: '#/components/schemas/FieldA' + * - type: object + * properties: + * fieldB: + * type: string + * ``` + * + * will be transformed to + * + * ```yaml + * allOf: + * - type: object + * properties: + * fieldA: + * $ref: '#/components/schemas/FieldA' + * - type: object + * properties: + * fieldB: + * type: string + * ``` + * + */ +export function createFlattenFoldedAllOfItemsProcessor(): DocumentNodeProcessor { + return { + onNodeLeave(node) { + if (!('allOf' in node) || !Array.isArray(node.allOf)) { + return; + } + + node.allOf = node.allOf.flatMap((childNode) => + 'allOf' in childNode ? childNode.allOf : childNode + ); + }, + }; +} diff --git a/packages/kbn-openapi-bundler/src/bundler/document_processors/reduce_all_of_items/index.ts b/packages/kbn-openapi-bundler/src/bundler/document_processors/reduce_all_of_items/index.ts new file mode 100644 index 0000000000000..acfe16cc95c5e --- /dev/null +++ b/packages/kbn-openapi-bundler/src/bundler/document_processors/reduce_all_of_items/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 and the Server Side Public License, v 1; you may not use this file except + * in compliance with, at your election, the Elastic License 2.0 or the Server + * Side Public License, v 1. + */ + +export * from './flatten_folded_all_of_items'; +export * from './merge_non_conflicting_all_of_items'; +export * from './unfold_single_all_of_item'; diff --git a/packages/kbn-openapi-bundler/src/bundler/document_processors/reduce_all_of_items/merge_non_conflicting_all_of_items.ts b/packages/kbn-openapi-bundler/src/bundler/document_processors/reduce_all_of_items/merge_non_conflicting_all_of_items.ts new file mode 100644 index 0000000000000..87895be952b96 --- /dev/null +++ b/packages/kbn-openapi-bundler/src/bundler/document_processors/reduce_all_of_items/merge_non_conflicting_all_of_items.ts @@ -0,0 +1,149 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0 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 { omit } from 'lodash'; +import deepEqual from 'fast-deep-equal'; +import { OpenAPIV3 } from 'openapi-types'; +import { isPlainObjectType } from '../../../utils/is_plain_object_type'; +import { DocumentNodeProcessor } from '../../types'; + +type MergedObjectSchema = Required> & + Pick; + +/** + * Creates a node processor to merge object schema definitions when there are no conflicts + * between them. + * + * After inlining references or any other transformations a schema may have `allOf` + * with multiple object schema items. Object schema has `properties` field describing object + * properties and optional `required` field to say which object properties are not optional. + * + * Conflicts between object schemas do now allow merge them. The following conflicts may appear + * + * - Two or more object schemas define the same named object field but definition is different + * - Some of object schemas have optional properties like `readOnly` + * - Two or more object schemas have conflicting optional properties values + * + * Example: + * + * The following `allOf` containing multiple object schemas + * + * ```yaml + * allOf: + * - type: object + * properties: + * fieldA: + * $ref: '#/components/schemas/FieldA' + * - type: object + * properties: + * fieldB: + * type: string + * ``` + * + * will be transformed to + * + * ```yaml + * allOf: + * - type: object + * properties: + * fieldA: + * $ref: '#/components/schemas/FieldA' + * fieldB: + * type: string + * ``` + */ +export function createMergeNonConflictingAllOfItemsProcessor(): DocumentNodeProcessor { + return { + onNodeLeave(allOfNode) { + if ( + !('allOf' in allOfNode) || + !Array.isArray(allOfNode.allOf) || + !canMergeObjectSchemas(allOfNode.allOf) + ) { + return; + } + + const resultItems: [ + MergedObjectSchema, + ...Array + ] = [ + { + type: 'object', + properties: {}, + }, + ]; + const mergedRequired = new Set(); + + for (const item of allOfNode.allOf) { + if (!isObjectNode(item) || !isPlainObjectType(item.properties)) { + resultItems.push(item); + continue; + } + + Object.assign(resultItems[0].properties, item.properties); + + for (const requiredField of item.required ?? []) { + mergedRequired.add(requiredField); + } + } + + if (mergedRequired.size > 0) { + resultItems[0].required = Array.from(mergedRequired); + } + + allOfNode.allOf = resultItems; + }, + }; +} + +/** + * Object schemas can be merged when + * + * - as minimum there are two object schemas + * - object schemas DO NOT contain conflicting fields (same name but different definition) + * - object schemas DO NOT contain fields besides `type`, `properties` and `required` + * + */ +function canMergeObjectSchemas(schemas: OpenAPIV3.SchemaObject[]): boolean { + const props = new Map(); + let objectSchemasCounter = 0; + + for (const node of schemas) { + if (!isObjectNode(node) || !isPlainObjectType(node.properties)) { + continue; + } + + if (getObjectSchemaExtraFieldNames(node).size > 0) { + return false; + } + + const nodePropNames = Object.keys(node.properties); + + for (const nodePropName of nodePropNames) { + const propSchema = props.get(nodePropName); + + if (propSchema && !deepEqual(propSchema, node.properties[nodePropName])) { + return false; + } + + props.set(nodePropName, node.properties[nodePropName]); + } + + objectSchemasCounter++; + } + + return objectSchemasCounter > 1; +} + +function getObjectSchemaExtraFieldNames(schema: OpenAPIV3.SchemaObject): Set { + return new Set(Object.keys(omit(schema, ['type', 'properties', 'required']))); +} + +function isObjectNode(node: unknown): boolean { + return isPlainObjectType(node) && node.type === 'object'; +} diff --git a/packages/kbn-openapi-bundler/src/bundler/document_processors/reduce_all_of_items/unfold_single_all_of_item.ts b/packages/kbn-openapi-bundler/src/bundler/document_processors/reduce_all_of_items/unfold_single_all_of_item.ts new file mode 100644 index 0000000000000..67a056091db4c --- /dev/null +++ b/packages/kbn-openapi-bundler/src/bundler/document_processors/reduce_all_of_items/unfold_single_all_of_item.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 { DocumentNodeProcessor } from '../../types'; + +/** + * Created a node processor to remove/unfold `allOf` with only single item. + * + * While a schema can be defined like that the most often reason why `allOf` has + * only one item is flattening folded `allOf` items via `flattenFoldedAllOfItems` + * node processor. + * + * Example: + * + * The following single item `allOf` + * + * ```yaml + * allOf: + * - type: object + * properties: + * fieldA: + * $ref: '#/components/schemas/FieldA' + * ``` + * + * will be transformed to + * + * ```yaml + * type: object + * properties: + * fieldA: + * $ref: '#/components/schemas/FieldA' + * ``` + * + */ +export function createUnfoldSingleAllOfItemProcessor(): DocumentNodeProcessor { + return { + onNodeLeave(node) { + if (!('allOf' in node) || !Array.isArray(node.allOf) || node.allOf.length > 1) { + return; + } + + Object.assign(node, node.allOf[0]); + delete node.allOf; + }, + }; +} diff --git a/packages/kbn-openapi-bundler/src/bundler/document_processors/remove_props.ts b/packages/kbn-openapi-bundler/src/bundler/document_processors/remove_props.ts index 616d9db11f55e..02fb2036e2a0c 100644 --- a/packages/kbn-openapi-bundler/src/bundler/document_processors/remove_props.ts +++ b/packages/kbn-openapi-bundler/src/bundler/document_processors/remove_props.ts @@ -14,13 +14,13 @@ import { DocumentNodeProcessor } from '../types'; */ export function createRemovePropsProcessor(propNames: string[]): DocumentNodeProcessor { return { - leave(node) { + onNodeLeave(node) { if (!isPlainObjectType(node)) { return; } for (const propName of propNames) { - if (!node[propName]) { + if (!Object.hasOwn(node, propName)) { continue; } diff --git a/packages/kbn-openapi-bundler/src/bundler/document_processors/remove_unused_components.ts b/packages/kbn-openapi-bundler/src/bundler/document_processors/remove_unused_components.ts index 1f5053d4667fe..393f986ec5a1a 100644 --- a/packages/kbn-openapi-bundler/src/bundler/document_processors/remove_unused_components.ts +++ b/packages/kbn-openapi-bundler/src/bundler/document_processors/remove_unused_components.ts @@ -8,7 +8,7 @@ import { hasProp } from '../../utils/has_prop'; import { isPlainObjectType } from '../../utils/is_plain_object_type'; -import { PlainObjectNode, ResolvedRef } from '../types'; +import { DocumentNodeProcessor, PlainObjectNode, ResolvedRef } from '../types'; /** * Helps to remove unused components. @@ -17,10 +17,10 @@ import { PlainObjectNode, ResolvedRef } from '../types'; * and then `removeUnusedComponents()` should be invoked after document processing to perform * actual unused components deletion. */ -export class RemoveUnusedComponentsProcessor { +export class RemoveUnusedComponentsProcessor implements DocumentNodeProcessor { private refs = new Set(); - ref(node: unknown, resolvedRef: ResolvedRef): void { + onRefNodeLeave(node: unknown, resolvedRef: ResolvedRef): void { // If the reference has been inlined by one of the previous processors skip it if (!hasProp(node, '$ref')) { return; diff --git a/packages/kbn-openapi-bundler/src/bundler/document_processors/skip_internal_path.ts b/packages/kbn-openapi-bundler/src/bundler/document_processors/skip_internal_path.ts index 42769eab7a68a..280002ce13890 100644 --- a/packages/kbn-openapi-bundler/src/bundler/document_processors/skip_internal_path.ts +++ b/packages/kbn-openapi-bundler/src/bundler/document_processors/skip_internal_path.ts @@ -13,7 +13,7 @@ import { DocumentNodeProcessor } from '../types'; */ export function createSkipInternalPathProcessor(skipPathPrefix: string): DocumentNodeProcessor { return { - enter(_, context) { + shouldRemove(_, context) { if (typeof context.parentKey === 'number') { return false; } diff --git a/packages/kbn-openapi-bundler/src/bundler/document_processors/skip_node_with_internal_prop.ts b/packages/kbn-openapi-bundler/src/bundler/document_processors/skip_node_with_internal_prop.ts index 4931036bcd1bc..b674cfb8c0b9c 100644 --- a/packages/kbn-openapi-bundler/src/bundler/document_processors/skip_node_with_internal_prop.ts +++ b/packages/kbn-openapi-bundler/src/bundler/document_processors/skip_node_with_internal_prop.ts @@ -16,6 +16,6 @@ export function createSkipNodeWithInternalPropProcessor( skipProperty: string ): DocumentNodeProcessor { return { - enter: (node) => skipProperty in node, + shouldRemove: (node) => skipProperty in node, }; } diff --git a/packages/kbn-openapi-bundler/src/bundler/document_processors/utils/inline_ref.ts b/packages/kbn-openapi-bundler/src/bundler/document_processors/utils/inline_ref.ts index 3106bf9cbc95d..fac6c519980b9 100644 --- a/packages/kbn-openapi-bundler/src/bundler/document_processors/utils/inline_ref.ts +++ b/packages/kbn-openapi-bundler/src/bundler/document_processors/utils/inline_ref.ts @@ -6,15 +6,11 @@ * Side Public License, v 1. */ -import { cloneDeep } from 'lodash'; import { DocumentNode, ResolvedRef } from '../../types'; import { InlinableRefNode } from '../types'; export function inlineRef(node: DocumentNode, resolvedRef: ResolvedRef): void { - // Make sure unwanted side effects don't happen when child nodes are processed - const deepClone = cloneDeep(resolvedRef.refNode); - - Object.assign(node, deepClone); + Object.assign(node, resolvedRef.refNode); delete (node as InlinableRefNode).$ref; } diff --git a/packages/kbn-openapi-bundler/src/bundler/merge_documents.ts b/packages/kbn-openapi-bundler/src/bundler/merge_documents.ts deleted file mode 100644 index e27253cefc1c9..0000000000000 --- a/packages/kbn-openapi-bundler/src/bundler/merge_documents.ts +++ /dev/null @@ -1,142 +0,0 @@ -/* - * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one - * or more contributor license agreements. Licensed under the Elastic License - * 2.0 and the Server Side Public License, v 1; you may not use this file except - * in compliance with, at your election, the Elastic License 2.0 or the Server - * Side Public License, v 1. - */ - -import deepEqual from 'fast-deep-equal'; -import { basename, dirname, join } from 'path'; -import chalk from 'chalk'; -import { parseRef } from '../utils/parse_ref'; -import { insertRefByPointer } from '../utils/insert_by_json_pointer'; -import { DocumentNodeProcessor, PlainObjectNode, ResolvedDocument, ResolvedRef } from './types'; -import { BundledDocument } from './bundle_document'; -import { processDocument } from './process_document'; - -type MergedDocuments = Record; - -type MergedResult = Record; - -const SHARED_COMPONENTS_FILE_NAME = 'shared_components.schema.yaml'; - -export async function mergeDocuments(bundledDocuments: BundledDocument[]): Promise { - const mergedDocuments: MergedDocuments = {}; - const componentsMap = new Map(); - - for (const bundledDocument of bundledDocuments) { - mergeRefsToMap(bundledDocument.bundledRefs, componentsMap); - - delete bundledDocument.document.components; - - await setRefsFileName(bundledDocument, SHARED_COMPONENTS_FILE_NAME); - mergeDocument(bundledDocument, mergedDocuments); - } - - const result: MergedResult = {}; - - for (const fileName of Object.keys(mergedDocuments)) { - result[fileName] = mergedDocuments[fileName].document; - } - - result[SHARED_COMPONENTS_FILE_NAME] = { - components: componentsMapToComponents(componentsMap), - }; - - return result; -} - -function mergeDocument(resolvedDocument: ResolvedDocument, mergeResult: MergedDocuments): void { - const fileName = basename(resolvedDocument.absolutePath); - - if (!mergeResult[fileName]) { - mergeResult[fileName] = resolvedDocument; - return; - } - - const nonConflictFileName = generateNonConflictingFilePath( - resolvedDocument.absolutePath, - mergeResult - ); - - mergeResult[nonConflictFileName] = resolvedDocument; -} - -function generateNonConflictingFilePath( - documentAbsolutePath: string, - mergeResult: MergedDocuments -): string { - let pathToDocument = dirname(documentAbsolutePath); - let suggestedName = basename(documentAbsolutePath); - - while (mergeResult[suggestedName]) { - suggestedName = `${basename(pathToDocument)}_${suggestedName}`; - pathToDocument = join(pathToDocument, '..'); - } - - return suggestedName; -} - -function mergeRefsToMap(bundledRefs: ResolvedRef[], componentsMap: Map): void { - for (const bundledRef of bundledRefs) { - const existingRef = componentsMap.get(bundledRef.pointer); - - if (!existingRef) { - componentsMap.set(bundledRef.pointer, bundledRef); - continue; - } - - if (deepEqual(existingRef.refNode, bundledRef.refNode)) { - continue; - } - - throw new Error( - `❌ Unable to bundle documents due to conflicts in references. Schema ${chalk.yellow( - bundledRef.pointer - )} is defined in ${chalk.blue(existingRef.absolutePath)} and in ${chalk.magenta( - bundledRef.absolutePath - )} but has not matching definitions.` - ); - } -} - -function componentsMapToComponents( - componentsMap: Map -): Record { - const result: Record = {}; - - for (const resolvedRef of componentsMap.values()) { - insertRefByPointer(resolvedRef.pointer, resolvedRef.refNode, result); - } - - return result; -} - -async function setRefsFileName( - resolvedDocument: ResolvedDocument, - fileName: string -): Promise { - // We don't need to follow references - const stubRefResolver = { - resolveRef: async (refDocumentAbsolutePath: string, pointer: string): Promise => ({ - absolutePath: refDocumentAbsolutePath, - pointer, - document: resolvedDocument.document, - refNode: {}, - }), - resolveDocument: async (): Promise => ({ - absolutePath: '', - document: resolvedDocument.document, - }), - }; - const setRefFileProcessor: DocumentNodeProcessor = { - ref: (node) => { - const { pointer } = parseRef(node.$ref); - - node.$ref = `./${fileName}#${pointer}`; - }, - }; - - await processDocument(resolvedDocument, stubRefResolver, [setRefFileProcessor]); -} diff --git a/packages/kbn-openapi-bundler/src/bundler/merge_documents/create_blank_oas_document.ts b/packages/kbn-openapi-bundler/src/bundler/merge_documents/create_blank_oas_document.ts new file mode 100644 index 0000000000000..925471719b345 --- /dev/null +++ b/packages/kbn-openapi-bundler/src/bundler/merge_documents/create_blank_oas_document.ts @@ -0,0 +1,46 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0 and the Server Side Public License, v 1; you may not use this file except + * in compliance with, at your election, the Elastic License 2.0 or the Server + * Side Public License, v 1. + */ + +import { OpenAPIV3 } from 'openapi-types'; + +export function createBlankOpenApiDocument( + oasVersion: string, + info: OpenAPIV3.InfoObject +): OpenAPIV3.Document { + return { + openapi: oasVersion, + info, + servers: [ + { + url: 'http://{kibana_host}:{port}', + variables: { + kibana_host: { + default: 'localhost', + }, + port: { + default: '5601', + }, + }, + }, + ], + security: [ + { + BasicAuth: [], + }, + ], + paths: {}, + components: { + securitySchemes: { + BasicAuth: { + type: 'http', + scheme: 'basic', + }, + }, + }, + }; +} diff --git a/packages/kbn-openapi-bundler/src/bundler/merge_documents/index.ts b/packages/kbn-openapi-bundler/src/bundler/merge_documents/index.ts new file mode 100644 index 0000000000000..554cf7cd2c2c5 --- /dev/null +++ b/packages/kbn-openapi-bundler/src/bundler/merge_documents/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 * from './merge_documents'; diff --git a/packages/kbn-openapi-bundler/src/bundler/merge_documents/merge_documents.ts b/packages/kbn-openapi-bundler/src/bundler/merge_documents/merge_documents.ts new file mode 100644 index 0000000000000..03275dbf3f3de --- /dev/null +++ b/packages/kbn-openapi-bundler/src/bundler/merge_documents/merge_documents.ts @@ -0,0 +1,101 @@ +/* + * Copyright 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 chalk from 'chalk'; +import { OpenAPIV3 } from 'openapi-types'; +import { logger } from '../../logger'; +import { BundledDocument } from '../bundle_document'; +import { mergePaths } from './merge_paths'; +import { mergeSharedComponents } from './merge_shared_components'; + +export async function mergeDocuments( + bundledDocuments: BundledDocument[], + blankOasFactory: (oasVersion: string, apiVersion: string) => OpenAPIV3.Document +): Promise> { + const bundledDocumentsByVersion = splitByVersion(bundledDocuments); + const mergedByVersion = new Map(); + + for (const [apiVersion, singleVersionBundledDocuments] of bundledDocumentsByVersion.entries()) { + const oasVersion = extractOasVersion(singleVersionBundledDocuments); + const mergedDocument = blankOasFactory(oasVersion, apiVersion); + + mergedDocument.paths = mergePaths(singleVersionBundledDocuments); + mergedDocument.components = { + // Copy components defined in the blank OpenAPI document + ...mergedDocument.components, + ...mergeSharedComponents(singleVersionBundledDocuments), + }; + + mergedByVersion.set(mergedDocument.info.version, mergedDocument); + } + + return mergedByVersion; +} + +function splitByVersion(bundledDocuments: BundledDocument[]): Map { + const splitBundledDocuments = new Map(); + + for (const bundledDocument of bundledDocuments) { + const documentInfo = bundledDocument.document.info as OpenAPIV3.InfoObject; + + if (!documentInfo.version) { + logger.warning(`OpenAPI version is missing in ${chalk.bold(bundledDocument.absolutePath)}`); + + continue; + } + + const versionBundledDocuments = splitBundledDocuments.get(documentInfo.version); + + if (!versionBundledDocuments) { + splitBundledDocuments.set(documentInfo.version, [bundledDocument]); + } else { + versionBundledDocuments.push(bundledDocument); + } + } + + return splitBundledDocuments; +} + +function extractOasVersion(bundledDocuments: BundledDocument[]): string { + if (bundledDocuments.length === 0) { + throw new Error('Empty bundled document list'); + } + + const firstBundledDocument = bundledDocuments[0]; + + for (let i = 1; i < bundledDocuments.length; ++i) { + if ( + !areOasVersionsEqual( + bundledDocuments[i].document.openapi as string, + firstBundledDocument.document.openapi as string + ) + ) { + throw new Error( + `OpenAPI specs must use the same OpenAPI version, encountered ${chalk.blue( + bundledDocuments[i].document.openapi + )} at ${chalk.bold(bundledDocuments[i].absolutePath)} does not match ${chalk.blue( + firstBundledDocument.document.openapi + )} at ${chalk.bold(firstBundledDocument.absolutePath)}` + ); + } + } + + const version = firstBundledDocument.document.openapi as string; + + // Automatically promote to the recent OAS 3.0 version which is 3.0.3 + // 3.0.3 is the version used in the specification https://swagger.io/specification/v3/ + return version < '3.0.3' ? '3.0.3' : version; +} + +/** + * Tells if versions are equal by comparing only major and minor OAS version parts + */ +function areOasVersionsEqual(versionA: string, versionB: string): boolean { + // versionA.substring(0, 3) results in `3.0` or `3.1` + return versionA.substring(0, 3) === versionB.substring(0, 3); +} diff --git a/packages/kbn-openapi-bundler/src/bundler/merge_documents/merge_paths.ts b/packages/kbn-openapi-bundler/src/bundler/merge_documents/merge_paths.ts new file mode 100644 index 0000000000000..1d541b5bb513e --- /dev/null +++ b/packages/kbn-openapi-bundler/src/bundler/merge_documents/merge_paths.ts @@ -0,0 +1,159 @@ +/* + * Copyright 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 chalk from 'chalk'; +import { OpenAPIV3 } from 'openapi-types'; +import { BundledDocument } from '../bundle_document'; + +export function mergePaths(bundledDocuments: BundledDocument[]): OpenAPIV3.PathsObject { + const mergedPaths: Record = {}; + + for (const { absolutePath, document } of bundledDocuments) { + if (!document.paths) { + continue; + } + + const pathsObject = document.paths as Record; + + for (const path of Object.keys(pathsObject)) { + if (!mergedPaths[path]) { + mergedPaths[path] = {}; + } + + const sourcePathItem = pathsObject[path]; + const mergedPathItem = mergedPaths[path]; + + try { + mergeOptionalPrimitiveValue('summary', sourcePathItem, mergedPathItem); + } catch { + throw new Error( + `❌ Unable to bundle ${chalk.bold(absolutePath)} since ${chalk.bold( + `paths.${path}.summary` + )}'s value ${chalk.blue( + sourcePathItem.summary + )} doesn't match to already encountered ${chalk.magenta(mergedPathItem.summary)}.` + ); + } + + try { + mergeOptionalPrimitiveValue('description', sourcePathItem, mergedPathItem); + } catch { + throw new Error( + `❌ Unable to bundle ${chalk.bold(absolutePath)} since ${chalk.bold( + `paths.${path}.description` + )}'s value ${chalk.blue( + sourcePathItem.description + )} doesn't match to already encountered ${chalk.magenta(mergedPathItem.description)}.` + ); + } + + try { + mergeOperations(sourcePathItem, mergedPathItem); + } catch (e) { + throw new Error( + `❌ Unable to bundle ${chalk.bold(absolutePath)} since ${chalk.bold( + `paths.${path}.${e.message}` + )}'s definition is duplicated and differs from previously encountered.` + ); + } + + try { + mergeParameters(sourcePathItem, mergedPathItem); + } catch (e) { + throw new Error( + `❌ Unable to bundle ${chalk.bold(absolutePath)} since ${chalk.bold( + `paths.${path}.parameters.[${e.message}]` + )}'s definition is duplicated and differs from previously encountered.` + ); + } + } + } + + return mergedPaths; +} + +const KNOWN_HTTP_METHODS = [ + OpenAPIV3.HttpMethods.HEAD, + OpenAPIV3.HttpMethods.GET, + OpenAPIV3.HttpMethods.POST, + OpenAPIV3.HttpMethods.PATCH, + OpenAPIV3.HttpMethods.PUT, + OpenAPIV3.HttpMethods.OPTIONS, + OpenAPIV3.HttpMethods.DELETE, + OpenAPIV3.HttpMethods.TRACE, +]; + +function mergeOperations( + sourcePathItem: OpenAPIV3.PathItemObject, + mergedPathItem: OpenAPIV3.PathItemObject +) { + for (const httpMethod of KNOWN_HTTP_METHODS) { + if (!sourcePathItem[httpMethod]) { + continue; + } + + if (mergedPathItem[httpMethod]) { + throw new Error(httpMethod); + } + + mergedPathItem[httpMethod] = sourcePathItem[httpMethod]; + } +} + +function mergeOptionalPrimitiveValue( + fieldName: FieldName, + source: { [field in FieldName]?: unknown }, + merged: { [field in FieldName]?: unknown } +): void { + if (!source[fieldName]) { + return; + } + + if (source[fieldName] && !merged[fieldName]) { + merged[fieldName] = source[fieldName]; + } + + if (source[fieldName] !== merged[fieldName]) { + throw new Error(`${fieldName} merge conflict`); + } +} + +function mergeParameters( + sourcePathItem: OpenAPIV3.PathItemObject, + mergedPathItem: OpenAPIV3.PathItemObject +): void { + if (!sourcePathItem.parameters) { + return; + } + + if (!mergedPathItem.parameters) { + mergedPathItem.parameters = []; + } + + for (const sourceParameter of sourcePathItem.parameters) { + if ('$ref' in sourceParameter) { + const existing = mergedPathItem.parameters.find( + (x) => '$ref' in x && x.$ref === sourceParameter.$ref + ); + + if (existing) { + continue; + } + } else { + const existing = mergedPathItem.parameters.find( + (x) => !('$ref' in x) && x.name === sourceParameter.name && x.in === sourceParameter.in + ); + + if (existing) { + throw new Error(`{ "name": "${sourceParameter.name}", "in": "${sourceParameter.in}" }`); + } + } + + mergedPathItem.parameters.push(sourceParameter); + } +} diff --git a/packages/kbn-openapi-bundler/src/bundler/merge_documents/merge_shared_components.ts b/packages/kbn-openapi-bundler/src/bundler/merge_documents/merge_shared_components.ts new file mode 100644 index 0000000000000..72f55645fa717 --- /dev/null +++ b/packages/kbn-openapi-bundler/src/bundler/merge_documents/merge_shared_components.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 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 { OpenAPIV3 } from 'openapi-types'; +import deepEqual from 'fast-deep-equal'; +import chalk from 'chalk'; +import { insertRefByPointer } from '../../utils/insert_by_json_pointer'; +import { ResolvedRef } from '../types'; +import { BundledDocument } from '../bundle_document'; + +export function mergeSharedComponents( + bundledDocuments: BundledDocument[] +): OpenAPIV3.ComponentsObject { + const componentsMap = new Map(); + const mergedComponents: Record = {}; + + for (const bundledDocument of bundledDocuments) { + mergeRefsToMap(bundledDocument.bundledRefs, componentsMap); + } + + for (const resolvedRef of componentsMap.values()) { + insertRefByPointer(resolvedRef.pointer, resolvedRef.refNode, mergedComponents); + } + + return mergedComponents; +} + +function mergeRefsToMap(bundledRefs: ResolvedRef[], componentsMap: Map): void { + for (const bundledRef of bundledRefs) { + const existingRef = componentsMap.get(bundledRef.pointer); + + if (!existingRef) { + componentsMap.set(bundledRef.pointer, bundledRef); + continue; + } + + if (deepEqual(existingRef.refNode, bundledRef.refNode)) { + continue; + } + + throw new Error( + `❌ Unable to bundle documents due to conflicts in references. Schema ${chalk.yellow( + bundledRef.pointer + )} is defined in ${chalk.blue(existingRef.absolutePath)} and in ${chalk.magenta( + bundledRef.absolutePath + )} but has not matching definitions.` + ); + } +} diff --git a/packages/kbn-openapi-bundler/src/bundler/process_document.test.ts b/packages/kbn-openapi-bundler/src/bundler/process_document.test.ts index d78a4ce515b65..fd6e73d4272c6 100644 --- a/packages/kbn-openapi-bundler/src/bundler/process_document.test.ts +++ b/packages/kbn-openapi-bundler/src/bundler/process_document.test.ts @@ -19,13 +19,13 @@ describe('processDocument', () => { document: {} as Document, }; const calls: string[] = []; - const processor1 = { - leave() { + const processor1: DocumentNodeProcessor = { + onNodeLeave() { calls.push('processor1'); }, }; - const processor2 = { - leave() { + const processor2: DocumentNodeProcessor = { + onNodeLeave() { calls.push('processor2'); }, }; @@ -46,14 +46,17 @@ describe('processDocument', () => { const calls: string[] = []; const refResolver = new RefResolver(); const processor: DocumentNodeProcessor = { - enter(node) { + onNodeEnter(node) { calls.push(`enter - ${(node as NodeWithId).id}`); + }, + shouldRemove(node) { + calls.push(`shouldRemove - ${(node as NodeWithId).id}`); return false; }, - ref(node) { + onRefNodeLeave(node) { calls.push(`ref - ${(node as NodeWithId).id}`); }, - leave(node) { + onNodeLeave(node) { calls.push(`leave - ${(node as NodeWithId).id}`); }, }; @@ -82,8 +85,11 @@ describe('processDocument', () => { ); expect(calls).toEqual([ + 'shouldRemove - root', 'enter - root', + 'shouldRemove - t1', 'enter - t1', + 'shouldRemove - TestRef', 'enter - TestRef', 'leave - TestRef', 'ref - t1', @@ -92,7 +98,7 @@ describe('processDocument', () => { ]); }); - it('removes a node after "enter" callback returned true', async () => { + it('removes a node after "shouldRemove" callback returned true', async () => { const nodeToRemove = { id: 't2', foo: 'bar', @@ -104,7 +110,7 @@ describe('processDocument', () => { t2: nodeToRemove, }; const removeNodeProcessor: DocumentNodeProcessor = { - enter(node) { + shouldRemove(node) { return node === nodeToRemove; }, }; diff --git a/packages/kbn-openapi-bundler/src/bundler/process_document.ts b/packages/kbn-openapi-bundler/src/bundler/process_document.ts index 1efe64b87b4ed..29344fa4aa7c5 100644 --- a/packages/kbn-openapi-bundler/src/bundler/process_document.ts +++ b/packages/kbn-openapi-bundler/src/bundler/process_document.ts @@ -67,11 +67,13 @@ export async function processDocument( traverseItem.visitedDocumentNodes.add(traverseItem.node); - if (shouldSkipNode(traverseItem, processors)) { + if (shouldRemoveSubTree(traverseItem, processors)) { removeNode(traverseItem); continue; } + applyEnterProcessors(traverseItem, processors); + postOrderTraversalStack.push(traverseItem); if (isRefNode(traverseItem.node)) { @@ -144,14 +146,14 @@ export async function processDocument( // If ref has been inlined by one of the processors it's not a ref node anymore // so we can skip the following processors if (isRefNode(traverseItem.node) && traverseItem.resolvedRef) { - processor.ref?.( + processor.onRefNodeLeave?.( traverseItem.node as RefNode, traverseItem.resolvedRef, traverseItem.context ); } - processor.leave?.(traverseItem.node, traverseItem.context); + processor.onNodeLeave?.(traverseItem.node, traverseItem.context); } } } @@ -165,9 +167,28 @@ export function isRefNode(node: DocumentNode): node is { $ref: string } { return isPlainObject(node) && '$ref' in node; } -function shouldSkipNode(traverseItem: TraverseItem, processors: DocumentNodeProcessor[]): boolean { - return processors?.some((p) => - p.enter?.(traverseItem.node, { +function applyEnterProcessors( + traverseItem: TraverseItem, + processors: DocumentNodeProcessor[] +): void { + for (const processor of processors) { + processor.onNodeEnter?.(traverseItem.node, { + ...traverseItem.context, + parentNode: traverseItem.parentNode, + parentKey: traverseItem.parentKey, + }); + } +} + +/** + * Removes a node with its subtree + */ +function shouldRemoveSubTree( + traverseItem: TraverseItem, + processors: DocumentNodeProcessor[] +): boolean { + return processors.some((p) => + p.shouldRemove?.(traverseItem.node, { ...traverseItem.context, parentNode: traverseItem.parentNode, parentKey: traverseItem.parentKey, diff --git a/packages/kbn-openapi-bundler/src/bundler/types.ts b/packages/kbn-openapi-bundler/src/bundler/types.ts index 06aa533c9122a..fa8a7f3c83120 100644 --- a/packages/kbn-openapi-bundler/src/bundler/types.ts +++ b/packages/kbn-openapi-bundler/src/bundler/types.ts @@ -94,41 +94,70 @@ export type TraverseDocumentEntryContext = TraverseDocumentContext & { }; /** - * Entry processor controls when a node should be omitted from the result document. + * Should remove processor controls whether a node and all its descendants + * should be omitted from the further processing and result document. + * + * When result is + * + * - `true` - omit the node + * - `false` - keep the node * - * When result is `true` - omit the node. */ -export type EntryProcessorFn = ( +export type ShouldRemoveNodeProcessorFn = ( node: Readonly, context: TraverseDocumentEntryContext ) => boolean; -export type LeaveProcessorFn = (node: DocumentNode, context: TraverseDocumentContext) => void; +export type OnNodeEntryProcessorFn = ( + node: Readonly, + context: TraverseDocumentEntryContext +) => void; + +export type OnNodeLeaveProcessorFn = (node: DocumentNode, context: TraverseDocumentContext) => void; -export type RefProcessorFn = ( +export type OnRefNodeLeaveProcessorFn = ( node: RefNode, resolvedRef: ResolvedRef, context: TraverseDocumentContext ) => void; /** + * OpenAPI tree is traversed in two phases + * + * 1. Diving from root to leaves. + * Allows to analyze unprocessed nodes and calculate any metrics if necessary. + * + * 2. Post order traversal from leaves to root. + * Mostly to transform the OpenAPI document. + * * Document or document node processor gives flexibility in modifying OpenAPI specs and/or collect some metrics. - * For convenience it defined handlers invoked upon action or specific node type. + * For convenience there are following node processors supported + * + * 1st phase + * + * - `onNodeEnter` - Callback function is invoked at the first phase (diving from root to leaves) while + * traversing the document. It can be considered in a similar way events dive in DOM during + * capture phase. In the other words it means entering a subtree. It allows to analyze + * unprocessed nodes. * - * Currently the following node types supported + * - `shouldRemove` - Callback function is invoked at the first phase (diving from root to leaves) while + * traversing the document. It controls whether the node will be excluded from further processing + * and the result document eventually. Returning `true` excluded the node while returning `false` + * passes the node untouched. * - * - ref - Callback function is invoked upon leaving ref node (a node having `$ref` key) + * 2nd phase * - * and the following actions + * - `onNodeLeave` - Callback function is invoked upon leaving any type of node. It give an opportunity to + * modify the document like inline references or remove unwanted properties. It can be considered + * in a similar way event bubble in DOM during bubble phase. In the other words it means leaving + * a subtree. * - * - enter - Callback function is invoked upon entering any type of node element including ref nodes. It doesn't allow - * to modify node's content but provides an ability to remove the element by returning `true`. + * - `onRefNodeLeave` - Callback function is invoked upon leaving a reference node (a node having `$ref` key) * - * - leave - Callback function is invoked upon leaving any type of node. It give an opportunity to modify the document like - * dereference refs or remove unwanted properties. */ export interface DocumentNodeProcessor { - enter?: EntryProcessorFn; - leave?: LeaveProcessorFn; - ref?: RefProcessorFn; + shouldRemove?: ShouldRemoveNodeProcessorFn; + onNodeEnter?: OnNodeEntryProcessorFn; + onNodeLeave?: OnNodeLeaveProcessorFn; + onRefNodeLeave?: OnRefNodeLeaveProcessorFn; } diff --git a/packages/kbn-openapi-bundler/src/openapi_bundler.test.ts b/packages/kbn-openapi-bundler/src/openapi_bundler.test.ts deleted file mode 100644 index eaed80727dee8..0000000000000 --- a/packages/kbn-openapi-bundler/src/openapi_bundler.test.ts +++ /dev/null @@ -1,162 +0,0 @@ -/* - * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one - * or more contributor license agreements. Licensed under the Elastic License - * 2.0 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 { existsSync, rmSync } from 'fs'; -import { basename, join } from 'path'; -import { bundle } from './openapi_bundler'; -import { readYamlDocument } from './utils/read_yaml_document'; - -const rootPath = join(__dirname, '__test__'); -const targetAbsoluteFilePath = join(rootPath, 'bundled.yaml'); - -describe('OpenAPI Bundler', () => { - afterEach(() => { - removeTargetFile(); - }); - - it('bundles two simple specs', async () => { - await bundleFolder('two_simple_specs'); - await expectBundleToMatchFile('two_simple_specs', 'expected.yaml'); - }); - - it('bundles one file with a local reference', async () => { - await bundleFolder('spec_with_local_ref'); - await expectBundleToMatchFile('spec_with_local_ref', 'expected.yaml'); - }); - - it('bundles one file with an external reference', async () => { - await bundleFolder('spec_with_external_ref'); - await expectBundleToMatchFile('spec_with_external_ref', 'expected.yaml'); - }); - - it('bundles files with external references', async () => { - await bundleFolder('two_specs_with_external_ref'); - await expectBundleToMatchFile('two_specs_with_external_ref', 'expected.yaml'); - }); - - // Fails because `writeYamlDocument()` has `noRefs: true` setting - // it('bundles recursive spec', async () => { - // await bundleFolder('recursive_spec'); - // await expectBundleToMatchFile('recursive_spec', 'expected.yaml'); - // }); - - it('bundles specs with recursive references', async () => { - await bundleFolder('recursive_ref_specs'); - await expectBundleToMatchFile('recursive_ref_specs', 'expected.yaml'); - }); - - it('bundles spec with a self-recursive reference', async () => { - await bundleFolder('self_recursive_ref'); - await expectBundleToMatchFile('self_recursive_ref', 'expected.yaml'); - }); - - it('bundles one endpoint with different versions', async () => { - await bundleFolder('different_endpoint_versions'); - await expectBundleToMatchFile('different_endpoint_versions', 'expected.yaml'); - }); - - it('bundles spec with different OpenAPI versions', async () => { - await bundleFolder('different_openapi_versions'); - await expectBundleToMatchFile('different_openapi_versions', 'expected.yaml'); - }); - - it('bundles conflicting but equal references', async () => { - await bundleFolder('conflicting_but_equal_refs_in_different_specs'); - await expectBundleToMatchFile('conflicting_but_equal_refs_in_different_specs', 'expected.yaml'); - }); - - it('fails to bundle conflicting references encountered in separate specs', async () => { - await expectBundlingError( - 'conflicting_refs_in_different_specs', - /\/components\/schemas\/ConflictTestSchema/ - ); - }); - - describe('x-modify', () => { - it('makes properties in an object node partial', async () => { - await bundleFolder('modify_partial_node'); - await expectBundleToMatchFile('modify_partial_node', 'expected.yaml'); - }); - - it('makes properties in a referenced object node partial', async () => { - await bundleFolder('modify_partial_ref'); - await expectBundleToMatchFile('modify_partial_ref', 'expected.yaml'); - }); - - it('makes properties in an object node required', async () => { - await bundleFolder('modify_required_node'); - await expectBundleToMatchFile('modify_required_node', 'expected.yaml'); - }); - - it('makes properties in a referenced object node required', async () => { - await bundleFolder('modify_required_ref'); - await expectBundleToMatchFile('modify_required_ref', 'expected.yaml'); - }); - }); - - describe('x-inline', () => { - it('inlines a reference', async () => { - await bundleFolder('inline_ref'); - await expectBundleToMatchFile('inline_ref', 'expected.yaml'); - }); - }); - - describe('skip internal', () => { - it('skips nodes with x-internal property', async () => { - await bundleFolder('skip_internal'); - await expectBundleToMatchFile('skip_internal', 'expected.yaml'); - }); - - it('skips endpoints starting with /internal', async () => { - await bundleFolder('skip_internal_endpoint'); - await expectBundleToMatchFile('skip_internal_endpoint', 'expected.yaml'); - }); - }); -}); - -async function bundleFolder(folderName: string): Promise { - await expect( - bundle({ - rootDir: join(rootPath, folderName), - sourceGlob: '*.schema.yaml', - outputFilePath: join('..', basename(targetAbsoluteFilePath)), - }) - ).resolves.toBeUndefined(); -} - -async function expectBundlingError( - folderName: string, - error: string | RegExp | jest.Constructable | Error | undefined -): Promise { - return await expect( - bundle({ - rootDir: join(rootPath, folderName), - sourceGlob: '*.schema.yaml', - outputFilePath: join('..', basename(targetAbsoluteFilePath)), - }) - ).rejects.toThrowError(error); -} - -async function expectBundleToMatchFile( - folderName: string, - expectedFileName: string -): Promise { - expect(existsSync(targetAbsoluteFilePath)).toBeTruthy(); - - const bundledSpec = await readYamlDocument(targetAbsoluteFilePath); - const expectedAbsoluteFilePath = join(rootPath, folderName, expectedFileName); - const expectedSpec = await readYamlDocument(expectedAbsoluteFilePath); - - expect(bundledSpec).toEqual(expectedSpec); -} - -function removeTargetFile(): void { - if (existsSync(targetAbsoluteFilePath)) { - rmSync(targetAbsoluteFilePath, { force: true }); - } -} diff --git a/packages/kbn-openapi-bundler/src/openapi_bundler.ts b/packages/kbn-openapi-bundler/src/openapi_bundler.ts index 451b0ff700bae..554758b622995 100644 --- a/packages/kbn-openapi-bundler/src/openapi_bundler.ts +++ b/packages/kbn-openapi-bundler/src/openapi_bundler.ts @@ -7,43 +7,75 @@ */ import chalk from 'chalk'; +import { isUndefined, omitBy } from 'lodash'; +import { OpenAPIV3 } from 'openapi-types'; import globby from 'globby'; -import { basename, dirname, join, resolve } from 'path'; +import { basename, dirname, resolve } from 'path'; import { BundledDocument, bundleDocument, SkipException } from './bundler/bundle_document'; import { mergeDocuments } from './bundler/merge_documents'; import { removeFilesByGlob } from './utils/remove_files_by_glob'; import { logger } from './logger'; import { writeYamlDocument } from './utils/write_yaml_document'; +import { createBlankOpenApiDocument } from './bundler/merge_documents/create_blank_oas_document'; export interface BundlerConfig { - rootDir: string; sourceGlob: string; outputFilePath: string; + specInfo?: Omit, 'version'>; } -export const bundle = async (config: BundlerConfig) => { - const { - rootDir, - sourceGlob, - outputFilePath: relativeOutputFilePath = 'target/openapi/bundled.schema.yaml', - } = config; - +export const bundle = async ({ + sourceGlob, + outputFilePath = 'bundled-{version}.schema.yaml', + specInfo, +}: BundlerConfig) => { logger.debug(chalk.bold(`Bundling API route schemas`)); - logger.debug(chalk.bold(`Working directory: ${chalk.underline(rootDir)}`)); - logger.debug(`👀 Searching for source files`); + logger.debug(`👀 Searching for source files in ${chalk.underline(sourceGlob)}`); - const outputFilePath = join(rootDir, relativeOutputFilePath); - const sourceFilesGlob = resolve(rootDir, sourceGlob); + const sourceFilesGlob = resolve(sourceGlob); const schemaFilePaths = await globby([sourceFilesGlob]); logger.info(`🕵️‍♀️ Found ${schemaFilePaths.length} schemas`); logSchemas(schemaFilePaths); logger.info(`🧹 Cleaning up any previously generated artifacts`); - await removeFilesByGlob(dirname(outputFilePath), basename(outputFilePath)); + await removeFilesByGlob( + dirname(outputFilePath), + basename(outputFilePath.replace('{version}', '*')) + ); logger.debug(`Processing schemas...`); + const resolvedDocuments = await resolveDocuments(schemaFilePaths); + + logger.success(`Processed ${resolvedDocuments.length} schemas`); + + const blankOasFactory = (oasVersion: string, apiVersion: string) => + createBlankOpenApiDocument(oasVersion, { + version: apiVersion, + title: specInfo?.title ?? 'Bundled OpenAPI specs', + ...omitBy( + { + description: specInfo?.description, + termsOfService: specInfo?.termsOfService, + contact: specInfo?.contact, + license: specInfo?.license, + }, + isUndefined + ), + }); + const resultDocumentsMap = await mergeDocuments(resolvedDocuments, blankOasFactory); + + await writeDocuments(resultDocumentsMap, outputFilePath); +}; + +function logSchemas(schemaFilePaths: string[]): void { + for (const filePath of schemaFilePaths) { + logger.debug(`Found OpenAPI spec ${chalk.bold(filePath)}`); + } +} + +async function resolveDocuments(schemaFilePaths: string[]): Promise { const resolvedDocuments = await Promise.all( schemaFilePaths.map(async (schemaFilePath) => { try { @@ -62,26 +94,9 @@ export const bundle = async (config: BundlerConfig) => { } }) ); - const processedDocuments = filterOutSkippedDocuments(resolvedDocuments); - logger.success(`Processed ${processedDocuments.length} schemas`); - - const resultDocument = await mergeDocuments(processedDocuments); - - try { - await writeYamlDocument(outputFilePath, resultDocument); - - logger.success(`📖 Wrote all bundled OpenAPI specs to ${chalk.bold(outputFilePath)}`); - } catch (e) { - logger.error(`Unable to save bundled document to ${chalk.bold(outputFilePath)}: ${e.message}`); - } -}; - -function logSchemas(schemaFilePaths: string[]): void { - for (const filePath of schemaFilePaths) { - logger.debug(`Found OpenAPI spec ${chalk.bold(filePath)}`); - } + return processedDocuments; } function filterOutSkippedDocuments( @@ -99,3 +114,34 @@ function filterOutSkippedDocuments( return processedDocuments; } + +async function writeDocuments( + resultDocumentsMap: Map, + outputFilePath: string +): Promise { + for (const [version, document] of resultDocumentsMap.entries()) { + const versionedOutputFilePath = getVersionedOutputFilePath(outputFilePath, version); + + try { + await writeYamlDocument(versionedOutputFilePath, document); + + logger.success(`📖 Wrote bundled OpenAPI specs to ${chalk.bold(versionedOutputFilePath)}`); + } catch (e) { + logger.error( + `Unable to save bundled document to ${chalk.bold(versionedOutputFilePath)}: ${e.message}` + ); + } + } +} + +function getVersionedOutputFilePath(outputFilePath: string, version: string): string { + const hasVersionPlaceholder = outputFilePath.indexOf('{version}') > -1; + + if (hasVersionPlaceholder) { + return outputFilePath.replace('{version}', version); + } + + const filename = basename(outputFilePath); + + return outputFilePath.replace(filename, `${version}-${filename}`); +} diff --git a/packages/kbn-openapi-bundler/src/utils/insert_by_json_pointer.ts b/packages/kbn-openapi-bundler/src/utils/insert_by_json_pointer.ts index 8538102305edc..161f548ad2cf9 100644 --- a/packages/kbn-openapi-bundler/src/utils/insert_by_json_pointer.ts +++ b/packages/kbn-openapi-bundler/src/utils/insert_by_json_pointer.ts @@ -10,16 +10,23 @@ * Inserts `data` into the location specified by pointer in the `document`. * * @param pointer [JSON Pointer](https://datatracker.ietf.org/doc/html/rfc6901) - * @param data An object to insert - * @param document A document to insert to + * @param component Component data to insert + * @param componentsObject Components object to insert to */ export function insertRefByPointer( pointer: string, - data: unknown, - document: Record + component: unknown, + componentsObject: Record ): void { + if (!pointer.startsWith('/components')) { + throw new Error( + `insertRefByPointer expected a pointer starting with "/components" but got ${pointer}` + ); + } + + // splitting '/components' by '/' gives ['', 'components'] which should be skipped const segments = pointer.split('/').slice(2); - let target = document; + let target = componentsObject; while (segments.length > 0) { const segment = segments.shift() as string; @@ -31,5 +38,5 @@ export function insertRefByPointer( target = target[segment] as Record; } - Object.assign(target, data); + Object.assign(target, component); } diff --git a/packages/kbn-openapi-bundler/src/utils/write_yaml_document.ts b/packages/kbn-openapi-bundler/src/utils/write_yaml_document.ts index bdcd783e1a214..45ad2d5987bad 100644 --- a/packages/kbn-openapi-bundler/src/utils/write_yaml_document.ts +++ b/packages/kbn-openapi-bundler/src/utils/write_yaml_document.ts @@ -12,7 +12,7 @@ import { dirname } from 'path'; export async function writeYamlDocument(filePath: string, document: unknown): Promise { try { - const yaml = dump(document, { noRefs: true }); + const yaml = stringifyToYaml(document); await fs.mkdir(dirname(filePath), { recursive: true }); await fs.writeFile(filePath, yaml); @@ -20,3 +20,21 @@ export async function writeYamlDocument(filePath: string, document: unknown): Pr throw new Error(`Unable to write bundled yaml: ${e.message}`, { cause: e }); } } + +function stringifyToYaml(document: unknown): string { + try { + // Disable YAML Anchors https://yaml.org/spec/1.2.2/#3222-anchors-and-aliases + // It makes YAML much more human readable + return dump(document, { noRefs: true }); + } catch (e) { + // RangeError might happened because of stack overflow + // due to circular references in the document + // since YAML Anchors are disabled + if (e instanceof RangeError) { + // Try to stringify with YAML Anchors enabled + return dump(document, { noRefs: false }); + } + + throw e; + } +} diff --git a/x-pack/plugins/security_solution/common/api/entity_analytics/risk_engine/engine_settings_route.schema.yaml b/x-pack/plugins/security_solution/common/api/entity_analytics/risk_engine/engine_settings_route.schema.yaml index aad2d49032856..cb67a3686822b 100644 --- a/x-pack/plugins/security_solution/common/api/entity_analytics/risk_engine/engine_settings_route.schema.yaml +++ b/x-pack/plugins/security_solution/common/api/entity_analytics/risk_engine/engine_settings_route.schema.yaml @@ -13,6 +13,7 @@ servers: paths: /engine/settings: + x-internal: true get: operationId: RiskEngineSettingsGet summary: Get the settings of the Risk Engine @@ -23,11 +24,11 @@ paths: application/json: schema: $ref: '#/components/schemas/RiskEngineSettingsResponse' - + components: schemas: RiskEngineSettingsResponse: type: object properties: range: - $ref: '../common/common.schema.yaml#/components/schemas/DateRange' \ No newline at end of file + $ref: '../common/common.schema.yaml#/components/schemas/DateRange' diff --git a/x-pack/plugins/security_solution/common/api/entity_analytics/risk_engine/entity_calculation_route.schema.yaml b/x-pack/plugins/security_solution/common/api/entity_analytics/risk_engine/entity_calculation_route.schema.yaml index 1229cf0fb6615..d776f6363a01e 100644 --- a/x-pack/plugins/security_solution/common/api/entity_analytics/risk_engine/entity_calculation_route.schema.yaml +++ b/x-pack/plugins/security_solution/common/api/entity_analytics/risk_engine/entity_calculation_route.schema.yaml @@ -15,6 +15,7 @@ servers: paths: /api/risk_scores/calculation/entity: + x-internal: true post: summary: Trigger calculation of Risk Scores for an entity description: Calculates and persists Risk Scores for an entity, returning the calculated risk score. @@ -44,7 +45,7 @@ components: - identifier_type properties: identifier: - description: Used to identify the entity. + description: Used to identify the entity. type: string example: 'my.host' identifier_type: @@ -56,11 +57,11 @@ components: description: If 'wait_for' the request will wait for the index refresh. RiskScoresEntityCalculationResponse: - type: object - required: - - success - properties: - success: - type: boolean - score: - $ref: './common.schema.yaml#/components/schemas/RiskScore' + type: object + required: + - success + properties: + success: + type: boolean + score: + $ref: './common.schema.yaml#/components/schemas/RiskScore' diff --git a/x-pack/plugins/security_solution/scripts/openapi/bundle.js b/x-pack/plugins/security_solution/scripts/openapi/bundle.js index 6cfa1507ea9ee..82280d0ef0ebf 100644 --- a/x-pack/plugins/security_solution/scripts/openapi/bundle.js +++ b/x-pack/plugins/security_solution/scripts/openapi/bundle.js @@ -7,12 +7,14 @@ require('../../../../../src/setup_node_env'); const { bundle } = require('@kbn/openapi-bundler'); -const { resolve } = require('path'); +const { join, resolve } = require('path'); const SECURITY_SOLUTION_ROOT = resolve(__dirname, '../..'); bundle({ - rootDir: SECURITY_SOLUTION_ROOT, - sourceGlob: './common/api/**/*.schema.yaml', - outputFilePath: './target/openapi/security_solution.bundled.schema.yaml', + sourceGlob: join(SECURITY_SOLUTION_ROOT, 'common/api/**/*.schema.yaml'), + outputFilePath: join( + SECURITY_SOLUTION_ROOT, + 'target/openapi/security_solution-{version}.bundled.schema.yaml' + ), }); From db48aa03b45e25151705df61d556ff3f8e30351d Mon Sep 17 00:00:00 2001 From: Konrad Szwarc Date: Wed, 8 May 2024 14:17:10 +0200 Subject: [PATCH 62/86] [EDR Workflows][E2E] Unskip artifacts FTR (#182787) closes https://github.com/elastic/kibana/issues/180493 I've noticed locally that the modal where we input the blocklist entries can sometimes get rerendered without any apparent reason. So, I've added a retry mechanism that, in case the input's value is not present, attempts to fill it out again. Failure example: https://buildkite.com/elastic/kibana-on-merge/builds/43629#018ed329-76ee-4512-aef6-5583b2cf830e Flaky test runner: x25 - https://buildkite.com/elastic/kibana-flaky-test-suite-runner/builds/5871 x75 - https://buildkite.com/elastic/kibana-flaky-test-suite-runner/builds/5873 --- .../apps/integrations/artifact_entries_list.ts | 13 ++++++++----- 1 file changed, 8 insertions(+), 5 deletions(-) diff --git a/x-pack/test/security_solution_endpoint/apps/integrations/artifact_entries_list.ts b/x-pack/test/security_solution_endpoint/apps/integrations/artifact_entries_list.ts index fc179681388ae..58ffde0d7611f 100644 --- a/x-pack/test/security_solution_endpoint/apps/integrations/artifact_entries_list.ts +++ b/x-pack/test/security_solution_endpoint/apps/integrations/artifact_entries_list.ts @@ -54,7 +54,7 @@ export default ({ getPageObjects, getService }: FtrProviderContext) => { describe('For each artifact list under management', function () { // It's flaky only in Serverless - targetTags(this, ['@ess', '@skipInServerless']); + targetTags(this, ['@ess', '@serverless']); this.timeout(60_000 * 5); let indexedData: IndexedHostsAndAlertsResponse; @@ -155,10 +155,13 @@ export default ({ getPageObjects, getService }: FtrProviderContext) => { } else if (formAction.type === 'click') { await testSubjects.click(formAction.selector); } else if (formAction.type === 'input') { - await testSubjects.setValue( - formAction.selector, - (formAction.value || '') + (suffix ? suffix : '') - ); + const newValue = (formAction.value || '') + (suffix ? suffix : ''); + await testSubjects.setValue(formAction.selector, newValue); + await testSubjects.getAttribute(formAction.selector, 'value').then((value) => { + if (value !== newValue) { + return testSubjects.setValue(formAction.selector, newValue); + } + }); } else if (formAction.type === 'clear') { await ( await (await testSubjects.find(formAction.selector)).findByCssSelector('button') From e9c3164da80d4720b7fe5910f1935bdf25c5834d Mon Sep 17 00:00:00 2001 From: Dima Arnautov Date: Wed, 8 May 2024 14:57:50 +0200 Subject: [PATCH 63/86] [ML] Anomaly swim lane - add / edit UX improvements (#182586) ## Summary Part of https://github.com/elastic/kibana/issues/178375 - Updates the anomaly swim lane add / edit flow with a single flyout. - Replaces custom edit action with the default one - Improves error handling, preventing an observable from completion on HTTP error image ### Checklist - [ ] [Documentation](https://www.elastic.co/guide/en/kibana/master/development-documentation.html) was added for features that require explanation or tutorials - [ ] [Unit or functional tests](https://www.elastic.co/guide/en/kibana/master/development-tests.html) were updated or added to match the most common scenarios - [ ] [Flaky Test Runner](https://ci-stats.kibana.dev/trigger_flaky_test_runner/1) was used on any tests changed - [x] Any UI touched in this PR is usable by keyboard only (learn more about [keyboard accessibility](https://webaim.org/techniques/keyboard/)) - [x] Any UI touched in this PR does not create any new axe failures (run axe in browser: [FF](https://addons.mozilla.org/en-US/firefox/addon/axe-devtools/), [Chrome](https://chrome.google.com/webstore/detail/axe-web-accessibility-tes/lhdoppojpmngadmnindnejefpokejbdd?hl=en-US)) - [ ] If a plugin configuration key changed, check if it needs to be allowlisted in the cloud and added to the [docker list](https://github.com/elastic/kibana/blob/main/src/dev/build/tasks/os_packages/docker_generator/resources/base/bin/kibana-docker) - [x] This renders correctly on smaller devices using a responsive layout. (You can test this [in your browser](https://www.browserstack.com/guide/responsive-testing-on-local-server)) - [x] This was checked for [cross-browser compatibility](https://www.elastic.co/support/matrix#matrix_browsers) --- .../ml/public/alerting/job_selector.tsx | 2 +- .../anomaly_swimlane_embeddable_factory.tsx | 25 +++ .../anomaly_swimlane_initializer.tsx | 170 +++++++++++++----- .../anomaly_swimlane_setup_flyout.tsx | 78 ++++---- .../initialize_swim_lane_data_fetcher.ts | 17 +- .../embeddables/anomaly_swimlane/types.ts | 2 + .../embeddables/common/get_jobs_observable.ts | 16 +- .../ml/public/ui_actions/create_swim_lane.tsx | 7 +- .../ui_actions/edit_swimlane_panel_action.tsx | 70 -------- x-pack/plugins/ml/public/ui_actions/index.ts | 6 +- .../translations/translations/fr-FR.json | 1 - .../translations/translations/ja-JP.json | 1 - .../translations/translations/zh-CN.json | 1 - 13 files changed, 223 insertions(+), 173 deletions(-) delete mode 100644 x-pack/plugins/ml/public/ui_actions/edit_swimlane_panel_action.tsx diff --git a/x-pack/plugins/ml/public/alerting/job_selector.tsx b/x-pack/plugins/ml/public/alerting/job_selector.tsx index bd28a15800cb3..5e1835ebfdfe1 100644 --- a/x-pack/plugins/ml/public/alerting/job_selector.tsx +++ b/x-pack/plugins/ml/public/alerting/job_selector.tsx @@ -29,7 +29,7 @@ export interface JobSelectorControlProps { /** * Validation is handled by alerting framework */ - errors: string[]; + errors?: string[]; /** Enables multiple selection of jobs and groups */ multiSelect?: boolean; label?: ReactNode; diff --git a/x-pack/plugins/ml/public/embeddables/anomaly_swimlane/anomaly_swimlane_embeddable_factory.tsx b/x-pack/plugins/ml/public/embeddables/anomaly_swimlane/anomaly_swimlane_embeddable_factory.tsx index 7306085b8d413..4b7e066d9416f 100644 --- a/x-pack/plugins/ml/public/embeddables/anomaly_swimlane/anomaly_swimlane_embeddable_factory.tsx +++ b/x-pack/plugins/ml/public/embeddables/anomaly_swimlane/anomaly_swimlane_embeddable_factory.tsx @@ -10,6 +10,7 @@ import { css } from '@emotion/react'; import type { StartServicesAccessor } from '@kbn/core/public'; import type { ReactEmbeddableFactory } from '@kbn/embeddable-plugin/public'; import type { TimeRange } from '@kbn/es-query'; +import { i18n } from '@kbn/i18n'; import { FormattedMessage } from '@kbn/i18n-react'; import { KibanaContextProvider } from '@kbn/kibana-react-plugin/public'; import { useTimeBuckets } from '@kbn/ml-time-buckets'; @@ -138,6 +139,30 @@ export const getAnomalySwimLaneEmbeddableFactory = ( const api = buildApi( { + isEditingEnabled: () => true, + getTypeDisplayName: () => + i18n.translate('xpack.ml.swimlaneEmbeddable.typeDisplayName', { + defaultMessage: 'swim lane', + }), + onEdit: async () => { + try { + const { resolveAnomalySwimlaneUserInput } = await import( + './anomaly_swimlane_setup_flyout' + ); + + const result = await resolveAnomalySwimlaneUserInput( + { ...coreStartServices, ...pluginsStartServices }, + { + ...serializeTitles(), + ...serializeSwimLaneState(), + } + ); + + swimLaneControlsApi.updateUserInput(result); + } catch (e) { + return Promise.reject(); + } + }, ...titlesApi, ...timeRangeApi, ...swimLaneControlsApi, diff --git a/x-pack/plugins/ml/public/embeddables/anomaly_swimlane/anomaly_swimlane_initializer.tsx b/x-pack/plugins/ml/public/embeddables/anomaly_swimlane/anomaly_swimlane_initializer.tsx index b4dd02be726a6..64c0d9db7b7b7 100644 --- a/x-pack/plugins/ml/public/embeddables/anomaly_swimlane/anomaly_swimlane_initializer.tsx +++ b/x-pack/plugins/ml/public/embeddables/anomaly_swimlane/anomaly_swimlane_initializer.tsx @@ -5,53 +5,101 @@ * 2.0. */ -import type { FC } from 'react'; -import React, { useState } from 'react'; +import React, { type FC, useEffect, useRef, useState } from 'react'; import { EuiButton, EuiButtonEmpty, EuiButtonGroup, + EuiFieldText, + EuiFlexGroup, + EuiFlexItem, + EuiFlyoutBody, + EuiFlyoutFooter, + EuiFlyoutHeader, EuiForm, EuiFormRow, - EuiModalBody, - EuiModalFooter, - EuiModalHeader, - EuiModalHeaderTitle, EuiSelect, - EuiFieldText, - EuiModal, + EuiTitle, } from '@elastic/eui'; import { FormattedMessage } from '@kbn/i18n-react'; import { i18n } from '@kbn/i18n'; +import useMountedState from 'react-use/lib/useMountedState'; +import { useMlLink } from '../../application/contexts/kibana'; +import { ML_PAGES } from '../../../common/constants/locator'; +import type { MlApiServices } from '../../application/services/ml_api_service'; +import { extractInfluencers } from '../../../common/util/job_utils'; +import { JobSelectorControl } from '../../alerting/job_selector'; import type { SwimlaneType } from '../../application/explorer/explorer_constants'; -import { SWIMLANE_TYPE } from '../../application/explorer/explorer_constants'; -import type { AnomalySwimlaneEmbeddableUserInput, AnomalySwimLaneEmbeddableState } from '..'; +import { SWIMLANE_TYPE, VIEW_BY_JOB_LABEL } from '../../application/explorer/explorer_constants'; +import type { AnomalySwimLaneEmbeddableState, AnomalySwimlaneEmbeddableUserInput } from '..'; +import { getDefaultSwimlanePanelTitle } from './anomaly_swimlane_embeddable'; -export type ExplicitInput = Omit; +export type ExplicitInput = AnomalySwimlaneEmbeddableUserInput; export interface AnomalySwimlaneInitializerProps { - defaultTitle: string; - influencers: string[]; initialInput?: Partial< - Pick + Pick >; onCreate: (swimlaneProps: ExplicitInput) => void; onCancel: () => void; + adJobsApiService: MlApiServices['jobs']; } +const getJobSelectionErrors = (jobIds: string[]) => { + if (jobIds.length === 0) { + return [ + i18n.translate('xpack.ml.swimlaneEmbeddable.setupModal.jobSelectionRequiredError', { + defaultMessage: 'Job selection is required', + }), + ]; + } +}; + export const AnomalySwimlaneInitializer: FC = ({ - defaultTitle, - influencers, onCreate, onCancel, initialInput, + adJobsApiService, }) => { - const [panelTitle, setPanelTitle] = useState(defaultTitle); + const isMounted = useMountedState(); + + const titleManuallyChanged = useRef(!!initialInput?.title); + + const [jobIds, setJobIds] = useState(initialInput?.jobIds ?? []); + + const [influencers, setInfluencers] = useState([VIEW_BY_JOB_LABEL]); + + useEffect( + function updateInfluencers() { + async function fetchInfluencers() { + const jobs = await adJobsApiService.jobs(jobIds); + if (isMounted()) { + setInfluencers([...extractInfluencers(jobs), VIEW_BY_JOB_LABEL]); + } + } + + if (jobIds.length > 0) { + fetchInfluencers(); + } + }, + [adJobsApiService, isMounted, jobIds] + ); + + const [panelTitle, setPanelTitle] = useState(initialInput?.title ?? ''); const [swimlaneType, setSwimlaneType] = useState( initialInput?.swimlaneType ?? SWIMLANE_TYPE.OVERALL ); const [viewBySwimlaneFieldName, setViewBySwimlaneFieldName] = useState(initialInput?.viewBy); + useEffect( + function updateDefaultTitle() { + if (!titleManuallyChanged.current) { + setPanelTitle(getDefaultSwimlanePanelTitle(jobIds)); + } + }, + [initialInput?.title, jobIds] + ); + const swimlaneTypeOptions = [ { id: SWIMLANE_TYPE.OVERALL, @@ -76,30 +124,49 @@ export const AnomalySwimlaneInitializer: FC = ( const isPanelTitleValid = panelTitle.length > 0; + const jobIdsErrors = getJobSelectionErrors(jobIds); + const isFormValid = isPanelTitleValid && + !jobIdsErrors && (swimlaneType === SWIMLANE_TYPE.OVERALL || (swimlaneType === SWIMLANE_TYPE.VIEW_BY && !!viewBySwimlaneFieldName)); const resultInput = { + jobIds, panelTitle, swimlaneType, ...(viewBySwimlaneFieldName ? { viewBy: viewBySwimlaneFieldName } : {}), }; + const newJobUrl = useMlLink({ page: ML_PAGES.ANOMALY_DETECTION_CREATE_JOB }); + return ( - - - - - - + <> + + +

+ +

+
+
- + + { + setJobIds([...(update?.jobIds ?? []), ...(update?.groupIds ?? [])]); + }} + errors={jobIdsErrors} + /> + = ( /> } isInvalid={!isPanelTitleValid} + fullWidth > setPanelTitle(e.target.value)} + onChange={(e) => { + titleManuallyChanged.current = true; + setPanelTitle(e.target.value); + }} isInvalid={!isPanelTitleValid} + fullWidth /> @@ -125,6 +197,7 @@ export const AnomalySwimlaneInitializer: FC = ( defaultMessage="Swim lane type" /> } + fullWidth > = ( label={ } + fullWidth > = ( )} - + - - - - - - - - - -
+ + + + + + + + + + + + + + + ); }; diff --git a/x-pack/plugins/ml/public/embeddables/anomaly_swimlane/anomaly_swimlane_setup_flyout.tsx b/x-pack/plugins/ml/public/embeddables/anomaly_swimlane/anomaly_swimlane_setup_flyout.tsx index 596da35f66d4c..56eaed3e9a271 100644 --- a/x-pack/plugins/ml/public/embeddables/anomaly_swimlane/anomaly_swimlane_setup_flyout.tsx +++ b/x-pack/plugins/ml/public/embeddables/anomaly_swimlane/anomaly_swimlane_setup_flyout.tsx @@ -8,53 +8,63 @@ import React from 'react'; import type { CoreStart } from '@kbn/core/public'; import { toMountPoint } from '@kbn/react-kibana-mount'; -import type { DataViewsContract } from '@kbn/data-views-plugin/public'; -import { extractInfluencers } from '../../../common/util/job_utils'; -import { VIEW_BY_JOB_LABEL } from '../../application/explorer/explorer_constants'; +import { KibanaContextProvider } from '@kbn/kibana-react-plugin/public'; +import { distinctUntilChanged, from, skip, takeUntil } from 'rxjs'; +import { jobsApiProvider } from '../../application/services/ml_api_service/jobs'; import { AnomalySwimlaneInitializer } from './anomaly_swimlane_initializer'; -import { getDefaultSwimlanePanelTitle } from './anomaly_swimlane_embeddable'; import { HttpService } from '../../application/services/http_service'; -import type { AnomalySwimlaneEmbeddableUserInput, AnomalySwimLaneEmbeddableState } from '..'; -import { resolveJobSelection } from '../common/resolve_job_selection'; -import { mlApiServicesProvider } from '../../application/services/ml_api_service'; +import type { AnomalySwimLaneEmbeddableState, AnomalySwimlaneEmbeddableUserInput } from '..'; export async function resolveAnomalySwimlaneUserInput( coreStart: CoreStart, - dataViews: DataViewsContract, input?: Partial ): Promise { - const { http, overlays, ...startServices } = coreStart; - - const { getJobs } = mlApiServicesProvider(new HttpService(http)); + const { + http, + overlays, + application: { currentAppId$ }, + ...startServices + } = coreStart; return new Promise(async (resolve, reject) => { try { - const { jobIds } = await resolveJobSelection(coreStart, dataViews, input?.jobIds); - const title = input?.title ?? getDefaultSwimlanePanelTitle(jobIds); - const { jobs } = await getJobs({ jobId: jobIds.join(',') }); - const influencers = extractInfluencers(jobs); - influencers.push(VIEW_BY_JOB_LABEL); - const modalSession = overlays.openModal( + const adJobsApiService = jobsApiProvider(new HttpService(http)); + + const flyoutSession = overlays.openFlyout( toMountPoint( - { - modalSession.close(); - resolve({ - jobIds, - ...explicitInput, - }); - }} - onCancel={() => { - modalSession.close(); - reject(); - }} - />, + + { + flyoutSession.close(); + resolve(explicitInput); + }} + onCancel={() => { + flyoutSession.close(); + reject(); + }} + /> + , startServices - ) + ), + { + type: 'push', + ownFocus: true, + size: 's', + onClose: () => { + flyoutSession.close(); + reject(); + }, + } ); + + // Close the flyout when user navigates out of the current plugin + currentAppId$ + .pipe(skip(1), takeUntil(from(flyoutSession.onClose)), distinctUntilChanged()) + .subscribe(() => { + flyoutSession.close(); + }); } catch (error) { reject(error); } diff --git a/x-pack/plugins/ml/public/embeddables/anomaly_swimlane/initialize_swim_lane_data_fetcher.ts b/x-pack/plugins/ml/public/embeddables/anomaly_swimlane/initialize_swim_lane_data_fetcher.ts index f10afe8e874c0..6946215b0c452 100644 --- a/x-pack/plugins/ml/public/embeddables/anomaly_swimlane/initialize_swim_lane_data_fetcher.ts +++ b/x-pack/plugins/ml/public/embeddables/anomaly_swimlane/initialize_swim_lane_data_fetcher.ts @@ -8,14 +8,15 @@ import type { estypes } from '@elastic/elasticsearch'; import type { TimeRange } from '@kbn/es-query'; import type { PublishesUnifiedSearch } from '@kbn/presentation-publishing'; -import type { Observable } from 'rxjs'; import { BehaviorSubject, catchError, combineLatest, debounceTime, + EMPTY, from, map, + type Observable, of, shareReplay, skipWhile, @@ -55,7 +56,9 @@ export const initializeSwimLaneDataFetcher = ( const selectedJobs$ = getJobsObservable( swimLaneApi.jobIds.pipe(map((jobIds) => ({ jobIds }))), anomalyDetectorService, - (error) => blockingError.next(error) + (error) => { + blockingError.next(error); + } ).pipe(shareReplay(1)); const swimLaneInput$ = combineLatest({ @@ -105,7 +108,7 @@ export const initializeSwimLaneDataFetcher = ( } catch (e) { // handle query syntax errors blockingError.next(e); - return of(undefined); + return EMPTY; } return from( @@ -146,12 +149,12 @@ export const initializeSwimLaneDataFetcher = ( ); } return of(overallSwimlaneData); + }), + catchError((error) => { + blockingError.next(error); + return EMPTY; }) ); - }), - catchError((error) => { - blockingError.next(error); - return of(undefined); }) ) .subscribe((data) => { diff --git a/x-pack/plugins/ml/public/embeddables/anomaly_swimlane/types.ts b/x-pack/plugins/ml/public/embeddables/anomaly_swimlane/types.ts index 9e24c02f49c2b..cde7ff1350687 100644 --- a/x-pack/plugins/ml/public/embeddables/anomaly_swimlane/types.ts +++ b/x-pack/plugins/ml/public/embeddables/anomaly_swimlane/types.ts @@ -7,6 +7,7 @@ import { isPopulatedObject } from '@kbn/ml-is-populated-object'; import type { + HasEditCapabilities, PublishesDataViews, PublishesUnifiedSearch, PublishesWritablePanelTitle, @@ -41,6 +42,7 @@ export type AnomalySwimLaneEmbeddableApi = MlEmbeddableBaseApi v.jobIds), distinctUntilChanged(isEqual), - switchMap((jobsIds) => anomalyDetectorService.getJobs$(jobsIds)), + switchMap((jobsIds) => + anomalyDetectorService.getJobs$(jobsIds).pipe( + catchError((e) => { + // Catch error to prevent the observable from completing + setErrorHandler(e.body ?? e); + return EMPTY; + }) + ) + ), map((jobs) => { const explorerJobs: ExplorerJob[] = jobs.map((job) => { const bucketSpan = parseInterval(job.analysis_config.bucket_span!); @@ -33,10 +41,6 @@ export function getJobsObservable( }; }); return explorerJobs; - }), - catchError((e) => { - setErrorHandler(e.body ?? e); - return of(undefined); }) ); } diff --git a/x-pack/plugins/ml/public/ui_actions/create_swim_lane.tsx b/x-pack/plugins/ml/public/ui_actions/create_swim_lane.tsx index 1bb54b776e140..a2acc14dbe7de 100644 --- a/x-pack/plugins/ml/public/ui_actions/create_swim_lane.tsx +++ b/x-pack/plugins/ml/public/ui_actions/create_swim_lane.tsx @@ -56,14 +56,17 @@ export function createAddSwimlanePanelAction( const presentationContainerParent = await parentApiIsCompatible(context.embeddable); if (!presentationContainerParent) throw new IncompatibleActionError(); - const [coreStart, deps] = await getStartServices(); + const [coreStart, pluginStart] = await getStartServices(); try { const { resolveAnomalySwimlaneUserInput } = await import( '../embeddables/anomaly_swimlane/anomaly_swimlane_setup_flyout' ); - const initialState = await resolveAnomalySwimlaneUserInput(coreStart, deps.data.dataViews); + const initialState = await resolveAnomalySwimlaneUserInput({ + ...coreStart, + ...pluginStart, + }); presentationContainerParent.addNewPanel({ panelType: ANOMALY_SWIMLANE_EMBEDDABLE_TYPE, diff --git a/x-pack/plugins/ml/public/ui_actions/edit_swimlane_panel_action.tsx b/x-pack/plugins/ml/public/ui_actions/edit_swimlane_panel_action.tsx deleted file mode 100644 index 3612446e8f5af..0000000000000 --- a/x-pack/plugins/ml/public/ui_actions/edit_swimlane_panel_action.tsx +++ /dev/null @@ -1,70 +0,0 @@ -/* - * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one - * or more contributor license agreements. Licensed under the Elastic License - * 2.0; you may not use this file except in compliance with the Elastic License - * 2.0. - */ - -import { i18n } from '@kbn/i18n'; -import type { EmbeddableApiContext } from '@kbn/presentation-publishing'; -import type { UiActionsActionDefinition } from '@kbn/ui-actions-plugin/public'; -import { IncompatibleActionError } from '@kbn/ui-actions-plugin/public'; -import type { AnomalySwimLaneEmbeddableApi } from '../embeddables/anomaly_swimlane/types'; -import type { MlCoreSetup } from '../plugin'; -import { isSwimLaneEmbeddableContext } from '../embeddables/anomaly_swimlane/types'; - -export const EDIT_SWIMLANE_PANEL_ACTION = 'editSwimlanePanelAction'; - -export type EditSwimlanePanelActionContext = EmbeddableApiContext & { - embeddable: AnomalySwimLaneEmbeddableApi; -}; - -export function createEditSwimlanePanelAction( - getStartServices: MlCoreSetup['getStartServices'] -): UiActionsActionDefinition { - return { - id: 'edit-anomaly-swimlane', - type: EDIT_SWIMLANE_PANEL_ACTION, - order: 50, - getIconType(): string { - return 'pencil'; - }, - getDisplayName: () => - i18n.translate('xpack.ml.actions.editSwimlaneTitle', { - defaultMessage: 'Edit swim lane', - }), - async execute(context) { - if (!isSwimLaneEmbeddableContext(context)) { - throw new IncompatibleActionError(); - } - - const [coreStart, deps] = await getStartServices(); - - try { - const { resolveAnomalySwimlaneUserInput } = await import( - '../embeddables/anomaly_swimlane/anomaly_swimlane_setup_flyout' - ); - - const { jobIds, viewBy, swimlaneType, panelTitle } = context.embeddable; - - const result = await resolveAnomalySwimlaneUserInput(coreStart, deps.data.dataViews, { - jobIds: jobIds.getValue(), - swimlaneType: swimlaneType.getValue(), - viewBy: viewBy.getValue(), - title: panelTitle?.getValue(), - }); - - context.embeddable.updateUserInput(result); - context.embeddable.setPanelTitle(result.panelTitle); - } catch (e) { - return Promise.reject(); - } - }, - async isCompatible(context: EmbeddableApiContext) { - return ( - isSwimLaneEmbeddableContext(context) && - context.embeddable.parentApi?.viewMode?.getValue() === 'edit' - ); - }, - }; -} diff --git a/x-pack/plugins/ml/public/ui_actions/index.ts b/x-pack/plugins/ml/public/ui_actions/index.ts index 15014205b8c83..41cdc5dcf6c4f 100644 --- a/x-pack/plugins/ml/public/ui_actions/index.ts +++ b/x-pack/plugins/ml/public/ui_actions/index.ts @@ -16,7 +16,6 @@ import { createApplyTimeRangeSelectionAction } from './apply_time_range_action'; import { createClearSelectionAction } from './clear_selection_action'; import { createAddSwimlanePanelAction } from './create_swim_lane'; import { createEditAnomalyChartsPanelAction } from './edit_anomaly_charts_panel_action'; -import { createEditSwimlanePanelAction } from './edit_swimlane_panel_action'; import { createEditSingleMetricViewerPanelAction } from './edit_single_metric_viewer_panel_action'; import { createAddSingleMetricViewerPanelAction } from './create_single_metric_viewer'; import { @@ -29,12 +28,11 @@ import { createVisToADJobAction } from './open_vis_in_ml_action'; import { entityFieldSelectionTrigger, EXPLORER_ENTITY_FIELD_SELECTION_TRIGGER, - swimLaneSelectionTrigger, SWIM_LANE_SELECTION_TRIGGER, + swimLaneSelectionTrigger, } from './triggers'; export { APPLY_INFLUENCER_FILTERS_ACTION } from './apply_influencer_filters_action'; export { APPLY_TIME_RANGE_SELECTION_ACTION } from './apply_time_range_action'; -export { EDIT_SWIMLANE_PANEL_ACTION } from './edit_swimlane_panel_action'; export { OPEN_IN_ANOMALY_EXPLORER_ACTION } from './open_in_anomaly_explorer_action'; export { CREATE_LENS_VIS_TO_ML_AD_JOB_ACTION } from './open_vis_in_ml_action'; export { SWIM_LANE_SELECTION_TRIGGER }; @@ -50,7 +48,6 @@ export function registerMlUiActions( core.getStartServices ); const addSwimlanePanelAction = createAddSwimlanePanelAction(core.getStartServices); - const editSwimlanePanelAction = createEditSwimlanePanelAction(core.getStartServices); const editSingleMetricViewerPanelAction = createEditSingleMetricViewerPanelAction( core.getStartServices ); @@ -74,7 +71,6 @@ export function registerMlUiActions( // Assign triggers uiActions.addTriggerAction('ADD_PANEL_TRIGGER', addSingleMetricViewerPanelAction); uiActions.addTriggerAction('ADD_PANEL_TRIGGER', addSwimlanePanelAction); - uiActions.addTriggerAction(CONTEXT_MENU_TRIGGER, editSwimlanePanelAction); uiActions.addTriggerAction(CONTEXT_MENU_TRIGGER, editSingleMetricViewerPanelAction); uiActions.addTriggerAction(CONTEXT_MENU_TRIGGER, editExplorerPanelAction); uiActions.addTriggerAction(CONTEXT_MENU_TRIGGER, openInExplorerAction); diff --git a/x-pack/plugins/translations/translations/fr-FR.json b/x-pack/plugins/translations/translations/fr-FR.json index 4814b1be2d6a2..d55f8f3384724 100644 --- a/x-pack/plugins/translations/translations/fr-FR.json +++ b/x-pack/plugins/translations/translations/fr-FR.json @@ -25593,7 +25593,6 @@ "xpack.ml.actions.createADJobFromLens": "Créer une tâche de détection des anomalies", "xpack.ml.actions.createADJobFromPatternAnalysis": "Créer une tâche de catégorisation et de détection des anomalies", "xpack.ml.actions.editAnomalyChartsTitle": "Modifier les graphiques d'anomalies", - "xpack.ml.actions.editSwimlaneTitle": "Modifier le couloir", "xpack.ml.actions.openInAnomalyExplorerTitle": "Ouvrir dans Anomaly Explorer", "xpack.ml.actions.runPatternAnalysis.description": "Déclenché lorsque l'utilisateur souhaite effectuer une analyse du modèle sur un champ.", "xpack.ml.actions.runPatternAnalysis.title": "Exécuter l'analyse du modèle", diff --git a/x-pack/plugins/translations/translations/ja-JP.json b/x-pack/plugins/translations/translations/ja-JP.json index 31af4836bd0ff..0842ddc97c8c9 100644 --- a/x-pack/plugins/translations/translations/ja-JP.json +++ b/x-pack/plugins/translations/translations/ja-JP.json @@ -25566,7 +25566,6 @@ "xpack.ml.actions.createADJobFromLens": "異常検知ジョブの作成", "xpack.ml.actions.createADJobFromPatternAnalysis": "分類異常検知ジョブを作成", "xpack.ml.actions.editAnomalyChartsTitle": "異常グラフを編集", - "xpack.ml.actions.editSwimlaneTitle": "スイムレーンの編集", "xpack.ml.actions.openInAnomalyExplorerTitle": "異常エクスプローラーで開く", "xpack.ml.actions.runPatternAnalysis.description": "ユーザーがフィールドに対してパターン分析を実行する場合にトリガーされます。", "xpack.ml.actions.runPatternAnalysis.title": "パターン分析を実行", diff --git a/x-pack/plugins/translations/translations/zh-CN.json b/x-pack/plugins/translations/translations/zh-CN.json index ba71fe0550888..b8a8545e1d5ce 100644 --- a/x-pack/plugins/translations/translations/zh-CN.json +++ b/x-pack/plugins/translations/translations/zh-CN.json @@ -25604,7 +25604,6 @@ "xpack.ml.actions.createADJobFromLens": "创建异常检测作业", "xpack.ml.actions.createADJobFromPatternAnalysis": "创建归类异常检测作业", "xpack.ml.actions.editAnomalyChartsTitle": "编辑异常图表", - "xpack.ml.actions.editSwimlaneTitle": "编辑泳道", "xpack.ml.actions.openInAnomalyExplorerTitle": "在 Anomaly Explorer 中打开", "xpack.ml.actions.runPatternAnalysis.description": "在用户希望对字段运行模式分析时触发。", "xpack.ml.actions.runPatternAnalysis.title": "运行模式分析", From 71784ade41cf0d5665c72579fc2d6e10b97eed03 Mon Sep 17 00:00:00 2001 From: Sergi Massaneda Date: Wed, 8 May 2024 15:09:35 +0200 Subject: [PATCH 64/86] [Security Solution] Unify app mount on plugin start (#182863) ## Summary - Removes unnecessary calls from the UI assistant management mount handler. Namely, `registerActions` and `registerAlertsTableConfiguration`. - Duplicated code in application mount functions extracted to the new `async mountDependencies` function. - Translation extracted. - Code reorganized. --- .../public/common/translations.ts | 7 + .../security_solution/public/plugin.tsx | 150 ++++++++---------- .../public/plugin_services.ts | 6 +- 3 files changed, 76 insertions(+), 87 deletions(-) diff --git a/x-pack/plugins/security_solution/public/common/translations.ts b/x-pack/plugins/security_solution/public/common/translations.ts index ee0172e01b281..126aa4eabe3b0 100644 --- a/x-pack/plugins/security_solution/public/common/translations.ts +++ b/x-pack/plugins/security_solution/public/common/translations.ts @@ -15,6 +15,13 @@ export const SOLUTION_NAME = i18n.translate('xpack.securitySolution.pages.common defaultMessage: 'Security', }); +export const ASSISTANT_MANAGEMENT_TITLE = i18n.translate( + 'xpack.securitySolution.securityAiAssistantManagement.app.title', + { + defaultMessage: 'AI Assistant for Security', + } +); + export const BETA = i18n.translate('xpack.securitySolution.pages.common.beta', { defaultMessage: 'Beta', }); diff --git a/x-pack/plugins/security_solution/public/plugin.tsx b/x-pack/plugins/security_solution/public/plugin.tsx index cfb981c85c84b..8707f9cf190bf 100644 --- a/x-pack/plugins/security_solution/public/plugin.tsx +++ b/x-pack/plugins/security_solution/public/plugin.tsx @@ -16,7 +16,6 @@ import type { CoreStart, PluginInitializerContext, Plugin as IPlugin, - AppMount, } from '@kbn/core/public'; import { DEFAULT_APP_CATEGORIES } from '@kbn/core/public'; import { Storage } from '@kbn/kibana-utils-plugin/public'; @@ -33,7 +32,7 @@ import type { StartedSubPlugins, StartPluginsDependencies, } from './types'; -import { SOLUTION_NAME } from './common/translations'; +import { SOLUTION_NAME, ASSISTANT_MANAGEMENT_TITLE } from './common/translations'; import { APP_ID, APP_UI_ID, APP_PATH, APP_ICON_SOLUTION } from '../common/constants'; @@ -94,93 +93,18 @@ export class Plugin implements IPlugin { - // required to show the alert table inside cases - const { alertsTableConfigurationRegistry } = plugins.triggersActionsUi; - const { registerAlertsTableConfiguration } = - await this.lazyRegisterAlertsTableConfiguration(); - registerAlertsTableConfiguration(alertsTableConfigurationRegistry, this.storage); - - const [coreStart, startPlugins] = await core.getStartServices(); - const subPlugins = await this.startSubPlugins(this.storage, coreStart, startPlugins); - const store = await this.store(coreStart, startPlugins, subPlugins); - const services = await this.services.generateServices(coreStart, startPlugins); - await this.registerActions(store, params.history, core, services); - - const { renderApp } = await this.lazyApplicationDependencies(); - const { ManagementSettings } = await this.lazyAssistantSettingsManagement(); - - return renderApp({ - ...params, - services, - store, - usageCollection: plugins.usageCollection, - children: , - }); - }, - }); - } - } - - const mount: AppMount = async (params) => { + // Lazily instantiate subPlugins and initialize services + const mountDependencies = async (params?: AppMountParameters) => { + const { renderApp } = await this.lazyApplicationDependencies(); const [coreStart, startPlugins] = await core.getStartServices(); - const services = await this.services.generateServices(coreStart, startPlugins, params); const subPlugins = await this.startSubPlugins(this.storage, coreStart, startPlugins); const store = await this.store(coreStart, startPlugins, subPlugins); - const { renderApp } = await this.lazyApplicationDependencies(); - const { getSubPluginRoutesByCapabilities } = await this.lazyHelpersForRoutes(); - - await this.registerActions(store, params.history, core, services); - await this.registerAlertsTableConfiguration(triggersActionsUi); - - const subPluginRoutes = getSubPluginRoutesByCapabilities(subPlugins, services); - - return renderApp({ ...params, services, store, usageCollection, subPluginRoutes }); + const services = await this.services.generateServices(coreStart, startPlugins, params); + return { renderApp, subPlugins, store, services }; }; // Register main Security Solution plugin @@ -192,7 +116,17 @@ export class Plugin implements IPlugin { + const { renderApp, services, store, subPlugins } = await mountDependencies(params); + const { getSubPluginRoutesByCapabilities } = await this.lazyHelpersForRoutes(); + + await this.registerActions(store, params.history, core, services); + await this.registerAlertsTableConfiguration(triggersActionsUi); + + const subPluginRoutes = getSubPluginRoutesByCapabilities(subPlugins, services); + + return renderApp({ ...params, services, store, usageCollection, subPluginRoutes }); + }, }); // Register legacy SIEM app for backward compatibility @@ -215,7 +149,53 @@ export class Plugin implements IPlugin { + const { renderApp, services, store } = await mountDependencies(); + const { ManagementSettings } = await this.lazyAssistantSettingsManagement(); + + return renderApp({ + ...params, + services, + store, + usageCollection, + children: , + }); + }, + }); + + cases?.attachmentFramework.registerExternalReference( getExternalReferenceAttachmentEndpointRegular() ); diff --git a/x-pack/plugins/security_solution/public/plugin_services.ts b/x-pack/plugins/security_solution/public/plugin_services.ts index 1ce2292e2d9bf..38ac65c08c8be 100644 --- a/x-pack/plugins/security_solution/public/plugin_services.ts +++ b/x-pack/plugins/security_solution/public/plugin_services.ts @@ -138,17 +138,19 @@ export class PluginServices { apm, configSettings: this.configSettings, savedObjectsTagging: savedObjectsTaggingOss.getTaggingApi(), - ...(params?.setHeaderActionMenu ? { setHeaderActionMenu: params.setHeaderActionMenu } : {}), storage: this.storage, sessionStorage: this.sessionStorage, security: startPlugins.security, - ...(params?.onAppLeave ? { onAppLeave: params.onAppLeave } : {}), securityLayout: { getPluginWrapper: () => SecuritySolutionTemplateWrapper }, contentManagement: startPlugins.contentManagement, telemetry: this.telemetry.start(), customDataService, timelineDataService, topValuesPopover: new TopValuesPopoverService(), + ...(params && { + onAppLeave: params.onAppLeave, + setHeaderActionMenu: params.setHeaderActionMenu, + }), }; } From 27fdb2def7867ddc1d11b2a9d491e11fa07d1ac4 Mon Sep 17 00:00:00 2001 From: Dario Gieselaar Date: Wed, 8 May 2024 15:10:33 +0200 Subject: [PATCH 65/86] [Obs AI Assistant] Fix auto-generation of titles (#182923) If the LLM doesn't send the title_conversation in a single go, `getGeneratedTitle` fails, because it doesn't wait until the message has been fully completed. This PR fixes that issue, and adds tests, and also improves quote matching. --- .../operators/get_generated_title.test.ts | 215 ++++++++++++++++++ .../client/operators/get_generated_title.ts | 22 +- 2 files changed, 227 insertions(+), 10 deletions(-) create mode 100644 x-pack/plugins/observability_solution/observability_ai_assistant/server/service/client/operators/get_generated_title.test.ts diff --git a/x-pack/plugins/observability_solution/observability_ai_assistant/server/service/client/operators/get_generated_title.test.ts b/x-pack/plugins/observability_solution/observability_ai_assistant/server/service/client/operators/get_generated_title.test.ts new file mode 100644 index 0000000000000..9fec3657a7fcc --- /dev/null +++ b/x-pack/plugins/observability_solution/observability_ai_assistant/server/service/client/operators/get_generated_title.test.ts @@ -0,0 +1,215 @@ +/* + * Copyright 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 { filter, lastValueFrom, of, throwError, toArray } from 'rxjs'; +import { + ChatCompletionChunkEvent, + Message, + MessageRole, + StreamingChatResponseEventType, +} from '../../../../common'; +import { ChatEvent } from '../../../../common/conversation_complete'; +import { getGeneratedTitle } from './get_generated_title'; + +describe('getGeneratedTitle', () => { + const messages: Message[] = [ + { + '@timestamp': new Date().toISOString(), + message: { + content: 'A message', + role: MessageRole.User, + }, + }, + ]; + + function createChatCompletionChunk( + content: string | { content?: string; function_call?: { name: string; arguments: string } } + ): ChatCompletionChunkEvent { + const msg = typeof content === 'string' ? { content } : content; + + return { + type: StreamingChatResponseEventType.ChatCompletionChunk, + id: 'id', + message: msg, + }; + } + + function callGenerateTitle( + ...rest: [ChatEvent[]] | [{ responseLanguage?: string }, ChatEvent[]] + ) { + const options = rest.length === 1 ? {} : rest[0]; + const chunks = rest.length === 1 ? rest[0] : rest[1]; + + const chatSpy = jest.fn().mockImplementation(() => of(...chunks)); + + const title$ = getGeneratedTitle({ + chat: chatSpy, + logger: { + debug: jest.fn(), + error: jest.fn(), + }, + messages, + ...options, + }); + + return { chatSpy, title$ }; + } + + it('returns the given title as a string', async () => { + const { title$ } = callGenerateTitle([ + createChatCompletionChunk({ + function_call: { + name: 'title_conversation', + arguments: JSON.stringify({ title: 'My title' }), + }, + }), + ]); + + const title = await lastValueFrom( + title$.pipe(filter((event): event is string => typeof event === 'string')) + ); + + expect(title).toEqual('My title'); + }); + + it('calls chat with the user message', async () => { + const { chatSpy, title$ } = callGenerateTitle([ + createChatCompletionChunk({ + function_call: { + name: 'title_conversation', + arguments: JSON.stringify({ title: 'My title' }), + }, + }), + ]); + + await lastValueFrom(title$); + + const [name, params] = chatSpy.mock.calls[0]; + + expect(name).toEqual('generate_title'); + expect(params.messages.length).toBe(2); + expect(params.messages[1].message.content).toContain('A message'); + }); + + it('strips quotes from the title', async () => { + async function testTitle(title: string) { + const { title$ } = callGenerateTitle([ + createChatCompletionChunk({ + function_call: { + name: 'title_conversation', + arguments: JSON.stringify({ title }), + }, + }), + ]); + + return await lastValueFrom( + title$.pipe(filter((event): event is string => typeof event === 'string')) + ); + } + + expect(await testTitle(`"My title"`)).toEqual('My title'); + expect(await testTitle(`'My title'`)).toEqual('My title'); + expect(await testTitle(`"User's request for a title"`)).toEqual(`User's request for a title`); + }); + + it('mentions the given response language in the instruction', async () => { + const { chatSpy, title$ } = callGenerateTitle( + { + responseLanguage: 'Orcish', + }, + [ + createChatCompletionChunk({ + function_call: { + name: 'title_conversation', + arguments: JSON.stringify({ title: 'My title' }), + }, + }), + ] + ); + + await lastValueFrom(title$); + + const [, params] = chatSpy.mock.calls[0]; + expect(params.messages[0].message.content).toContain('Orcish'); + }); + + it('handles partial updates', async () => { + const { title$ } = callGenerateTitle([ + createChatCompletionChunk({ + function_call: { + name: 'title_conversation', + arguments: '', + }, + }), + createChatCompletionChunk({ + function_call: { + name: '', + arguments: JSON.stringify({ title: 'My title' }), + }, + }), + ]); + + const title = await lastValueFrom(title$); + + expect(title).toEqual('My title'); + }); + + it('ignores token count events and still passes them through', async () => { + const { title$ } = callGenerateTitle([ + createChatCompletionChunk({ + function_call: { + name: 'title_conversation', + arguments: JSON.stringify({ title: 'My title' }), + }, + }), + { + type: StreamingChatResponseEventType.TokenCount, + tokens: { + completion: 10, + prompt: 10, + total: 10, + }, + }, + ]); + + const events = await lastValueFrom(title$.pipe(toArray())); + + expect(events).toEqual([ + 'My title', + { + tokens: { + completion: 10, + prompt: 10, + total: 10, + }, + type: StreamingChatResponseEventType.TokenCount, + }, + ]); + }); + + it('handles errors in chat and falls back to the default title', async () => { + const chatSpy = jest + .fn() + .mockImplementation(() => throwError(() => new Error('Error generating title'))); + + const logger = { + debug: jest.fn(), + error: jest.fn(), + }; + + const title$ = getGeneratedTitle({ + chat: chatSpy, + logger, + messages, + }); + + const title = await lastValueFrom(title$); + + expect(title).toEqual('New conversation'); + + expect(logger.error).toHaveBeenCalledWith('Error generating title'); + }); +}); diff --git a/x-pack/plugins/observability_solution/observability_ai_assistant/server/service/client/operators/get_generated_title.ts b/x-pack/plugins/observability_solution/observability_ai_assistant/server/service/client/operators/get_generated_title.ts index f35e0716f1051..af8f0d15466f1 100644 --- a/x-pack/plugins/observability_solution/observability_ai_assistant/server/service/client/operators/get_generated_title.ts +++ b/x-pack/plugins/observability_solution/observability_ai_assistant/server/service/client/operators/get_generated_title.ts @@ -5,7 +5,7 @@ * 2.0. */ -import { catchError, map, Observable, of, tap } from 'rxjs'; +import { catchError, last, map, Observable, of, tap } from 'rxjs'; import { Logger } from '@kbn/logging'; import type { ObservabilityAIAssistantClient } from '..'; import { Message, MessageRole } from '../../../../common'; @@ -30,7 +30,7 @@ export function getGeneratedTitle({ responseLanguage?: string; messages: Message[]; chat: ChatFunctionWithoutConnectorAndTokenCount; - logger: Logger; + logger: Pick; }): Observable { return hideTokenCountEvents((hide) => chat('generate_title', { @@ -46,9 +46,11 @@ export function getGeneratedTitle({ '@timestamp': new Date().toISOString(), message: { role: MessageRole.User, - content: messages.slice(1).reduce((acc, curr) => { - return `${acc} ${curr.message.role}: ${curr.message.content}`; - }, 'Generate a title, using the title_conversation_function, based on the following conversation:\n\n'), + content: messages + .filter((msg) => msg.message.role !== MessageRole.System) + .reduce((acc, curr) => { + return `${acc} ${curr.message.role}: ${curr.message.content}`; + }, 'Generate a title, using the title_conversation_function, based on the following conversation:\n\n'), }, }, ], @@ -72,21 +74,21 @@ export function getGeneratedTitle({ }).pipe( hide(), concatenateChatCompletionChunks(), + last(), map((concatenatedMessage) => { - const input = + const title: string = (concatenatedMessage.message.function_call.name ? JSON.parse(concatenatedMessage.message.function_call.arguments).title : concatenatedMessage.message?.content) || ''; - // This regular expression captures a string enclosed in single or double quotes. + // This captures a string enclosed in single or double quotes. // It extracts the string content without the quotes. // Example matches: // - "Hello, World!" => Captures: Hello, World! // - 'Another Example' => Captures: Another Example // - JustTextWithoutQuotes => Captures: JustTextWithoutQuotes - const match = input.match(/^["']?([^"']+)["']?$/); - const title = match ? match[1] : input; - return title; + + return title.replace(/^"(.*)"$/g, '$1').replace(/^'(.*)'$/g, '$1'); }), tap((event) => { if (typeof event === 'string') { From 9ddc3c6aa836e9e5d3bdd30512f7de55d62a16d2 Mon Sep 17 00:00:00 2001 From: Drew Tate Date: Wed, 8 May 2024 07:53:47 -0600 Subject: [PATCH 66/86] [ES|QL] accept string constants for date args (#182856) ## Summary ## String constants in place of dates As of https://github.com/elastic/elasticsearch/pull/106932 string constants can always be used in place of dates. - `| eval date_extract("DAY_OF_WEEK", "2024-05-07T13:20:40.554Z")` - `| STATS AVG(salary) BY bucket = BUCKET(hire_date, 20, "1985-01-01T00:00:00Z", "1986-01-01T00:00:00Z") | SORT bucket` - `| eval date_diff("day", "2021-01-01", "2022-01-01")` ### Checklist - [x] [Unit or functional tests](https://www.elastic.co/guide/en/kibana/master/development-tests.html) were updated or added to match the most common scenarios Co-authored-by: Kibana Machine <42973632+kibanamachine@users.noreply.github.com> --- .../src/definitions/functions.ts | 42 ----------- .../src/shared/helpers.ts | 12 ++-- .../esql_validation_meta_tests.json | 70 ++++++++----------- .../src/validation/validation.test.ts | 18 +++-- 4 files changed, 52 insertions(+), 90 deletions(-) diff --git a/packages/kbn-esql-validation-autocomplete/src/definitions/functions.ts b/packages/kbn-esql-validation-autocomplete/src/definitions/functions.ts index bfa718353f6b2..205b2d158fd05 100644 --- a/packages/kbn-esql-validation-autocomplete/src/definitions/functions.ts +++ b/packages/kbn-esql-validation-autocomplete/src/definitions/functions.ts @@ -606,48 +606,6 @@ export const evalFunctionsDefinitions: FunctionDefinition[] = [ returnType: 'number', examples: [], }, - { - params: [ - { - name: 'unit', - type: 'string', - literalOptions: dateDiffOptions, - literalSuggestions: dateDiffSuggestions, - }, - { name: 'startTimestamp', type: 'string', constantOnly: true }, - { name: 'endTimestamp', type: 'date' }, - ], - returnType: 'number', - examples: [], - }, - { - params: [ - { - name: 'unit', - type: 'string', - literalOptions: dateDiffOptions, - literalSuggestions: dateDiffSuggestions, - }, - { name: 'startTimestamp', type: 'date' }, - { name: 'endTimestamp', type: 'string', constantOnly: true }, - ], - returnType: 'number', - examples: [], - }, - { - params: [ - { - name: 'unit', - type: 'string', - literalOptions: dateDiffOptions, - literalSuggestions: dateDiffSuggestions, - }, - { name: 'startTimestamp', type: 'string', constantOnly: true }, - { name: 'endTimestamp', type: 'string', constantOnly: true }, - ], - returnType: 'number', - examples: [], - }, ], }, { diff --git a/packages/kbn-esql-validation-autocomplete/src/shared/helpers.ts b/packages/kbn-esql-validation-autocomplete/src/shared/helpers.ts index 868e8f3f9212a..fb1d3d648142b 100644 --- a/packages/kbn-esql-validation-autocomplete/src/shared/helpers.ts +++ b/packages/kbn-esql-validation-autocomplete/src/shared/helpers.ts @@ -214,14 +214,18 @@ export function getCommandOption(optionName: CommandOptionsDefinition['name']) { ); } -function compareLiteralType(argTypes: string, item: ESQLLiteral) { +function compareLiteralType(argType: string, item: ESQLLiteral) { if (item.literalType !== 'string') { - return argTypes === item.literalType; + if (argType === item.literalType) { + return true; + } + return false; } - if (argTypes === 'chrono_literal') { + if (argType === 'chrono_literal') { return chronoLiterals.some(({ name }) => name === item.text); } - return argTypes === item.literalType; + // date-type parameters accept string literals because of ES auto-casting + return ['string', 'date'].includes(argType); } export function getColumnHit( diff --git a/packages/kbn-esql-validation-autocomplete/src/validation/esql_validation_meta_tests.json b/packages/kbn-esql-validation-autocomplete/src/validation/esql_validation_meta_tests.json index c9b89c0163111..660fff0bb7d8f 100644 --- a/packages/kbn-esql-validation-autocomplete/src/validation/esql_validation_meta_tests.json +++ b/packages/kbn-esql-validation-autocomplete/src/validation/esql_validation_meta_tests.json @@ -952,19 +952,6 @@ "error": [], "warning": [] }, - { - "query": "row var = date_extract(\"ALIGNED_DAY_OF_WEEK_IN_MONTH\", to_datetime(\"a\"))", - "error": [], - "warning": [] - }, - { - "query": "row var = date_extract(\"a\", \"a\")", - "error": [ - "Argument of [date_extract] must be [chrono_literal], found value [\"a\"] type [string]", - "Argument of [date_extract] must be [date], found value [\"a\"] type [string]" - ], - "warning": [] - }, { "query": "row var = date_format(now(), \"a\")", "error": [], @@ -975,19 +962,6 @@ "error": [], "warning": [] }, - { - "query": "row var = date_format(to_datetime(\"a\"), to_string(\"a\"))", - "error": [], - "warning": [] - }, - { - "query": "row var = date_format(\"a\", 5)", - "error": [ - "Argument of [date_format] must be [date], found value [\"a\"] type [string]", - "Argument of [date_format] must be [string], found value [5] type [number]" - ], - "warning": [] - }, { "query": "row var = date_parse(\"a\", \"a\")", "error": [], @@ -1021,19 +995,6 @@ "error": [], "warning": [] }, - { - "query": "row var = date_trunc(1 year, to_datetime(\"a\"))", - "error": [], - "warning": [] - }, - { - "query": "row var = date_trunc(\"a\", \"a\")", - "error": [ - "Argument of [date_trunc] must be [time_literal], found value [\"a\"] type [string]", - "Argument of [date_trunc] must be [date], found value [\"a\"] type [string]" - ], - "warning": [] - }, { "query": "row var = e()", "error": [], @@ -9121,6 +9082,37 @@ ], "warning": [] }, + { + "query": "from a_index | eval var = date_diff(\"year\", dateField, dateField)", + "error": [], + "warning": [] + }, + { + "query": "from a_index | eval date_diff(\"year\", dateField, dateField)", + "error": [], + "warning": [] + }, + { + "query": "from a_index | eval var = date_diff(\"year\", to_datetime(stringField), to_datetime(stringField))", + "error": [], + "warning": [] + }, + { + "query": "from a_index | eval date_diff(numberField, stringField, stringField)", + "error": [ + "Argument of [date_diff] must be [string], found value [numberField] type [number]", + "Argument of [date_diff] must be [date], found value [stringField] type [string]", + "Argument of [date_diff] must be [date], found value [stringField] type [string]" + ], + "warning": [] + }, + { + "query": "from a_index | eval date_diff(\"year\", dateField, dateField, extraArg)", + "error": [ + "Error: [date_diff] function expects exactly 3 arguments, got 4." + ], + "warning": [] + }, { "query": "from a_index | eval var = date_extract(\"ALIGNED_DAY_OF_WEEK_IN_MONTH\", dateField)", "error": [], diff --git a/packages/kbn-esql-validation-autocomplete/src/validation/validation.test.ts b/packages/kbn-esql-validation-autocomplete/src/validation/validation.test.ts index 578d3e9d79b6a..1d7d080b6c5c0 100644 --- a/packages/kbn-esql-validation-autocomplete/src/validation/validation.test.ts +++ b/packages/kbn-esql-validation-autocomplete/src/validation/validation.test.ts @@ -622,7 +622,17 @@ describe('validation logic', () => { // the right error message if ( params.every(({ type }) => type !== 'any') && - !['to_version', 'mv_sort', 'date_diff'].includes(name) + ![ + 'to_version', + 'mv_sort', + // skip the date functions because the row tests always throw in + // a string literal and expect it to be invalid for the date functions + // but it's always valid because ES will parse it as a date + 'date_diff', + 'date_extract', + 'date_format', + 'date_trunc', + ].includes(name) ) { // now test nested functions const fieldMappingWithNestedFunctions = getFieldMapping(params, { @@ -1289,7 +1299,6 @@ describe('validation logic', () => { ); }); for (const { name, signatures, ...rest } of numericOrStringFunctions) { - if (name === 'date_diff') continue; // date_diff is hard to test const supportedSignatures = signatures.filter(({ returnType }) => // TODO — not sure why the tests have this limitation... seems like any type // that can be part of a boolean expression should be allowed in a where clause @@ -1489,7 +1498,6 @@ describe('validation logic', () => { } for (const { name, alias, signatures, ...defRest } of evalFunctionsDefinitions) { - if (name === 'date_diff') continue; // date_diff is hard to test for (const { params, ...signRest } of signatures) { const fieldMapping = getFieldMapping(params); testErrorsAndWarnings( @@ -1561,7 +1569,7 @@ describe('validation logic', () => { // the right error message if ( params.every(({ type }) => type !== 'any') && - !['to_version', 'mv_sort', 'date_diff'].includes(name) + !['to_version', 'mv_sort'].includes(name) ) { // now test nested functions const fieldMappingWithNestedFunctions = getFieldMapping(params, { @@ -2251,7 +2259,7 @@ describe('validation logic', () => { // the right error message if ( params.every(({ type }) => type !== 'any') && - !['to_version', 'mv_sort', 'date_diff'].includes(name) + !['to_version', 'mv_sort'].includes(name) ) { // now test nested functions const fieldMappingWithNestedAggsFunctions = getFieldMapping(params, { From 187ed098750c68ee889f1c7c2156f41c163f262f Mon Sep 17 00:00:00 2001 From: Elastic Machine Date: Wed, 8 May 2024 15:01:26 +0100 Subject: [PATCH 67/86] [main] Sync bundled packages with Package Storage (#182938) Automated by https://buildkite.com/elastic/package-storage-infra-kibana-discover-release-branches/builds/677 --- fleet_packages.json | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/fleet_packages.json b/fleet_packages.json index 9f0b28f9da0a6..06a0f983657e5 100644 --- a/fleet_packages.json +++ b/fleet_packages.json @@ -42,12 +42,12 @@ }, { "name": "profiler_symbolizer", - "version": "8.12.0", + "version": "8.14.0", "forceAlignStackVersion": true }, { "name": "profiler_collector", - "version": "8.12.0", + "version": "8.14.0", "forceAlignStackVersion": true }, { From d38cf12fcad7455076afb8f2246e9751f932aca6 Mon Sep 17 00:00:00 2001 From: Larry Gregory Date: Wed, 8 May 2024 10:10:04 -0400 Subject: [PATCH 68/86] Bump @redocly/cli to version 1.12.0 (#182744) ## Summary Bump @redocly/cli to version `1.12.0`. [Changelog](https://redocly.com/docs/cli/changelog/) --- package.json | 2 +- renovate.json | 18 ++++++++++++++++++ yarn.lock | 35 +++++++++++++++++++++-------------- 3 files changed, 40 insertions(+), 15 deletions(-) diff --git a/package.json b/package.json index 6e385a82a6a8b..29487ced40a10 100644 --- a/package.json +++ b/package.json @@ -1373,7 +1373,7 @@ "@mapbox/vector-tile": "1.3.1", "@octokit/rest": "^16.35.0", "@parcel/watcher": "^2.1.0", - "@redocly/cli": "^1.6.0", + "@redocly/cli": "^1.12.0", "@statoscope/webpack-plugin": "^5.28.2", "@storybook/addon-a11y": "^6.5.16", "@storybook/addon-actions": "^6.5.16", diff --git a/renovate.json b/renovate.json index d07ce08ffa07d..9393a7b005225 100644 --- a/renovate.json +++ b/renovate.json @@ -157,6 +157,24 @@ ], "enabled": true }, + { + "groupName": "OpenAPI Spec", + "matchPackageNames": [ + "@redocly/cli" + ], + "reviewers": [ + "team:kibana-core" + ], + "matchBaseBranches": [ + "main" + ], + "labels": [ + "release_note:skip", + "Team:Core", + "backport:all-open" + ], + "enabled": true + }, { "groupName": "babel", "matchPackageNames": [ diff --git a/yarn.lock b/yarn.lock index ba830c1cdb1b6..7ff3debb76c7a 100644 --- a/yarn.lock +++ b/yarn.lock @@ -7752,15 +7752,17 @@ require-from-string "^2.0.2" uri-js "^4.2.2" -"@redocly/cli@^1.6.0": - version "1.6.0" - resolved "https://registry.yarnpkg.com/@redocly/cli/-/cli-1.6.0.tgz#d3f6c8d6822eead487c2cb814d131e17d05c961f" - integrity sha512-0naVFJGR2tVcpMIHSFRr2HAoyy70qMqDAP6kXcnOdkGkwLRJ8s/5n1STwsym/yZwNkhrt2M0cKT6KAMlTUeCeg== +"@redocly/cli@^1.12.0": + version "1.12.0" + resolved "https://registry.yarnpkg.com/@redocly/cli/-/cli-1.12.0.tgz#c2191e2d34161cdaf1fcb42d896fd4c5e3313ac8" + integrity sha512-k45WELRAvE0UbYPhEhUPq/T4WOCDx4zoCT3tLokCdnCyeUHgaDzNAzPM2qe5Y8m8k5FUYlNoPdND4PlvUhg9Wg== dependencies: - "@redocly/openapi-core" "1.6.0" + "@redocly/openapi-core" "1.12.0" + abort-controller "^3.0.0" chokidar "^3.5.1" colorette "^1.2.0" core-js "^3.32.1" + form-data "^4.0.0" get-port-please "^3.0.1" glob "^7.1.6" handlebars "^4.7.6" @@ -7774,13 +7776,18 @@ styled-components "^6.0.7" yargs "17.0.1" -"@redocly/openapi-core@1.6.0", "@redocly/openapi-core@^1.0.0-rc.2": - version "1.6.0" - resolved "https://registry.yarnpkg.com/@redocly/openapi-core/-/openapi-core-1.6.0.tgz#09aee5e21a9cbad08f3230ced16685d043a9b197" - integrity sha512-oao6Aey4peLKfagzWGb6N7OBI6CoDWEP4ka/XjrUNZw+UoKVVg3hVBXW4Vr3CJ2O8j6wEa2i+Lbb92VQQsoxwg== +"@redocly/config@^0.2.0": + version "0.2.0" + resolved "https://registry.yarnpkg.com/@redocly/config/-/config-0.2.0.tgz#c61fd0a8ccac330de398e26e8cac1a3fedbf9165" + integrity sha512-r0TqTPVXrxdvhpbOntWnJofOx0rC7u+A+tfC0KFwMtw38QCNb3pwodVjeLa7MT5Uu+fcPxfO119yLBj0QHvBuQ== + +"@redocly/openapi-core@1.12.0", "@redocly/openapi-core@^1.0.0-rc.2": + version "1.12.0" + resolved "https://registry.yarnpkg.com/@redocly/openapi-core/-/openapi-core-1.12.0.tgz#82047a92a138362c7f411046d855fdcde3a946b8" + integrity sha512-2Jfxv3iIk1JUwLSnLyewJ8GAsoxubROVieg13Sjo79TjuWaUBuI49j8GZqC08ljENqyEIp0JHReDjhKs4Snrhg== dependencies: "@redocly/ajv" "^8.11.0" - "@types/node" "^14.11.8" + "@redocly/config" "^0.2.0" colorette "^1.2.0" js-levenshtein "^1.1.6" js-yaml "^4.1.0" @@ -10268,7 +10275,7 @@ dependencies: "@types/node" "*" -"@types/node@*", "@types/node@20.10.5", "@types/node@>= 8", "@types/node@>=12.12.47", "@types/node@>=13.7.0", "@types/node@>=18.0.0", "@types/node@^14.0.10 || ^16.0.0", "@types/node@^14.11.8", "@types/node@^14.14.20 || ^16.0.0", "@types/node@^18.0.0", "@types/node@^18.11.18": +"@types/node@*", "@types/node@20.10.5", "@types/node@>= 8", "@types/node@>=12.12.47", "@types/node@>=13.7.0", "@types/node@>=18.0.0", "@types/node@^14.0.10 || ^16.0.0", "@types/node@^14.14.20 || ^16.0.0", "@types/node@^18.0.0", "@types/node@^18.11.18": version "20.10.5" resolved "https://registry.yarnpkg.com/@types/node/-/node-20.10.5.tgz#47ad460b514096b7ed63a1dae26fad0914ed3ab2" integrity sha512-nNPsNE65wjMxEKI93yOP+NPGGBJz/PoN3kZsVLee0XMiJolxSekEVD8wRwBUBqkwc7UWop0edW50yrCQW4CyRw== @@ -15738,9 +15745,9 @@ domhandler@^5.0.1, domhandler@^5.0.2, domhandler@^5.0.3: domelementtype "^2.3.0" dompurify@^2.2.8: - version "2.4.7" - resolved "https://registry.yarnpkg.com/dompurify/-/dompurify-2.4.7.tgz#277adeb40a2c84be2d42a8bcd45f582bfa4d0cfc" - integrity sha512-kxxKlPEDa6Nc5WJi+qRgPbOAbgTpSULL+vI3NUXsZMlkJxTqYI9wg5ZTay2sFrdZRWHPWNi+EdAhcJf81WtoMQ== + version "2.5.2" + resolved "https://registry.yarnpkg.com/dompurify/-/dompurify-2.5.2.tgz#e02be61d621bea36a76eb2beb23b043f347aa9c7" + integrity sha512-5vSyvxRAb45EoWwAktUT3AYqAwXK4FL7si22Cgj46U6ICsj/YJczCN+Bk7WNABIQmpWRymGfslMhrRUZkQNnqA== domutils@^2.0.0, domutils@^2.5.2, domutils@^2.8.0: version "2.8.0" From da78b1b4ef292854a23b98e29fddd771188f9e24 Mon Sep 17 00:00:00 2001 From: Kibana Machine <42973632+kibanamachine@users.noreply.github.com> Date: Wed, 8 May 2024 10:22:52 -0400 Subject: [PATCH 69/86] skip failing test suite (#182932) --- .../cypress/e2e/explore/navigation/search_bar.cy.ts | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/x-pack/test/security_solution_cypress/cypress/e2e/explore/navigation/search_bar.cy.ts b/x-pack/test/security_solution_cypress/cypress/e2e/explore/navigation/search_bar.cy.ts index 14afab3600f54..c11878fcc4916 100644 --- a/x-pack/test/security_solution_cypress/cypress/e2e/explore/navigation/search_bar.cy.ts +++ b/x-pack/test/security_solution_cypress/cypress/e2e/explore/navigation/search_bar.cy.ts @@ -23,7 +23,8 @@ import { getHostIpFilter } from '../../../objects/filter'; import { hostsUrl } from '../../../urls/navigation'; import { waitForAllHostsToBeLoaded } from '../../../tasks/hosts/all_hosts'; -describe('SearchBar', { tags: ['@ess', '@serverless'] }, () => { +// Failing: See https://github.com/elastic/kibana/issues/182932 +describe.skip('SearchBar', { tags: ['@ess', '@serverless'] }, () => { beforeEach(() => { login(); visitWithTimeRange(hostsUrl('allHosts')); From 099c909abc7a24ecefee93651fd3e245d13b279a Mon Sep 17 00:00:00 2001 From: Mykola Harmash Date: Wed, 8 May 2024 16:50:37 +0200 Subject: [PATCH 70/86] [Onboarding] Scroll to the top on the page when navigating to a quick start view (#182844) Closes https://github.com/elastic/kibana/issues/182157 - Adds a hook to watch for location path updates reset the page's scroll position --- .../public/application/experimental_onboarding_flow.tsx | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/x-pack/plugins/observability_solution/observability_onboarding/public/application/experimental_onboarding_flow.tsx b/x-pack/plugins/observability_solution/observability_onboarding/public/application/experimental_onboarding_flow.tsx index 265e1cf810476..f3eac58303425 100644 --- a/x-pack/plugins/observability_solution/observability_onboarding/public/application/experimental_onboarding_flow.tsx +++ b/x-pack/plugins/observability_solution/observability_onboarding/public/application/experimental_onboarding_flow.tsx @@ -7,7 +7,7 @@ import { i18n } from '@kbn/i18n'; import { QueryClient, QueryClientProvider } from '@tanstack/react-query'; -import React from 'react'; +import React, { useEffect } from 'react'; import { Route, Routes } from '@kbn/shared-ux-router'; import { useNavigate, useLocation } from 'react-router-dom-v5-compat'; import { EuiButtonEmpty, EuiPageTemplate, EuiSpacer } from '@elastic/eui'; @@ -22,6 +22,12 @@ import { CustomLogsPanel } from './quickstart_flows/custom_logs'; const queryClient = new QueryClient(); export function ExperimentalOnboardingFlow() { + const { pathname } = useLocation(); + + useEffect(() => { + window.scrollTo(0, 0); + }, [pathname]); + return ( Date: Wed, 8 May 2024 17:00:52 +0200 Subject: [PATCH 71/86] [ML] Enable transform health rule API tests (#182560) ## Summary Closes https://github.com/elastic/kibana/issues/177215 ### Checklist - [x] [Flaky Test Runner](https://ci-stats.kibana.dev/trigger_flaky_test_runner/1) was used on any tests changed --- .../group2/transform_rule_types/transform_health/rule.ts | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/x-pack/test/alerting_api_integration/spaces_only/tests/alerting/group2/transform_rule_types/transform_health/rule.ts b/x-pack/test/alerting_api_integration/spaces_only/tests/alerting/group2/transform_rule_types/transform_health/rule.ts index 318b8f99a61e0..d5a03d3d66cec 100644 --- a/x-pack/test/alerting_api_integration/spaces_only/tests/alerting/group2/transform_rule_types/transform_health/rule.ts +++ b/x-pack/test/alerting_api_integration/spaces_only/tests/alerting/group2/transform_rule_types/transform_health/rule.ts @@ -23,6 +23,7 @@ import { TRANSFORM_HEALTH_RESULTS } from '@kbn/transform-plugin/common/constants import { FtrProviderContext } from '../../../../../../common/ftr_provider_context'; import { getUrlPrefix, ObjectRemover } from '../../../../../../common/lib'; import { Spaces } from '../../../../../scenarios'; +import { runSoon } from '../../../group3/test_helpers'; const CONNECTOR_TYPE_ID = '.index'; const RULE_TYPE_ID = 'transform_health'; @@ -30,7 +31,7 @@ const ES_TEST_INDEX_SOURCE = 'transform-alert:transform-health'; const ES_TEST_INDEX_REFERENCE = '-na-'; const ES_TEST_OUTPUT_INDEX_NAME = `${ES_TEST_INDEX_NAME}-ts-output`; -const RULE_INTERVAL_SECONDS = 3; +const RULE_INTERVAL_SECONDS = 10000; interface CreateRuleParams { name: string; @@ -80,8 +81,7 @@ export default function ruleTests({ getService }: FtrProviderContext) { `.internal.alerts-transform.health.alerts-default-000001` ); - // Failing: See https://github.com/elastic/kibana/issues/177215 - describe.skip('rule', async () => { + describe('rule', async () => { const objectRemover = new ObjectRemover(supertest); let connectorId: string; const transformId = 'test_transform_01'; @@ -121,6 +121,8 @@ export default function ruleTests({ getService }: FtrProviderContext) { await stopTransform(transformId); + await runSoon({ id: ruleId, supertest, retry }); + log.debug('Checking created alerts...'); const docs = await waitForDocs(1); From 8805c4ea4ee5cdb9ddbb5a563cb2b1b86258a1c7 Mon Sep 17 00:00:00 2001 From: Yara Tercero Date: Wed, 8 May 2024 08:16:08 -0700 Subject: [PATCH 72/86] [Detection Engine][FTR] Get exceptions tests in MKI green (#182890) This PR: - Ensures we have the correct tags for the FTR tests within `detection_engine/exceptions` - Adds ticket references or comments where we need to skip a test in MKI --- .../exception_comments_serverless.ts | 3 ++- .../workflows/basic_license_essentials_tier/prebuilt_rules.ts | 4 +++- 2 files changed, 5 insertions(+), 2 deletions(-) diff --git a/x-pack/test/security_solution_api_integration/test_suites/detections_response/detection_engine/exceptions/workflows/basic_license_essentials_tier/exception_comments_serverless.ts b/x-pack/test/security_solution_api_integration/test_suites/detections_response/detection_engine/exceptions/workflows/basic_license_essentials_tier/exception_comments_serverless.ts index 9fd4433e01f38..cda1ed3ca1517 100644 --- a/x-pack/test/security_solution_api_integration/test_suites/detections_response/detection_engine/exceptions/workflows/basic_license_essentials_tier/exception_comments_serverless.ts +++ b/x-pack/test/security_solution_api_integration/test_suites/detections_response/detection_engine/exceptions/workflows/basic_license_essentials_tier/exception_comments_serverless.ts @@ -26,7 +26,8 @@ export default ({ getService }: FtrProviderContext) => { const log = getService('log'); const supertestWithoutAuth = getService('supertestWithoutAuth'); - describe('@serverless exception item comments - serverless specific behavior', () => { + // Skipping in MKI due to roles testing not yet being available + describe('@serverless @skipInServerlessMKI exception item comments - serverless specific behavior', () => { // FLAKY: https://github.com/elastic/kibana/issues/181507 describe.skip('Rule Exceptions', () => { afterEach(async () => { diff --git a/x-pack/test/security_solution_api_integration/test_suites/detections_response/detection_engine/exceptions/workflows/basic_license_essentials_tier/prebuilt_rules.ts b/x-pack/test/security_solution_api_integration/test_suites/detections_response/detection_engine/exceptions/workflows/basic_license_essentials_tier/prebuilt_rules.ts index 7ce1ec3bd5a3f..5ed8d5d66c5dc 100644 --- a/x-pack/test/security_solution_api_integration/test_suites/detections_response/detection_engine/exceptions/workflows/basic_license_essentials_tier/prebuilt_rules.ts +++ b/x-pack/test/security_solution_api_integration/test_suites/detections_response/detection_engine/exceptions/workflows/basic_license_essentials_tier/prebuilt_rules.ts @@ -37,7 +37,9 @@ export default ({ getService }: FtrProviderContext) => { const log = getService('log'); const es = getService('es'); - describe('@serverless @ess exceptions workflows for prebuilt rules', () => { + // See https://github.com/elastic/kibana/issues/182889 for details + // on skipping in MKI + describe('@serverless @ess @skipInServerlessMKI exceptions workflows for prebuilt rules', () => { describe('creating rules with exceptions', () => { beforeEach(async () => { await createAlertsIndex(supertest, log); From e7dc1fcd035bd3ed67fd61c46809b0afa088629b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Efe=20G=C3=BCrkan=20YALAMAN?= Date: Wed, 8 May 2024 17:17:15 +0200 Subject: [PATCH 73/86] [Search] Updated Notion native config to correct one (#182920) ## Summary Updated Notion native config to correct one as it was copied wrong previously. Thanks @praveen-elastic ### Checklist Delete any items that are not applicable to this PR. - [x] Any text added follows [EUI's writing guidelines](https://elastic.github.io/eui/#/guidelines/writing), uses sentence case text and includes [i18n support](https://github.com/elastic/kibana/blob/main/packages/kbn-i18n/README.md) - [ ] [Unit or functional tests](https://www.elastic.co/guide/en/kibana/master/development-tests.html) were updated or added to match the most common scenarios - [x] This renders correctly on smaller devices using a responsive layout. (You can test this [in your browser](https://www.browserstack.com/guide/responsive-testing-on-local-server)) - [x] This was checked for [cross-browser compatibility](https://www.elastic.co/support/matrix#matrix_browsers) --- .../types/native_connectors.ts | 67 ++++++++++--------- 1 file changed, 36 insertions(+), 31 deletions(-) diff --git a/packages/kbn-search-connectors/types/native_connectors.ts b/packages/kbn-search-connectors/types/native_connectors.ts index a044dd717ef4f..5f57f64f0a06f 100644 --- a/packages/kbn-search-connectors/types/native_connectors.ts +++ b/packages/kbn-search-connectors/types/native_connectors.ts @@ -2808,84 +2808,89 @@ export const NATIVE_CONNECTOR_DEFINITIONS: Record Date: Wed, 8 May 2024 17:49:20 +0200 Subject: [PATCH 74/86] github-issue: remove PR owner from the GitHub issue content (#182954) This will reduce the spam when the deployment happens --- .buildkite/scripts/steps/serverless/build_and_deploy.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.buildkite/scripts/steps/serverless/build_and_deploy.sh b/.buildkite/scripts/steps/serverless/build_and_deploy.sh index 8fb982c11d9bf..88ce6d9ea3bb4 100644 --- a/.buildkite/scripts/steps/serverless/build_and_deploy.sh +++ b/.buildkite/scripts/steps/serverless/build_and_deploy.sh @@ -154,7 +154,7 @@ $BUILDKITE_PULL_REQUEST ### Further details -Caused by @$GITHUB_PR_TRIGGER_USER using the github label in https://github.com/elastic/kibana/pull/$BUILDKITE_PULL_REQUEST +Caused by the GitHub label 'ci:project-deploy-observability' in https://github.com/elastic/kibana/pull/$BUILDKITE_PULL_REQUEST EOF GH_TOKEN="$GITHUB_TOKEN" \ From d2fef07b80b674d6a61cb64afdd5262cdb7fd794 Mon Sep 17 00:00:00 2001 From: Jon Date: Wed, 8 May 2024 11:11:53 -0500 Subject: [PATCH 75/86] [serverless] Remove screenshotting-plugin assets (#182694) This plugin is not enabled on serverless. We can't remove the entire plugin because the reporting plugin depends on it. We can remove specific assets that are not loaded. 402mb -> 280mb `docker pull docker.elastic.co/kibana-ci/kibana-serverless:pr-182694-35970c7fc1d8-arm64` Closes [#168524](https://github.com/elastic/kibana/issues/168524) --- .../docker_generator/templates/base/Dockerfile | 12 +++++++++--- 1 file changed, 9 insertions(+), 3 deletions(-) diff --git a/src/dev/build/tasks/os_packages/docker_generator/templates/base/Dockerfile b/src/dev/build/tasks/os_packages/docker_generator/templates/base/Dockerfile index 2284e504229a8..e42d2a7ec1dcd 100644 --- a/src/dev/build/tasks/os_packages/docker_generator/templates/base/Dockerfile +++ b/src/dev/build/tasks/os_packages/docker_generator/templates/base/Dockerfile @@ -25,21 +25,27 @@ RUN cd /tmp && \ https://{{publicArtifactSubdomain}}.elastic.co/downloads/kibana/{{artifactPrefix}}-$(arch).tar.gz && \ cd - {{/usePublicArtifact}} - {{^usePublicArtifact}} COPY {{artifactTarball}} /tmp/kibana.tar.gz {{/usePublicArtifact}} RUN mkdir /usr/share/kibana WORKDIR /usr/share/kibana -RUN tar --strip-components=1 -zxf /tmp/kibana.tar.gz +RUN tar \ +# Exclude serverless.yml disabled assets +{{#serverless}} + --exclude=screenshotting-plugin/chromium \ + --exclude=screenshotting-plugin/server/assets \ +{{/serverless}} + --strip-components=1 \ + -zxf /tmp/kibana.tar.gz # Ensure that group permissions are the same as user permissions. # This will help when relying on GID-0 to run Kibana, rather than UID-1000. # OpenShift does this, for example. # REF: https://docs.openshift.org/latest/creating_images/guidelines.html RUN chmod -R g=u /usr/share/kibana - {{#cloud}} + COPY {{filebeatTarball}} /tmp/filebeat.tar.gz COPY {{metricbeatTarball}} /tmp/metricbeat.tar.gz From fd44e1faf47e01631730c41bbc2fa4ab252fc916 Mon Sep 17 00:00:00 2001 From: Saikat Sarkar <132922331+saikatsarkar056@users.noreply.github.com> Date: Wed, 8 May 2024 10:22:58 -0600 Subject: [PATCH 76/86] [Semantic Text UI] Handle the case when the model is not yet downloaded (#182040) When the trained model is not yet downloaded, it can't be deployed. This PR has covered the following: - Download the model if it does not exist - Tests to support this change ### How to test the changes locally - Download the elasticsearch changes from GitHub [branch](https://github.com/elastic/elasticsearch/tree/feature/semantic-text) - Run the elasticsearch: `./gradlew :run -Drun.license_type=trial` - Download the changes of this PR in local kibana and do the following steps + Set isSemanticTextEnabled = true in this [location](https://github.com/elastic/kibana/pull/180246/files#diff-92f4739f8a4a6917951a1b6e1af21a96d54313eaa2b5ce4c0e0553dd2ee11fcaL80) + Run `yarn start` --- .../semantic_text/use_semantic_text.test.ts | 66 +++++++++++-- .../semantic_text/use_semantic_text.ts | 97 +++++++++++++------ x-pack/plugins/ml/public/index.ts | 1 + 3 files changed, 126 insertions(+), 38 deletions(-) diff --git a/x-pack/plugins/index_management/public/application/components/mappings_editor/components/document_fields/fields/create_field/semantic_text/use_semantic_text.test.ts b/x-pack/plugins/index_management/public/application/components/mappings_editor/components/document_fields/fields/create_field/semantic_text/use_semantic_text.test.ts index 349c13fe805c0..062c0b93c303e 100644 --- a/x-pack/plugins/index_management/public/application/components/mappings_editor/components/document_fields/fields/create_field/semantic_text/use_semantic_text.test.ts +++ b/x-pack/plugins/index_management/public/application/components/mappings_editor/components/document_fields/fields/create_field/semantic_text/use_semantic_text.test.ts @@ -13,10 +13,15 @@ import { act } from 'react-dom/test-utils'; const mlMock: any = { mlApi: { inferenceModels: { - createInferenceEndpoint: jest.fn(), + createInferenceEndpoint: jest.fn().mockResolvedValue({}), }, trainedModels: { - startModelAllocation: jest.fn(), + startModelAllocation: jest.fn().mockResolvedValue({}), + getTrainedModels: jest.fn().mockResolvedValue([ + { + fully_defined: true, + }, + ]), }, }, }; @@ -93,6 +98,11 @@ describe('useSemanticText', () => { result.current.handleSemanticText(mockFieldData); }); + expect(mlMock.mlApi.trainedModels.startModelAllocation).toHaveBeenCalledWith('.elser_model_2'); + expect(mockDispatch).toHaveBeenCalledWith({ + type: 'field.addSemanticText', + value: mockFieldData, + }); expect(mlMock.mlApi.inferenceModels.createInferenceEndpoint).toHaveBeenCalledWith( 'elser_model_2', 'text_embedding', @@ -105,16 +115,58 @@ describe('useSemanticText', () => { }, } ); - expect(mlMock.mlApi.trainedModels.startModelAllocation).toHaveBeenCalledWith('.elser_model_2'); - expect(mockDispatch).toHaveBeenCalledWith({ - type: 'field.addSemanticText', - value: mockFieldData, + }); + + it('should invoke the download api if the model does not exist', async () => { + const mlMockWithModelNotDownloaded: any = { + mlApi: { + inferenceModels: { + createInferenceEndpoint: jest.fn(), + }, + trainedModels: { + startModelAllocation: jest.fn(), + getTrainedModels: jest.fn().mockResolvedValue([ + { + fully_defined: false, + }, + ]), + installElasticTrainedModelConfig: jest.fn().mockResolvedValue({}), + }, + }, + }; + const { result } = renderHook(() => + useSemanticText({ + form, + setErrorsInTrainedModelDeployment: jest.fn(), + ml: mlMockWithModelNotDownloaded, + }) + ); + + await act(async () => { + result.current.handleSemanticText(mockFieldData); + }); + + expect( + mlMockWithModelNotDownloaded.mlApi.trainedModels.installElasticTrainedModelConfig + ).toHaveBeenCalledWith('.elser_model_2'); + expect( + mlMockWithModelNotDownloaded.mlApi.trainedModels.startModelAllocation + ).toHaveBeenCalledWith('.elser_model_2'); + expect( + mlMockWithModelNotDownloaded.mlApi.inferenceModels.createInferenceEndpoint + ).toHaveBeenCalledWith('elser_model_2', 'text_embedding', { + service: 'elasticsearch', + service_settings: { + num_allocations: 1, + num_threads: 1, + model_id: '.elser_model_2', + }, }); }); it('handles errors correctly', async () => { const mockError = new Error('Test error'); - mlMock.mlApi.inferenceModels.createInferenceEndpoint.mockImplementationOnce(() => { + mlMock.mlApi?.trainedModels.startModelAllocation.mockImplementationOnce(() => { throw mockError; }); diff --git a/x-pack/plugins/index_management/public/application/components/mappings_editor/components/document_fields/fields/create_field/semantic_text/use_semantic_text.ts b/x-pack/plugins/index_management/public/application/components/mappings_editor/components/document_fields/fields/create_field/semantic_text/use_semantic_text.ts index 9fe8e2a114645..dda1bfe794c97 100644 --- a/x-pack/plugins/index_management/public/application/components/mappings_editor/components/document_fields/fields/create_field/semantic_text/use_semantic_text.ts +++ b/x-pack/plugins/index_management/public/application/components/mappings_editor/components/document_fields/fields/create_field/semantic_text/use_semantic_text.ts @@ -6,7 +6,8 @@ */ import { i18n } from '@kbn/i18n'; -import { MlPluginStart } from '@kbn/ml-plugin/public'; +import { useCallback } from 'react'; +import { MlPluginStart, TrainedModelConfigResponse } from '@kbn/ml-plugin/public'; import React, { useEffect, useState } from 'react'; import { useComponentTemplatesContext } from '../../../../../../component_templates/component_templates_context'; import { useDispatch, useMappingsState } from '../../../../../mappings_state_context'; @@ -64,20 +65,37 @@ export function useSemanticText(props: UseSemanticTextProps) { } }, [form, inferenceId, inferenceToModelIdMap]); - const handleSemanticText = (data: Field) => { - data.inferenceId = inferenceValue; + const isModelDownloaded = useCallback( + async (modelId: string) => { + try { + const response: TrainedModelConfigResponse[] | undefined = + await ml?.mlApi?.trainedModels.getTrainedModels(modelId, { + include: 'definition_status', + }); + return !!response?.[0]?.fully_defined; + } catch (error) { + if (error.body.statusCode !== 404) { + throw error; + } + } + return false; + }, + [ml?.mlApi?.trainedModels] + ); + + const createInferenceEndpoint = ( + trainedModelId: string, + defaultInferenceEndpoint: boolean, + data: Field + ) => { if (data.inferenceId === undefined) { - return; - } - - const inferenceData = inferenceToModelIdMap?.[data.inferenceId]; - - if (!inferenceData) { - return; + throw new Error( + i18n.translate('xpack.idxMgmt.mappingsEditor.createField.undefinedInferenceIdError', { + defaultMessage: 'InferenceId is undefined while creating the inference endpoint.', + }) + ); } - const { trainedModelId, defaultInferenceEndpoint, isDeployed, isDeployable } = inferenceData; - if (trainedModelId && defaultInferenceEndpoint) { const modelConfig = { service: 'elasticsearch', @@ -87,28 +105,45 @@ export function useSemanticText(props: UseSemanticTextProps) { model_id: trainedModelId, }, }; - try { - ml?.mlApi?.inferenceModels?.createInferenceEndpoint( - data.inferenceId, - 'text_embedding', - modelConfig - ); - } catch (error) { - setErrorsInTrainedModelDeployment?.((prevItems) => [...prevItems, trainedModelId]); - toasts?.addError(error.body && error.body.message ? new Error(error.body.message) : error, { - title: i18n.translate( - 'xpack.idxMgmt.mappingsEditor.createField.inferenceEndpointCreationErrorTitle', - { - defaultMessage: 'Inference endpoint creation failed', - } - ), - }); - } + + ml?.mlApi?.inferenceModels?.createInferenceEndpoint( + data.inferenceId, + 'text_embedding', + modelConfig + ); } + }; + + const handleSemanticText = async (data: Field) => { + data.inferenceId = inferenceValue; + if (data.inferenceId === undefined) { + return; + } + + const inferenceData = inferenceToModelIdMap?.[data.inferenceId]; + + if (!inferenceData) { + return; + } + + const { trainedModelId, defaultInferenceEndpoint, isDeployed, isDeployable } = inferenceData; - if (isDeployable && trainedModelId && !isDeployed) { + if (isDeployable && trainedModelId) { try { - ml?.mlApi?.trainedModels.startModelAllocation(trainedModelId); + const modelDownloaded: boolean = await isModelDownloaded(trainedModelId); + + if (isDeployed) { + createInferenceEndpoint(trainedModelId, defaultInferenceEndpoint, data); + } else if (modelDownloaded) { + ml?.mlApi?.trainedModels + .startModelAllocation(trainedModelId) + .then(() => createInferenceEndpoint(trainedModelId, defaultInferenceEndpoint, data)); + } else { + ml?.mlApi?.trainedModels + .installElasticTrainedModelConfig(trainedModelId) + .then(() => ml?.mlApi?.trainedModels.startModelAllocation(trainedModelId)) + .then(() => createInferenceEndpoint(trainedModelId, defaultInferenceEndpoint, data)); + } toasts?.addSuccess({ title: i18n.translate( 'xpack.idxMgmt.mappingsEditor.createField.modelDeploymentStartedNotification', diff --git a/x-pack/plugins/ml/public/index.ts b/x-pack/plugins/ml/public/index.ts index 25bec18e80ab0..bf293e2228570 100755 --- a/x-pack/plugins/ml/public/index.ts +++ b/x-pack/plugins/ml/public/index.ts @@ -26,6 +26,7 @@ export const plugin: PluginInitializer< > = (initializerContext: PluginInitializerContext) => new MlPlugin(initializerContext); export type { MlPluginSetup, MlPluginStart }; +export type { TrainedModelConfigResponse } from '../common/types/trained_models'; export type { MlCapabilitiesResponse } from '../common/types/capabilities'; export type { MlSummaryJob } from '../common/types/anomaly_detection_jobs'; From 1852d981a00a8a07d78c51c5d9042cd2a64ca454 Mon Sep 17 00:00:00 2001 From: Liam Thompson <32779855+leemthompo@users.noreply.github.com> Date: Wed, 8 May 2024 18:29:17 +0200 Subject: [PATCH 77/86] [DOCS] Add Playground docs (#182692) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit ## Summary - Adds new **Playground** section to side nav ### [✨URL preview](https://kibana_bk_182692.docs-preview.app.elstc.co/guide/en/kibana/master/playground.html) --- docs/playground/images/chat-interface.png | Bin 0 -> 240099 bytes docs/playground/images/edit-query.png | Bin 0 -> 118636 bytes docs/playground/images/select-indices.png | Bin 0 -> 153669 bytes docs/playground/index.asciidoc | 203 ++++++++++++++++++ docs/playground/playground-context.asciidoc | 68 ++++++ docs/playground/playground-query.asciidoc | 51 +++++ .../playground-troubleshooting.asciidoc | 26 +++ docs/redirects.asciidoc | 7 +- docs/user/index.asciidoc | 2 + 9 files changed, 351 insertions(+), 6 deletions(-) create mode 100644 docs/playground/images/chat-interface.png create mode 100644 docs/playground/images/edit-query.png create mode 100644 docs/playground/images/select-indices.png create mode 100644 docs/playground/index.asciidoc create mode 100644 docs/playground/playground-context.asciidoc create mode 100644 docs/playground/playground-query.asciidoc create mode 100644 docs/playground/playground-troubleshooting.asciidoc diff --git a/docs/playground/images/chat-interface.png b/docs/playground/images/chat-interface.png new file mode 100644 index 0000000000000000000000000000000000000000..8f13fba59666ecb2981cc3b9e3e9859d100d6df4 GIT binary patch literal 240099 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�@MCK7&6eJI7e=;zS zEMgJfC3CW#Pl2+1SyLNiT8l*Lo9vQVmn^5fxQAG~4FdH8{oIWqj8WNoB~L*WNp?TX z=Va?;5YJzAuO$4QOHgqqfUeAs$?3tUV{f|vQ-NnPsJ5Edm!cPwl*Ai)IxYy?=6-m9 zY5~m>e(}0>?jrV6X3VYG-c)p*#QW7d5-oEbqhx;>qW=S6l71nbeL7s1#VkjmshTCk0vL!HRL7W~w+Kv}ZU#%O1ql!9Sd~2XJIG34Zr`bK35i-q08Y>8u z4`RSLd5YQDZ>|h+Uoc49ItY}nVT$h{CRL}pC^D0CaeJ#i8s#yoU2RbCAR-w{6Ebr7 z@8b;r+J~-pMAING2poxnJ1-EZ^8G>uzg3ezdI6*g1`>1~q!n)sxLJE8i~2jVbXgD+ zzl@!K^p)+#+9!gq9Jua2*4#vc7X!+o8yX4Q7{p10`H;zC-gkg#X4|Jp(!A`Dn9bc8 zTZQQw2eptF)M9n4O8N>oga#@N(9$Y&R-l~{eJ6f)SEq>^JMqC~JeP0jQSU`RCih=Q zopFo;jQL3DT-Q~@;65!tetmXbrFQh z=Bf3i04#(%zj|RoPpx~=o|2gLHT4O)t@(l9lu%kHQFo@xa$inBWA9rK+qt~9TW)LA zHj93CN1E~0)8xb<6_uRm=zD*fwDSK+#J^yO9sLR5PW!VNFuonrwXUc|b{4?&3I$V} zlwMn|!uf0WobS&hBse3#zLzknN}>qzaW5Se``%zkMohz*&g>OQd#IL7yAIV-GqD9M z;Z#3$mH5V*cVF$tqz>g{{&BVy0!k8FopM_K&5$wxYyc`t=ti&#$;%F)b{b6V+WWNn zahrc+B=zB{GlWx0h+pb^;I{_tTMhabFQ~mRN`hiT1O~JvVEdEI#-174Bad#@< zjW{4CExzN0G(~-Z%E><6hqZ#|Jp< zeX1GOVKDug4zEG#N9d994!;2@5==!s zEmGo-Jo_S|Oz&`^Zp15fkN7dzyN<$|66CgR5g~c3RN*VDX<T= z=0G$0ywB+YvT@e6#(B`#$tM-WFW>b|Yw1N~FF05@eCTrzE5HhoAw*z^d;`Qub^jlmm3GRiR$Q#@I)6tPuZja*(QFuxOtm}#n z92dvxV;7`n&7fB zgq#dPvAdVU@r%uaZc$?aD+X3gsiC5`I)pJx?<=F!SZ<81Ef%28>RMF*eXpOS#6Hyv z$`jwebOBayID^{jiNFUp%@&G5UGii#FbWfa`J%LSxj*U`uM6i6vDu6Gp#eVQh0SQ& zT8eJdPrIou1vcEb>7!VGM$=0thXY2wKW`pmsr#EEP?iSyXCTnzg2ak0(ry((p-i7S za&j4LYqp#pWrFzSZ2*a1EFTS!gQQj}m5q8D?Qdq%Yr16VTf2-oxiC1cUEUJSECm-T zIN!}h9k?TxoyETPbHj5Fk+u3iatbgGRxQDws#eaK#y`??MLcIxppXzfz?SKf#lgCq zSI18`p6-;QSL7}7d^8CT{TpMO*_jDUQTpy~kG2i0G6Q)lS@J8el~xm3`3}Q|EH`3; zl5UF7pV<>EQc~<>g7DMGS1QaZVT`x&-oJSDv)*)TDSqHnaB6*P=iZS2*4(%VJ#j2b z_cO837C3pJjSJ@yTv`Y&)afots^F4Na)MgmIozDZp4P>;v$-G2h#T@aYrc zYKSlwh1e$LAwCxA$Z|tOg0O#@&$UeA3Q1Y4#XXs1YEp|YpncZVpv9uK(cp)tH{g5^d904n%v z+tg3*Z7km7v)&8h(jdFEsgrEUbrT*{Imf^zoqUP-H@JHt?%oiUL8TsotoX@{*s!IS z4IjFCIqvBR9-057$X_T;=?Xxfh}JMiW@{NhvY14BB=1J%yyqI~X?MC}Yt1wKA7;V( zXQe~#Ipv_Am&G#f<8eYz4R*Y&U$TMW0q>N7)AaOEi&%sE!5itW)KCc~kdA^g%+O5f zd~?~Oo}Dd8J!RQ%C5TasN2yi)ZUsI>Y*9kpUJ3aG%jL$SJBDnomrwGl&>9=0=NJ%cogL&wGeG?Fo+-uyl5Q zO--!Ba(+3meC@i2=6{-k`prOvmYH43X=W}>_3 zp~_wF*R{Ur#M>F=_u<-k|jw4-#ZA%K=|u z13IAXu)MR`tBk=3SdY5RS|e9PEe9OSJFuytk~|0QlMkJ+txk6@$4BXV@(c^eIt77h zP(gW9#FVG#Owo?bhD&z}6laD`k=1*7#TKt&oF^Y@oNE2WR>kg_=>H?P1ag$`Z>~J(4y;e znlVxvC(f;#e$D4q#)E{jy{2tn)G1?Q@-(m9_?jU_XH$EMSTzU<^~1)XR!8Iz#NizF zPAkH;j`QLMrFXQ>>-D_(DYu)nSO)Bs;7-?=eKWu?B9>A)m;FP5$8{KWNIJvJ^jWHT z{}SI7QRk&-x8@Sr&E)|$dW*+)4KzkE#*sGN^w6od3P#%!ST1)8zx{8?7ezN;zsHsR z+B9N=x=JBYTrP4jpLV{8#zDt0k-TO`2<;h`cOjg}C<%sj3u=CqAqm{#w$r_k_ePl^ zF(1@X+K%0Fg-OUI(IT{-BH3NfwNHLSod<(2uQ0D*gF@6M~ZkU5Tcn9;mj&1}7#PHy8m#T)-03l%ShuC@_ntkt;=!BmS zxdJ?xrmw6vAwxNdDV0CM23$78n0hNBLb6r8ddPHDA{CS*ZZUE=54$}V2NRV`*#1`< zVS&23!9SjpHJDQm3}%8ZJ)BcN#<^^ZN_eZdcd|#3mv=8{GDJd@Lih>lJx*)DZeyx> z{i~XC)9bfajex2H$$m-o9;-FXNw7Whh!q6}J8cH%Ic7xhK>ym31Hqrsc@SC3LlZ*o zG20Fw(mv;MyK|{c^&G!I z^Sg5wLA*;God3uv)#HXS=}{rOvq@5*=Vfd8+;_$Ah@AZFfttgD5hN&w=v$0$Ns#JP zKX`1tRRX-{a(DwxR3nI-J)T^zJ8s~~Cnz}NSoEHg3G}iMIMk$dm#zLj^7X?BuhK{q z$AC$?CC)J;%`QN3TUMrs1CEZxN$ z3Sq}g3xwC}Cj*!DEkS@8eQVr(aajjP%><$i$BjZIoC76K^Xd)8qZ1{e?jVO?%+7g6 zGAHMD_^P&f>SdbO9OO@<{)+v6WXQw+c%3^pIQw2`a@PgLlX5AJ!>g4219n4VGQeAl z+dqz$l*7MC-92m{^-wSrxES~ef7I{TC9}8^-9+W0&Fje!Ddf13bxQZ)pTkTmsdjsm_ zUHbSIcGT1VUHRF6QB$C~JGH4kxdi6wpId{aI|modJ~);bTbu!Ksm1*5-V;8q7Ia0m z%YW#uy~GTupL2ZvJy}++wdPrL1217y^%UAG`@9)F(e{Cz%9**|^lLVt!sr^4n)$z;3)z{IE@I0%6%~)M9^3ji6Wuq~=YY>yq}M6; z4^@eo1QCdHb1`|&2ln${=D#eR{PN=k?+YQl+uA92bS=lvl3KJYXZ|`X2x36%gOkd) zU9s%Km^E3-U%>@DbmH>XZ2B&EgURwqP{yE`%Djk%`!mZh-i7Z{k%)k2a{&?llMavSh9klcjNY)*_7g`4{N19 zMa}o;S&qWd639{efHfT=N7M{d5N{_ z(9${P<9m+gBt_(pjAY(oDbO&c%V{gm9KPfyERLwM-9GoQ9&U*{O%O-DcEYOTYf zL8S8mSB-Q;<@1?M5Fwi_Y7|9D!#$#jWJFF`{sX(^|34{K7JxMoQ8rWmm%6>blISUL z?AxFFr#ktM6Z*b1@K%YL-m#zihXVThbiM!sZ2DU6|8ef&FM!o{O8lDIPvLVvs<1cb zsYqMyY5zmE`(vCN$AIZ{&h>7_Kh&0g>>dk134wfF|6{y=MnM%K;LNhFy?OBVkMaI$ zhyU2C|2$%(m84m2uswbF&wlmCw~~nuA+U+dF<1Ul1^?~9Uh!b(lA}1}vmS zn52oqKeLVgP>28!5HI3a^tteJm|N_>NHI4(M2U@I)$>1OU6`BHcQc#tj5j`<1yBRmDXdr4Bg z?AIfM+^zr*!p>Ly#A;qhKLn~GE)Pqv0kvNdVG{k-X8AS zsh*oZvz#pugGZoZ`2T~^4nIyLBYFI12H?I9=wZ0Y^Weyg!#{wfoRSh(J4&b@zC=tK zUJ2gKmXg67eOKoWAS&xuNZ6ll#eYtZg%eyG?fnDsvru4ce0%)QM3TGif@KF2n_oOi z(TBj%F3E0MHu(w3%Tok%c9NhhI-2-)|1g|?J2C9>PYBIla#O4}7{uR;T=@vO|AawU zREogT+XX{@cxG`9Z2CQUv7=h*PsWrEI}L(7BFNK62Qj_@WX6}WkNYQbh3_Axzo;jM zyB%G5-aYU@K!V)iD6Rg4Ns9T7ffyY2;~3A8X?NW?+_gG0sw2DhC#(6z%l9yo;@5VO z|Kyz)(!b@REGGT3{S$;WJB$WisCO|x^1>5~%{L9-%kF2f?phbqiPC6GIA=RIV zB1m`vN}w{)Z|LX;(k}xpq3dks`ia#Tvx9ddL;D^c<*2_>xqreWR9TO~(oN_Uet0GT zM7Zx-YQmpP|LATdHy>_6{2&6awL6#mzm4|L=rV*#qyU6V8ksJ2FVuK6ub>yYf?z z5E{&S_r?#zTi^xshVz^L@ZeAO>h?RZn5!~$zDMT#mq+RmVjO-$dJ!m53rOc@t0N!q z>Ny0sf@hya9@&Q@A3GFIufju)YHeD`I6BDn3t)7^C!c=?UHvQb#VZzUyv4h2r9YYe z(aCg8fh~Bbv~+|=UPxa$OnCSv>!kP-t5F372OJS>#)(JXm9{*j)kEdadPkOdgb#jW zL+b}Xf`cWVmnj~Z_U%J^G4&?htD|%O6YfpE437rOd^XbC+VRcl% zOi0!tM{(90kAd*LgF0US3Bulhf_Ho1zAHx-LuCd74`zg1eg=f~S_QNAr2c_;e`&lO zq5mPl=njwCw=CpGEz4qdFpvA89{ssPeEj$r5mO0E>{7G@r=hbB9PN_W=AP&_s zSKOLAQr5a}E@e8#Q#7U-^(@?>)qVQoFvn}$f5qU*slQZ*ynzZ`-d4KfuAHJr>y>N| zEnEpavXN%@!Bm1)f*$Oc?gc&OyNY4+@q&GMcOa|hN3m=;-j+lGx>@OJtM0Jvrr&(y zbL7`Q9(HD)UYmjUd#gyNFP=F^YO&uLc=o6=-k>!r@=AW-%bM{pDP|Y*SyoyA`ao6K ztk!MB_@KCR|71n1dxSGCD5l8Jy|L@42lJz@xn1+II%bl+}79%tAF403Bk7v3t4VJwKS3Mm!o>w7LWeTX3ABVU{2W& ztp6#n|NEOVm_RXaV=w^UaWoHjUBwM0NMHt|(R8o0e8h z2k@tMlJV5j{WqidclCh4wBSz@R%x5S?}o(<&)|dT8%<3*{`qRa7m3jYz5qRvn%8ZP zBHgE+(HE@RWIv9-m;d|t{$0PwT4DxiuCMqUE$-kx6^hmAI&RxG?bY35= zv7SB6{}34ddd$W&L$%Q&ioAlOz07bv)L*r3g^5=q({V(4F059A$jm>r!-dR0F;*xZ zY-6d-oc9zIxA$`|D6eVUobRpt$dqV;vAPL2v9nyo;Die{J-?dpZxfb!oJS|CY^Z%r|AkXdPDj+ z{}C$_{z9-pTHA;NFe_mw?PsYjU{h7mE$#_OD)|7Yc&mx0)5P)=7}K4nsFHq~bL1{$ z8-ASO)V5YTyHeZw;rrhgF%`Wcp>IZFxk;zL)QHR}j;iq9zV1fY`JVYh{QUNy#q@jM zjNCI$zJIsWUk?vhi9d>gjKH&9%lbi;bn}>@s9T|=G5}_dfebh$u;_U#O-T}XZEGp7 zrKT4)>V?fA!{~=&-a-S>I9ee4fB=hI8-%h}7zAExH~>QDOcNJ*Ij(&%2nZ;uNW zn)cEyV)^%L=2*f=C`AzedVPxlQKCVIj-of#JWd0$M_Hoi>2p3dP#-fk(t)Iv<6kIz zL6-FSe|tgDz!?x)G>0rl^hieZU@5S_N&>fY6+Xjzv0v>k0i%d0rQ$HOq#zi?n?p(s zj34b65f7ntKj$}|8IQPKx~&elopW!Xl?cDhR{>mO7*qKj5Bqw>a3KhPy(H<8aT_6< zeN&%!9jW>9PXiZRvlU3F%trjvINOVdjOQ~Tn`}rXXMg?9e}48qmtYx0eB^dqjaOY{ z`B@o?u#6}wnXX;U_?O`gis}5$@?gHkbvCgexy81YYFUm;;yVC{;ZVvEhd!VQKG`fE6pEJ~RO1Y^ zjVt9%Q|YR-Q+if{SWsa$Qg`0wb&`TRzi0ti&=NQ;y?Q6pl_t1wv!);!2!RK$lp=@& z!#!99@CGbk+5PG$(+wpcDR$fC0HwYWV0L75nOUoq|7X=Xpi!Dbhs@S69kh6nsn#U( zUc!dy@-igR&|$A~XeP1#df@*&|9>tIaezg)rH3Y$Tp6h#eAB|)9LJO-Sr8|ey2sFn z8xHwlpNBPE`FSHlu0XFb&SLJ|cIa*rCmOQ3nECejT>GF4@F7~O7j%D_M^V$c+8r%n zKK_F_M>=*WEBrZjmXp^>zkDL=isRJjACoI!%T^Zj0Tg)pcOgOya>U$GfLK$f7TDo% z5vp0UDW_R(^6U1n729jieLJ5f$L-Agcoh%j)?Xqw6^#zW=XqVxaI}i*5+*l{oB+oKjrD@Z$tE8#%XUp zL}8M#aZFm#sUDhb4V5;I{!rqFM8q3mPjee@JG^*fpeW+yEE=@jzFIjU-UZyl&1!~B zWGKV?!l>|6K7K<=xL*wyr0oU&d1b}`G@08vvO_K@pb#(&(qVJ#5vzT;mqGl_0>72+ zi7j5`%epYxo8~kg?OKxF9F`Q)sGjGKW^e=!Mr6@9V&gOA_2GJr4aJdSc=S;&IBHafn`tVK@% z2GPgO50mC2@XyhD9PjQee0-p75QNVk5rdl`7=cw=5)I{Xd9x&#^Y zZoF8V3D6Yy6-`Bf4AqV)2#x>R&HJ@e8ZdS>9&S5|qF1AbH`*YZPc(hk*ZL8**1Hhz z5h0LO{;m%4!`E)gbz{!iFW9xORw(mj>b&QMoKz&D3cr4^g7BSeT7k}0g^d9W6+r}Hz^lkLc*JDCo zwFf_n?(O#1n&)(&;ICE&uODwWL=$%sP!C8EaFsq@t>xED6IMw2dmsEyQ5W`j*ga3o zj@>6j=}+K-9&dP`2B&4m|3`-y(?-bkI-h23ullZ?pGF}qM&fww0`J{#xy{QXJcNx! zLge;$2{37;hq(UaRlt+hF8m1aky}e_d6&9ZQ&@unJ!q=en6BCZ@BHkEV`5^@RdDQ~ z@`r4e-YWC}+06c^S+R&ezQw{0d!E$Ra8Amu?V7)lg$7)l&2)eZ8!w(l@M6jE0(0{_hEr?PYI&`%e zVt2b*`*BSBMX?l9e%7sNVh!;VT2LMFXz>7RwdIXQ9Fu-Nww}Zkn=nAThmsukbMqT7 zWpST*HTe5b*~+qdUdvu>ZRk71r3uzc<%Yg6>LIgRSZC5UUh5fax^{Djl}%&|U~I*V z2kp+^rS_#(Mw2c z7>c*og;joJ#L(GqAt@RP(o`k?Z%;gm9swN|Wj=_SHZews;)({7#%G}hODxVbl3FQ6 zs80bt6+M%sD|?1+bIk7Bqjav9k(~nV;9@NIcWJJ<-(K=N$-W_6>aU*1`cYstw}Emc zd+L=R(QtolQNG1kZVFf7bFyHWDl?8wHGe6#;Dwapxlf=C#xL}AJrSaP`vo&9a1?h> zyTl;!`kbv#H?~l#R+h|-wpc!*7>J$Ceo+U15D_{7xtHV$iz%JqY^m=kjDl|GQF6&b z$Gz&mv!j^Lj=y&5+v7IZp7-NExHBYy*jJrUK3A;!Wua z^(K+}`s{*I`R%Ni`}^{(Y60i{lq9pf1o`^4xMbt*n}h4Uh~AFEDSPANj|-u^*6>P2 zprQ@0QH{3fwV1ukJoPxD^1LsxIGC$9ZP3J29pCPKz>CQ&Bj~}s{X)W=E*Ur>(onzq z^S#aG;fJf02*0{#&I_LL*+9LRAqW^=M>_6sZ#oF*AEroIlsX?MY@-~bof!(`2ps;t z3;K11Ha{=9cm$-Bn>2A2lQ$o;p$8kbGZ_Z=C zj-i^vLQy~d88xF;x!b$n{$={RlN5lT`8mHynt=1pNi|*wJ`;uexra4P(2Qf}e69JI zx!G)XZEAMY)*RhT)ip+`17+B z10VqObq88o5zxOs!bh2cW#GIP@BT5-!LwGf?AY{KSc67o^m(FekMCC9=i=DUW9g>p zp5lOE@3MN_zqMeupGX!yGAX~Ud=`t2ESccxf~I)BCMTQmVgDyvPK6X0B+_ieqzgbQ zQ>>ozWTeM1YR*o{(=(L3U{)HwSl&%@KL%c&nt5JPu&y{~fgl$$&>O=t9) zEvWh*+|e{D&5gI_e}y#i%kSX(wV@@ed>YB^A8zanajUmmlZGYwF5@NS=V=@bd#O3> z4NLu0FW!!i`$p1$iW{{aTl_iGE}Hmcp->-VeK1m|)(({eky(+H?>dbL$c1Bw#|ltZ zgHHXKb?bZMm}XX!J{Luv?RXTKM9#1GPBj6Gbya0>Q-!feNckDr=!0FF)uf{YBGHHj zIt&wyS?YfZxc`+IL5|TB!T496G2fVOcgtC_rOLVFWA*nY*9-OcV+~*#W+T)x^MS`# zXqJoANEGNz5uSkWiE@z#6?~n5`8L$a{Rr1?5|+VbInxUaoh^2x2sMut*VZ_&MZ_b6l7 zh6_Qj?kX4RCK!aLQ{eRQyVsc!l3^TSe=>d#?t|U?AXk-j7i$c;6k);?xCr@t%GFMhAcHI-W=+vKfzJK49zQ=SrGT zfnam{W0>eLv0QrSP~S%gsKpWWvr$9L+d{oc*+Kd&Za{_M_JoB_e~Fjj-Dsnd^!3@9 zH>)9ApE6-*be`-;GT?(9_iB)ktA4p5`#I&nrUMj&|K2@YwSsX;_&t)N=X$YX z7F#q+k&GUaEfvv=wH6%Y%p73$ISzv;iwX#Tk$(;~s$NC;la*Rr8+VhT2>_>4?Pnl^ zOT@nTC+GX?>=&VY%+aFUR*tLNnLtUIFJZ?Fc^M2i&B##u^#*3YK+IS)JnAdX6`*R6 z{FTI+t$mTk=6x>;_Z-QUACC_Ef{P55{Mf;qfL`aYPpdoH7Nds%#q?)&GVl<+b8|GF zsfx(aI@3C5ZoF^bNbdqnY>2=ryP zc&A<~fmfaGSi|l%zxOK_oMV`bXeN0HyPp@XcDYtZTfK+zlHIxQCd|4Y_)#a9SD-*2 z?r(}`-SzcM(N^;rbj2Brv>V@KReAS`pfo=DsdA&6p=jf zOXx7%jVWDoM@o#AXSA5^G4--;DiztUf1rRnd^HGVm!XAzi~nu9`c*wgK2_ucHrBDun)xx{uyjRQ z{C|)QQ_VVy+KNwqrme}jylxze#ooO`$$s=>4UVV9`)1`&F}XC>vj8~I$I%K z4_6diVR40SHs7H3^|ju#ZlMOw3r;(K+&6Q(l&JRNc5MEo#~oQ$S`~(6;#rU%7E{A) zMs?OYp=LC3nb%7|>SxZjh3JIS*yONf=qiim)X>ta)J2G#DGT>P8WU?DX$*GH<+L7G z4V&7M+JGqV$x{AzOw4x`3i*QulTQzd8!`RP;(p+;GcEV*(?xaJGp8X$6!fk`oL0X* z`I1uyvn)#8>EH3#Xih$F=%qhFhX9ctNWIfRT%+(krSR>gACRc%S*frW0qajtIZKRH zDw*ro$WQpgz4m%v;)X?@bgGtCwKrQTvVp$z;BU zCc=6=;&`nWCFX4!(o?T^&d=jLgYer|5)VT3X2ZFWGqEH1COf}(N%dM1flq73F=_@c z^Pw})qz01r6zmmHR9)`Z3)%s~cU^#_R_65KS1(ro(31EsC|oAU(^q@)oY69boGU$z z%K6GDQqk05#bs|E?$2j*hijzlQ|smTl7=(i*84;iH}NUYds>&uckZ%^gV?<1ExJ=@ zyiJ~0{F3|=#diSM_J*hMJHNMr-#K;P zEc#t*$;C6Lc5hdU=@+VJ(TRl+_Q$k#(_NjG53Y^urFTaPKg4vBxvQcJr0E+VSRqcZ zm~gk8xhk)9R%-nGh*o>EUoT5Im}9jvZrStYMrBU?V^1nWUQ@b_oO@$~7+C|za$=s_ zUb)0eyvb&HvH9)w8vU`T$d|;l>59FK5H3~1aVG8SqC7=M-|rdk1uTy$O|E zgSg5F6MFAEGbkS z@VeA(W?#MDDOMQ_x2TJl9duN=Uv3X!lPl$QJkAz~I>707FLp!qyc$zKzS`hlZ97^? zYF^pa^IQ)49bcDAR!rprh#{&Cqzkiv6|+1+v!AK;Tr$If96$~@)jQU7Qd&L~W)!Oz zX))Clc|Y7?pYcb@-%$&`q8dA3F%f2;7z_Jp>8M8Hhf*{HOy2ie!}sv|ECSpSCak)Z zsVG%CLcQ9TTU(1?O>{h#HVch|tNf1Six;ep+p35X5`Cco3)DAyoz}-dzvtIy4FD_! zCjPH?a%9aG4)E?h|KvK#OyDdkI!eF)rT6_ItkiqKt2U!3IoY~NDoq*Q3Kn*|!15ZBhUgB$oCweK8Zz@gzO|(MqcxeVQ7puo2 z#I#ub!WGETZm}iKS!@0QqyMQxY_5P*&*AEYL=R39*XQp|yxvP38`5=1OBt+auo8Hk z-9mGph3*q@dMFC)Hx5K;7K+33?o3EW`msp%ib+y02laun-557yB`FPa}jI(xmu7~E^ ziEH9=Dr5;5uZoOk6Wa@j#L*#Ysy#aQH9LjL8?GT+|0u^@wzTX6jRf0Bq2 zjP6klw1}L%|20Doog9?c-X-99C6~(f=R~Vwrs~s@z?~t^GQ0Ds(u7-WneoT8GD&h_ zuPpcK`7dj(VZ>ts7tqDgGPOgld3y!2tv}xj2t{fcN^aJ!Ha^STI9bkWw#-+}2!A{j zaXp_h%@%E^*Rlz8cbgi%fT2g*fG5oXL4pCCL|0Om=}{?|X7+9gFZ^!2#ph-VkMjxq zZKuqj586uSC)PM!3E3U64B%ZNU1f2E7Tj>$5lA}Vez=%friJ#jG0WqsOgUH9%xq#{ zW8QzN2%WHjV~1#;;q>+MVx6Ts<#WKL;#-fJ`Q~=xzVNQk8|39TvnP7K8-{t|djjnY zwp;b<=Iczak&pSv(%i>>s{N^Ny59C4&dNEM_5jK{MCyHzWBN*UhIaJ;0?RQ)u6x~L zc^%(ZG6;nDxaW=YnOnU>e$+9bQu0Nx6}JZ8tE$FSm-^36HDl3+;WlQa|6;ybd0d)j znCbM7$l{*U7wl(_0UJ;C#_N%0QL%_$0Wi7K!SGBC8NZ`>ak~cfTOHSgV?7yQidx06JvFfP2cUHnD4aY0D6UBg`!f7XnsH?WT@Yz{RI8y;`wJ zt-LGI=Ly!9?HcYjAKH1nS-5q*eIiG>7<@&qK)X0oJ`2+I?cY|!-xcAj=qD)9$SD@I zxt|40s4Z9ixX2%tRXpmk2(+s`eo!a%W|jxwA~$C~l^1k6bt?_5uq4?$^%GDKyp#0- z=X%41UH`p;4G^hBuFR(&Brsq*^w#JPds)eG{_qN3$WtyaeulZSvA;v`AM*p~Upq z-8Lz!sZ>oBZ^yNrp0hSHv2A>JFzrr$s_N`D03n^$g$rraOYg%Ugi@_x*Yn%}P6lVQ zbp*9M&(*0tI4Zy(0m_i`+c?kNN!!|u`KO4-^`tOa)Kda#JYAr|umEJ8FLI_fDtEIw zHVtIa{QgETAy+t(4zLU(n!$X{Q5LQ zc{L0&Zh&I5;zXoGz~+^U<>;Y7z2JyDd{muZ*kFUr*wSK<7BMf|+}w#=ENpuW`A(_O z#jNp}bAozcW7b5!z70*H(28T@7NO(fS~LzG1yX{+`irm6Ehxg{{p4s_K`(UynC3%L z=2NQ;wIUJl^`xQy@mfz$uQamBQ@!PigQ2Nz(`l58pkny^7N$t2!J%fc!h}4RlWV;t zSPfbjz<0dnuHkimMI>CEpTt?vn{0ip!$78Nr3k9`ob)pKBhZ~Tw-AJi)cr@i20hV7 z5)(@q44+yKZx30B(=PwWI(3RGFJ^+8?Iw-Cwiddi4*3$6RGH?CY(~OeI2QiGC7;VV zO+l8+YW9<>4sSm)h7MBICMweKk`2lc>;uBlR11oIB}sUG=lU)o@)VY27x~X;x$@2u@hJz-Ov1`?!w?M^Qb(G%JnRfC0i}!P!E3!YqT(;vjXE%iKcwp;I<5B}=2AUbbh>4Nr&zlq=#nEJjCp6;@G-Lwou= z1te_3T6NJjo?+?1GSKj7dVyYM>RaErIp+l`n+JBxQv1mgifKo*9or>eyJo~e9#FFE zrn}1Bc#c%GmeB3t>pFIUM6_vQ^^*tK4w8 zsdeMv?OBH1kDjcw96*}4(!Pl2fwx>=oxNK3b6Jq*-12jAaBxF4P=8-Dxrhndue4AJ z!IM8_FfDRC`|^3o_Dl!qwg1&z3m*zJ(hXAL>8QUk?FyT{v4giOZ-h{E*c9(XU8*g$wvs1@oa~CIEyfvyjK(@{r$oO z(X^Bs=?e9+u$P(LyXa<+Lerg7dxM@2Gzs819##Kpl5D zhgzQT4<@jFKjlH^XG%Hq$49P>2t4plptJ)pST;a_{&HWSBmdLzYCfAyhIK<|w@QJ@ zGuORJ9255O-fT)xOSe1kTfzT;Q>->AVCrjjyv^xF7#eI>;JJ#=K^1?~t@6CGku>Dc z?kTmJZlifEf8xwPw2p2ckt{sqJNMfZ9mR+5_O-8=_eFA<;%BI6jf3%{c#X{MYYNI_ zLC|k|${*wri)c#v1dlgx)~rgWt|-rwh({6XXZTr_broJT!m9`X)|0>< zUpTqDFuw|7Hz0OhOo*fz)a7%}grTIq(0ijIkuG#6$LWUlXTbAffdMELe?}N#Cv+Hi z*I*>rV8CSgPcC>k~oT*>y!Xta*~!5Z6zn?N7!Byl6GO7i^Njgr4J5^FYzV1ZMX;U2rjKBE*3pi6H`= z5ry$z3mGThi`~yR=>d>#cm^EYr{uSkM@K{}2DHRJ{_juZLsF%(0rVjjCyg*EC` zl9GrU1W(76u%;7{d*^vqg)b4$b3*EL;T8h`TFUeUd4?uth??s|2$>aJumF>cL*ydD zHTU=4cUvQJ_FeCdJ#Isl#{K$xB-AZ7FgvEw#S|dnwao+AAdkKc!s+7-4n<=E!AiQF zh;~Lx8@;B&OrIf6d;rkHR8#b#QlinyPp^bL1NkiCqfkyZB#U%-<;Dhv3Eu;qR4XM= z8bv~C4|1C`nDK=Yc9EQW9Gy1UpAGyuBRvd{;C$tpgx9^hvK%3n{ zxBl6%e_euKJT`qoy=ruReZ^-553m5FCRbR{rxI*d&uM%*_5CPXni$BZ^*+tx;a*SA zfM4(l&k||5H(U1Jtle(|pTz@>kz_g3TBFXqsCROcgnd&e3#jqTt_pGj@f~#bfCwI) z#*dP`nr=em53kyweqVsT2rOt)G5y7bfsT4;v9v4whBq6V5|J$2ExEo_&{z8ROe^R9zF0|Y-?x67|?mqXvHp!xT*?ZxjUx?A! zqf}QR#We53F~5zl>vDFQ089CGoKxzxN}Yq0rxkT^Jmk~iqVMpJ51!HO)>~^}|86Sy z+?B9tLy+$89lkmpEGUmvbZ&p@fxizs8$+kwBGi+L7x1INNIxy<{!r`<96BYnB$w`cL>g0(y^YDE8Twtb^Sdqi4=I|q8& zdnXAT^?xwH@776ph-X?q_QuKeS9zJCMo-3J#|j7Z*jVPuu#kza!C&6siGn|3Z%dHO zA^NK1$(y;GG$1!;Y`yGxW;|UX74DM-6fXmqH?(kzE%%TR&(d9XU9JV~MVyu#UvIT%*&M!G;loJW9;Rh#Q0AXbS^E4J^bEyXJEKR0L zQ{xq%J1up@wm8|dbv6%^-C}OU{E?pg@G9Xs@(qOp>pu1OF z!kPnO2Ywb$Ai*2XwS1aNexnG#33%nyGKa`a1gg&HA%wWp=5308xJBV+d@W#y!Dg`m z0a4gk*BiC>sIeLNSbxbhn4k-fgrXIp3*E&yVX-+*ri4L26ET+W$O|9jNSoupFN(Ap z#X}IAxgQa|vT#yvC?TUp_Q*t$<`U*l?5@p7#f>YsaEv%@S%Wg~<8G&|p`+o(_#s%v zi|s@ce@m;<2s5O#ezk%zyEJ&!4;J89yIx@cl^vYy&&A?};_BD6HVu>>w1$yO0=-;E zu4)K~ooj0Fvr4=td4GCwTWqaeqV5N#Rvfps3ms8Trf9ad0wduD0_c}U#4xKsX=dOQ zl0bIS?60(c-LizcupoEi8WtfuSLfu!{kC?KG?vYnfp2Ty-rmV3;P2Yy?_y69@(N%s z;p5ENXcFT{8A4JFcwiZi&KBsx+I`VaI|z1xmKoeyRZkRahT^~Y5Wj=StpSwA)##50 z6FQ9ck&==v5%C+1o>d$X4=?G{SY2w8q*D;krfv@=h!kRhQ(m6?AB5~pJICmIU5!my z7Xv*)&zo}@Uz)Tk=bf`U$MpCnPd&RPrKNgYYMFKoWPS*lR_W|S+9f&+^+z`?jRG2e zh{fD-=4w}DD=(u?1Z38(vvY=P=cH5PYaRw67LT`VACJ}Ur_`s$tiJQ#C|W-PIqUw< z)#PGlp6EnF8f0-W@f1QS#&)Zt?}6FYNS?EkH$Ze0^y-qjv|c0N+|SXODzm%4He@$eA`5ZO2k4o?Ziv7+L5y&YmiZwiWk72dWqxfV6nB# zXdu`uEcNz^Ja(xVYov&Ky@7&EDwbY)IOn8RCBcEQlcBU*fQpaxPk}nNZ>ujFkE6kp z60{kdr=HpX-KboKMW2LIXEDhT5h-(t-X~Eb6zS_!pfNy01F^iZnH4L6R-B7`ShXCk z$>jLFZeMPT0kd20%hXrQkwh>{VA(}zl9#~QGcjNt$06mfik_}CzvgPW ztq0n0)0(YL!U%b|RK4b<=z8+dF29lh{wkjJl?Y)aDU!uSoQj|`?OW9&x(X~0!zc}dzjFWmMQQ>9u@^GJ`C^j+Q({G z{wyM7CNu823`r|Nl9z3CzquA3tz5K9?|%WyfX8B}m#_ayvDm+vor)A;0E;epi6P@v zx{_{JFPuw-B?;xF!cfwO2ZZ&mY{IyJ$_ocfT>;PMg5F{jku}n+v1Mf?`@JPZ5W-gym_!}p%f0<(VUT*bd*cr;KL*|FXH`4R67kA8y*nF-{*{-L zA0%kWoaPO7)-TX*j&9=FO|dEoy#VAUKqdOl8sk=e@uJ25jvu>}){E%vJ6h(WyScWL zY@Mr(if`x>%fV|0?)UB(dld(X1`ly)jzY5ve}~n7v18*$wxcnR{?>QdBmvzZG!vdc z%l}i9jZQTYGc18%Lq*%>Db3@SzK8+gq|;It`%R@txp%-R0%V6Co;S~IsChZoT6CFp z>omwzj8J74wVyY!x6@ca!Q0K;WF8j|PyLxA01Wu{dq<|n-5K}(oSS=3OptP^sB0sc zK6HqP-$^n6-4~BG>zHPAwV>8+4PRCum=$@yD~DRFtu1(6TbTMbfVPL>H{L6PVj=N+ z0B7o2gd*Jr8(Orb)Hc&-Iq^%7^4N$R3*X1+lb)kahXgUox#&v7tAHKW`(AL$XEo5s zjN~fHXoES-j#Xdq3~>kjtba)z*Is#=NgUyi=0EqR1nNoEN4zP&&h_t(hloJG6-3j4 z>=0}%sr}!66YQE)jX=nM&KMdGxtMp45OGVV$Q)x%H9nV407WQ0B!QdKv`j(P{v zPVwcaHUODn3tjr)GiZtNhZ{JBVZLC4OtAyKd%5=y(OAAPw1%4Qi_O5FR5vV0C2Uv4M3tx z_S*W=Q}@*N*^$7IchECpE?ea1K#;RM|d=HlV80^zGuSOr}uqZ5Epd zvMmt~CY)X}9u@k!6PjdApWI=WIc(W=@|uR)6}No@8+3AQ zRlOdI>nBN#zcPVqimqPBE*ZLwFoDX_H(rZls+3#JnFpgV);oJEVMxz8LX2q15Mo^^ zC$l7XzwoQp+8Lk1seqw`HKi6|I%XK8VR8Zf;Deh=Hr)Gbriz!@_F};~-45q8h}@P^ z8+@vKKs44FZ+HLfa1y<}y(xUFBhJ3=7+dfC@HlAk|~x(uNT) zb<{tXCteW&2em1`u9XQSniiGQgUqvC(_34O0U$IAeCAD-?EqDyd+E@#vlpS;)8c}Q zdeQxSs>Q3jc{b*jt(NQ1le~zl${oAxagbocy`bRhJOIg78ig=~_qfgO(6&Q<1!wtE1bf5N=ik2M4D1af-!EBRQhfHwmV)0B%~ zf8Pnq8Ap6fwr7Mk`M*VWHg-nO@e!YMW2ktwUUN=!xjdpmE+q;t{XO?$Q4UT9Z^S^< z#ex|#*|qTsKbvo3>D6Kk+koo9~62BBN;c} zKzOZF`(L!lq{1?bDRc!AbDFo`2rz3pet-67LM?3ncpA07Ss`cLL_7OS<{Op`xxXEcM zvzl{D_1}2|G~lP}&-jiPQ3#js+7EujD^+hg-V|5QyLIBEOm1!Zweo&Q_1S`lk?)3m+W?U{>2jl7Pq@d~HYY$)P@g`c)JUAv`TR&npeV*1QJV_q)N`EK z=cs!A)b(-C=>|81lQ2HZV)+V}ZL2&`6cU0#ZiL8x7A_sV;?#Jl=(MX=aP@Nd=lfqk zi_YGU#dP!}SnJ8Itt^T8UG} zXI&|3v}^4u`Q5uLJ!VVWn=<`bC>T^?|{o{0whoQF|VCWsf-Ig2oHv1^6u& z>s*%nT^(WMsH010}iL;M&PJH8o zX@U$$F`xT^cIIroK=mWTdS0VK^S3Kjzhh$V)Xg+UB#_u8I_cp5_*hM8TXU?KoAui2LwY@{=$KrJ?e0kJ`^bCdO7y z4)f8kE)hXC#BBtB&r11GYG0np>cWmg{-JT zzlze0VFdTRPzmgEbakfje+$-fIbM}|A?y_;Qi!V}@*Mdh{V7?^0!y;{A^e3TcHT1{ zs{{}=-zC89sO)D(6F-5cyl!=dw^V`rX;F@HT;>FAns-gwW|O>pW|X|9%? zoaEan_6EmyirgZ|ZArwxr1+^e_~V42nx=*Dsp7oBm}_pb?{bx5FZ*}t3R3oY0ImE8 zKao%6)R@_ITYe2gkz3iDR!ONJ{pig_>KkWRllEJb*b2L|wlGW!o{i}Yf!$wn8L*9&J5HE53D z1h@QD*7HwK4=AD*d3ZdhKhh-cfn$JHzzv@*7Jf(Y)m+7a>kM6Q0s4$IfNiD5I(6(7*;6sl`|%S#T6#-8VMMqAb9M6Hh&8xJhHwD53pyvxx5B&4)oi{~YrE z7$8a}RBY5+@8t&S1YVl-j#~nLQuvS42B!C&qZeCwXU*QS;as_$*mrqLGuOMkCox~wIE71}J7tCUlUsslZ{QD}OaMP%$(8I< z{5FM;`qii-2QXK%H8Sy#4CyEdCE@2=Oeo!Z>R~@$W?W!kxUeva>}MKFyK_EMF74ZS zA_Jr+C|HUSYu;?x5YRJU5XQviB^sU}X{n7M;4Syvjjg4QMS$Gq8A=K!-oFD_9KK>S zAU>z#6fp_?28+}(`we-sxu1?H+vz-JS-3?4;JmUW{NP||io_x*Vi?4}=@I|1n7b~0 zED4U`#c)EN*cznr>v|NL^U$*{>`3W6`MsP^rONV0ihij_!YcsyD+Bkr5r zS1&n6ADimdih~^Xl2_}^&;l}Q|AOO%t_k}l8$j(jo-`7Ql%Yg}4H@)>BB|40dVN8X z&om9*KA}~~jrq;l6%LTcWO~$HjXB%V$sk;Ek58!jYdGnQ)Si~mQ-X5g(P5`rwAhK= z&L^Hc7j5_w5oBZM(+?_xPiwIE7QBCVW6?13;3Sste&28QLzNsPa_2WTA63NCPUTP9 zE!85vAjNN~^no5>uX`%m{YVV6YB&;Sk}YfJE5$*cn)nn!rkf*eyx_Sq_B$YCK8Dq( zV@nt4J$nLdDdl3X*ShnB2rmU(B!ST}xxCg!WWxfRSN7|DFkwA_>Gk#sNE$4@ltdJ( zcGC!*nosP{El9PBH$_l^v!MxJzT!g_MN>j1TxZNWJ`C=Sn`|_@IXG0{GpdTw01bFO zPsi-nn*ncia%EpQHYs|~dEM-Jv3$pq27e3>;cD&PNVazB*+}=MsA1XDD82Q3oblYH z1jqx|%C(}Ew}S-eD8Lv5<+~94NP&x4CQa*lxq7@;b2g2*k4HmL??JBTU?-)2iz|TY zXcKc3d_6BhOTa6IL z>RH&HVOt(&)TI18F0)|MBFNlCM5eqi6o^g!2TyLjiJ?0CJ!1G}N4ocY{!4u<-o0M8 znO}B**)rck!m_q^&DvlJ?|0s2Pt<7I^`6+bWyZbKN=iyg@0V8Jy4K8Q6vh0!J)6*{ zsW$B=KAkC58LC8V#&!8#1h_Iv6OK8b^Ps9bHKI+>g_7|6>>!?VX+29au5;LGC==Hq z78ByNnRq3eSUSGm(zG7GS+kw!>Q5y<18(e}!9E>`F7`t|Va{w^KY**Hg z_lk7+p81{LG|bANJ@K%@mc(?X_EMqKJ2ZH51aMbY>krNoKGJC%(lsx-;{kBN8wT{3 zMzRf)<@HIClr;gR-KH$B<-i})@pL$^v7curW3Yn7p!+`n0t=x_^V#N7;0bygCPqS$tlo-=4q1&JaXta9P`X3reyAptpHNJBw!d44OwqAz^yx%UCX=K{3ZJ_L_G9) zF6ykl_1>9&>W_VlzE1%@-xh%Z=CeWYM+~Gp*3UQ^6tjk?$tS>Q!z%L`3~)hAU%et? z4$_9{7Sy#synW?xjAz1pHqkB5ahoT@Nr7#)H+hs(VLm56K`vdvVY3LKZ<__U z5+&rn`2J^BHE@8$^tMQCYAz2XLn64D%T$8?tg zE9{~pprSLoXl0-P1s@zx3vuCljnjNzdDX(18N%2ItNghd+N^rwyVIdk4>=# zp&*5jL%B1RGn%Lr-(`CtMj1q@$R|w)z({w!Q~WhBU3t11KtLZ8Ki}wvnzFw=_Bkc! zayOM9e#O>NO6#Oo^v^8DHy@(^L={hJE&24YbG~?Fxt;OKWMYvz!9qR^d|F7W1SU3v zwFg^{3?9|iaEF&u_~pwHT`pj>mVI<_x-}4c2RP+ViZMy}#A+=r2PduDDAzBMP)}o( znP)ytDq@qf_Iw0p0$+EDWNEv=IBHOTvo5l%8Q3fK?;oG4C`jL33z_2YN_YSOb7w#5 zjMb8_Hh8q`9lP14-RNZbhI{@(25az+&o_f5SZx%w9C37ZJQ(6D5yx1)nJ7c%dP(6b z`m9SrED6ZN(0pWu0MPl@OfArPLaZipHYnji4SOx?bs=K5+xmMI0Qt9lN1J&l$Pqo` zHF*yVobcV_i2kz&AP%&;xv(OVwTVK#eY*AE8Ak|6s5d&Ig`ZoTKHBmRX9(euaC>cj z{UaSuPj`27!CFtLF_VI6P6cFhlLZkZ!b<8Bc?#Ba>Q$k-mF3~?Rx?!!F_x#V?K(-F zdA5#pulA}vmA{*i>OO1JXE&7(E0vy^%6g=1Lp39keG2;2r8OLO7mSoMMR}ultNm4; zzT^kn{H(h&Ngq*qGf-uZ4a^t|svNJPr8qvlX;=;<_re#50JA>(!rg+p8UiGtgfF4^ zN9!aff(Lo8CGKO;30QbzYf+#sgv*IvK~CW;=WbG5z;NY8DGC(mguG)755 z7WM+h47ckJ)jh7U)-0hzp<603GxK+n=NQ_IMi@eSHv-gOx+W?#Wh4%30g_{PP=toQa^raFAtBveA|XmiN_T^Fmr8dxDBVa&!*`5#JeR`#Tt3_O z{`h{}f7}Glne(W%jurdbm-*?jy>fw7&UU9H4}GTW6w zV;2vC=)7=#*tlnFsB0&d;HH*9C|0AJoAd2<|I6QO-r^s9z!aYC>!fz2PUx<4e|0jt zU;}kHTC>&t(mWJR4cA)g&v-Q+|AcWrZddMXFufd$LXtUf1JIZ@JuQOV-Qb zL!odAN1M3j`u>0wP=#gVpQNz24!~5QqSL{yAu*5kXPjORX6H^=i;YN$LPt|i78VDJ zMJX~gPB7{73P532aAJeVlDhuJvV2?792=(Lpo4}Buy(6WkINViV|(z=POPWDT+i5c z;+&B1X%C}UU4^1)O>^*;yL7~q@(dxlPeqU99r-G+YL^WeQ{31qteY(+WDdkJGOKRc z(D-Eh5)_BC;h}RTg;3VxNbr#L=AFTnOHHa}`$0Ss`C&l%%UhqkKyCZVaakjY4l@!b zSp_mL42AcBr`=*gRV%h}gpSNKJ3EMDqh$7TfD;Oj2m z#MP}nN$wT4?~Z;`>b7r*I3;kZH&Z3(G^!%dfX_%T`k3PwrR>q_6!Niu05J<&{FL$L zchPE1G#Gvu$iSkiP1MrNOO>$44%G^LKlUtZe2jX}6HZBh$dRa(7`;ZjbNq%&oI{dC zr9{AG__?1}K45b2P+A1odxh!tsGW_b;vo%8lti@OFrvTZS--Y|db!2c{P`e+6Lbmk z;Pl%!K_XPxp{J-G2)oE6RPE_xd>gEH`u)m8Ri}9~7 zW_lqObc+gU#VC^cUt9oP6E+V%wpFpMVpFM=1;!)~F+8YISi?o~f8|~`r0E*N#4}2_ zNMvVPd1LtC<0*(ZBI@Rrbsjqu>5s6*OAxF8LYei%QQyV2QXE#TP$5ew->ah^gz&7P zZ0k{UTk>|JX>1q+hiqBIRIb6Y?$vSU@yk5|g5<52RUwDRuPdy{qAUtnlOZgc>-#eE zR1^eQw5pH7y>2W=cHCCC>-I+%@qDq|h;|=VJswFLMO0V){PR;mG|w94axLFv@u*L-nn<~+VguQwVwRA>Kj1N16_lqFRb4#_v2U2+qxeB!m%G+M%QZ~qv1Le0er zlH2aj8lkOLT4=7;YlE_nOeYg9dFqsAM?P5$P1v^7I3LXwN^*ynPX6#65yQ^M2H@&U zi@D|0vYJ!TFquMRPP5vYQxg3LLwPMami(ij27*LB^U(A8u$NSRwuK*?`Ei-k?!b@= z+6!(+5Dg58WH!ibk7dHm`rx`fFHY7qVcVu`jp3Z47WwtQ_7gJLW4(o?*Uvzc+_esSwHBLf0DeI2Yh@XhRt?&MO*EzSs+{P?QErd5%z(vmte0uq8U0i zRH}i%j**}`%O!bjL}$t8OhYZE9qG`&+*bIpF_rfvKZhWVMd$S*1+{L-U4k#W9(5a` zAoFLXX8A6P*>)KeWEF)_YN)YKejC}}q=-v*<<8+%Ae6l)8R#8~8cT=(NK_7Ojy)%s z|A>)zcRa4#Vj+aM=8Tv1tJ6G%k;+fk@2acdCq+#{s*RdbCB=6u75YJ>hspulyk!%c zhM8P#ac2xC_#a>Hnb_}5H26P2IRGG^Tj=5YrzX?oKBr84_r`I}BHH4(f0lYZaw!u& zQMlhg#rh58an8hdkGG3coGTwmxa9s;Nb=i{YRZ6nM_qZ6<7dgI+oeXvVXO`>(G=6E z@MKWHAFG}4Dd*L}Z*dPG{vh7~eaDpw;q4K*9TH6{a^0Pginn{f-xCJ;MgTglQuXOo z5p7w4QWVXp@PWFuD30x1BTYC2gJI#p+AOJt;7XUn~-MP|J$y2mf31q)$C=wXA=Pk>IUgK+WH&ClM{K~pE| z>MBqMyYJm@R_vEg{7-EK(@RKP0c}9~XB)>ln~&cuSeH$9v09DCKPvQ6F+5HGh=tXDn`Qr=x*4mo?dfTBmF16$mkU9 z{b62EiWgpFJk%rGtk+r>+T@d~MFZs{j4Cw>%~f}dSmp?aC3VR8i$MWm#{jm?(?5e< zb_O7yQhqZZr$k|%^(SU%4Cs$EcHy*oodk?F?Ub}7^^brIEM)P@O=&u4L=>T~jfnt| z_D-sEb@j0fsJgDnZb=RQ#=&2AnU0>-V!u*foeEe*I?Ds5vp$RM*W2YfHDJLJK3(Mz zY<#qPs|Okgo(+5TS6GL3-vbj4BUeF9!^sp)&y7wBIjhBP33#`KU>V2w+^TUYymwMB zZ*Qqj6;)%EIU4}DS$f4zew1kggsTd(&&w+WS{3y0WKZbrX(}IyG|8w{Io#z6Yep5C zZx+`V*m#RIYNLeCfB_DGR!43tH;;aL&Q**%@&LUL`BpQ+U@mk&A`}E)4K|kBAm| zuwSBNK6U>z)oFlQB%+5?D&qMM?E`StEGeJh-gmnD>;bbU38)f|AJWuuqXK>8`0fOwn$#aWOE{ib&cj*BceQhgOk$#79U@nhB~LZF4kP%Ob&PsTaG8`f?+$mDMH=4BUCH&8(t`EBF6oM9Xfwagu$zQ| zDE(x!UXG8U6{~Q(-sA;n#!z7Qzd6)fqv%2CnGy%{g)Y&I-nke@(?0JNg3H8LBa$Q@^L;xlxiZ89=!=qlF&oR2 zy+4oG9P(7pG`Y3g>yk1;pUm4Yv)N~5@04h5t=Qbf+L7Pb-v zOj)O?lJA=3@$^fpp0tEey{GRvWY2Zh%XHIj(Xl=)I}@J@2jHMM_ASr5*>y}1t-c1o z@Cd^g@-HYIQB*@o9JcHRFXlw9dze)v37!Qdh&;P|4F?OR&atN^P?!;J&WT$q!e`{R zeT_JKs4Gmn$-k{QlBunFZ}Ki+;z-7s9<;B~c6 zf%9z(sz9^^+iiDpE;$vqT6pF5F$t5*ez&p()%?~I?nc^cOJ*WWpBQ}RzB>jiye)qu zuFSC~<(f6P#+(HdbHch=`IlYWz9M42RL}|a>Nt~KiS^2;@*B$V+%#0KtU?yUejXKO zQ^PmQDK|-{4=zd5+A;l&@S!7w58ak16d`cdEC3YRB(d+pol zl479tdvDP+Y~O{r6OseW+uvzC;J4hL0Pa0vXKDX94&3GO;QrIML&;%)1UdJRl{^{V z9NiA+3un8(ecnpD6Y}PA`bfdVH!7b82W#Y41H%D^)zmFF{K^~kMvW%8na?Y;V@tg* z;UBBE)XzJuZNhF3nIC`7T-}_Zuo^S1+VqM)*yKKJc2tVdyEA9goPW{2iFH94dE#PD|p|w5i*0$Q#tFX!Bl{Sh?&z9}8Y|+_9;?eai(DX#>sb z!^PY>Gbaw<{L{T5Z3G1^I8|2Im{dO$9UhV_TRQ>)^w~Q1D=J3b zHB8e{7%a}oUj!LYJ=z(*zIpBNH5Uihqzng)7-P)=K~u7uU7^8QSg_A(8L3?!zPZLe zu6GUnI5)GJ64bGXDm7V^UOw?;`}pPLy8n>I3VnrDcsVHFTj=frvZlCTZz)BypJh)6 z8=sE6zDHViyWv*Z{C6YH-0?|9o#uGg8Le%{J9GgNqnGqzUR}d5V8DlX=G)gKX++bs zf(jbz*fX5(>QUE<9%Jm0L-=8z)HN0{4UHq)Qcx6I}Drmyb@fAGjuk3?Y~)aA=I#s^^_5mv34!D;Qndz9Nx)jJiT=e^AhHor`CR_0rFKJ00N0CgaLAR8A-FzUtQhP-7t*PQs zSM(9wSCQPNB?wlkXT(1aUo&UkP;(RyL0gV)_L~-Z>X1Z{6E?5tOqVJm&^2*> zVnZlV0DwlYR+xxxzYr&rjIF$zsBZLRn#^o{oE79*UuCP6tJI8bS0iXY51*`; zQv{5^rwHKKkB+>2SDB!@idJ?Ay?;7%F~4UlBa}!W~)It#7#KQGyo_^MW-CTt%F+ z)rx3}|1h;+G6?TtQ{e(#b4%aC`zPTV@99F5g<}{=yIy<5`>f(T`VUfj!JQ4qLmWmt zTQ129Av^F9Od&?V`uR13smEg8$SQHYy$JBSIFF|La9#ssza=k+A6%r)E?h@<9TA{a zbVfHhj4%3(yN)m`_(F~%5(Bujg@_O6 z7r)k7eM7?Lb@KSlOa9+}ra~Ml0C2+bHJ|b# z9mrEa9+-^GyEp(2u6}8}(CW9By(ySwSIA2qJJP8nCehz3c~MyXpLXYh-v=f`p9rK# z&7fm;ktNrE1#pK6>129h>8MAAjGNfU*l3zvs2XSS93E=>c$EjZD(>8IdO zzl>G!15W`aO z$Zeq$VQRo7EVCpWd+nl~t_vj#T!rvnrSk+t<^oyVxMYW)=7O#Yq==Ci^uOgWkfER@ z34HED9^+wjM~&h?%<+N+ac>iaQ?Xvbleq=K!&JMN#f@hl5}X5Xerm;am}pbsJ|phb zzze(l9EXS#Us4XU;7Wme`5-;DHFmT|BDUcF>8SI3!t#;PhCRR`5qOi#g5&NH?^&y% zboZhK;OV760ObSdDNEr#9&nTTEf35}wJNybiO06g4Wx+lkY(~Hiz$f=jUrx%C$6bd zs+?=^OE$Be|z=)b${UK5WtSG-}F{k=nWtI)oTwpzlZ2W+VwIfG!ER;&kGpo zCnlwYWfE?D<}?U2vi%S`uPX){bi0~`K&EdKrfU~*uIepIAaYEyby(O>WHb z-Fm-pQsg(4pwx*#Wjx_=gD5h6cVhj-8^?U4h6(aAQIevvtBaMkTb))9M~sYE4mw#e zm=yKqEyEWGdQavoo?f~Pf${w9KWez$weRa~8Pr&G$dI6Lw@ZKh=Ly$kBwmT!^3%^0 z)$H7!z2uMY{`$ag&;R?!T-3#>mamn!bMYB5&kch#?vgv4Vo2@m+xy8FV!kEJ=$n5( zPQ+A(kasq8zN@1R-N5txWt@oj21&Z{1ipWnd-h#;qZ1>+>U!tzv-$Vve))sj3eur1 z<363&ir3pGzb}`2GX)R4x#i)I>wdEBg11x!MDI@)6~lB@%vUma`)Vt0ghrA)WV`;mzZm5 z;(#QCt{(5)(qDKW%+z_#B(6?1m`wx*{jxNOSHcb;PzY=J{2@l%&iXM-B>d~!b4!2j zLx>5N(Z#z`yxPzzGieq&w`M+0NDz-`HOmukNe5dOXo{%We~;^ht9b4#{P(#2_qhJO zcFlU|dNA#KJmaVudu*v0%V|$ZAIBXwlo#6;HAFu*g|SgQDV_NAeMJ7WQ1(Ohrtqi$rtxq@}uxwRvnZEf06~N;I zeZtUz$?3rCi`^zV-Q-IS5^iA;3{`wOCbrQ}Fd*eKg_~mM54~F@3Jl7a)BgF0Wp=Uy zb!#Z5ZEH2(^y474OXBQSEweJ2{NZZweO<3-9dlH# z$oK+embJcE^>-w#oVo0%nM|BC4PU3UZvBEuFCpf8=V7K`EiOjDpRAG{s?+{=-q>2F zyS5wLy+i_Q1R-?Rn8F_(YuItC_)KbIK<3&axt=WOGM-bSJaAIfClx$_aZ~u^b`E)J zT#h`GwR@=Vi{IgNh!)J=CmpfC#ih^l!9uIpIFeiEvdhNHgiCqY<$wP2KI)uexnQuc z5lAeTt1je~OqviG)q4t`2cX?AX}io8>A7u#c_9T+!>k$>;`gJ6sZ6J;Q23|MOtA01 zFlq@ZEz;?f-mewGsFq>BGQqrtmh9h-C*z~Ivq*G!kK@swTz#=5U-#By)XFz`9EW#q z>Ziexcw;vYW~k0xf_2ppQUUm4OVW|Wa`%hPYTFLlo%d<2l=dj{!JfXd6%E^vU6RSF zU933Ky;;pZo=-fy14-O}G6W!W3GtMvR2DkoY@_fYG#&#k4K;Pof_ zJl(~9f^+*dH&O+pH?eKm5`}8C-rY*X4g*ygC9RvJD@b~4UA+a&?AA}^4}l7b4~y_6ySWtE+t5UaeBF*DPi(GgYlM|ZIM1I)*+bGbHYlB9KXybzC1i~OIB z&)F4lzUxnhdAh%;)65MH^bzGNfnFV99w~;7UkWGpoT+VzIbPVp1C(fq&YOqlzbg@C zu@aIZ5hNsYPx5O|o-n*QDLlYi@OPPYH^cM^bdSHn9@aX6&-Lxe@~E+_UNeb6>!7W% z*=_#{rx|w+$5WL8-Q&0?@9sQA+i1@@_paZ+6S1B=xclF~y;7_C5&k6rSF}J!C_&M2 zHj*b$kPaW?-8r%Ob|3Z)oX#Sqz}->DPZGR(bmKQ`Z8zq?66X-dG5*;eC)6F#*f!8O zFt>zqir=1mIBO~Zr<@g!ym@YaNo#mKQ6Mo~RRVM|6B|8QVGs4BThu=$j@5kjEo7O~ z?CZM;wHPCxuK$CnlKQ%#Km-`7Urt6ZaUQ_GZ&Mg)&X%oRaGwu?*!*P-Eyv{#hm&@Y` zg>c$iX_n+f8mb@{+loJVoG5hgVU6thbco3wBgA9eMA!~~UOWE2mF_~+JfJZH9Y@~z zO@l^2NT0y<_vY=V9XC`wRk{IXp-78}_{4e)6jDAB{GI3AD*SHL0}n(FGz%qDx6{Bs zw@a`G*X^9(i*LGkS?$eaJ=NMJQ5D15Sy3tnD#7+-&3%3TC)<;M$vs}EYQKu@+#!16 za5(@Sa&S-`)X~<|GRBfeI?LDSgQrS8utu$+!7wp@0;bU+^Bw*t(@;Z9zxw`1u-UyI?~ZG9-d4G8;3nWcP+_J& zNaU5=eDjT{5^@vzrkj{W1O5C8|L#K8y#kJleYe(T`nhSi@jy}SjNpsYkMBNxnj}NisQZ`oWr>Nffo|oG zaXjZeo|h5$GaBHf4tm}>F9h%csGSac@!JW0!OIzf@S#Ow*|Ie8J%+~p^|cid-%sUl z3#$EMjwD+5m$FtLvZ}KjEaV20+H0j9McLk$Pbnu8jjXStR?EE(d5y}>a^6fj|Hitf zzz@H19s7b+PrmuRnWuZ{v+8W`$O#>NFvV4mg8BQ@<){i)2QmDHpp$iAuny7rul!w- zFGDh8$77#dQ-|ae2jW%<(~QUJu7=BAv7}B zEzCFV?icLx?;3~aJ2Di4JQav{f$osR{$9q@y|$t^*B#gPYHlsVJ)Tc@S!6W8;_Ax8 zEA|K;DKlieKQd68p)e>4p5P1K^RwrWuA4#P)eA5VM@_T2);218g?D5-BqaKv4f+4{ zlCLI6p!PBxk4evu?V8nWSDYkh+d;Ctihj)_4dIm1y>c?S4r9-%9nG#`K~ZwyGk8vDKaAS> zzb!9#;SQlo_A73OYS0rzzskD0aJzgofG04^;w}FL2TBuhplBA3b!5(1l(u5;Krwwu zi=!}55VJHBLiX?{;sg!bau|px4Ere&wNJt!ltI#Z8=oAam;3Vh*+H|E;_CJONC*PJ z|8mH<`@VzK1~vGtIeWO}f|Jg-#HpeM!!2v=gZ-IRlfAdR&ImY6D|MgV@x;+yFqyg5 z(nz6dysTQegFHIXV=@Yf*bo496|S%{AlIC%3Z@yNkSQ_3^97CQ;w>SAyqrTpcLnE$ zH?aUm9&!hpYfY6*e4Sn}%SM{}jiJ#vE@x`j^>K30i!=DMcYwY%GAd4>B?3v6auvoYBgtBig~)r{YzV8!6}Ud=F?w- z*2W&;>pJ4Po|elV{=nDI6V9Rm4R_E8x02G!)i`nJHArU~C9NJ;y&UR9kfnOBWqzx_ zqIr;NspwbhJ%6P)O_JjMJ^%Nhv?fZ?@&a4#uNShLDs-_vE)ad)bFj)i;U*MC%*W;e zxt>O`Q-kYw96#SWt=9ag@I}@Z`UW`BhL1Ke#388g+pqWyz2Upiwy?ZFQ1!3E(Gg6J z3M#&LaI77kuZ`|98tn^Jr^n#7$K3@TCri?ko>74dx%ab13kPK(qLea(DyiDUeUOl4 zt%6Bs(G2uJ&J~!dL*m7MWE4`*?}ew`@2_~UJ=ce1IaadqV0l2#c{xNFlf^_WsdL0{ zsZX!9UD@*O`beSP`{+0)QoXL2_n@5r&Tfv%qwq(@DtNlvexS3O5GboDmI};N+(_{d zSsn&dSU10m29cJF{fK=wT2AwBu#xz0PFtBDk3O<3-^Z{VlizsCrt;<%l~KsRx`2Ack3c}9_R{*~Xg3H%T=3R9)yB)r`R_0vk1n#A ztlmacY)Ny0k^`%?!9Gg*17mlc=D>Q&6PT9skc3?B91rjt{u1Fv-Qq=Q2xg{6no>_2@5Dx^`1;q9|iB zm_pLT+JL}N53BgIuS>dHLuRNb`SVYn4%m9vK**e+E<)b>2|QixK%^0!wYqkVs@QNK z(Cb~zAd=~2WRDl^(X>o2+IwSPfZpCR2)Yf5?OM=@Gs5aHHA_K?{ir==duj?<-X0Jt zD}&Ci0Me)S;o*@AXm>x){r&6=^o;d5F8RWp&8**j=^#-=*Uv_N-+AWV!4k#U0}a5+ zodUXj;5ZX;IZ+N|x@HXMw(keEM>EKeku+DmM_Dg6oalto=V+F;&MUVc{hes?D4}{P zm{AnX-)Q&dk$T2gbU|+ErXu1(xMp)dw35ZiqnH%j2qG~g-nXb!x&Lw42%$1veJf)% z1$tc?Gd)}_LHsW|qp776pY$xZzk)iXnL6$UvRNO0zU~mi7Pq|_M96N_I>Bx`x8Zsk zlq?)9w9K550{WB$(Z&Th@oSS>OCU^&Yyk4RRN`wfCh-7U#eAyVX1RbmYfUpC&&0 zi=8f+Dm!WKZAgDS$D=5t0j9}vM@6kBfAS33l&}I_QPIh&I1vCtruE8GD^@X?sM6iq z2?ET{FO3b?WRrz*)x#OrltR0hJ0tm#J-7~LwU?&y@{%QDMDS&5d1o$N;dOCwk;$-l zNGl|lF2#$-y^iZ$`eBx{0Xm9C&^@HIf)y5ZSy#5w=OVq|EkKNl9%;fu>(UAcem}Ne_7Q@~F}a-5ekukxFNI z!2w&R{c7$WU)WUA_FA^`Rmw83lmF?{dhD*(6B68Uj|ZATbi(1?eInz9l}$Ev6@=+;!a9M-=Vw#9qJK{J&d?=%yVMP9rx&D@;@y+ zjX8MjV1f-pv^cXbHdik;#HLcnPDi`_Kq$)+(9NtfJohNQuUhjdV(5@>jV%R2^ntynTQZD zd)_|UM#cV-sno)KU&oZ??skpZ1sn6%n+i6F)Opnd*y+<2z)q+5mz~}U?DX`Hj8x|@ zsjoK?=4*xXNjAZurTs^& z0t(K4J7ulwnFi|n<8sSz>4inUH4Y|=FAsc)I4gP@I36TW^V7hRWAgxCZKLzR>(OFL z-PRBbfDgC-UZ?m{c7w}w-KY=!!FAfhAFBhZKh}4r8U!Dve-!X1AZ{DT8hR_`cc;>> z$H^~79SKCqV%$N~6_fF%QH6);F$VKpn)*A^d(9sn`T;!uh~0|;efsXLJcGR?B2LFK zNb#FnbYzNo>P(HGt%SswuwciG2wVs`#YMG1?gk4w_KVG}H*|vj1WZUuh9?8ZhY4J^ zLwTAkCmUYouDkpPcAL|N>USO*F7BZ79!AeEfMei?OCMxDLt)5YVmfvo7;-m@?+${- z=5rwi6zLJE6CZjbjpVv1U5@wXWmVOHVJUOO9`e|n^kCDQ7pL-hj(Vwv*A4uP-MCdw zUeG-8CBtBq*?7?v1%%a-3Bc$=p!d$(7sXe4+rsIKr=H;qyB2ky&GX7%<-6#b+o((l|%`j=fwdlDfxlPGgobj@Q+Z)!Qr9ED=$s_`Vbpq zRZ+mPME0ETY*&tbJUu3GN8PU7R!9cp?EAMVnH&e&HO_tsme1Zd!1eV0_C~Q*12x{m zL);v-qc)Y^N?XaK4r#cMv2mUU{viXx$T31$jv#(H^x+fP=abK5cuX#2cfBxz08`Cv z^})O|buTo++|U6DUeWOTMbO;zy@Sm(5|v66Z#1U0evj$sPNl7JII#->DY(N*9V<7k-RS44w80k-rM`{Za7*niFw_LXBMax7 zcb1rnE67uKTLQVN1uE^oHFiYx#@8#V$b%l9$?|RUqs4J?pvClDExYnuEB2iCMlBQZ z3(J$w0k3rXQfXDH9q65_joD=WCQib08}%`Mzj;YqQWM6yo#3|05EirmC*cAJ!xJKe zkDZY+QZcF;%lTtUydgAY>x;t&Ziatx0q{uuGeneIW#Z$1JqI|^%~LEU!Er8k?tIpnPj2oN!fIALV{~3N&d_RGHv}-lc{iVnH;0j zrh+*do%Y*jfw2xRc2^I3(#^5%`e+kc^d2eYNlIPerM_Rh8({pw7}R;B7%8hpaXS7G z$um7NECpPNcE}!A(T+7xFJ(NC|6!y&=eAUMr<-9vjX0U__10zUd;@$2i;!%MYK5$+ z0{d5FLVMa|U;YPL5=<6x7!$%xAo8xN8pyma}a*Wm1=wsvXLY zyNXb8uASH6zlixd{Hu{vQ$?Hx`YIuan&epb9IedNHI|P`z?hlM<{w!mZQfAl4R=#!Io{GCug;liuf>MoB2uN3}_LV6un`L8de zb1`4xCFXJp9LyPOVbV3aT>E*7}b8>8z-T>n<+h(`RuZpxlpX}Kt;*-4HA8wt4?(u+^PBg0I z?DadB6Wx$ov?^a-plmz-*ccKt?Ej8IqipL094NVLIeAoAp1j9+om*Lg58t6vRS!)mvwNPz>^IQM*0Eq~Ak#=WZtD}#bws&8B zznYTC9Iivf1bO~s(dtGA5WQ(8y-typM{CAJ8f)a>=|k!kM{M}wNFMK zTxBnlTB$ald68q?^n>=1t9QG1wZpDRYuI*et$o?bzci_$qszQy`U)a!6US~{t<%DX z(6tq_7wpepEo=BVa`cVm$75YRsK~ZeN%lD_*CEP&QWr$pNdw#jf$zFyq`pSmMRfG^ zP3W6A%5u5%fgak)hecO-m&vbT5Z%LfnbO~^;XeHyBbTXzACkT$aKnCQF{sD3VT&BF zd>H~Ci^J|K%|pY%K|f3i34)QD4sNoWVeavuIl!CIOI`li0=2m=PHFX?(pKmj-I3@<}v3ZbS0;I*&7D*-IyBg@h>`5@!0Rm z=cowO;15q7n!hWsx6|KUp4+Mop?X*1Mps248EU_cqpz-zt3(aThb@NHU#A-mW#koS zT?$9B$d~~(gUso6>!>v_YLZ>gxJHYUxWRj=UJm69eJDN27oKi>w~|h?d)`F(HT;+1 zR>(_;Fl_e!-mn4r_6DY-+4i8EAgz>t=d)~Y_yHus%b^tMnR|^#nG^274WpG#dirpA z$IoJprUh7AyNO04RlJyFLeD~WQMY3xci5a?{`iOjp#?VF(|`l{+Uf@7YHd*Sr#qC( zsp1S8UFkONP~kYs@vd1Fne}K%cNuNy1GdN_{mK4Mt-wBc*Y%#FRP4iJ2@qN_N?n;q zi`(RQ^zO3U>S(#R))ya=wy-E9G410kVw3M1MNf|p2>eG&oV^ha%1aDGcym{mq!$_< zT~z7t+1V9rm?&uWL%?RG6jdwW_o6q~_@$rT^*kP_@LbNf3wMtDFjA!y?fn)Q>C+!X zpuEn|9+fjSUTYsCRFBGgHEJ#Lx`Tkwu#~oVC5+AC$LhV^rP10U;7b#SmodfblPLZF_8YGZhCxP z4c2WVbNrIgTsX*r)!{z@!E{aLMJf#jt*hNMs~KN3bby=G8e6f;XID3U7ARxgyHQN89tu;#{SwFpHtyk}?v-CvSH6yqstydMZ> ziyWa(-BuR~r6$pB3kfnBDHK_j%OJB^9af1tSuF5S5@knM)B^^S9hQv0EdHEB-=!U zYPF<0Qk?L-7#?|w0WKl7jl=%;1i7r!l)QV*dDx9ma~^0V+-lFsh1| z|K&3 z;zv(f!)T3*mgB^W3qw#Q1p3yA!(P){6Zi8@{M=-SUc*Xfd#v6!dFS)8OieSC3oCB4Zs4=DNOIqJxQu$MnI4PcZC|T*06}PH%o*yJ$D={% zPdi4pzPjfz2udOG0<$B?pij?GJI7X|hk_YH27&|aZAve^llBSju;0kBnmpQZg%@?c zE9ky5Bf^nP-c%HqFSI%Seqt+AZXp0-)u3jcMmDVj5TKd}EJu1+5OBNjfx_?X8|Jsz zdKd6H>>`Zzos$&M4B_e8X>=B#8?5mvpz$PAEy+GCYCM>35bXs_fjO%Z?(xMdgMKK; z8A*y=>oTP##%rUK#PjTrI^tMV0iS`E)e#8X8}Cud_W%>uV7x4$2XMU`XQ<`{DJTHw zQFn9_{~CI-&2^ckEnPoyr&+E9=HTSnU3 z{u$p!{3kwY=49f3hW3{bh(4ZfU>o^;2qm>J><#(PI+et>bLxoi`wSmqywh^t<8oW0{S_T5G8Xx6BW z%tGg}7f~ehmCxr|-mBgdCrDe<*O};X^1eGzqJ5;$mn)NBWRj;*9ab=R93%gFltlmd z@tL|y5qc_jMI;j2H8Ea7>&1izInRE0AJC}?h&_+XPwfskNU%vZoJg%!NU=eeVTX>e zw{x%LLRwZkgbB|ZhQFBkB;*L6V8q2gmZofmu;Zn=B)nP0^8$bs;8O*tmE^Fcf5UI` z{|A0kt_p%8x*!!6kIZL9i9KsD2r61TV?;Y+wu6BBQC=mTC6-XuK}jPU@Ji)uv`B<~1= zxsuk#ii74m&c<{_Ix zl@a~uxXpopfo>~)UcC_vkf7u=$}S_5*{tJq6SS~oxZGlzE=?PuCKA#IF5?0m9L5c8 zB148emRbc~{B3nF4@~IRCM!LyN=Z+u>~=rPnuHuk@M4mS+}dPy)lkS)Glp=}-n=TFFPQj~=%`23ci#EaJr zwX~t;GsnhqP=VLa`%Ty-#Ve^|xSUl`IhLNoAGT}!GshNo<}aNo35Ze2USuoDl!#FY zgJ?{q#gf@Q*v{$*Q(yJU9e46w^c0cMkRlLXIM~K5ib>gtmk7HbsavoI0Tw|`!*=@j zL10po3HOo(v&!D{dn7Nll6~sG=+1-(Rk>&0#1qKJ=Cto)wcg7q zMUQPm1rpWb+}N#BmERWYQCHA)+rl2b7TdaAk2OFP0uF%@8sQ_pM@GZ?oW;@-aa=JR zK;hz`wS>~7wMVSiCIv2kKiqvO3rng6_U!PY=>{ptQ84O!#|S19#!O<3=LuX+wox|h zFUz=TW7s=Ovjp1CGMx6NwDl$%peC&@^1Tj}yWMg)Txc7&vpmpLF`77Dt%`eKy=s?3 zm+lV7R#+aa4!>!WAF+RiYQOD5O(7B8FG8!r{2qiI$E;*|ak1?fxGQW9o`S&cGY#zI zmwG_)@L|v6?N4Ad-Wjg+J#-R_S~ec7rwXc`=UGAAaL!_JBrBJ~4tRDCqSjezA=ca%gj#=*VgO_Kryq0rw|!(%@y)sCJ;e>q?}XuNuS!2rx@zatyKi^p-_)5RTPa zB2&Z8Tf-qzXJ=~p?0C*NE=8#>O%{XPwd7kreP?4!x6ksF#-AXj2ijvcGpC1cD#eES zl{kQ6PAt!2>3F^ae~obO1E0#Fzl+ccK|*x^>XJU{~v0^&LO;x5_*l9TpN?sOq^5B_Fs>r5(WM4ftjJ13F7K4 zSf|FJ$grHNC@EEWFX`{}2)4{;^JN6-+&F=21k~$q`oo;4oeWX(`^p<3%=0 zeJNP<^z?dOcbt!h7Gg892e}0ToA9y9?Go0{hBWtzA4)`%DoVi+pi9n zgf{ZRui!5jvb)0-=WcudBG5mtWjla92ZjPU>qqU3@#=3g(pm4>_|d6kN@~WqncU%} znxsUqKY-x5^E64Q&kpC$psN^Xso&UvK?{n}(x0Bu@zq2xU0HsLe}UR}i{$Y{gJkS& zC&zejJlBJtFeRPA)&a(Tm->(DKJ7f+P_A@Du#PQB!QA6NDl42+LIK{kF{<*MCBpLs z=JOG#B#tx;(;!j3y~Np6A#4F$pXIgw#&*)H$e|_KY8>pR7Ox zm27-T58lX!z8&F0ZHu~kr15hs$Wg)9&mF4Y_xdtqTn?VjeqFiN3*|~NX#3aC%8Y@; zn~>2qet|#hhzjai0;gTUT^Y?*r0lezZs|856ib~nOC=|ac~4>qrwc2@8xFg5i}vtO z0Lw530A}Iq3X8nJ@3zJDx#bRbzL~pEa4QareQqsE(Lp{UR{P6aTGp*F1Zv)U$(eua z1^5D)_vL>uQJ9%J0O_vSoGDA(%uRFR2x zk_OY-nuAO!-n~7voG5^VrB$B)6BIODA573=UceM$<$mQFdg~4zlkVO+r%bI2r$Jvu zC_o}zns9j8_ni0iAjdNI__6@{e5*PM;gGIgW+av0SzR-B-U30g( zjl}zh<;b5D0iu8Z(0g!#LNbyB8Fe-sDfO&;45V;{BWs@}G-#8He~>%eThW%r)p(5n zo(!AM(3+T@{PbQ3;%4&~WpmZ=lpna}3J@ayuG7cW;k{Qq+HvOr#@u3K9{FIUbMBe< zD>>+*t3iQK=FSMYax2<=sV{5@)Q){&+`>G6yw08Wn>=8^5Tz$sijOU3BZ>_BgtLsN zazm~3r$#dc_i;c+zIy;pUtk9zzzvEu-n z5x9^WlSH9dc||;utxw;kR7&az6f#j}F8c{)=FK!Ay~!OEe@i1 ze0h=gcC{l=kh^U{)`NsxozZME)hzUW=hpK4a=TR`3dKvYuSYJJFZ_IUhWs6-c}2YK zHYMYF5GtTfav>rC-5Aj#k#%r>+3&g=$XrhQ@GOPA_c4_}^d*N9)L$a{MD$6rnH=ks zTkK{6_G-E1p{%u?vaePIj5~VvUsq^oKRDAKY&qYF&LCY?0)zr|IYgd4l~_9EC=~Sr(<&)-_A~+=iBx3bbp;Jj1I|meLR%d ztp)3PSUGU?C{f)INm?Glp&v` z;?s`TbB_e9^c&y;diN3zlQg$rpilgXzJZbh7;XY&w7|D3w3$mtY?Ri20W{yY7R)q{YMz{Ox26p~o-w*M&0YZ_YXD9`_gn#r{94ucs9SB{M<6-lNmyl}iG* zX!wz5Es$1!2%bLI3&dEWWG{Fg=EJKsq&>r62+gJhoXlY;HZafNn zVUKRP+Wkdy?(*~dMS2ZQZQzX63@s!!d@t*2N> zekjsf^=G&9xQ^mqXn{j%n8C>AH{QDx`h&@20GMYO$We~FNZy~ULpicH&qtv|#t=dl zT{2ZW+7OH&lwyt1%(AfG&K$4wqG{L!DeL}PB@s0dB3yUHbbc8y?{nteL|1ZkwoE5~ zPVbw@W^wQ4nD#3W+3;oWzL_E{B`OiOIKb=C8=PRvd)x~EUUXhh_F17tKV#Frg- z-7!KU_U^08xXgYXJB}rQw%nd27kLwKr`10^K4Y&qwCpyww9xT#g>b2x| zaHzc|n33+fIyzl1U*~RKl6lAf4Jk*G-d8s;62Tttrk?<9s4O1t)pz>U?rs@%ghJPp z`F{0qJ>PxA9pJi*u1|WzAM|K&bEc(}mJuPPzrwj7p6{04DJz~MSM z&w&pZMik>!>5c@T;?jWTGE*;dKIfNx^Xp{j6QvWw z&+_PrA2@NO@0*}s*7E@Fo|;a={@+A1XbZSO0u*A}dv&_)l;O;b!~rHW73PkGGn1tg z9}t@z{px&;28efMLF;Rf^_6c|HxGZ$MkYmo(*SU6R-OF$K~B-(o>?*L`XvFK5#EAl zw?|rGBkj5A^W5{x(+%-?eD6H+zV!fd-WuP1Kp341rfDpnkY)JwSnpB?_JW8Zqe}uM z`o>PLJmG{Y+JO4tu%kQG=i;OirH(=Y3c}mL+B;C`Lo?RkQ>vZY8qcn#I00Gs5@nY2 zQTci?=zrWm^;9n>tm+u8334P}5K=NI#1{{)*En?X+)v_tHT`1`;4jLYQGZxN`C^U#k(T~f;A3KN z^n{DweLFV@ad8ERH8YzQ)Ej;E)~Y#s61Ww>I7dtR@eF@4#O_F+Eb>XWN2)rMwiRD{JB8ep>{sjOHUthbI?M@2@e^)=cmp;9dT&kh~a%y(|N8 zcw93}G)vB?lE?_?One=OGU?(C*-lxqZ``R+t(O^9;z zrw^bl>~nUe9jD~yBwg}XQ5EIiizj~etum=xkPBWOg}`xK$%DcHY?v35>fH#wkG*76`{H56#}}yC(Ac#c5OX|M1CIhrH!> zK%G46Z!{CgDs`i^YVW_wWA_0Cr5qXsW2PwmdVq@HUu*0;nbLzA+mrXA46^J$H8Jqm z?C2KPTMS)BEN1P1VgniL-Y)?j+AB3-feyY>pzBWyu>M34k#~1qN7G!d{cku%zo_(o z!_@NVu;$!wS1yv*L~Zumg(P?Uq=(}y%taC3aGrYaF4KwCdhk*2j+HN{=d3R9XJ*uU zNyNegiiQpWZmulep4i6d8qKQ3s#dp(k|qXn#W-j2hT_A7D>UR#g!`=$+>Ul7F2cO@-PRc-^KIOJ|S z&lX@9lI|WFf*j48uX^HDRvNe~RIxF7!4W4W{u*?dcXLn-_Yx$_Bgt>)ba}G=>gfR3 z=D7tevs}dLd#g|E^n+Q2drKns0GWt&t|KkMYwDn+!o>o<+`a9%wYkr)G}Mc9A8w`{6ap*KlF)XA6WxzU-kVq!-c2aA`hVMnJcfIr zJ-?xx=uKLtNVq`BouejD5O=;WMa)GV@DJJoqe>kX!5o2(R`S74lKs#exb%0R&!JTys3ajL{8RV zp0U!&J`|NG;PgABpo_kPy!+9z{e^O5p-1^mt3nqZt$w(lWAgsBk-q`2oNd72PGStZ zky@Q`?W43u0&5jEegJ`1?a;|9(Mra9I>@EKto{`RvxAnJ&{_A7&Qqj`da*(}4p1T; zwULMj$@FCRcSy4d!Zm72fufkfd<{K`7ZdU4z|T^ zRD-f=c+5K!AM^~3y&j5^ymmJ4ytlVHwmKaw|LgW& zreI}~<1hCiDXoVG_h23haV4)GHp?kg73n=1>qk%=_n9$en->y}?|wpxTt6`=)P1$} zHf>Cl*mdTIwe@g)F+V6J;w2UbV-|llU$^%o23%((i!wDdYVJqdr^ayxrh*WDK^2B zl>_0smvjX!rw$4FON``J9y+hgYk?BQB&CMP$jBH}{d=Vb>OD1rz^Q?0ktDeOquXBp zy1F-iKBI0bXML*nOEqk7aGcYq*6#ehq4;1TRMo^ttvYUGYa~i$YoXI}>h5pbypj2& z4(DkVe3W6zXD8}|)9jZlGt8M9@oh9HM*SwaeFtWb2kS-El z`;pTh=~ls;XTtT);kVKyNgT4r@shnDIR=r+vPjyCu!kzVx%tZe2gttDBE;EBhLYjL zkHp=l#?5E0iq&@MZifKPCJz#+;jDa)7Y5evg0v0KGOIQ_SC%XxcSo8l+87P>KfC4a z;f`+_Op7f4_}h*As;GYv#=s4J5E zdkji22WD^>RLO6X7TeD^I?c*wnDCZUR{(mOb>I7NnacBImDW=oZ#grh^VJ#V22{3n zUA+K(222Vtsj{D-0|l-uWL(DYt*UiCxNfE_RXc*YZ+Cx7-rv1^#^W4LgWn1h?uGdN z!Ca+O+Mo+p-{}Rqh%W$I8mWGR*H6;dd6F%fI^QL%_9VXYuF)r~aizK(&w|4SYb)&f z?pk!El^R7-9+k(i81ZCeI*iGJQ!)Qvn`naENP#}RqqifV%5=X+VfZnTS&LNtha zY4hZfBp$D~piF8i$Nx+3_n9@ZmKHae%Y{v#`t|d|vDa9cSuPmTqcX@TJq)r{<#XFxb47(L zzfw{pZ(auP=JgH7(GN8T2ZpbKkNTwvw;Xha;0ldh9PoH;H(sw*c$)|(KZH?f;tSwz zWgFJ?Z>?PGq_WXE0@I$%*Nvb;;IOMx2La)&%V9BJXpf=tZ{`6 zwnq+TjM)uB3~JnyO%S0xN5tE0~tD z7HZp*CLX=Om1bLaa~F`#{SDTNu8VgaCCa3-f}xEHweCxH8Y;hKkOAf2<2;W2Sgldx znwVsBsT%Tv_4F!RJIGMi`y%A)a~0!(5K~?-qrxArgFkUy9W=5n)hbMKU7J+9u!Ao6 z0!endH4*oLaWF}q-c}pQ2nfL=9b!Ja@e+z6#RX4#;gs4osC9MJi^KZ2D6W(|oqYvz z!HjAr6O|8W5RdiJ{}x)39jMi~cCYNY8>mkzzth$Ym{$63)=n{OI;}esDR}aSJ4-*l zCYJZtCff(ecDQ-XbMw=++QzAYoI8v&kbCz(G>)hqf@t~5s^W~*1MQGo6 zo0Sfk4PM5Tw#a)x04lvJpY=8cq5Pth;J3{~szEc-yDQt@oAJgrj%2MzO0u;1QD&cx zYjR-TMzU27$U8}Vj^@+ZMk;%0w0yQF)meRgW^E8}w@#y1nr-K1+rS_(lku=ztlzx; z$R{GWPh$=Tt;;|AY`L190m*Q7FlhK5TVd+6>4pFW(ta&glz?KC03HzdrjVOB2t7tno7 zU!w!9@;k&LI7{ic|D!a~^I(9~Y^V~|`6#FH+{sZ)wVr(ESEt>d>1UgDoto_XCH!$v zW<8icL91IzIVjm%Y)}n(95ur^W!AftffhmlV10pYkf~W0K)pnd<2WPjB5I}T#N?sU6=h*)kT)N$#btKSVw4@{3 z;9vG=={z~VZ$;jdp7)ULU7NKcf1#!wa+gQz^+DqfdEREPW@OA4UrY5jSW4Kp(f92#z(ohT_<^(m%(i$;h{eAl+Ws4X%e?t*2|B2W;(VG5 zmAl7TD)J(5@F++QJo##$edFi^I@{9v;)o(eE*^SZ5=Dwh+w4y9UCf^5s>hN-M`{tNwO>F#hU+|q zw|cW*%|i6HwfX%F&*9|XA1=~kqY@S-%SJ30%JTS*5~HgQyO3Hf;QJsxk&bIsV}*tv z9+bpz7_{cJPxypfBp05{nKlmMLF~qJtAnyopRU2*KN#Qh!@mGzMy87H%`5i)gjn9= zWf8ozRN_?b)9t#}5+@hx2^!j(^rahtHzXWEQY!6Ec4d6<696uBt4mTI}@K|ViPCNv-#6xVeCh=*gG zP4mFepIS&!^KqW;W8Yl51WkNzysUL>Bg zxPcS%kU+B^^mBfTZj0>mh~V=gVbm^icXt6ZpZ6<}jDJkyvrlCyr?r3PAU;hM8$a;L z4y(FM$V=WOs%%y&8HrrJdM5iI5B+5i4me_O}3O0uE8xisG0br1RN7~?i1&Co|W219(;;GE72 zOjzyBTkAnOD*tlozx}d5*AX_zFrNNCq97uCye0rZ$}FyA8|AlMJ2KZ)rE2L7&`%J zYs(9Rog&BH)^e6GqHYz8!{UuY%KgD(ic(GL$6kcNGf^W3}+zoYU#c^4Zt5E0bZ{)4kbSgH?H8 zbjxn^o#5(Avzf*tYP(8q%XBaOqWUc&gDFS6Q|kObMjMPk%|no0ieUvUp+ap}Zq1`^CR( z*0kZf=WvF6h&-nDl$PO7b&S0@s>UsXu^vPSSwvpw7GdibRq>eeGr8`%ajC_If{r#IyuEr0QXQav z=Ul}{2`Fw(N)!*zE+Hb=8_Q5PNES%raQ8dhNPlS2vo>Ty8qPef! zvS+hn^e=WJnL+=@cE*jl)~pIs_f9zqHY~tLgIJ*b36-V51mD!kG|S-o_NaIhfAR&B z$4*XO7r5#l6hWtjXN{J1O#H4cqz0&!`HfrWhEJV1=5BUm6D*k_Gw(nnrW<_P#C=fp z%mbo0?>-%_d{*E>(Wm*W2YGI`#G4(wyu=Nw-O>^=%Xw)NJEXigum7U zKAn9G2FuS@Lq#NH!zr#>$HY8}$*~Wp(yE!ZUj4Z7FV}XI@arX z5~kQ!B?O#!ne7f~a~itT?0p4<8*&xVP0jkP<(19IfO-m$eq^f*sM38q*t1g9V6h~= zG?YDFX4ckPvtXn-c}Ib(L9?i8IWlC$dwy(THXn)bsYWM{K}eWQjlQpwP5w^AmN zvJ_?ZRRC76RPyQkDY^ZRNC!q-&KnXrj;L+4St*Wp*PJk(`&FcVzVAw6;P$I?qg_-c z;G(W9*#NQ0UsIubLsR@-+jnL{YkeK&+l)fAm2KK zSM2pk^xR@;S`wi`5M2jqEYG=Eo!MpEk{&I-M8}#I3#Uao=ryj5Hy4b2rox??UggdW zZO$j79z_ezY&>hda3f6TooVwAJCt>98gaalzj^)f7TX+~u1omP4f`IA^Y_>Gw*5j* zzD%$#gtEU^HT3)hHw99{;;5WiU>RpeRhjvaRaUIWxMVnQs-ztKz;JWOgTIiyhR5+BDKA5EYt4F7|=$~*}Eu~mb zFeck;I1Fg0h^jtc(r2?3`K$ZaKR>uk<!7O5IHq~RAql&BM#|-x!)X8R~x+HU?RkZtcU|l&P@|;oF zL@oYDH0sxrPZa1|vRAGjf0t8|W~zf%xn$FJepZYwMBeTeydxwTg~g3+k;ni%h5Rji zDaTk@>oJ>^wa$kbn)4!|?1mIF)}Er;6k5zG)-f5dG(Ybh*6=THa!5`DH!|o$=5kN= zToDH(U*$Eb*QaLU<*r{|I`*=m-jWZDg2Wl#INPxAFQgjPk)!s4Q1k)JS66GBgww#R zn4n`Mico$;bfpM8q|atctXK4+7P-xR`<{K7^HN>H41T>gl^~|#R{2UOwoGXLKS0Roa-9`foYzTBUp9ELf!UWvT4^Z#OEn6*6oFlw7T6U;o;00w7B~*Al-iwcQjTK%#SZa+^ z0!o5fA!O+~F)A+%>?)0-Pwq=3hjLX}S^p>&nB5IHDKv!7#UuUeqw0)3HzA|$bw-`$ z{X*J?PC<)Pg&vcrkI&}3H3S_)yV`A3ipHP5?RYlODFULID7c@9BogFZuY-RwHJHPfj-`82 zaT_;K`Cv#b3Jc$w0u=2SZX79u1Xzm&U7+?mNMn==n?LjXLbrrSoXPr8z9)AB0*?AT z4Y?HNtovg$OCc~jybbq_bK5cfaUtILznJH zDo5q#D|+yazQz0e^Xv`HYKN&LUXJh|F-_v_WzKgKI;2Y*554X5&Qs5^c=-n;LOK`Z zr&%7vU<>ISe{WLP{ZUurnY`_@-XK9J_;_+rc*3qhX0?2Oy|2^+I`e_V_;5}Q%8F;9 zEQI)=>r>1Z;uo74S3wu_R9S59z?qg|4K+|HaQA%P+){fRJQ7rG%?~ALwneK5Wr;o= zsth>1!(Qz_)tL zST%&C)hH@gHkupHF+-5CXFgqtln@>^_6gr=*dDV?Z>ySs>k}#==Z05iCs0Rvr7iHM zt|xIhb?c2>guu z?p%>i-pE?yvzH?y>SFh)ygq*_L#XguJNxQeQ&V^^zruT~k}f_QYir&7!zN%$fi7Yx zC)vHeQ*gijLT6?k--w}@G8^v0Bo!9BvdtWWSUGYV>zz0oEGd!o<89CR#D$RMfjn;D zu{_$=kTJJf#FNnF>=s%0y4g`tMTZ;j&^T9Rx{tj-b?NrkUg-V49tqS9Wx>q~bwRr_ zUGurv4*FGIqDn*GzM8VH`*AkTcKZ1j)2AL!(U_ee7C7P)HQU-~0(jhEX3)2dCaX{# zJLr@EJu!qIQUzf_vGc+UJB}X5r&dP-lhnX$(iIT9kEmHVwy3|QQZU;ifMSRcpMU1bYfEFtXO%OmSwBpkIk=+CQI*>#Nhq;3YAO_jqpnMHtgI`d3^(2=l)fzQ7O&PVz8;n1tQkjQSd&e1*;<@cxnx$r z@`RJK?l`h#Sn&@(TaH~bK!=P!+JSE#5j^ZGte(u;$Ddjz)9NNZ+;JE_EAtx|v zrfhYqkYtxbgMx1fIHoKke!X;ZtwtVG29x`2>`=RGAO78uW};~=YPyAeGULk&DLxOK z6cqxCoz1&Q`>nt*i4tBu2}kojl0~nr{9H3T>+Ezr%VfU!M4u8<4~UThU0R25fnN8% z8tc)H29XTNGIa!-&sKcTp)3gj5PojGqx6O7!@3Me?ZBcb3r<{aoUCBy(brR#_lsR| z&6X^NefRiLshqd&ZQb^K+=>SCWn>JaVcL*+H1b`H#a+`_!qY=oX@ja9nbHj#e=`pH zfm^l$-(N>{wHig|1RRa4Szl5ND1@vKG)3BWumEU-Y4BQGc$)K`V^3%(7vfGC^3b+4 z43{*aR96|L_2OTQJ7p)S0SzLALOXdgA3FNfsQnN6?tOpGyH?YNYC)~lnw3rV2Skb< zdal-taD^E89Q%%puA$s*@^wQe80C&4#pYj*dS>mmi3H5y%Un7CEE^koyw$1e1aZm| zf;`cr_@3+BAr(QQ=>?jdsm~gdHqSG!9MX<}r8qg4U!K)YXT>#jpR$LW z&OM)v4A~tq$ki>0HLKkle8DSrxG}}u#XImBm^(8_>_`|eX2Sgql{@MRpE*(0I%+vQ zAFH~0+(US!mA5lg)gEJ^w5At|!=Lg6HfQy7dfkk-$sMecf;Z5><4+)nP_D-7Ecgkz zZ8QyBIY|X3#^JzH(U&yNA8vV5l-V{DjD*A4-#-Qw|K;@!h^B1dyc)xNAhsX|aFo3u za+ud_I-taFXZ%$d^NN23blPvIt^nbmdut$gAHXC*Ib(N!`SH(xxp)ihXjuPrG_--E zVWN`=9F0oUlm}i*?TVu|uSBHiZQsu?b=_-XL+y{&>MU13H22(y%+??`9D7u5Khq_E zqQXA=^|Hs5m&=u=4&skaZPetH_8*L+kzRAaT?xe|q9D7Ge-Q_X=m~h06)Bd8yy3>KwY^=5Yow>5;IwT6wV^G$|Xh0fY)irGJnGO#Q8#gDN z7`Vq{eK%2PK0(Z(Za4XX?D!by4B8_QFB(a{AoMAkcfxBZHvaS5P|kik+s;C3lH|eo z{Yf8`CoZYUYMl&CNyBiY*{~iS@0bbjNB8g7n&>B;oP2dD8|aqca@RWh)Mn0e!rmiJ zuBn4wNo@Z(vkTVs6E`$_56+-8YR__PiO57#7Ulh z*!L<+#+#h$*(};8`!E1RffrfZ|MDi3)28m=t&3SAoI^{`FM6({&xO%FCPq`uvJwR@ zGLoZuy3wjL&1Y4g0@u2Up3=Uui*U1pt+XZVb~o`p%*W@-vnnj9*fb?VJF~f_3;vXy zoOOznkj60(O0xL6f++dw{-A(Qqh80uRU;=NwZwZ{KNeXKy^l6>s7##SWsT;;Z&fK9%lE-$)$B z&3cd_eGy4IakBjS*}VNdY^C-3)2Pp8`!Y~}SQv3k#C>`OBX>;H?$d4i4B-;`p zdh)Ng_YLQa&mnm(EWEAOJ-b-%%fWlM~dRpVkP=Adg; z(-v)}D0G0e2Xidd?yRcFDj!dmJ!;P^K!@te!keRUoTa1M0NWwq~`#K)2b8GRi%J~Pjxdpx4T1<9czkp9mNZj z%bb9U-0Ngvq9FsgPAiUlB(zY!?qTzb7H761{Sw-#JIVG{YV3!pGBXpfG_k{dxXG$Q zCbY1WT;NbsAuz-66B;v1NBPqCGv5g~nt;ug)WJLJLJ)rYlccx1c+JX0^Pv}#G!6Cd zLp|Q_(-Tcm4JeB!ZQnTU0sUe`75M`rJcA|1I2&i~g0y4^quxzS9Mkm!8d?5~MwX2` zB^67`*}j(F;h0FrB4Rmsos;G7Wn~C>#@Uyi@sD{v6P#ac?qp}Ff73)JakLc2eb5{^ zQ&P9iA*<}QaUzlhcvW-G)(-*58rzn;P38K{Uun72ux71FWOjqTEy$Yi-;jv*x`Rti z`M3nAnAEixqq#aF0I%QvtR!GKv|QPEw4R~sf$R!F7M5&f32qDI^0G{5)8;w5rXu&I zZo5x@w^WLNFUIn|S3GZw{2tf=CI+>^gT#Krw$6K~Cq~I-Rpo%@+efgZz*D@xOhq(X%=T_HsFwN;W^3A2H4)@z9 z_W(Fq-thVoRKmca6UY%YQ+$)9nD@>#IPcL~z&#K>-)Y%9hx;^%=3x4W<}>guuSH61 zYL*rD7rqZ~qw;x_-K(Q8FttBPhDYssx2%xo)^Po*fnx&|jsK3*l817SX-v-iQSo1j zU&>GMb2bhT*J-GruWmb)fWIY#PJe6uWEAM1HFZukdYDFKGj>A4s_PfNJB!xtyw3N| zV?&n022{dmN>94-ZZM^9t@JO_ja;S2BcKtl$CuKKNKs!B$ftX9iC(sqwXoPI#cVl0 z7rgC5jjx6j#W{$WCfW%HsBQgLhiywqvO~S_e5&R8d<)};>BKddCG^?MCp;RK5=Uve zm;Z%I){u;k+YN*#Rj}Ya?QgYA^M6$Tu5IHIz3I@GhXk%%u3)Okb;Z^=`v znb$7mgfqnJ+P#&<^Ilo=2%#M<5L$@2vCMX?IU{W`m`w>v1W$66CfQrNw5qPa-nOA6+KsfJZtt52jMeP;p z7iId3-TOm{DrTau7kWEMAFwbkiY#EtCWQ`~F4EY8&SL!Ma;HwND2sBGG_1EW;&e5i zBa%3_%KmnL&ULvR8d5oY=rosOT0=_rWS~cotptFKZyV9Dy!wM2(AY$&+iiGkp@kv- zBy+Ut$D7c$xp?E=M*)>=sY55c6bclv3`%IIZ4!i%pn|iJ^iU?`C>k zOM+?YZR>ejx-C$CJAHBx)v>d4vnS4-yR((_xLy1((}}l=6jMy$ThTc-cQ~$`#~JG2 zHtO-FJia;YwJ=qotN0V=br~{88Bhv{tgN~y>`z@)s+vNM7?=Vm(BXY?QY`NcHHt)L zC6)&sU%BOY&)J4kiSX}@+M+yH%a}rWn9^Mhi^}&XTAVB0S-zB`-Jt6(AG!7-)~cp* zbh}Xy?}($JcBg@K$FAhJJj9w_ChX;3`<=eyLaE@EWjwB~cKHO9jurlDIvoCFFc?l z^kr_EcWs_{&{O}t^5T%*mUt6i^6E)%AEA%8&|v*gESUg#3k1QZWYqvHX30{D3s)G- z#PhzBm-UYnF?Sfle6r*8H8Bg^flSmeKKUPsH#wUUlD6Urf5(A-XlsGZ*KvPrC zKF?e_Fhf&~7OVz>4OlnNfK5xkES&{p)1+#~-ANc^(Jj+%>ot?{zWv+KH}r{DeCn z$t&NrTv+->pi+@(lYwRN<5FIJr07xWXn za!m)NyOGt^Mu9`G&G^yp8#c{VmNfdC#Wt6rPonhx7pFi5^0SMsoCu8}7AdPTrjeTu$Z z=YnBQnr)CcCdtg0|5QeTBMdyo**F7-P_~l#9Oh|J&@^8hSWc(!LGiK_YK4f3uRIEE zQh2K((>X@B6HLI<=0DIHCB;W z-Oo(oHT{~We#?AVeKFGuKf737g9;v#a=5!@@SL&MZDn|d&RR2D3gSY5aJ}csg==iV z7NmsEZ1<(ns%~GoNF`ih)%H#OfO)sCe!Kg&S{4CcsiWzL?RUYlg(58k8g4mD;9dHm z2ejj$arr9#j?quu%g>r5R{(`f=M~lZdb?+mdqD9v+EW$^zqfnhL-QHzkD@$Y`Vo~= z_?6n1y!}I(8oRdKd3>3(tC-5DNpL!nbovnyZ~e>03Fn7e8lL zS^h&y{fCx%3XSC8hhGneXiQn?%cz6_*e3&T62QGCFV;$a6TW# z(Euhr(KyO@yFq`vby4ot7&$gXB!|f&NwelNSWm@t(r7o&;g1pkKm6T(TX^diwJftf zTs&F0vDoe4za{R|-Xg~Z9Yd~iLB*N9cULdLjI8$BJ?F>MSp%Z`@?fTe#+u=n!b*>i zX5M%H!MrERJlTbP0(7xv(=^8bwnG&Gt@&F_81Cq=7UYi~F=l;y-2;sXfFjitMU-F( z0VR5jvx&9=1;AC zKFP8rKpuX`A=}nokchExp5@Pl1%57!pc@RBMhJ={SJ|>~=8`|1f^IMmTv0YqRJixz zfC`mM5BI<$QJ1z9^o@RjnYxA*>0{{QKyOlXfriIV*fokq8lv{pm?iu&Z`E_|HoM!O zzus0(*89u!+E40FAR)=YMl{z<>b`im1H^@09WM);0ezqJ0ik_?)nNsgs|sI5uWI&l z)jk?&zvHF&&EX7{^MsihzB&ni1!bY5;lPM1Umj+-z7WFezIMComQq`)9nWwIwB2gQ zk(-geM&r^iAu~FfcKi8!n9%vX55cOJXnYU6E>ehQ(b(U4kp zb@1Qvw#$E!H~Zs9suu#ubJB$^lFe%u2kLY<3X|Pk%D3nOc`vJi5k+quVaD8R zntoZR9po|(ehdMSq{fynH%=*mz$(Dr9p`72|MADo>oxtY@DS7X`Un0z!EwjMdzcrw z`Ljl78;z~(6SFG(?L!4eHqP}L+P=XddqhBWALDR%)6j^yUm7~5pq4g2_xEPviR2OP z&yTf&X3}HIRO=PAO!c5;YVuAV`@_H2O~h7E$)B%wO~Cag#?AM7qHk``>(86}dnIrN zYmMyZOUOdLh&W}gRM6&19F0mi5oNxAe(H5%oDEPb8AvQd@P3}X!nkd2_wIR7q;rAacn zUxMZOV7cY~qSoO^Imu<4=PbB^)0D?vzK3Hv;k}0Tm|oMV;5pjp!HcEbh%t-A63%B* zSW?kQcV}sg56B?Iq2MRhq}X5r(Y?{3z!F`?@cJ_n!sV$#pCyyX{+H6lvCHEV5+^&I zo<6-yb5T#u5+=~)Bo?T+!i_1!+y9DZ^~d2<7(Dozz`Z#)(rng?mrm-ItwPi&_P8~{ z`i1ql(L#)8hGcKdC|k)Z43SOf$EDyTj(IBCEEmRk5=+X|8AJVLcWEl?Ku6_M29fx& z=ve}4^=qJqoa?|&GJBe`^r^eRIAsc@Z`)kKanGc%EthDpEz(LHz^H`f95%k^m`jIY z5nRQWm&$ku31A@^B-c2Py^A!tm3O<_q|+rQDsY-L{9;TFVm^rhAR&64%R@4Mw=_QQ zm1{yan)REoPc6ejD^}UGU^XX}eJsYpw5mapcW|D{Mv_zB2@a1?%WBh<>fe;{-dm&w zt!`gZPYsMp897pbK&*bNXaB}r!SldcV^obP#+_pBX0aAah$N;_Q1?;b*jp92u~9WQ zs?IqugA*1+fpJFou1_VW@X)wB5e3yE4Wuuyzhc7|TLfW~l7@MNn0w*P`B><9 zk(J^kRrngiJ=#2O_`_mGjK9RFl;MCaWv!XPE3B%M0MfhG6&WSB{5HNXa9eEIkraD?S$tc14uZvtVUisr1%|h&(UAUlE%@lN)hMrB@pM z_+S}^y$IXC%IBe%k-ZF-;pJc;9=tbIQj8Hp{wq*AgA+?Ct1T>?tC2!a$4Gc>u;H!T z{*H%lPSJf@tBz$N9ZWa_QwqXCncLt8ztXu=zq=M6#}Bcaca6_m(P-DAhkD8^Dc@V! z$^J5a(oF4VTug)tUT9fVuIk3*f8{sWLE2$tCG8xQ7|C$~6ApSJsYAB- zJ}~1uBr5PloGkuwUjF!oio%?YpAu4@9%q*&oP?J_5lc!#n(M<^46(&j=(NP3UnD1{ z=EUbMk&Gw6@!K5wa!o9Ue->M8f3@6c%sjrOyhmIoTI69cmB&jekI6DdH;BBqE1Yyd z+0Xpk;h((#rV1@~mE>iBoA7o)_wP3Fv$k$ruK?3()AkPG)IOrM8eA*`7N6eMB2^BN zuNQ4 z&b3{#xA%J%s6y}KD{I{8SD1aTz!eIK)8}y?eHeV7a6>bKKW15UyQtj88E}60U;6ub z4`!F#&%aA+rM`1r;nd+`=sX)VKqI2ScS;ItlO*FW{`C&@P|E1UeG1&rD<%X~TIK%BFTW|*eu&8PSoRk~kH+P* z_3>f7jBgW}WcIhBum(iozp+9<6fP|S{{!?VZhLnrYho?=nQ#}ImAG{8S~ZNCEG0nd zA~{dCS0CdF@@PMD${ofr46240Ckn+>qMwcHE=>S`U~M2PT%D@U0F3qZ8~Qu>P)@ zqGeimC}$&YzpwN_zXI3Qy48BKY(&hhb2v)p8op7S`jk}q-Z?D570ck2SM|xYc_s|X zG1QVDX801YkhpGh2rLYl8n1aJT_0?fr=VgEzdV>2Evag`EFyrZgE5|$>+_GG%yq!x z8gsfpP++&%!fO3^zDr<+@|=e=rqD^|o_DR0>?Jda3T3h_ux}bPT&h-^iB0Zuald#@`JYBKGhD~Q@mJG1e?+Mm_RG0*s8h&R>@-7IMOm3 zSy_f%ze%jQZE!aT^JNBd{yb`sn7Cm>h8OaM{tO>YJCkE+6_bHTBVx~H#Wvrty1#WP zcWtV_q`j&OUn)9${MGN@gt@Y0Mk|)r^Yr;o>Gcic1C{Q++iOF^Bh$`UQfsj;*DM<>|qYwQGI%&4hlziZs1{CDCy(<3it=TJoTrQ?j9lz~+u;KZm zuWbggVDfUuMflMd%d*cip)E6z06?>q{t9Y7uZT7#rJ}n$h;Dt!+FW(%X#uQY4NtD^ z26&5UXn=sW9zqVZbB*LLBnO4dptiVqv*`j?>p%d?=OV?9F`9G=+2bIWIQ|~8x#rl@ zXF+xTzqg^1BUkSAl%)HtBW9X%6WzxPra9aiv}-}|!Kg)x7m$SKu>~&6aqVD!qOiEM zVGdY9wgtgcZ+e7`82`|OhM#B|AE(mSMJ3|WQ$o?j-W$ZKUbq@cd|H!EM;z$>9vxk? z9Hr&!FE&BtVq7(9ZdjtNx{*)AYf5_Lir`8StaWI_(7^Cu%43RpAkO%kTWiHG|3oVk z5SetXGI3|OIyuvd;x~3jOn$cdNO3_|zE2InlCrlY47|y`LCcKRIyfQgh|6duUYjhX zy{fTe;|8e1X_3OCA?*>}w%azE+Z|95sllI&5m5Zm1g@A&0%iu+j@0+t9Rkf5BE!Il z%SwHVA77#XoxiQEVSjqWCULtPY0q9c_@;Qh`q`;h`BN9@lU+l%-OxHeU4PJ|&_d%O z9}u%70@D*D)qM~+YSl~tnjJ75w`H9i4I8wS&+o{ko}BDkhFsyO-;gfbkiO6Yh_n3n z;b-ef+H*sM2WVc(_Y@ZKd*Jl>QgD^G)#0r6h_R0! z=xQM`BY{FXZU*PY>6&id3;4!~bSeaqMzyz{tq3RrZJvoVYS>yX+ytFMTF3ySHDA(}Vkrj!(r5(z;-K2Ag%q`P6HhnS%mV3^^(*?XV!-{-LR@0>61xAP5=dFFYZ`@Yw@)>_xP))*cz z0%fgQs%MSDa+Ntm!`x$9Q$1(M zfvU<&KtNP(im#e**xJMMAy(exy=p7uiSU!GphP=8ZLo1CC#tyi^513gq*A?!YxUWY zWqoAQv#d?S*%}V(IT-}fohwOEd1y^hw*yhO%QqVy>OzxZWX|M#bTH08%!t0OaFbd< zI+>>i2+Ys071f^?Lv6!kk60X9eM&&jSw$W%7^cOvm~@1lxn{a`_Bt)u!73o50)eR8 zg&b^EhYsz{`B|@kr)aozbTG{9?s&<0fTjd33W*)gGjQAPZJB*dNX5gDVj2@4%QnEb(}arS$su3;B)NtifjOhk zV2T#jJ^|u>JA6Ju#OiV8;7wX>wu~mQm1Aw|npI)7&cU#WrL=dffqqmX`TLjWcNop$ zE>lV%Uu!!LMz@cDHc;pe(9&@Zb=V-J8je- z(pMud^$crff+U+o7L!x7S`vX!#(DeAM>ifG;rqj@iYh3UsLWVi{kr@fFQpC9fUJ== zhp{jZN8yXdbh2C?TZn?T7h|BB!&1~LviOlfOW%FaZCr1xcufM@G^A%Y+E=(ynU&gG z=hqCjWQuLsGpDsFuX;Yz=&N>aSRiO5&bqga%m@o{9@5DZAH0`MNF@5XTkMy5Mux8# z%QHJY5&~(PGovR3sf>Jh7|0F|+uz^K-hN)EsiAe2$a!suJ3BFZ=lxwPQ@%70QI9vN ziFS>GDx&)X^t_iFG8K3^uL}S-uaE;lUm*Le%#KVsI@F@6&OO(ZU;J&e$%y>1Yx5fd z>6|3|O7%1hW@881cmjY91kbSq=){vH+1Z_8#6|PNgAQZyhJ0Lmfv{{it9a0k6`mPb z)O`5Y>+=k)b*rTstEF3E^D-JYEm~Myxz{8Q*JX^qQw;I0b(2?3=z5%So2ia{y(G%h zu>I}IxhRa0(?*tkuWT%B9;&8GKm4z2oJ?x$;^tE}81Wkyb$uAMp5r8eEgaXi zw`133RU%$M>|0p7oNy0YwfIzXaAtG0j4C9U_rU8}S}Js{4lcmdtHwRl?>RdKMX9|h zxLswmjty4q{?1!8F|h2Q1RGcxnGFjUL+?TITArfg;-q@Oy%`>=l{g)8P$AgFp}YC{ zpC{XayUku%ClmuqJM&HKc6GnnPNgY`C}Sf2J^VW5b3k_tGcpfgf~H@EUpWs;?5mr#R4NAWY(9Uqt;Q#)$Bzapvw49gE-D!t{hB&A z%?7;33f*{L$+5F?KlPkY0i5U<1 zw;=tgJC}S#$mMB@>%&>m|7Oqpo=j^luan;lkm}@gTTdfRv>vng9%|egaap;tqOuPx zTJ?TRV&ZDy?tNuSD-)nBj=t**A3NO17g8BqMu%OxjKpCO;i1C&3$ltHOY4(sJi6Xz z-t#Q~!$u9RBt}U+IZLar%_RO32|&e%tXM`#{SDHl_M96^ysyA3tU-1*KrLZWcrj`-2H;Ny;9Inc>!++_z7)8q`zE*~*Q zu&n9ojYT}TjLBSqt)MP~vEg@ta**Oq7sE=Fp^(>#9)E?CLjB&1lD*Lq?@*Q{z@^-V z_ryWB>_$gfcXZ)wbe#J_Jh>l*kT!32qHQhxN-J}J`)AOB&BY3v`RTTptriQiB>=VABcG5?OhT_AYhgo)WVzuGep2 z&fk4lp#5The&(H|e#!l16^T7N7*v!My1H=@C^a>S$5iH|1U4xi^$FPJ9%;PJP5>Q$ zloETdf$jl?5=IfD&L+_VCOw7X9S<1cw^Zz>*SaA)jfyZvJ{;XQfvngR$^D<%O%4Y| z`$k^%J2A|`(5nn1Cf#0bydFo}Ig-u#j$QGtg7I4T=x@i6E;2T(I|kiAtEi}P!1CT( zt6bn&Xysz6ysby5|--5i~eYhOGTf;W1Ngc}d_JzzZ${w1@zWnZ@YxRhhdDumU z)<@&&cjiY-T0%V?CwGK@Fq(%jTS}mm)}*@b;i5L#QWas^R&X2@mn5f(>2-lpuQ7z@ znD@J+U{`KStj9{h1^E5V^#$3smFVuEe(Wa}*AX5dCwRDtj{&YM*+UMr4W|IzCAN>E z_&t+$4n(G!OP}NF{Z3$-n%IikR=7J6Zd;vw0g~gfu33`&lcEOU*0k^5Lva+1rJVC}*M8x?uOSidocJ$+!Is zbB($rAQNm1?bsVG$x~ttTj)CbgC+Pa(r6%Q7Ta5;%&(Ue0d21y2O3LtmSq_1jaX z#|CRE@o9`w`&!J{hE=Y(rLIHZHRJ4fvyg3xt(rx{fN%+XHS%4#I7UmYcodeqHsv-O z3LY0G4@B6N);^N_0E4L-kXp5sfk}-w8{T=&h6-~um@|o5Yfsng%>>h}mFVViHXJ?1 zJQ783bxVc=aSk}rZ)gf3ez?wY*LbdV1~-LK@`~^l>aVMcHN?wr1GlUF>ML;&EP4^5 znxe&uU~C^GaaDh^ksi!zvsq_pTqxWSJZ8Gc66_jw!Exe83>{g5_TBk^<7I(b$#2o{ zcmMFP7aVd`b)=sumM6TiDEqJb4CRbx6dihYqlT(BN+xuSZRCp z^U0oCq5J0!Cc!66&-etp{W7K1o+dm!o2#((`lSL#ANvFUhuJ)sD?IUh42XcDx}alW40oaM*C_XJade7a@SQv@Zp?7S zQSmf~Ect!uVEXSKJGDQF6n!fppR$dPPJ7?IS{qLP0bL7mdw5epMmVX?N!Xwzq)};V z``g1~MaJzyGXuiw-~B1Wbe^=L4|dpfx%$&}w$nLQmlUA2NHSQ12jYs6n@>7Ymcrj- zIF;BhbzZM%q%X%#Qlpw|tZu7MrGBC_7uY{ShuhJ~}bRzvxh z8*I_j#2*!jZG?C?uu~3@U-*NG7KE^h+?3#0$a?I!RF5w)x#>(MDPeaSLzbontA|vW zB>vtJQ^l7%o#eSqx>g=vi)c9fo5wEo;?o!g4i;Y=MfGKcZ;a2LA*!$#ZN8sUYFfst ze?S^`uvsiD*7GBfYOla?u|t6PhRsMLPB`~jUD#;$>0(BHK5s2=^TqaB=c0H-f>4FE zyPwlqWl?MH+p!u){%;PLDM#0Af)vM#V0203r*}M@TK8j3)4C?Z*G`P``+at+RPEX7 zwaCF=%Vx@1sws&a_bP2Cmpci{?OYgzpJu#Zryw3RoeOv|^~-D!^?6@^p5mdBxo7WhGKMYrLri#CQ)F$wgE zh7>5(dTk@j014m_;i8gU1O0e-$ZE&l$}+%HHJr#mI6y9R`Bi+SsHyr>uG}Jp{Yi!>&a+5Co z$WLJCdj0Usd!7UJM*W&nGg?0G(vc<#c8f&%cTP{alWsL}=ZCP0tABo0VC>4D(#uh~ zB;xd@G+j2hHJG<>hnyE@yTqZKAh3&ZCX^P%hI;uFE%Inp=GU*#c~2NeHRcb;KV4OL zh4-oFWoqoBjxi{Ab9y6uWg;iV%gmRz(%}0Y26z6(>R@KF+j_eX`;FG7Cmg$JxL+YH zbXsSqf@?5oO}xxPXO9OMZB`)dS{m%UN(%WY8n9^S zE?-B71b?>b&zI8)V_jByr7s`Zy{QV#ezYddATDo9Agz0;c4x?E;o>eYi@l1x4?tX) zLqxDdi%6My8>n_z)r!N7v-0(8+L%jFT1UEVG2*>c6b4SyZ~MxZ8fQL>yVR%Ho_76W zgUfpH{eY&ydWcL+Si_J8#9hv(pMa!xAI9-NY6bf~E{f&iI5i^YG5{=NjujCYGvGgIwgz|iLOMkqh)Ae|ulGJ($ zKa3hL1GS1n`?+(EnD`jQtuo`^Ba=dzWg!&uY|iCpqAUuoTD&TALvz%I4@r%=A}^^a z>EI{SMFtXcWn&TESY;*w>+@@{ZM*0j-)JCHi z3`}}Q-wb>o8YxdfFAnt!NM%po#|c|8Fq54XeTT|OF{pL=AXK22knNUIQwQ^gg$q;D z+QGFkWpHeZsI8NjPpSpY5Y6vr^v~nzwrLbV@)!(w`pFANG3!8JY|r?7#XOXM-a}s| zrQ48mxm^sesyD*k;H2ILxy+wC!sVMq%0_$;X&L#fKK8d_W10vsiB_lVy0;NVDV;#t zdT72_Tgc1%t@M-xANd-Z{}S09G3hMv{lgC6Z2 zmU=iC;(kpjhKE0osg&{FFU<>|Za+zVZ9y#?%p6(I=nU*RbtZ8w7=^vB*CS-aqHQv@V-^#gakZ@)Ri)T|7%q@AeV4^R znSo_VO+LEas^slWisG8n4Lk;R0%^B!cJIU@wR%eEd3BaUZ{HiUK6_h~6eYv_=Sj@$ zzx&qX={ONx1V&yv(E>Iu1*)lpkj`Ym$s!x1zj?Bkia+I~FgCbSTxjiu$i|Ngd^U9l zR(AerQ}6lD)i@JQ3MXS4##9-SL}UrsYNNOlw;0#T$cdIhgmp2+!IZWY{mksj5XRnM z!>UH81gcykL%6A;P%zHG5cR8b$4>T~XSNuoeo3wd0H-Tq7g&b+LKzI*eB5J;2nT9{ zDX(ayJ#dFxt_-o&>m=<`JZ7NPElKiQW^mE#$r-9$-8VAC`ZBt8qcFexG+yq0tjT@^ zd8Rwt`>LY~;eA7uSAUMmDra~b$x)`r(iS7CQ$5p}q@Z(2$_qf)Z3tU1y~I2P(j{tXC0U7Cz;htW@rKCZIxHdK zA*{&XvfEuF9PNPHVLX!4*Aho`FlszzQ6n7$mOeg&#kEMJk&^xs;Z?IL0r-LkoIYFd zCzvT5Jk(!qJ5r%XRaTcQZ(h*%D%`)IeAk$?Q6pHhz&64pOhnF!x~kU%y=!hCgs-w# zx#RIfd?9Iy>%jrEZ+&#`r-m$q%f)?uUXbR9q7@xKj-!0j?dB)Cu^a5Himij?&&pL@ zAPb^@!Sd(nZokioQeg9m0;`j;KS)l5+VGVQ)V6+Qez=Ft^nBZzJK+dDbe;0n^VsdU zX?)dcA?<-7HS#$xbreFWlt8*ayEDSF-~6B|C+!pkDe}BQ>%H0S{su;g>^-kZ-oSH2 z$|<`MAKe!i(bJu-UL{4m-<^AVzpy48O8p9vwM7CUmBPN#rX4djT)SZo{k@6zBi5u8 zuPvS{n7;<2qd#17>XA0naALoyxiMccY#5se-4VoEq|L>f20wlw#hfmW45q}!CDp@O zH-fY;TsI4;cP$Z?>G7I+EbU@XD7~0sq;`D*mICt}Uz`ocgvMxS$Qx4b{8T9CfTLWC`fbZN8ngc*FGX5-uq$VlE1i*~5Doi#4)2 z3`V*u#MUHng}U_vjBkSIxvg9UQ*;G-ivyEvZsz!~Q_vOYY<&=hb~@ZzB(^GNr){tv zuT(Dl6iM@@7ZHdzoVW%jkhXoIDg!yNyPGF_WTO)Is^|#X`MGE^yNsQJDQaWY9Oy>x7sV%4fyM4gKD4eKg=c(L*U8V;@EF^k|~v3N`<-rMel2@@nN^4gz|?OR>;B6P8oOp0z) z`|fWzIisbszTJ2#0D6w)l%mX;QEqevaf5lc?a?ZMG+Ihyltrm(MNl-i~iI3g~mNete&xO6#Sl9SmRxNV% zm-?z}%^4`|{cbp#bw_BZh>S`WQeGOaQg1hSE>h~!KJr8wfoMg z$b^q*ez)}}I{3r0xZAypeL^f>y71n1+aL7~#j8I;c?zgHKi(Z=t}jVN8`Br4Sr#ZV zR8{UDtk@}ZCt~AVC}@_PYlB&}%-{DVG;g$+i*NOHOWH+>I`dm8^a@IfFNoUFr>E32 z7PUolL(c6SNE{tH@@psA4of5bDVWdOPcl93^I>vs=D-zLvGh_NEK0;8Yn7csHbzs>@~I|x5gpNYj0I~HXq!qMFwaHLIz6`JIwP>1?sK$hAG8z zojbSk@Y3oU9fh~PZf=53`|a%#s~vK_SHIZ%?Y`JdgA{bqo9_BuiA~R zGHrb@pyFHWtuZSXb^KzDcOaBzlIy$kK1t`M$FSHtN{o3@FTq>x&Fa&6lq_S9-tB&c ztL<2f7iJjU_dt(ca{!!``2K32)b||zk3yLSm7&{4yY3I)3B-u<-y{w-GY`+mh#Jg; z^WLLnAuHubw>%BTJHMrAItM+6bNa5c)i9c%vIjrnPc-15h__6=W?^ssxNW(Lrrhqn z4Rm+)y<&7;Vj)v;!o3%sKWz8u$ohIoq1&xw!eiuMG6R2>P2!MxiLv`A$^aua1(OuK zx7);U#Bbn~&7M@#!W}T`cM(|TpJ?47==&DIxhfh+&dY5wa^s~6m?@v~FEUNEjXVk*pV zHhn)f%!U|HSw3`0mN#y+kHu=5C%8*^9CgF@9srds68LDr-Tlx}&!0Th0(MiLjIg60 zkL4}~DrPaW38$3KFc z(cxzLRhwmJS2X1K3875tx&l=?3SdeivFh5H+JR7;whdUOr(LeIuvyN%u{b`+C0Ta% zoizwmgyZy@>-IT$inv{;;?-Oosj4me;mS#hPIIlh3B=nGPu6FU)7lLHGjxv3~Ml0 zZkxn8Q>b$QVup!>tjZN@N##U?Xwwnv{mn(w^@tY>cP^meT0GUiJhvus?JQBMq`LjO z$vn0o%6!?4hUN)#_9ZYF@#Rq|CtqDmhK5Z(WN(cH^ID(GA@guBn%f`a)!I9IyPV|y z1ZV&7d3{gWuMtYuVGgg2!w}IC@(W!Hkr9NVq>lzxr94_c9NoMECLg~FOO`Z3DOLBY z+>R_JcLTN44sv6t6icAhzM~Sy+51%#)dq%c)3W2TwNB`pHe=g?4bDUKv-fN4U57ILrvhNg{L+iTVJhg^-xx?n8o#)E?RieMW zB_CgSoC2PY+xz7*Qjp8dBQ1n6@@`&t#8+2^B+=MJTl9`3l34h5l%%i)=CK!BoD-aZ z;Afm{I|Wfw!V3ke)HHGmBa7#YqvrJ3#TwYRtL~tZ+i@^(i^?OTDrw#>7@uCY1*B8t z`d3MOC)8R6i2BMFLwoBER+y(e^qMCfQ*_vbT|%CIb_(3LHBan~PEGe;n!{BRV19}1aStQm`T@#twHCNxoEAScp0M3*U?5k?81lH3^^EyUd}02{nD2| zP~KapD#N{!3?pPYhlHF{P{~YKEraU&N`pF;bk<(@Ev%hnEAPPoy491Abm}(6@^CQv zo9N%5(AQG0zm!|@zZ~0+Kdr~-dv@G=Uskg~7iH(_M*`-}3phs(*N<{c&Wo%lMmx`D3tdOeV*HC)&Rgp;!L zCp{5d3c72$H8Z2tq&=mix|ORs`}4y_^FZ^8!Aq5`p_+ffdb0M}SjE~Lsd0HxvKHil zn9J%qX;@iHk5tDS>>7WW=%^6xa8N9TB-rWsJ=f+07BT#~SwfA(%wBs8&j*gMdlQr5 z>rhP}_JVy&6adGjpH17ne0ZRD8u0B_F9#|oT#sxOT6PCj3z)eKHl4D4w*LWAzAjF9 z`8L+2UB>83?-1?OF}Fhn{%VP9fkRJ8!I^;(Gd55n7s8XDP2k4{y}_*R7BYIoQ$?nSs7A;47oMk z29HoK!_om48m||HWwQ@?g=n9TJ2I2?5rok@_|m&-#;2l6#y}h{3rA*Te6CpQ`I&O9 zbyEKOZ9yO$>qNwdnQzzy(C;`(W8Oepxef=ciEcd`wq?x7+Nmx{oOmT8N7L4TH;>`| z@SQ5$pxhl4u}oW&7&!tc*n}Qh4Su%lnkMlz?i|WwsdI)u60&v^({Kaw>}jQk`*aK1 zOnA}l9wPO|9?J!<o{kO3=UQ-l ztpO;{8`u0g+?wBPhdg>mY0#0XQt9gCHWx05j~L|5zl(+Mjxn26CIs`=_Pk+Ik;Dn` ziv>;!YjU^RR;8druG!xFZX3SHUnkY`j?I?uD>Ia<0AbO2MYLzyFnBi!gVetTQe$g+ zXnK}nYh*D^y3f@*i&HOGCo?*%oI(rCLfbp6#az}!lJ?~wvZ5xT1_zUU@(BW#)>>t_ z5Xy`{vUeX)-a2n(CKzMW{hpzHY~mg?Xcg(&3e{X@sVedwX7n4Yf?Vjmgj>BLM3P?( z7sKfLkxuf6rl!{YI7?*7RxvDnknFK+>B?|aN9iJLjr_$0d0AQ3b$oO+Cw%WtrjIG zb_-D6bl9icxgrM*#(XpDPOvrOvd511_}eJSv41i;8lTIGHLT1Dz;0zRXg%spm&M_A z$=vqdyKipy2NM`gLB39-@4Eg3#rI!pAenKnyL1iU!Hp_e*#6$^kwV@O>apXEqEmh7 zHG%*rPNy>{L#*}%h3i}yj)JI$xCA8X!r~}yA4s5Cq2WecV9%m)vLJcx@s1LeDTA%d z4)!`@G?jSGvQ$`4T~n#wY?!EPH)>GAWjs=qC!%B)U6DtVqWeSyyULG4M2T&FM8yHS zpEUW%+`SLf``TMIRJ*ETqn5USEL)Vv4s*NW}cG>C;Sg)r*bjgBY4_)3Je{>CPmsfi8nRJpnW_$_z>3<{&9?hz27g zJhMmr7XHALYy1{HQZ=QvEHLq**nBWJ8d~;nr@kh9^x2A*ZcC7%z9U5_;DFrg2k^>5 zCUJ;c`AIWcavBevC$L+%RCl;LZl_+R*}RkN*frW$r=?nVYrRaN_lkphje}VtwD2Q| z@9NhI*1g?vX4C#`<@7R>rLFQ{%JcVZS1;BjpmOkH131aOUo!6IvvTmtOtEG7BbGNs z3h%E>b%_6#A6ak{{e`e^VTqkDsUUG$|4N!DLF9WS*P6Q*T-oDgQ3s?Khw@lR4z#>X z9d%JY%=ceLC;yf(%1oDPBk`?2;??&aZPcg_&*a+hhxr~{+w|RrSxRQUR9l1Ds?Mo7 z!tx)I`c5$5MH)WGaNALHuU0D=68ScVFy0_fHndO?b8LRPM(q9wbKcln66E;^WzHUK z8k&dqGVIwkR7h(Ucwe5mh~|>8Wmk~lX0i>eKw8*?RI;%UW@RyS*X3EWg&lgQ8@4(f z@I`IA#A)F=i-AgPiHW?@ykcy^8kU*Np=i2SenFuI3}dkO!!JYI3pO{~i{g}R*^%RR z@JPAP!~~b5-dvkRP3bywE3vrLpC<{NxRQzZy1$7y^1i~YTX~ne_w6rx%!IjIOMfU;chY>g zueqo^P7s7>M+lv5WR#kLj_gT%`+EXlooK?fhW_Qx8DfXI_wotPlD@wD(W+KzJzC~c zR&H(I07z?t`S86y-6aI?Isty2~VJ#dMd<&;|T_j_(-hQr)s$ZxZ^v1j?YO&mhV}LYUUx zn(=IY<42ztw}|&Q&c46>dWp}ZnJb>pxfapjoEOtq0l5K+R~(aetGAei>QPn73HJ=U z#ER14tSg|>62y85y_izvemd{KY*@QYw8n3!#;>8~a*~9XZA@OGpdcm{lO8oC7Dc&4#^|wcWecuf%ekJTC^gkv)c_g-nE;?KI2Es?ziK!ClK*<2pNs+z%Hh&cE73TP`Y|) z%<6|h{wgoZC{^awpFE!~97p%AY`fK!aD#4J_=N2Z>L@*tU73^XqHe@)N+_*(^bX{v z*g$UTr?#)J#75<{O^+ZbKOr5)j7;=N3^*9&ucztXIXI*oT=4+muXl+8rZX56zvhNw zCu@m9%guyVTZ|B%*n*HtBD$dVuk09g*>5dE)R{*ZF)8%~0J~$4Yn*KPS?fzY-gQI9 zoawWAR_W4;zq^w^h&Qhdr4N_5{Zua-<+iSAaoY@Zzbj9_GK9OXaW#mCshT)D|16EJ zl(pwG{$5{y5O7%x7aFK%SyA+}K4s@;F5Pc8OmS(yeQ|R>)=04|uZUm1-IBevK}#<# zsF91Jf1vSDQRC|U2$1Ses$9&*VD=8YHs@~PZ^B$BB%}n$%owWJKWChFSt>1hZiz)M7QyjW`8&`a zm`r&R@yP_{AMT;-wb<)e+d<4cm_r}srxX*#FjRjP9MQ0mC6J*}Sn6wut4tDeO<;6! zs-&$$*3DT>u~C>GL*UIcVZR`Q<4W2&{L@cQh6GD>$`)GZ-eo6DZsW=tO}cE^pp+Q? zWT_qvRdH_D@P-zIGU6^3v*^Pvkwvcku|%B3HnN1~E2FU6>>BNkENNiBbpAxvqsV6U z0xP-;*6v_(9}Y898IGmIH?xYH;tnWWB9Zxz32j%_4EjgYE8YoDY1@&6J5CBpW$c_a zz;C4-DYk3c;BY(bC_=jn1=4_gW*9Hzm5uZomkmvUx&+d4>kbGt9j*@4BwFmr#-^sm zu#_uTAw=dV0Rc8dH?DAPq~!ZK>fJ#tJ*UBrbd&Edq%X5H46_RFY~tFXm+2^YMiJjW z^}4oydm9YODQ5R{8xP$XQ50lu&5SvZCPkeO4`h03I;8P!z+j~*eB0)k-xHxMZy3^RS-Mc1Q zoJhHzUD4benrIohuiTNuuMtGYX*RUO+koaVsAFCP)IbAU^yv4LlJ=pu=@6*PB5;+X z;*QV|!fF1gRF!(1@nk<9&9+kA3$keGvfA<|4_co*dlsRzSxhRTUdQ*t9pxwW(n7syS_#lb4L}5s}^@ITZ{r;`I-KY-eZ>8H_ha0`qSSumcuX&m^t;e ztop7?v<*lF2$N>7EV(2oJDW7t`LNpr&^7n=$ZSDu*JbFtd5spjgUUcwCCjERY{5;J zT3tqu`fe!fC`*=}yBT?&<>LrKDnjf)$4PBrtv@lm0%8=ScQCmiEXyD}aYbIUjAe<; z2jPuL`lwZsuGMpIKyqqT#Id2bJv(m41vRFS6UOL65C4uZYDP$^Ep#T@4LLB8IhbeY zOoM#%9i|40_hldo&la(8VR40qGuQp35Ptb4GCe%9e`hdnxb?Mz(@vK>jOo{HwJRJ?Gn2~Qo)vk^omPewktciHH?9+p&?_E%f6MueBK_Y~iBI{g z5*xakCIO7jiw!fRa+PDK^TV=^RyG}Ud^Vf|)jaBBZVQJ$V#ziP3%w6w>NVsSZQa>G zb9=;F7`};t&wTg0nQ#FE#l;>3QQCGKaH@fEjJN7c>ZTKfhvC=6Jzl_j=i?$M$^#*&s{j_TT5f-Re5%}8!9bW%I9 zbAyu3QagH_WCD#ayw6cZQSbHY2brUC;pR6!9N#xSk5q7EmO`!zms_A1%t2B0wje}* z0r3v!0H(>!mF$NnKC2?DFzXCn(Eq*Mf!xzD(-x+G&B(4&SXakAzZ%fZ?Pqdkwg=~0KiNAn#n z++Pf4iE~yrd*&WFfLy@Hvn@uO=h^Gbf zq#9cVYBv06R@~3Utc<=@ZjU|dePwW@M;iAnM#w5a z{`>vjVE-Ti{mfwe_(gt?Oxj!OKh}1K^q4cTq2jn5^AsKHZ?@iqMt@uSDW%meF^-P6 zzn-Te+7nNSr!~O#jQNp}EQrUbi3K``{0<)bm_eV3GdTOhT>q*P{`a zgLyZIe4Shi3XoEIwx}xy#ky;?utRZ&AszFBM5h=Ambu3alZ_sO4zNVZO`*B27kIH( zFqr`cFSx{VAx-@9Ii|Br0!S5DMD?f1!)Fw4LoP}@Rgu^?@=o;L2eg5Dk4cuzE-_|~ zu?#IIq0F%gh@5bXet2P#MN2zR-ojvoKNbr{`4TXSp$%c;2f-u(te&roe>{iSj+m{d zj%V3Uavn||r#a$pwF-?eIyxDUh946JK<#YwlN#X?qNwO-ymMLK=@i-c$s3eR@SmQ$(~$LT zdE<73`wG2oz^l`n{B;E(ZN2hrra{t04ft9xRcC8#kju8`3nK4(KRS`#7?jop`FTTCax)H9H+jq^dc&0Ew=gqD#b*Avvj1mNp6THee zpB3op@Z=dzCf>~rIj%iCPLz-VLua4}Y4|amRW=7X;FP6~J4vDyu^K88IxZd=wKm&9 zTE|QajzUW#ig=5W9|q0gDZd!lcJRFL`k1G++vjgBbtBiXQ{@sO@;j{ebWH>oqnohq-hh^R1dE3m*0HyjQubK2Y&QRH25p(1;n z$x;!lT}h7~4ewwKzb3{*7E{DbCm}_$w6~m_xspUUJ$hfq>gxXrMQhdXHO6~cOS;lu zw}Fgp-_{_)ekH$ZS)xepT#MxQa6@z5(#S5?aXlI+jPSls=d#s1fVd199dl@0OxSq%G5w1){LvX_4Vzip^EztM(Xi zPEO7Is9{4GhjH1^nXyXCB+DnC15~;cw?kxA#rNa1OzsUW(Hso}%Qkd7*~7v6*Xi;u z{ubtQ)*Ca|Xq-bzO;te!O$EYpBbt+;q-f|iFu|r{JoW1Y7cM%8A*HMU=`;$A0TD0y0~Skd5w7(1Ep#UVsfh=?-BmQ#P2*2$$F$-wCGtlwI*glUq+A@O(U? z8^V@!OMY$1c`d#kEc4h)dgo8tX}-DS$cA~R-q&3KPhxi{C*q;*+?6bn6AlI4T!ehff-L}z?0 zV{VWhXp5B;?!UZUB|5kj&`5&H9djf3hZcbLT3anBopOqFB%ExHPUeL-wg6X&HXkmlvt>S23UVJV*m)N~m6~WPVLMr+h&UifBO^kM zVq*^v#tR2vOkFIOJfG0qdRqLt-{HBZ@>6yNd9ge%_vU=z-L7_@s`Wwcd7)zme0+;`7%OA6hFu zWLKa<(oh9n47|)!!3r3 zhpK@T)tE!+c{_IGacp2ei{_vHoFB#}exR@El~I-3PsGCLVED@C85WXi1uCNIh5Dn& zN!*UAB(9@_AhW4kJJ{dHV`79m{S!kTFY09K^^XKp39-|uQb6M~2oqVb5J9H;8M~ev zN#~C{T!R@Uoc`(br2>#ZNw$L~=P38+Xaxcr%x5YskS6Uh-0HR4cO5{ctL1(%$y0$( zAeG=MfIJWBt$j!NI7h-`;@ewCq1V5_z=uveaf7JIQeT$iA&)-hsI4yN18H;=M_B8{ zVxFOj=5c&GFTAw~ZX3%H&PBKPu|jSghtX61k`KJ@0*2NgF$kl-v5nndw8=(icsW05 zgyFY}FNrldvZ69xa2A}#t$(LdZ>u}X2p7HG{zYH2Ra|KfVMAO1z*WsCJnZR}#Uc%6B2qRDlKls_mwHvgI8^MuHE+a5Jhq2+yK;(9ZA zLNbUUCSCR{YXs&4VAyu;-91h&u{sNIQ9x;LKW()O-ZA~7>VaSIr&w-(eHzzUD;69i z1em&+EyIke+1+v1c;SaZg>qb?wXtE>v-#7BxJ7-Z&e;(afbvFrxsJR}-6;9_B;ZVG z#wVmANMf8GR!jT&x4laglHKlC`%>$SvX=7-9-*$-1fHp*^||!$E9bK8zCr`Yg>M04 zoy{@mHjY0Q+oJPcwhb(8f`Wdq#js8! z31$7WWZmK($zhQ8>84fbODey&)0(kWPje3{HGzRlTlCFWV{nzE_Rcc&Siw8wV`&{0 z*m1eKk1!I~i`bshEYf9NDIcv|S*u**u1fF*aXl{u^H8?~8%3$|$L-fODpe+?R*S#Sh)x1h${a|d@_&7663)$G+7=Zka#jaK66Sn;vhws;K(TwQo&7kzZz^9Q zYeuvRwGCQO+GC2~F%8gN#Xwk81YcIWTgz=*;Tt#&c>xVLI0$M%w6~1SUjJNDcrco_oowOujc1O zoi)=t6D4D1sKf_CUdKgxO*S6X^}$T6l2&`s6I+{q@88`C{z0*a`Esrd-6gc$ry%WN zD4-a~f7WvDV)oj0tYnn{y0+=G6SMwVg0%Ai!oMdG-);Q2sFLg%h|Jz~ozE;I&YDRt zBUoCMBHetzeiN3W0+h$_hIHnCkrnw9J|#Qf^R=k3q44df)A2#e>F$)Cw2(RFbD#Df z_u`r>bPDi~cUE`XQ7#11HPI%2&E|i=K-MR}IUY7y3URf1>l;MNbCWdsUh#J+Dw>A4C!g2^ISazSmn|e-^cCQ z1gm^l38d{WB!=xC$$omZa5Qf%@4@k}G@IiZge4bs8-U#1PZMt4q%$KaJ(64fjl^M+ zxYr?bnn2n;pfmSRZ{h^y`S?!Rod}pn5`?_WCeql!C$=sWAMq0Sq}FdNaGf}U)RaCw zB);1lt9y>&hc%Afr*WA-D)u^nit| z4~wXQ6vcDjqzt~lwi!P2R@R(UF{`QZ4F`3Uq$(IrD;Z77_R(0yTY1aO;VbdtV)xru zntzvn`RB5+{~!=adUP}4!FMT^u_`*;;{~wW;%hH4|MM^Y`CRvki65|$spG|=M;};V ztM5VF!%D51aUAueyIlrw=*ww)agiD_0%?)nbl#IV>g1CCyueN!bzd(msMflTV52ehIIdswupkERt4;NixwX_}ii0;=od060{QFwIQ3euSBgr>0 zekZ@^2XBO?54&maod^=YZB@g0Unf>}iqlJM6vSD_2QNB>bvW$gr~bsE{_U}-uY(=< z!XsgV{N!^-@cWdL6X~#0kO1%8f-Te9T~$^Q`1Ir}fqJ=u^qT52sZTz$4?E}A8z(<| z@}2E-N&$0#6A?T4#}O$6mY@XI>$tS^#1FvTYu3)K==^6)d9bel}`H1v{Z3J1qDfrhsGIPh1MJ| z?y#h>A1$XPi}6@Nj5 z2&4m>N4vX+EmZ0WlI^Z=z<*w)h${p{zUp(*_VNF|L)c$SohKqAx^`NyY@}7sTKIdO7hBkO}fjj4Ly<|jh@idNpC%^KhW;0p znmxjpAeS|>7oaIfJp%zwci_;)|7aQBZ(-rC)ob~xd9*_(*Th_dzwJ675k zujv~GJ4&2*k`s4%n#h;cdCF&w3^>{_h(&mtQgx4nuI;)1{OIgW zM897$bENxS`w6y+4=n@m&ofkaig;6EU%7L4?f?68{>5EVlhKnYQAl!OXbz(+PF(Ud z(FYFTAVmt(#BcLXKfqel-2Kmw?n8Uw_e;JvmSp2$IPqNS`d~K&Nq(ts^fdf7UvY2o zzgQtDc5QYp!NcMS`E`wSx)YbARtN*QV6NJK_f!2Fa#Y5A^MCQ^>W}}pWDw5tf1C5q zd*gqb^M9N3f0pwEP^Fn1x-O8K!y3|SJK#X1$Tx0Pr|Q%Pkp?Wx=-*kf4apH|8VC_ zyVun=zu6Oia*ALB0E{5{K#4}FQp0ZzfN9OQzAL@Ckhp?#Y&uXcos;IX9!YWlIZO58 z=U=raE&lH`=kM-;eSqNS=jla3U2QZ+(d508rMt{3;D@)p@gj}bm-TP-raQ?7YMtvY z87Yld7MT86PZOC6XZbH&Gc}o?6ra`J{`C16Y%7&m*U9L7={PClmEu*1zTe9`?PQkP zUR2GeHJmOMdhzaKQ00wY!Hv@V+v5DyKYgCkDL7F`!Y_SuVB4Q>aX*37*u{^*-=bsp zj=_zCYx*lfDAT5(XrJN!VregtgSZUS?|RI01r&CqySH>U*+=)f^wiTI27W>PeFx*8 z){0uw=i%`BR{Je3%zGp6k0-HGp9a869ugRRg!2`nZ-6kPtRgx4@$s<3?x^`s4yx|= z>RDmyRh9_S8>;WIYbnU8QC>i9<`%SiT9voIxequ`iY3NPrQ)vjxKiY#KB-eaZbavGzK1V*{#?Eg zgH?#3YWWNF=nFDD#JN568tm_Rr>9^?gf)jjocu{EphfbxhMQai=E6@Js#DN4T!78@ zcayhJV-OB&oZW=bulHE3*VOHEoREj^!=Jw}z8sYLc=DJAaiZ?VNP z@|(*8N?TRcK;g6g4(shNepEkKir_Cm6QrylWGE`pc9|z9#U;UVyw0`gnBBn#8L~d6 z?T-Q-r3+4?iyzCf9CO0dvlQn8OjZ`Tp`>|VGF+yiWlY4%7p>ysl>Gk&VCH_MQ6BJ{St5sBZ ztYUznUVw(PPG)&Gbik=5@42-;aYt1QbL{3mX{-mW9#_&s>Hgyyv3C#z=1(u?Xn@ly zNg*Qq&*<|XCMGlG__RV7u+A-ko@a7=!mcYPn%5?~hj>wkK#0SvM7a3r) z7$ez2^$WS{ADZycdN`Wf$SXNl`MU_<>C0vBIu{j2Ur^bT?3b|Y^W!s~`xGGIM~dJ9 z6|47MNp-U2b)4bdu%|q=$OlXPRVl~(BUg_Rl7%Z)^D}+# zumR}X;x@dvB=`TZ_uf%Wrd!+iD2k#2iXsA16cqsh>C(F()dolx=^z2=Eg*uRf`IfQ zy-Al2fq;tAdkZZfH9#Pt2ND9mJ2P|6`@V;n_xM}uTi^QrIDgDq&Kl;CC%NyvuYK)n zU;F$l{cYCuIEXYQxg@^jGN~UuZm~g(HTL-cL3*_;4chYC1w*Wc3f@{>LWj#!y&b+_ zmOYgmF|mtb5W10$eRHlc6AT_Wn!^LruiS96zTc26vDrfgiQKIRlbE7Y-+j$(8fq-5 z7ZJStXJT^CQywaj|5*b6d1+9-dhrR=4U`s5!i0iRTAU@t#Ji(7sM|bfxy(jm4CU{~-NoGldLY6_S+=2 z8hpCF8!&f3gzgfpN`H>T%l{OL=F-v7tANSoY3E)AF3hDDZaumEIc4n9h3wuHpoOeK zseX5(EU}9F!Bc|y3eg-u)iR2_A&*_=hm6DdG0B8woADH}M?J(D>=xm~@mG8A9~gs~ zG0-NBK1ItLGRjE`80i8GHSKYHrgQac=f`hs5T0y&YkMQC{ckgm-{;fUV1X&dMkY03 zd+RfG|N7Fb;mLqq=-a44;fu}_X&@t|mRY7bJR?S7T^IX5J&?B^o#m`q{dW3Up#QVi z))7E$rt2CiwyqqH8=lea8t>0FJt4Z@@^HN^A8po|Ku3n%+UPupzN+{x&aMO_Db#$z;hfsQ0k@s#x_nu`0XmO^P!num0NNr?e-;MVmjy+l$ zf`7Y=9YyQ4sPY!RzvG%RA)=Zh1;09KGn5zE>h<%beirZ&IY)dV`_F#Vf3Fe$doumT z6TZOU7VmWLZz>+%7Jtj$KR zYscN_^-HyW#1g?(TriW;px8cC>bb?>i}WGI_f5=Te^J}&6x*EN2^KIP9$Uc+XJt=% z+*Qy73))^8Yx|rgzs$4#g)Gv1=S}UN3t=ujm?tWSZu#^PYxhqsXjj*=1CQ?N+PP8N z#KbLZ!z5?FWk(c?&(7D5;qom4HcR0x4Zqj+nGI_?Bs%K^`yut>lz2n%Da0TywmkXKt|?% zBvCxeVd~qyRLM6%aDl8>707O4O09aIEdpi5m|1KGgUSh{} zaXdF;lDC$()^#N!h$WsKjGBMQ&1bZFM|)E5U|tLe`qZ+ac8w(2!lpo1N&Y@c+`c$A zBUG%f;Kb{|uKXvmF}HLVaHzj%+5JnP4d?kCXjT~i3ec<%AZ2%}OBQPpS*7l4Gy;#* zUFqC^(8jix=SF7TPm{~GEx4_Il}wfdwMWXbl?+BLQ=m7ZId#IUNOO%IZZm;zgbg{I zmMP*#rzws>x8^K3?x)IpuSb2<=ZlPF>?%ppud?O^Lc;R=c>!(K1u#7mLGqU%L7I{3 zHN)M_eoga@d0sOxEqIPl%Y_m3KPuZRK&&RfCdb?su60Y*j@w1NJ>R4ndE>phek>2N z6Wh3Q+i~_bFrtVa`~G*{ZvS=jSh8?zAp#;cd1t2aE92dH23^l_)+rR?5$Q5Ze7Cb@7Z8T zp#_BEXv12!cCb4o(mI>XjXdoQlkUHd8ge}0u|j)h4+H0s1kBCSe!_AS%_r)1mvTmpE84GdUZZEbKNHt0nD8yx4EJ2c^~Z6qwQt4s!V*Ga>Z&c zZ?G>JMbeG?1+a)nH@DS=d#Zom+FXQ|Z7%k6rFRWe|dJV(ZF!?aPe&_|7_OMdr_eUQV^dLXGbp_3saNs*N`(y~ z>X~A2n=hQTCqam}?Hw(B*>8&2+n$@s)+5v8{dI0wBT>vwX|G`iz5*c}E2d+>Lvjou zol~j(9ce!z=?#gLg&`%UfzFVTUTRsR0ZbzJ&`?qxuer{DHj}+>rE<(1*v9SG_}6#D zNhvN3)LgYXZ+8e?{Yw&fDWiAtT4`WP%2N^?6Pz7C^go3Akl+|L9*baNU%&pb>sbHt zlC7d;(nt!)W+bMOT6$bsAvmVcd}~Q)-&3O@)0EW;Ozz&eMr)^4>&i_+QnO&RJZhv2 zrO+`tv#kzX1&}aArgfR^_#-p?{vtceJuq1*P|^RdzuMto0pi3}+nrtOi-5Awl<#_f z=qDE00cAl<-t|GgNH_ilB_Q1%*19r{z_x-63=zPDOcmHTv27D^4bl+|LcC#Cr}coT z*Tdb}{_a^2%tMDig3AJMomPTK1JAcB>|AfDfJC}XiSuzC>pXUvR7ilrV0M;fG5FA5 z{jVQffCg(X0Pjah;60WFb*OUp+q?imT5`7}!YwHz)*(^YE<)eFR#Hjecr=fpULbWX z2|Zq2HM$`!s0Hda=4y3DmjhHRZzP_Qp&gJ8=X!aW$Yf8QwT)q=Ly?LU@B$webxEF& zsLN8*JRU#&S}}`6>;{XM0?@H97jOK+Ay@J<8(7_Fp$L!W%8iC_srt(vkv1%WpKEKs!5~-rM zi`;!aoLUdS6${B;6!-%$^~yxl*1@MJMez$6>ixhnr-N^N#S=q;n?wn>f=R%+K9#|% zqZ)Un4ip*{d)qm3l0Pi&C+k)|0g`!y^B@{B{OR6z$aPibYb?H-CJKo~ADtjS)XEmB z5%z8i0G!>@D<3XO=>F<&AKR5AhPM;r>h8;GHyc=}6?mPwIm+M;K)rJW7@@bIKlu*P zA^jqRmrKYGYP^2h9Jg;OV=^8ZWe0=X?fy<5~2mztGN| zJhsNz@46ekBR{*_J^l{=S&8Au#1HMfU;Z-xb-~) zb8JR+?xA5HG{l#YwL0|&`(C@#!3Xzby9oo2G|o{@&2Fuui^t{$`nx)uNB=DO&1`ax z9QywL>zDoGPs$>Gb$L_lV?y8yf6g8ncKB3RgWGRFS#QbpMYa0*+l6pezuLR+KTw>% zVJ>t$gLZvcPKIzoD`t4p;y%FB$y_E6VSvNI3gXal<~~2?w{-#H z;mLQai_GT>M1fl!6Q6ya{p192#ORJ28~KHh_y6;AbNUK~Mq|KGtQl+qWV*AIWED0e zSNnw-{`IRrbe{d3|7=r#=xR{J92N|(8-cq&k(jed4}=7LVc3`TJH_>*SMBR}v%yX` zw{-%xp`A~Og&PF>k00HP6nDWkiWf4*;&efWPt`v^$3G6jY|x*FV{eDj;eV~p>H^wn z8O47|8{zP$;DEyS%jL6&Z$gV4c%6%Pp10isC%fZD`M>;1fBCQBEJsapr-DEUJ|pr) z^bne6g_3w|Y+3hU(gqEW&hzDffBWX3HvRUeh~e7a5ht0yIJKt%Lf8HInWOAC-YNdX zp2LUj&}Dil<8v|~E06_b$*{@aPzwJ9F@JvNK(z}}Pd(T~>IQC`K}pH^L$u{zygmip zpOS;s6CFnmz58!|w*V1s?$?;zaTI(>&*lC-90rGf_sZEA1|Jd}_96RU(~T(al;e*k zjl-{c_!GWn@TcbB8_Vqzhu;0jvC^~P<&RS(@}FL%;VGlw{*`C`=YRs0&HsKt_oTht zj`9xf9lY2(e~LCeDt*~jnh;T{01T>CI9G!2r#<9IkJ?rr#r32Il$Q5i)w^|X8+!Um zT6+2pPC5mntS$S zoBfWgwGwC1k?q4I>mOaMZfK}pSFD5RGt=vbuiU@h7a;BD0oK8*{(YeVDNlv}LX-O) zoT&?BLAp~%y(#D*-!A;hGarIsgWsR|*nn*L@1RyP;c~@CaQ449sr<@01!w;u)cD)n zoA=TGHqn4stXwT~-=~pUMV!Xx)d=h1Z}qG^2+n6NTf9EKdflL!;?XZX^Yx$4eE5R$ zv*w|1K>2ry&kN%;;8-8fevXmr7n4ZpULZ@9>$SaOWwM8!DZ?5FUjEXZj#G3$RjVD& zXa7amJoFKVpYr?TnVHiJPg4&6=X!vI`f%f@PjlWBv24QHe}N+peH^S)K+sMpeRD;5 zhr;47MAx@44M?b8d?;t<)%-{SjftP>w^EQ{kOWvt(>T$o6>^K2({Qa5lY+phT6XSRi zF+S;(k`c3U-5_-M3B_S7a2N{(oIW-uvX@%UHpL$IS3*xdknDbZG10F6&G_5v#M{4s zOn>ux4AAHA&!k2CMmUt1{!Gd!DJ5={YW3xk5}L!;;xJqUN%@ap_f7LQvhIfPvMve3ZQuv$?dp7)>d;eo2 zZZ6?FTF&kO>eUQ1M%UNdbmnU98)C5{b`hs&+Y);ee!Rnm)p%aC5Q-#cbZLd zn~bChx_ng4IRag%d&twWoy!Q5{(ze}xG%LnLAI3)ZCX4KND%>4^0h2gmgEdOR8BOo`eyfV|9)w= z0e-+v3CZIE+etNi#3Vxh4i72k%3Sqr)HIiW)ff7hq165mqW(kMJTCMs z3AxO7t=KKrax6t+j<5H2ELFF(h)CL0I01v@K7H|4Or(Z{?7WmHa@llv^}+hirtS^r z5{p58fli`Q_rWYjSX*34&+#PVk=9>z?P%Iv31v=%nVjV{Vl3yYG5s< zrS)*CQGw$6R-JGalEc2PM1yKW&Vnn3yJNegYvbq(>TQhukpAxav-7v~Y8<1-2l?0x z1bru-i*Cndl)(+Pm6N|jI;DK@As*CH^Xdv3hu%pK@%_!ScxXvh%t~f$wNZ6th0y6+C#E!xqc$5K_;G|w~YiGoo)N#bT6cNosX zYaXbU84z6UW`~3eOAXj{PhXoZ3nm}itl#JqVa#BzB)=F$xyTE2Lhq_Oz;gM;<9Ti^ z^@L@%oD?IzY5rZ4X(0Athmch=@4ae zgM$y`t6YhXrD;y8Y|%eGI8^`rj`71&j??Ti`f!fXN4aM9g+mXGgUjGaL&ObE$@v%A zXH=^#Q}kISz095SnD3;989)bV`NHC5?yDsSba!adzOv{_VDk?OxoszbUpU3zQfs6k zxizb1H+1S05{u>li>%+qC#U2qn~SYplj?1gLBepGxF^`A(Y|!W^BledANBRqp*b>$G z!Jk^{=F)4L0h#bXlj0&R1od9I?bzJ}5!)z^)EdifW)FP4rTLdHCiUGL-BKJR!~GQW zNxxLJ%MyQAqn^r?;rD6OBv%7f>h}S1XR3Iv&JesTU)2{{~g^f6I>lqryA> zkd?k+ik<8RfTe-7ghN&8kz)nFkw)xI4UV<~KIa@TlsvVu9q49;gjJc3ZLehawdz_X z^XM2nPzPG(lsG$NjZ^F`gK`C+sgd9H>8E~J=gud(`2GAW5Z6XJb&GP%!%8f)YpP)s z5B?0J3Y(XVp)M75g#8mhhAS*uYM?86Q0G)P)>I9$x}(-#@BHJTbC?PnOJRG3qwRDlO8 zr>!>k27)9?`skuTyJ3)jv@?0@lQeH%OSzI|oUI(n`o#M5kKn`~f@e2AiD(8f7By&x zieoN$bc^HAhz4$wGxxh?V+9SVMTOi&L-A%Nw*ps8=vui3eI zv6Hdcg>vEBd3N#Lz?kQ+)5JsO}88oNp@K-`4;=r-3_0WNn01n zd?l$Qvj=UBBDL}nZAFH)W~-_757YJ@?5~ThgMEDQh;b3dhG=a4*sSj5n@UW&+BT0H z47%2goJx$!^p4Mv)Tv>0MDLxc=JaTRHjm;g0XPC|Kpza*(K|(XY*FYlKr|BvjI)XF z8MD+D`yAI>+3&3|+Qgf-I)9#s^w>y=J>i8DiPWjDd!lmL@l7?;CaOD;yP4U^dBMh{ z`(S5=nqJ!EUA#{l2YYKpMG=+0MRO<xOyQg|Tedk{`Fj!N!`N%Xu=CaweQIlaY%v0?W-xFilKodAnR=4x4i8vq9e}FR7JP_c%Gqp3LXv_|*?e8VWNg{w}pJ}DXz&oLeqME)CIv#`J zqmVsK6b-#g@11%=SeHf2y`>-q!_J(~9#`d?&8jd*E(D!w5@g`wroK zTtk1I?Lyw=*Gzw8)`qtub_gD(ta~%$r5JAbiF!LskQW>mygq@h^sLAO*4wB+=47>` zZTGts3|OhjTzNuVbL!LuINd@|?hF%Otc#o3r2JrwRd4zPeA-LEtL3N9{QfeJZFAZA zlWnaYC4^pFKhRbWdWCr)yrhX;-k6)vov8_ewIY_dc?yg-+^+p}5SO?V=-ElhwEbpe zXyJoA3Dd1tF^aAGyZJKRcK8%;u+xo+l%M8cWEXQTEle7>D()o%E6Fvkc>)s_- zfqYFY0p2a9(@tRVzR4)D0sP)&_DA9RAmQHW?S9f*IR$Ym!!h_`c3%VQD&qv)lB0Qh z8wLAi%c8X&P8C-;CAN-THI_$26Kmz0h}!X;cY0l~F>&ydt=Gw?@7{#ubRha_z2?}; zLI&|;9xjWwey@#CaQ|CCLWQ9&bg0Mav(;K~HWDxDazMo4CIs3&5VEwn-c!dPObTq^ zrGOLli@$~;%0<7YguB52R+>F2p+5XmUjPYMN+Z#9Jv;=k>5L~~JJXzfTgfeHfg5#S zI?wWkr!u``qa4lMtgLj~9n_SI%>~(he8wdvbl{$_^GFY>QlQLLyHFqHx!ALo+@sjB z!Edh8zVM*&YM_$ykrjnKneKX{1+xd=w_MU)W8hPGy$2|JfX($PA?(JUN%z?(8R|Wp zM+4q8hXbXs`0m6+QAWc^>v<)mWf=_b&k!^Avzht2kC=>!OR7FCN-53a)kz^jpR$rN zGDci$2s}VgG5;yi#}OmYS9}ouX~RBGN2&a17-J~d)SOu0zDrxym43WC?sjmkADCci z&x$nrXIT^#J&4Hf#xSFH4Go zMP+8+s+F#i50uNhAt1O!s;M;eq7#(6Gf67|x$eMmls2EMnA|@kf zHAVFnEI+aImaJO(MDTpER)&FeR0on*yb5B9so(J)CR#=!uIw%8(Q75~G%P=)Ut49Z zb#DtHlAWY)MGMy!TS5yZ@WW?%ZKPd$o~CGoU2N)k8AJJW#ARHmcAwF{;5A`7n;inn*G7 zg(k6la;hqx!P8qmJ&-b5Kz~sy8@F4q{1{gE)UX^EO1@BWTT09@`vdxJX@aB zB1`dI)5@l5ooNmYZ;R#{`LU-|nChrMM&*;}Y;2k0l5M3J>^1@I#`Vv5Kbsd6oqof= z4-=bqeFNREsfo{nTe-X+gEX`o`=ldA#Px!n_+GJ`jrZt|?;?zrjA_gDw()am*G+5L zh{}{_z{IUA4U&o*J1Nokax~lmU4FX6h6!R^`K6X_Vm)`OmI7cGxwJbTpX&P($doND zb+7!H@Uys;Vd}VVajFyxR2qoZ^9hT1?2)SV1q}+NgFO zIkh-GC*_-lkQGQ4fWa$J)D;?sblri zZRkC7=Va}>J?Jgnr{4N*vWgNMM^IqJuOiqqogn72-Un_T* zqA6?bGE!C(FS6g;7WY^#iML2do^hA=m&9OaPV^)viLfsVNjvncsxhGmIIo^!IaAkp zVn%V|1e8232hOrQrIk}X)D`iVo^ax<$u-`w<@#i#S7EYo;hyt^hh<`$Wbe02!515@ zsm9zAqBSai7DdG%BMOuA5HPA)Kb~$v2Gyh|*qd`RF7y+VJnr6gi3C$-ZA3}_ASo7l z(V_fI0pxR~gI-gy)_kdLpqJdG)pN!-HlDaw(at;gz}KNzcZ>%vT){a$pW@qf!Ltw1 z6W7~FbeW+Cn}$3MDxZa5&|sd7PwW0TqHJOkEDN7*;2CGN%JhnoBrh~G_rI%`TNtC$ zdvoGzebCZw914D;qOa%sz5b3RfPEwQG6I8+%K)+a+F?F*;`9z%gw{TR45*=w;2 zqdDOcJsJAhtIiN9wwhv9xa+bdKYR$-&^_^J&aay>GG;iIBl<1!)- zXU$Kx^+MV(rXSCcmyg*N=*edB>DZ)K$-n;EXC6d`1(#20Hnsb}Dc<~>3Cy0!86Tn8 z9eCU+ThmuAkcuU~Bpg@FumCk58(Q(X^Te{tW14Rxd6swK{Q^Nvp7)GZp|c?rx?e%y z)t%9jEAy|X3tgWO*m6n|pWT9fN7Bt4jtZoLE!^Ob*m3drFUOAeJzXVw$CVo;T-`n9 z^5Z$zJ5ogSLnY^}#Pxl^zC-Kr@`{7l3GCu%@8dPm)h}e7{L)@&RD~~7wXQf<*Y-2@ z)#;iFFk_`bCO0%9yM@>J3AO?n3*3`uV%YBO$`e~yvvpyrN(k8(+Vk@djNesaG5qR$ zwCMi+%?*PCunS|*(K6^D@2!L=>V@bC+5vK6<>h!Gfh_w}s7C)grO`!%w&!q}W!U0p zDcA99W$#?wq2uW9%lla#Rq_R36&xo;;aGW9ZG@HIHDAADAfv;* z=i(2a#M06CW35kO2lHs51c|3&i%T0|@ke}~bfwMx%)E=(dR)Dr-Oyb+5qYcEA-oNE zJ*ExK*QTiS6lL-$K$OAGsnVIjcr3a-RLIYC zRPzKY8vx?;vUn4gC!m7E1jC zS$WpQz&y{vzC~XQm|>8?L;9F>9WKT^Q<3Z{>?Tp1sd) zd%j3H4o2$?8^*WsY*!SV-x9iCh1v3n`w7->MAg=vGTQdG7NRL!il%E+RgEPuZD3a> zbQy#{#afG0u16+a;#kenii_bjw!Zix>7n)WFp)k}qe{`utpbxHQ26UWuCi06R$6Iy z)%D^V5$Fsf_~?g(XW2;}uI3w`aF3waw}RDa-0)&57Gc(YuW-gQ1BmLt#$~8(6&)Vd z_qlNkVK_5+VhFxfIX;IZ*xmoxn>#ZH28}|TZ=TDk@nfxh$v8|J?VW|=q@%p*-Wdox z_ZHbPN>}G@Y)NJN8Bod{SGvMu`&I4FzrR7$>s(`Nd-daw4p6#O7 z*6xHQH$hYl>~+6sUcA=x+h@YA60SG%1zF8T=os;oD?>ux)6ei5E)(2^iRkqGr}^uP zYwF2@O~*W!)o`AJ-2x2WWzE^qOpGG%AHK#*18Y>hJrUBrW5SCg`NahWHEqu|u+*L@ z4#ltQ>cfUzSN}pcLt;K!>6Dx7cUrBqeu>X9fRM?inVcEBU6t@7%%hlT3i(|29W3?EnPazCEc<=I(&PvFEy@mFW<<6 z=MD?FkHMfr#o2qU{y4~x~7Ev1i62tw+kjK-hXZk_w`#V8>nyC6(n;Of?CC%~2Ynv(aCAYLhR6!1{`N^< zL);~KF5!{aulM5L<*P z0q!c4BDT924mdOxuY1Dw`yy^ogD1=2OG!+4`9_=Wqa^x)xNa$ooOnDVWDg7l zJG#Ys5pm45aYi_Nz1xH6wi{--(U@nHfYuVUicIWQ#-JaDnFAsqeQ-=Jh(zwVt_WZ% zMyW*hmLT%Qa8ybX*LC>P8%!!HQ!#%Gdfsr-@UC>uaGP;|cF6g{W0%CL)6#mn?_*Fb zlqWPdk19fb-mRJ|Vqu`!8_K`wvf@I2CC3WOg^!<~(UcNGVXhXB#=;T#4ap~%uTXK9yNN9>mRq)v_Rpnt(gYQK~TkN(NW<7WnB zNr^Jyu9ZfsdymeIO}m;6H55#w@A@XaSuuW&p!(Eqp+9}yxO+$3rG{qvFb?8st`>XjkwbgfIyPwHl`7sE6)1tzw)^%eZjd>~&j zD>xDvCWZgr;o3+8B~ZrHXm$$p1Jd0*Z%Sb_P}?%sh%MvQ`#@__C&##B~l^B zE17$MBy4*xVs4P5S16zVcrlf>fI-COX_HWavq^MF=wMn>Z0AwF{dhoCodINy?sSRu zc?J2$HB94F&H2XAd++FYlV{XnX(8gHlNNc>Bk#9ZZa zO`W-xs<~_`-a2))pA-xrcNw3f;hU(0DuH!hE@in0MA2%#`hu;NahX^(%2@t515b}E zS7Uj7RuVlmB{u%8?p~x$lkT$idR`|6t?M6RLu1{-88QW%t(5Bt=H-qp!foCTI+s5h zrG2kvvy@BybySbaeT-1;au$k>{N4C(x@Fn#GdGZKcWpesTZ1KrjTb?SYm+QEjq41< z-scX_>3aerls|2>E>JcsICKsQnado65TfIM5(S)hl;fp{6dTU(bm)H+PFu#l-LjgL zN6LirNIMN(rk5}a(AAQEp*PqS=wf>O70nByXH3OOmSiIMaY}Cs7s}BsQ^_T$3iiAw zZxwB)Tr8qZwraf3KqdMXy;!?MRdWtXQtx%@xX)cj<5;}tO3kj*UYl^*iNTqDsb^g4 zHEC9EjA?^0<95~99LQ^yDhA_BbU!k%5SE=nu~qT(1a3pKz{WdPr=iJP_!Mz(mRUZY zKTAb8w*cY(% z9G9(K1Ue0eR=zL0zF7gaqZP_f+zj!(DE3qHq|X>CbINizx zXFlxfR(KX#39&Ebl%JaH$llBoTzW96f_$6E2@`dY!9fiwv&G=~@P9!Pj;0Zr_!I|)CYcxU3tl*=fUpmRRi6h9k)~y zVncTAl(1zw&Z$^LGKsqgAWFzPn>=O38TTB?-m@vakK}m7BGN9sHG4*M?fXopd%16f z`DMEUS5Kpg5vU~2=X20N{S~%hE1WG0fT7p;&(2QNDoOG`25f^ZHQREDe2$k|&Owh2 zKSqeqHD=p5)KB5NGQmyvIL~I@yy|F}7c~qpgnce0^=Ri|R@Pb%*u` z@fl%7Pxs|~2PoYIn3s{p^PRpEx7Pb2P?^q)jh)qFSB4CY4{YH3g9m_lsEK?eypJ&U zZ3W$~cBgLMsJV6>d~;foeZ~1&rg4p?Q3|8tH04G>5SVogzqN>AJeeSUaC~vFHYHxl zd*QcSBVws?exfylE6Ez6vzpvZ@Joh&@&*^2Q=Wm`iR;ubCuik)H|TG*yiwv8J36Mq zuQ#QXFTe2F>Z<@>Be}&D6iZda%fQ-l&U=s(V^en?DlPQb*|KkoOn9qa3E z?IDVpj(EO-*~2_lV9KuIy|b|YB6Czf*_3y{q7Y~Ia5gxD<4yy&G0fD zen$nV&M*zy?kiP1-;ftNcBQWC{rg$aC8eR%t*hP{`P`@y{bJZJK&>TTxS8PD#ToJe zEG+cGQklHj-CU{CCZxr?7wJ~zX+e(4LQ-$^9f3u^lrxUi>_|ojSp=QIppG-;#j6+S zR~hM5S=%>Nz>+X*wf<0QO3<`&Eq^%nev2U_EENpOuFd@&Y3veLl<3xPuX#Uag>`rHb!9_UUT zbI<@N3l5Tm`BF5v@fNGxT?yf&Cy5(wF?RD+51t2vol>Z1_A6b)%2`I3DW$l2@*TZX zbfHEbH=UErBoIGUaRg6%(hob}tixo_K4ay_T1B=O)oMCd=hPiKdJV^mv)#EXf5-Kb zn0KaH%6@y%YE&ck767KDdwehZ0W66p~fZYhdc$&^~0RPknk3WKz=i|)Sfb! z=Qh9SM5dx!NN4LK!4&F31j~bzyN#ek&NFFafcc$+A0XrUKFN!FNUwc2 zXov_;vSeYQ=X=7F@A(#L!#pF|WOn@3X6kcu+A+T|%KIIFu@aq&iky8rqUm80Y?4h0 zTF24S`@>T@l4Y`21vVyqA6hRnE0wR+Svl1eqs+)(jeEHX1}pbZx zBy%6=Y3fug>2a@>o40_}Es+q~b-HkSn%o{7C;(8mx#p^|>>nyw>=K~VE|YXfb0lj) zeJEIX1@qq85^;3O2+6ZcTT%J$(d(d8yUj$zUBtNyzI0m3&2iV-mD)zxW>t|kB#&6fOVO;j$NkMt01w{qkjd4JdfEwWCChWcTG85PP1wHHVfMe0B%FeQk%(75 z}c4tMQ?%V3LBTa@|!K36z~{elb-|CH2;jSL^@M6qCoE= zOfMS+$PZ2~og)5zBg5VF%igQ97UQ5Gu%qX%E*?kj8ufqGqB~jm#ZF$5ygEh>v-^Eto4o_tJPXWY^FXgyp?1j#rHL)-JWS0@#B2He^2{h~bBUd*2~ zxRubeQHQN3Skz=QD>dxPn~`QE)2^$uKyj{Xh_^Y7B|H+=>lyr>9lp_}o3LID1p7ya zkCz{0hk(_IPki=0f(JguKN#eC$l5ZQE3#gQ_=*STPvl7P>)@Cjrd1dEDwP1KFx;g` z`jZTxKOe#mzo&Xm?x>)M>zVpI7CA%S}j^#LU+2N&uHusEF#$YXIc(fWyU|tZI8Mx18 zGA?;)QcLfpUuhO|DGFvd*|y@b3%2QGJ)CPN&LHm3zZaQcrPUPI0+ZbjRoroRnFPP* zm`E{2fGr_V$nG2+sQ1_|T;@3Qyj!Qd`}iNBye#kRTz$^On-SH`;7456> z6&siO)9`McwKG}NyyitFhC|>ofT9&ytj+I@B~rt2ML4r8I)jPNQ-!%sh zmj79?`e!3@=Y@OLl>J?$1~op3J%7^BgpI>6Hyacm^>@8PoDSyA`kmz1Mlud=Q|T1A=QSAAu|aa&DYpeb`I^S$^BC7Z6m!9Vt>}*kVjiCn(0#Er=Q~5MNftnQ z$CXa#A8D3&vHv3fD&S2WwFOLADHA26pfT|u`%Tp>SX(GlH@#D9JGPG=OYzyR31F^; z8ZK2-j+|BlUON0(qlb^Ri=JH8j^~PQ!tA~gPNuVSH4ZB=>W1Wa;G}HB1|=&`csfUV zZrP0KnuJxZ>vbj!nzy9Zn`|Jxf&xthFGM1*BqOxakIL#Tu9R3Gyxx)vbHRs<@H;=b zdtWG`L_4GRX(*LggIQ~1CXvZ45vBY3MyK3^{Ss^%@SM@FvWpaRu@_FehYShS+%!t{ z*SEWyg4(Vt@Iu>JLsi9*Q42LJ3$F#Q9_K`=D7*!mXDh^QHr+>nl<5Mu=hF@w4bSJW zy&thgCYazfT2p5qZ2<4RNj0t>(E<=zF!Yih5-9d6>q6lc zW2P3m(xL=tnu7yv%EYTvd}+>|JcT^)!a`XYn)ZP|N=Jd>>EsWNb8QLlJW+<>YobC! zTg6<^1L6%54~ctGr4rlK4(eNs|KGR=JY*v!gUH@eAo!%$UM4#{P4yYfa1|U2dqHsx zC=<=VM$M^FU5~+~il#3Beji)McwyVaq#-eHUqlDJGp+v-PFR=c(`iiiHl<-(p#Ag*ofa>{;hvG$!(Y9W0iIr;kN)Sb~(ExrU{ zThnixFtr7bP!R5mERCrdwEKJXGEMNC>}CtAA1sCd%if;kHjd$~1cG<9A8*(~Z?Z+# zwaKM50wLJ!H_pKhGf5rKuH~~>z8hefUDCGQ7CYsL^(EyX6M2H_`=!`1d0gK6GvJ>N zA(TPBs+D3%58{*Io#>|ROV1?d6%%Kml4vmWjl1gPu6z6y2ICwgXg_qv<`GzDFbV~l z6cKAz)dA=TB@o|C-e~a{wa#hD&H4B|Pj19x&7ce@HWsCjthtip&;f*&f1-XIAymq^ z&LKI9+bbXx??1toH~7iCNWIWer_}7;fn;Z)Fsk@0>J2=(?36-*(MCeK?Ig$Z{4}tT zGC5XMQ;M5-;*1ahBLRaY?Y%aT?uPD zvvGdIBzaM%{f22ck~mNWMKEpyQR|@Kbv&) z{1#I$ya^K+JjysE61^&i7`z=7nC^T@V)aVRdK-hqc;VkOF1w#DW%0 zxje`c%RcUZF@XmFyx;8UYcnEyX62l}Cgh~`V-+z=W3m90!hkcm%LBoeJ*)Hc*#fy5 zzDuq2j?-_OYlFXEt^$3HD=XK;%=_X#|NJq1o%dc9Mv}Nvos?6-AVVbY+)Mq!v|=AA zTvfgrJ9uv8>_l7slg}oNwHA20s>%pgyRn^is~;?dx1R;&K5A;ML47n&Noej&^o<#H zVZ^U|yzP@|@MO{3H~tCJGay&In=L8Ucq>2JF8L$zNu~dz{m{}&y$z|p9$U71S$L^| zM@3tCG_+s^V@fugO}YuQ{&hKdab9kZi2#VRPhC<-#_?CqjC$PijoM;XC)`&GYP+Qf zaj5MSrMsb#x&6!{nrtp@L-e4}AMFK`eyYP4mZ3xyt;*ASl4l{{ABv{$%dY@a#03~5 zn-mMe19=gK`d(QmIpsp6b&9J$!^2+m1}I7SBfHj$lB_3$W~oRyWzJ59Ytwt!&e|c* zCDC=?Wr6%v<@1s0*Oo;B!Ap2v30#zi`iRTcgRre^yn1J*t*s$95x}BY z%4MGaN zu}|*V7PYiL(vi*1$K6D0{d$B)7T2V}#5|~6VQ|ot_V`+JAoo&?Tkveu*v2%uo!BHa zN6>au*=>dzMwFta+|1tszN5!qjpHuEsnL?PfTJKn$Iij2T^C0isU2LZ^9##uMmoBL z!z8`7Xo=%l{)KqUIXSacoi8 zF7;t^McXJc33J8^4)a^+K{yw5OT*NGxcyj-Nm6CiU$J~NiV9D^zE~sBIDr!!hUC9kEa7$Ew-(*(p|M~hvY*49gHn59UMoIa+}p_1 zNJ4+x+e_m6n+f21w0|@W@BdoUkn^bQ=+1|Xrq-xjdOymQ=Ogtig(UH78%EO0jEJY? zKNz7?$j2@?`00F5$nP+-1a#4g*r@I!uH?r6y;z;J+4C(e4CZ{$#*d}Tld38kt zJHt^AcfkH+^S_6%Jw#1`+f^ZtUs(}r18iRZp!%J=T(|(&a1nv?t6|Lf@|zq2pHJ2s zmS+$%!a7$QWngtc>VSe&9D`C0=0cM`E^0aTAikm}ws0MFsJ$%~W+~-7L!aCti$M1< zz7aql2vjj!Wq$e5l~kL#t{Bhtq5A9Bkc$?3i7KYJJI~&;!#dXj$xA`%;j7hpQr;Hm z+EKiqg%v&6a}p401^osud64+x9m2_bmp@zgQ}UOMI_*X?MAdH`9oCBYxg$HQOaW+i|(1Ij+q@HMS_cq8L8K zD`4C7cw>J~)8VdQR347Qtz`w;Rv*-K{$!uZ-K{#ARA~3m%t^pcm5&4NbxB$s?p3eN z)$fFFWlw3P;T=euqHuG-qSg%jF)++d*aQ?a-^5Ks-$N~W)dWTXzeF|C2+T);!e?eD zpvD6>a(cT>OyjJj+FiYQ&SDFw;H!$K2*LC7q?=jJI6!dizaipPoS&gKczLTd#n?H% z$L2lAZeY7Hr>vf&4HC9Be|z(io}m3z+BOz*sUUd8z8w~BnJuZXL9agPwR{%65oUOo z1;k-B^VGZCL`D5dt7jPYER|@%6h$MSU9AJ5i;H3`0o#hy?yx zM{I1sa3nb4hjLq9lW+p5XaS`x3vKHWWx z)&j@sFSgy9Ul3Bsxz%3!ZqeRdRmI3bj=j;S`zn=dQ#E6@$3n81rW5Ou#T?^TO5U1~ zoT*d++65)={;Cy4;lzMNu3e)nV zkGGC}HG7PmV^KVykMBEm@8e&WdFrELRVS=>=3Ms^cU{d#1W)!xx-139PY?3$H+ruy zv`0tjmEIc-km{w0O&fNoKVS!YeI5xN_JwY*sA*=0Pk@e|kA=0Gun8uk3%%D1u|`>3 zSi1vu0~`Y5&Uar&oqvr0P3E^5HH{7 zC+edbK!vEg`wkPE;5&cDmjy=}1wmK>=C`BYF|}nN^A)1l+vyIa?47wqxz@(R;C|N7 zBPK~5Tk*6Vt~eG+0WD=3~*w^uY=&r-h zaxCWYS}_l3tAfk=i^$iRU>JO3u|lh;dHm_}u3}Yb)4Ryjj#4D+_oI51o$>bIn%VVL zpRq3|G;@qkICQrQo7yZf;@F&Bo`VCK;z4WCTBNx*C;(Zs|~Y2X6AXp02Tpe2-i6277SdFVky{uY@wU2n3PYYNhS4 zi{Q7?RKG9V+F0Cyey9x~E z6SfnRayXwg9B0Idnvforv=CX4vSr{iek3S9`9<=}MmRYYIa3(CH*WSVEFMH(0NePl z-#Jb`Xt#-Yx^+lM0A!9CidJgFFjs}Be)-S1SV?!85SyBu_FT!Q*|7r5RTe@&oY zh#5G!fy`Uab^M>a&nmq()>2a{7BuGc%Lq)v#T;IMotDwJUqD&pZZ4m#r3WY09>Yz| z+(dPw92vo>kK59B;L>gU0;p=aDD7tNK0X%_VdZysY7*|~B{xJ3dblnbQs&k;4?cYN zBeI8?{c;%7{89t8ajpV76cno6+UEQ73_u6iQFP9WFo&Kq4XZ^uZm_yT0bW|Og#rzy zI_`|e^ia*Y%I{2m&;X99h;zyL&r1sSzyl`FCs#cVy*R$pjPCB+XlJn!Dqw3+0 zG$q@{q#P&nw!b+N!W#;9OUxC^BpTzS_X^#76Y;dYfT`R{ts0XBW7|Hwz z=Zp7`ZP~&EzjR(kC4$D5G1+fm&zaSqS3E}5x(oR&hMltyS?t6tHH_YkJ~u2pyL!0c zM?=FvL#zpnfXVnv?}1mGj9xr%FwKD{q>bG#MGMRccz8XZ&CnbkdUsC>H#~m}r0GSf z9%18%*Z8w7v+>fy%cji=e9z6XwomsRmtSb?egew!9|cpHZr`Psym0}IofWt}H~Jzk zaiKr2(0|xBKD*D>&09T$WDzO>O#!leyfaC5Y3^omZ~ zP2X0dOi+omRtLqG@x6CmgRb0GXDSK;RIBPOtISh9;>>X$kA9Zj-Fv<>Lbbm=b7be@ z5N_?stDOvUEqr5YY=31x7Qe9#rkOkpPWK51W^FUhOP4Dj7adQDL|10@-S;~G^XoC1 zNiW0hl}_#DI`Vza3e%ORP=s>}9AC0|k;bi-Vp?u2=IF|j*Ir~V*0N_(+RZSL+rqC%xA-~tT)k&l9*6%CP$U0;c>OB&$0O|rm+R8QVBmB zhv(TV)4nTH%X`kO{J8!qd_IQSiDn5LRsLRoj%IGnzbjg|wHqvIZ7^$Ko9F!mec;je z%gCgGm%`WTZC2nwlMJKhWT9uc`>7g%Sw=fzZtOf{c^`i(*JbTt=2d&? zqq0;pca^jfm5rK@t**qRrrriQ{AKAev$>QR*ZJ<&_jMzu9_&C(_r08*X&tPQ{;UZ4 zVn-IN3ASFg??@ezuglTNKsrZi`2VO?v)75tGYXuXiSqD~E0nU%Fl!-biu$vdgbD*k zrhhidF*JOVMYsV5#zBj(V6BdniWinf&Z9=6fA<@(+I3fSaC)@$<((|!hdbO4G^oKe z!3S()@1FS|{RjfU#`)jfo#w~Wg$T72mJPNt+N8cv?*-kRXlWyUot?VR7lpugAW+v) zfA{h7So4fdJh&Hxlsfu%_u1MrJOp2A_?xcpl)vc8GmIqs5-&WT3S8;Ma=}6;Km#CC z_q1PR8NvAV2U#3%&1)}C#9vtcj+d(FHDg+>U_w?oe^?jjz z;A`4HTaA^6A+m|AsLJtebEVjyFR6jHOSyEvSPoN(x-*synjq{zT7%96cLx39t;bKv zEjJ#xqzG=w3kXUnip;xpq!`Yq8OrY%PV@PMXnpBWgb{=VECz(9sS zd0|n!th1*Li3I&&_s3qHFaeu~eMVpHnGR}wo2e^)_9Uh%*b{%~81I(H>0kcOKD+@u zzhrxR?0XtNA({aSfP_5q%Q?-UdsTO>=mc?H{H?nAG4)qRtdFU!yQ&C#S9|~+ed)f; zgcv6GDdb9k&lVBSDSo@-OL1G_7q8mI9Jz^nGyMB?&<}%mYonPR*zL^`xav&UHS0Gd z@wbGh!Ksd)?bW8o>`JW&8lA!ULB6tm=KY{XBG{p;yW38LKffc1KM&Zx?^mm-?5l@< z$?Uh6^6>qP6-sQi!ufg|Cj1(82o37z4)=!tP%E6j6m!KX+)|r>U9^{hkUmJHI<{~E zRT0n>Cc+^8@!8rw{%%!ZX13z}nS`H&BJeq|;&sz4)?sI1 zBv2=E{5Pcd>r5iDeE52&{hm`3T-YbPr4IXlPetdb*-W1m>crHECA-scJ~K~_D8uVP>{XMFCuK_22m?e==do}TXa;!0OwXzuZ37bBILB8(0 zH1PUj?`nGS))peSEb~DFLU$P^MJa=HyNS{kXBLx zIz!(i@Zwef+Dd56^fDW=I&DDV(nAm5H^UrlJOm0spp{$5MtI)YEni(6?c}jmn%egL zL5u?9-Q8p|+m~joeh^F;a0H-o(w*;Z!RpA+M7q(8>Y1eTr_L;We7ZgBAPeDVrije9 zUGrNg2KhucXEMM#R^eiB84Yi}*!vALbf8$Sg5!LOy_MAql`}X72%>AFM*JLRfKiao>oWS1#BvKpi z17FjnE2dXiY=Wf zP55oU5q!@}$y%GUTJZ>Xsp$mriMebimG*N3Kg#yV56`zBAVqi-=NT3jThRjrY;J*P zd&ZTwDY0JEx&-5x&NJX7{5`D#a0lG1gR=As13A*S``_r+xSW-_7W|S(vkC&q!Ar?a z4_p*ckM7dDK3(6ptJ9uSipd6-}ZLJNe^viuYso3KS7P#FG4oNDKYk(`w#6zsxI5@ml)B3mT<6Fsifo^G-x=kCgKP$+~ep_dD{VbyBiN_eckCvDxPZ zh4a@K^iLB?g$O3!mA=)V^SRXCu=6v})geo&MF$}e?QwGzr?_fC=mln;64zIwOi39g+iO6q$!o$fyq{aym!f#T-F zck?((h&gRB5c5K^`aTjY1OE!_1K5Jyx4U|fz;M7fZa|Cb3Zpkq2!{=i)15^vpyg{)(k!fm7!w0Vi~rUPN~%zB4*?m|7Xhe4AJR4coHP8bd`UnScg)K7 z5mEtv3wWipH-eN1jK}iW6)<(f+xEQ#M3Cc=x_|Y=6$0HS!2c(oDe+mjyM3i7VdnFZ z1_)%jOyk=D0*OHF>Tmi4@g2I~utyjWkO5Bt5*+aH4j3-t{&CZ(*+dwrZhf&mghO+IB9 zC=!eiQ!4Q6Fqrx*{GJb?TPw%A{yoPSNE9ILM`kd!V}G?O0THk^Fp0aXn-Ph+9*~N6 z7GsTN9|-doDZFeI6?c0RniNrzUwZ(y+lqe9B>dRwJ{~~e*H@-A1hOKoXE1X>pp|kO zj6m68-#}J1eewXQth$I_8{hWLkS0(C3U@F93zO~mAL4@2NT&pF+CE!u)dn4b1zZP1 zCkG6N2u6s)hCAUiL(Gig7@_X@jw1sRJzDxX;^TLD?+X%l{p1693npCUt z2mDyE;T7FSz$y+=yw%j^^<5-Dn7CUg0hJG6Ww9~@WCV}{R$YP{FcORqWz`n4CqO}E z?e+d6dm+$VLIe95$-l<~0wo6S5MK4B#fx^UWSSrqY5K`Qf#*l5M&AJfe!zE1KxWxg`0*D`h{Ki&t~$=3zO2Z8c%b;4M0Xay}l!X0O9Zla9Xvkgw{lq z>F{cN@b!yeC3Nar8DO+3_Z1I$|BoZMP^r?{0+hC|?zUcmj=%ya!BD)CAz^EAqDXBa z0}VH68OaD~2yn%dEuv3NNH$Rspvdt(>1dCI%0P!vnfTR(YFua~@#}{KinWMOpx4CM zSf~lmqQkc`-`+1_^^AaWqV&OGK+(5PXEtyUknvF;fO6dZWspGIpalHVu2;an_?VZm z5I};%{!oE~y5o;F_^Gdc*#jMb!|nqcAiHUxgI`Z{couwnx_P zsB$OZFj3~c4hEJiDBdebSQ6QH1bDr}ex~FEhDJcaPv*hc0U6e>D#ZvU3YY{V4Xcz< zs{}*D1xN`57)u*@gV1VFAd;%wRAk*rs@1sQbqB}NKt>?Ji$#F+@1YrT1S7-?3Ml+) z!0IHCrA#|m)IM_+AgvGqxOp)E%uFtmevn}1i(CL*BfESfZUQSHGB5B`#rV`Pb>_p@ z4Z}ZhOw_2avkyFsZ;Q#T*H}{g_wbe*n#nmC{ zHMd?{xqZ;rjVV`-P$cAu=A8I1IDb!JOG`^`*Y@flWKvWknR`@YU+vL9L!e!_0jHf6 z_rwukzhJagre0Bbkp_hQKfC4Y*002SpAkNdFU zowPXl|B&takmXf4t!-_`B?!uJwyiQskvBpJU=uP&2|!RWzr%ZZ9ptZ9jsf(JtGjcN zAdxqe6z*@#d%7S;D{I{1aF9R<7b;$hokdT!>pGX5{xY12v zpzorj838x)p5WYxObnS14!a1ar6V89f&hV=0I`nEF+Kh>hyX1(?K5X-b2*4uztho@ z4|MrzL3JN86MljV6cp|klG+0xLnQ`4QU*$?Bw4&8c(+b#k&nQzi+2Gw1^xgo6Dlsk zCsn{Mt3I(_gpeW#85C8%~WT*!MyW|Q$?~1G8euyK0yoP6n7w|e>$SsxZ z5V1=EI;7GZ|N65;;5WVR!|r;&a)1)t2=ud2*j(p#orBEtlSudxApci)a-sUEbOG3~ z0fLtVk1@;+qZrLm-Vc@k6wv&8`s`5Lh;V{}8{kWIK$?JQYjEJ+cZ#l^hscQ-Oj<7B zDCg$vAv8zD-G{v$(zzo0XAm5RVHBKcCtg7P{Zk;2r#$6$Bxpq-AS5u`4C<|Kz5sH1 z@fu4EZ>Ut>GtiP3o|qw!{x=JE7~58;SrehEL>z_Y*%LjyCd~QEc)+4KX1 zF&9cG!%$d29o8V?&z_%xw(S^5cS~)*_fbdZ{=}_g=GUl zXY)Jlg1ioS>nHn47=h>*h3cTJXawXn7H^p$!OVF9$-I5yArO2yKw#r65Mw04I+{R2 z*o=6as)OGzYnJe{yFGM9y0S68Q~8eGZ&}Q7~m&_Cp zK^}~NWX37hD-e92fh-~DMz}8t)-ei##3-ho93r|B{CdFAh8;>C|{aLHFpt681n)UNRCqo5+=g0dUNC9C9G*dKf z8-zrZ7eLNSL1-TYIU+7I$_HfT)o;22Aqx8u#K!7OY6qzGLuSHHuzNo(Iki@<6+{71 zJOBwEKOGXR1NK7}EHPwj1R$&^u?1>1%U7}jc@Du9AGJ`vU^d@{$IyC0HE`$EDYX?4 z-n<(&s1zB3k4b&3M+&r z%LjlnX38=zBf-F|fpu6Vsf@tfRG3A1$ZroD*&zfoWrVA+s8#R#3O1lVZi(!j6@pR=vkSJjQipg++j|A(WT{r@xSb8;h5WS@9%<(2kzinXz&i5gdxatR z!l{8yJd(^iPE>}!8A4Pn@OJ~6)X+)|7vNt=$ARs`+Ul zoCFXsZIA(79p3`sT2wSZuJ`&Q5-KfkfmS7?pTt75$E{HIt7p{1I#RA zFxQ44aTDYjcd24tkYF7YE@0W|dTj>m9sVW}ey|}RxJtz@4S7zWJuvvUSHQa-DT;vz zAC(StB|Xu`>UY3I0NjVW0^zT+hCqoF1)3>lF?s&a5VoM?;I!YB2|UPqkjNK`%zz^R zzfngFi4w4cuRn1y73vT!0C8MM?tJ%00O0H_pjdm^k{L2t6e#z+t&He;`e(JOzYeEu zvQG9o0>RK7_=yiCI*L#Z5fDrZdk0*6ve^p3YV94c(d64JB&_UVw7eh#Vz-B)TdxF= zvy8t0MUIG~ssOD*v_Er(2D@OOu)*2Ayd*GF4=_`YN`x08x_2NVWO{y8ATlX|x)*_U zPSIOOXe53K$O~E9{xT9uAcW~)3d?K2yY5AQh2RU<01DgQoF@uFjt~Gmst5>wZO;|x zP#Dn6a1jS^ni&F{5UCQdbv1pGfVv*w?|MQVN!hfx36}78_rGq1!iWLlh-ooX|1%D7 zUO;h*Yc4cnS2_m*w7#M_G(baV0z}?D38OI1Q#}W*Z+`%SzIij1gk?FcIv}}4c#R+* zRR=bzdfJT?5EOv#p8Lh2hIE$$AeXCh6p9=X;Uoa9N-(XKg!;S7fR4+ZmIMhC5rOgp zSM$!3`2}RC4Mc>F(&6JoCM8gJT_8H$CJAUHz6{8_f+PDvf~Uv@BzX3Bm_IhHmS>9gv6PxAj_3UP|yuF@YZ$bz-x;y`J!Hmbce+Vza#c&r)Tx zyuHqf&GPp8x^}a?y{;3R%?Yxdp&q;mbce+Vza!xUbfmSZ*P{j|Gz!G zedA`=)Os&~b^BXS;{I9n{rUs7d6Ijb6PqWwe+BZ*licgRdh;arKb6DHlicf-!_AZ2 z>%nC6B=^|}R@PX|yWP4zgTW{~6-%3v#;P}ijLT6&owh`NTSgV72)*$6=ILj5DE4S!swpdim9ybj?(ML|w&KDc{5 zM_MoYtRKr*Ut|H2Q9k74?wsy|&Vzr@?S7&($jD@BM!lP%6%QkTUF=u( zMCgshf5P;?e`H>V!`=p&A)w_Mr3`>ZO^FvNS9LfTX(>2!(!8NmDxHAQs+`a#=?3xy zASG*m=mrM;2{=n1~ zX!nR?T%a+h=@>T&SAGJD0OOVRE_}^*!x-!$_%iZ=$>wza|Dr z4g#u?Y?}BAibe>KiSZ6$(661CB!8m|o(CA3_ec`@BI-0?=;?!sVPQsw7_m;#lPt=siBcOF%;}b-!aEff572jbI_|JP0Z9Z`L9exa=LH(NOdmzcRr>>g>dLq9|z1p6ws5< z0qE{?pj{bDde8=0a3+9;(d;Kq64Wc14j9TEEqdsE`zCH+g97h*NdQ4!4H#N&HV(a8 zP4Nu)(4bFkq+Ci?DgdNRloMPw)Z~ECHkH2NB%zx`fDZt{8J>O>q8d?`05`6TdS(4) znZzY@dOzs4p43|nZBfGs3@G8jR~RX(Q3m2Db<7|O1Pz!2kat(=mN{sb2qG{m0o8&R zT$G`&exjrxKi(-u#ZKT}|M9cyf4l~H$ul<^1oTZm9pHy&2T5tyOZ$?RmcsfZ0o!%} zhs4zN{`4~l2s8b`r z7hFz`1**Z-nE-8c6=eX>2tiSk5M5zPz)7i?>(da}F^K+eFIPf4YC>}oyj)Nnz)+0Y zg`wfK{wzR)K^Ot;CQL*}Q7V8N*GHb&LG#Tk_<(m^B#EFi08{~JVFAH_8wS*B(98Eq z55e=}emkIyCJ-tR{DBKVjSdJ6L7ANgeCUAN_O~S5zURLHs6N#f3hm@}Q5A&f_7)8i zuHVC40f<@Wx6qbAH)ny#$B2j=g$j#^R7xJ)hX*JS^aSG11=-X$gW7d_f)ct>`QKgy zDsbdt8T1_up!|25%`2d?+W6aF@I!#tZ%T4ghu**s@B%Vna!r?q7!VOc;9NkvG}~2W zp$UNykV*4y(|dmgu?1xf7;4SzOd#?*fT4FzXG0wl5lSeU@P;CuM$lf50XVO$ck%Kh zG?;jO1UN7GxFl%PtGiDDHv;qZz}K9hyoNqOeF27Y+9cN+62MUM;5nzBAO$I^!4Ie| zdwT}DM)`OHXegEoz6za`5GLvrp!(5XbQ9!Ncsc<6DZ925f*v7+tz;uWezE9t^iYyx z@P4>3?;r^v$WH*OwF#SXegG=7L&RnWv1y?g%L0t)WtgBD^+$QYj6{1b61s8La|7)% zm@6}eNDn0luxl6&M37)8nkRvwRA+NSdtbfP05)iFvy2oCeFhjB)Y%5jyl6Q<^ydsr zBc(x5lszD&;~_!gk4zPze0+a7_&<9cTFu!)U)>C-B(2fkP6^4Hh7U8Jr-DCQvl+ zLz$rpn4yuSl?HiEEJ7RLD+h^es!;WM4X}H5Au@@SMnUpGHB_?^*C5luYXBNT+n7n| zf)xc8+;6)o4?(>?93TCI{U#uwiBPhYEDIkwu9`x_Ym_HIgU2-CDG3~n$5)jaPL4sV zN+Dp4-}KsCouEq>Q~_Xcm;m6$7p4?wBdn->;JN$(Y7$B`Fn&LvM*POLP@A#_KD2t3 zQi+64SU3Fu)%xWkLJ%toNCFH^PtE|Jg8LIc;7b6+2v%u34c^x_zLlA0lK4Dgf=$SbYcWUkjrK zXb3Ld4uVifM7>a|_=F%m*$0{s7&8DHJlOW*&mgvv4FHA?2+u=9BY8FOq1Crd*`c0_ z;6)1Bw;-CowZBEs>Y4|?GS*WLBB9yaMOomyg05;n8_?Dt1Kc=aSEfmXgHTL@@yTL~ zCR{+nuSmdgLtjm=W|#{6NkRK792 z*({a+yI_KEmdgKS#+J=e`Nn{02224QDNl5It~M`KToVN9Geq+YVKYE z-Rb)THYks`o~D8x^4Opt>nXtdV*yS97huD&I!;wl4(c&3aI8>M4g}Q3@dJ5~*u|Y`AXFw10jPk3R_3 zBQplw)vg35O9c1W*+93B|M}sDKWxDku{Onq2Y>T<^B~wpmTVpb+fW~ZZyp5u*N4G3 z4}xv*kDCXXej;m-6^deM3D7Y;3MKMsYS(DL}h5nXUQUuYv+e>&z3nijQ}%w*C{+mN+2 z+!}tgMSt%`^V|^Nf91sgbrBG8Z~Hw>InS3~M*^O}u{~DfC)H*XdTw=I+nrpin^JnY*}__GE-0fqKWTv zos07G>2F6By~_NHqjE5fnAMDTZD(h&QqD84O0c-0e9Ot899t>V!YO&Z)?kxp=yCfE zmJX{o1_cJy95t)o=mtfKD|iY^D*5Y+=@jSxLiU>^uuZD**KnUReUC2ou8O#4@Z9VU zo2sr=nq_HRk1F{CgJ-O_oNtjSO3azE2kdSB1OrxCEnfwl`|FB0}y z`|kEvEk20U{#{LhijW;R-rgK-d>Qgi6u$6k)7JY*dK|;XyY>u5EYkQ%3d7w6l2?Od?G?><&483oSG6Op^ROMJAJB`ONLEJnZfm)-|JbCPs?C zG0;a|++gR%%w?m<;P*?yzzv3)_^263?FPjH4$I5uA3|m#N3tC3&k7#*wiU+Wa*@+k zjjL(6?=x>^@}y}q>-LO!vgT+fJ9HfNmu8*J#XR}ZZR5t4k~dY1#FYiRkR)A4w}+GRlIT~ zbx%(B@zQTBi%Pup)+p_mKo9A4$2!$*8_uWBLkQZ|MLvNpL+|&GDHz4pg zJO#H;MM-yHqzaF&Jxb+ixgo`(BEibBmOR$XMzOT8re)_ACheFq6oEX<;#lh0Th6B2 z-8omrH?g-x-6*Zc@NbGzEj)VEbmB|b`1|bQSboTR(-h+V>gS_i4|lwRS(y;l5^|Xe zFe@XQDNM*oULH(8ay}0mr#R-eTY%wZ&i=F7w<}%3&B$aVLteNZrJYTeu>X$=*#Ekj zhd)kPPgg#*>(FX%#C{sIqfd+hy2({jPNJxmUn$H{3>9^+Yrmo-vvAiC^OV`pTsyY# z%y`j6N4I}rah)XAMRcfItJG7iyT>uV-esnCzYebBcv+`jjPqg;- z>^y|oo!dG;_MpNy?rj+EvsT#|wUtv{_o_Vfa&nSb=X>&%1IickTJk z(r~PFhn0@`r|o69j=Qn^Hi1E9i6@$w{U6O~uN8=kU+DfYk6hl-ozq*kY*%b!~74^QMam#m9rP!Yv!siOf7dVv&EcTjgCxjMohhqPEW(Q z{+Rmlrua-+j&n?(^FlIinNit|reJ6IjjnAyI8T8Bwz4NXi}J9pY{zH?<62E5a7ld+ zWv4z}z|x^VS1^P~CuM#)ThZ90)0#KvOf~LoV{hf3pOmXs(HbhOe#$iK17&Y1y6aHw z@&Hfoi`H(|7ImvB%ch+M_VbF^$a{+7{fr_H5`8ce$ykYf3>ub2wUTy)&CfX}Q$JsJ zv>(keuicFLkAn+S|fC=^dJ!q1|RagV41@ zTu6&6v#x0D)5+<(rS~Gab-0UpdFQ?1w762WtA*(qBht0G2{|T#S-#G)R($@cJgvIX zHptP5S?G=1jX}7C1@D3mM>RrS5I1l^C$d}<*uE)ZcVefy7R2uPUtxcwxmq={!@ci| zv&+hIuUdtFdq39>t3I09WnHYq5B0X8#yIa#jLTc34aU`_y6PGx^5ELaqr|!Fxnjp} zPuR;)vRl4YAGt5kJf@H7;FMS@Z|r?(Q9QiA>dZV_cH~6;fl?>*5VB#{_L}UBws%fb z+vbr=1!lfC>-J@gN3fjEU0}xSc6RMsR&Lqv!B@4iIuQX+7hi;n(ZVVl2D68?r*LLR@6lzm_QjR&jdfmit3$HAT81||JEa$|Xpdcz zTajhYZS2O5AjNTa>K<0zuxoHGT}gEt8R0oaYx(g-Eiajdh@E%v1ZF3;OORzjjk(yg zUOzj~^kp_2*NED&Yxh+<>Cs5reC(Swn;niwYb)17I@&hfts`<6;ZAI7LFzJg@rbGL zOi5tr4XkuaduF3*Div-edO{4tj#R5#9qrLuJhG(~7t%N;RJ-hebFm*;<*21Ur%~m4 z+xthz;?P8-*z8WLK8L=dBNyqY^Hc9(9`0y#z2P#)T2Yv`62VZl+@Xh*(&C6ivYr}e zJQs|_4Mbi!W43$Gq16v&Wu*c-lAUW@KF-rJa*@pid^Ps)v}jxr9agS58I7%p-!oyB zxST(B{!a4@Z;;tSn8ewDia?Ce*39O=<2TAG7a5!Q?@R6F+ z>TFwKDd%V2260pCk2f3p;tx(eJbx$kK;}bz?%a|j>8MC$-!-^WSPb)?(UcgRHx?r~ zEmxr|XFf5>xyoF%_(8hpD0g9-U+t;JUF0`hr=7(WRejjY<4(9vj}3WZ!d5#Q&g6^F zx9b)Dh{wK`zdb*7&2APgUa-uL>vpJ`D`iJZjyYhf(dh177p_X# zC)BYmjn$N*3d|eYg~H)VxGCjFhRpvvr`Up$0hYUi-iDyP6pS1d^)NAN*<b*%dj@r#N`~>Pcw+^a0~xYIrp5;?HTU2 z=m@)-H=C}lz6H`n;0&!THu4Y^auHe7xx5!A|Cw7`;?4-Q-b^bW8$MC7tffcpK1I>! znq0hey|*B;Gi%u@J3yvuZ|hWap)gex}8{=eHvP}7o8iGk<85G!`3I^%PWX9bY5YfKQaGy z*{6Rzv)NehQ4k|dPS2d>La7MfE=FBfX9ow-HGOfG>eNtFcMpGfqrAUkEWAEUCsmFGDI+@a#l&d_lh-ZQYi6NYIP)MJz0wa)CZfiuC zDQT&YG|RJ8oN9`Wq{Ei4+09GKo;=jaM&T3LKW1Uy&hg&Px0OK=7s9TsBH=jvaX+t% zRaJTMkjnrP8zDHWZDoO8tXDS78)DV$npra~qc8JO;OpAu=sHlKHt!yF>X~f?auS_~ zmcp)3Rphf_{PI70>*n)Su@_c2%enAm*OTe>sMT~kV%Q+b_-_e20)HPh`YyCvAxs1; zU|#iCxeZNQf_2{IMC?w?n%9w}^pVWR$um(SI@0^gBJSPD&0OS>sr_VWCxQ^LN68#O^9|J@s-r z2H6p_khY+JdN$-M=jPI9GUTa@Tr22#2ke*)H;Q|pd}5xjpxp0Aa@}~tvYs>cwXZK* z3C5v(q}#u@Si0Cm-6D%|>?O--b-O&-(h=P*$uA-piNbz1$CVMcjkLxo55uE~e?}zYe zLD{eMNJWn<*7q^m;`!=S*#uTJcg=|Xu~gf0`G0H(5LpTiyQ zQG*5C0!E!|m@N5t41ol>h}R9nl;&lLFQK2%&1>xB2&=-is)K5t__Tuk`+-)b)-Ifn z;)D;nadIqUXA#ItYd~I_vEAwx+!~i-QQs-uEyBh%X|#%c-{{|yy#M;RG*0(w;SrXZ ziO2bRo`yz zrq^+)ndlV}>FTt4*;NpE!_7wY$Bf~8t@O-iXRlV?;=33dmqs><#8Pl*@-qa=Do%A1k796xwL7Z@5s_jVR?$N3~ z=PyOy7l`UZuBPVpEIfERIc6b^?Z?&i+_?V<(Y?A2S8*wT)}7peoeq2bH60(Fk8&6z zhtfsVtq($UT&l0tzn)ciLgv{wxz&9KR+NEa%AuB8;LBBe5w48(@bJ1->EJx;$-E(# z+VS^wjX0OZilcn4VXSZ1D&p9xTC;CB4so4=sp+wsaq%>>o7Zl)ZE1W-x!*stXw>#?QnZ5Ijnn1X&pxp{FjWp^PDi|*7**j78`r9BE-3J>U%|1uxwPUV$Y zN|iHbVNOX`>dieV9*az@0NsJybd){AJ|Y;$n$pTt%DDG*#`5I&RMHO22U0xPgR~%O72LzUD#f(z1Wjp0V0sC1Kfn z)ksX)tODootxdAkr&}a+UkkUndaJ{iR`jDs2yE_~`dRlfVV^73K>V4le8XT*tU=k0#&XxR8FdqZQl9 zlJu!jA>{4|i-poq-SY_sPqO=r1x31X7s4zn`WFqRs^^^Lu;$@ZRTbhDJ%Ak!(yOP1 z#~c)*M>KY(vf0!wH6Ea1v=(p0VYBXiTcpWQF4nMkc);@8QoEbc$8XsJHq9Ok;nyWO zOn&q$B(y!@ba;YTlmA_VZuH;zqc)}RQ z8#63T;}*$y=qZfj-5UKGhpb0fQ#mfLb)6IT<7v@Ivg~>m-ca1!2Uk*X(P=bXj?w0y z_SNP%g@8FpF>WawipNr(`40)2ELZ|lfB7%Eq zawW&8TXSqq#G*$;%x?7M;sDpP*TzgVI+@DJ6OEtrZDhi02wPaJI}k-dQT#hStvqO?;Szx%)cTPm8}Lvu7tf%51L*kF0IoRFK7z-|!t7C~O z%5_a9+6fqoESAXD94VHA;;cxy=zP^j-a~r~#(R#7&vn0?YIjxug}LHJokBg#%V?8{ zpho$s7t*|PFb>4Q0aH<>&`uf~7gSsz5y~RVmxJ=1o=>S6 z6}2)tfJ};%PQet0Ne`!D&NSw$f-J(mF6$PyW{JT(SkTeh)VaxQYH9f><zP@n+C&4X?_jp(V4WgRt&hS;HG;K0(RMyaamtRqLZ zFMZi(Gaqv5asI-S+=(YSjRSWd!j(oGI&i#Qr+`lraMn4e8^TQCgv&_16?hJJt>3Cx z+b;TIbjoqYVOFZzZUKYfG?PadZd4SL_MYEMwi_b_`5Vx#y51Hf0FZn)>IM+)YOdd+ zG4ovVs2#ic!9+fB#pEjuG;58*g$X;F87buZ?~OLs-SSsn3$)Le$YJKDk7N7cyP`K= zG`ZGV74QUoXSoVfXg{9+$yz8yaqJti&XsoO+Tz;Tj8MgHvE?abZ@IsC{E^xOXKiKC z8!Qw{F6G1OnET9>t>)4uo$3a?Cs8q_pNz(v7*BH)Wu?HCjPXf;+&R#a>&w}s%w>cp z<%wnUtg|d>W1}PUOq~Nc#Vm$s{@7||`cWboZX%jyy}1j2={Dc<@)+R) zvHry!8Wxu^w;DIgDJ;Sjtx)4y&&=lcS2Auk^{mK<_z_pNrktQP$@xyBX3?9WLFroZ zsgl#JH*Q6=8&;XpE1%Q%?HVwr1_$FMsZSO|toeGTMf0~7%a|~c z)HvZ2m&2Zghgv)ij%oClc|W+r-Q4v@vgmw+T!x#n`b@1fPMA?RY+uwDnwwn<57WA8 zk)PQNqLY(bZoIb)v-c@xtdp=TY%?f4Zldk5!RUSyA6~Li+F+kx;As=IEvFKG-$XX? z#>&yrFuG0B@MX5#hv97{H_cT#aP1uOIE>^{&C8OR`4&kev>ee56Jo^PwT*Xq> z>JrM6t}g6t9^N{4kw02-y4=DmozfumDY8xtd8w+AlDruaK7tyO z@S*Br2Pe^ z?@gl%Ss~W<+iG(FYe@fS@ECuRb+eLT|K9|_6a8{-7O&L78M!M z7yz#~!O-}dJ$}z4RF`e17AC!B|HWXjj3aq1Z7yG-d}=v~Rlp9Tc{k7w>9s^e*nXj5sN^;cE|H@1E=ZEp!y}k)0JbThpJ}EUtM^Ss_zywRz^e zS6|?cWo|&8cP)!dDeHPqzY^B+5{nkxKn`zxZ^ z9Kthh%!Z|D*@x*gpqF{`_?3#zYKviqJVgF#pp+3m+G|c0@yUll57}|I zA?X7S(u?ML2U-sm%OqDpMIO@~=$~os`v!A@j7XKBy7cULxgDEFw#OJoVUk@GB6g)=zEF#dI>?D5x z`ubnSb9aUw@7jN&LOCx=(Msrf)0=F#l2L46lX-NWbES4hje5+j%L!{4=Tay?Ip|l$ zooLT)*Yv$W346`S>;Hb%YRwj?k9vWHsz8)V49de`7oE3b$UaKr$<-^YE5(Q0#2*)Z zf1+ujh(5S@U(3p)rd5agx={2A+9+Q*`DdtZ?Zz#YVlO-CQ1Z{$Ai58VjTYP+A5b)Y z5Y#aDoRU1YNb!B&RBjr_?%=SN#deodeTk=pICEmNy(iM0#&hNs|r{!?Tj-4J@kB|0)Quqc$KT`y>1Ac3k` z6!V)~_;=Ot(=otp@GUcAhIAmVBuW$1QjIkh``Eg59r~VU?Qr(#Y-*6TPdF*PkeZm< zFauJdptUX1h=+?q2RqMO&4mMhMHi<#qcU>zjhNKfx4EN;y`0@rY^TKbtjxILlQnt1 zJ5}C8ZsSs;p{IVXysKjIe!j2#lGR<__qJ#OjG@`6(9cX4$0!6+O&8OZ**84 z-+}(&?$$3315kt8xIqQa03ryv@)mkWB8n0`A61`KInIH2d*sgf7 zcEFfqdEII7ugA8%viQd{?%w^u+Oko7Jlh$rwi$*GpE~!VZ79<@T_JwD4quV!N_vN! zko4$l=-korBmX4hOHIdkDNkXep@9$Q`WuimNkU=u4rym@p_5hrdZea%J7J65qpK{> zuD}rV3g}adJZ!t=s}`$o#n;$KtFjgFt3Bi{&iam(Upr`57$*z1i9h23dR70uogZz?4?EJ7ODYz=u*(<_^Q}1JZK`hgB0jw`KzqO^ zI;P0~G3yb7&z`rJz6k5vPBg^VI&1cwRnVaGpYyib-`A~O5%pESQZ`i^5h*)3L4QNc zf!n+xYPDC_l?@+sZDvRJN*a!<4oT`FMTEV+bBehxujX>w3S!3v?$jmE>|oSXfq8<} zru3-OO_LocV`k;GjA!n=BNnzPUFf@%WY29rOUImyY_-KWN4nAXS1Nw2%>E&f@!aO_ zqfwKylj1yx>&#QlFTpxBPTjOfr*UrC^y5cN`hArp^I&93uzszMfUxmO{M5p(!1Q;9 zIb92lSgW|Jk8lyjv*)`1BWG3;0;w?~qv?b^#HBt1U3}l}epw+ss(3hR>}pr~?n2cI zj3aV=G(|u3x`Gq=ZNHnFl)Jk+T^0JFa$MhIn+3NDT{|+AzTaOwSr{SCPN5P5m!f@E z>S^?uZD^b49D+0P0-p`E5cgXu7qtqmMP(HW2_1#H?g8K*s&9t5l|-JEF;dWrTA^9| zTyGbO=~F}Io=KE=vZEso>u2Rw{ODHf@gYt>=e8HwyGc>`#hVnKXo&=Gr~$@f2=Gp6@@w=1B9rg46_IFc@R zWKE>+0oS3(H&r;Z!m}*E>b}O>R2gMAL!`IiNb&l_Z}))2XH?xV1KNDI8hjE+MW-%d zVj||SZq*}f;a)}RC2o9SX^>wZ%bQl(XH(HYHTPIIDHEPlG%kS{)9?E)i~TzY|GX<( zAPVh8P5TyqS5JzyHRKq-qjh=trNCD<>_PWK$cIlrWKKYl629j+BD3ucfvR2sAWff% zL0iZErdz+j-NpCk)vw58UuVmDcsfr(zDP%eZR_Lz3}uD@2#H^v`5}86N*@4v^zZL^ zK^5npU;g{YTU#Itd0m-)C>omJi$rgQnk1pU?g_8}uwbA;`Lqndh#>f;$J;4`NrHiY zr~hY&BM{IM46}oFr&b99&k;O1pP*ish}=7#gLgYMX=0$+I47Q#(=DGk{-eyhE}{v1 zx%UQd;w9+k3V85tzO*DC%Bb}pZbay<764+-tVS?q2i!{Y@qU6$bOIFvM=X88waP5f zw4G3HP2hXEv+^dKgkrc6gI|p01Ra3iURSLag;0*l#`n2?u3Dx}fFdCj1pd=!cc{$s zAwzHtd^h9LxBLHOFF?alZ$RxzNVW$0$tgI#K?!1+y<`P~Aw;Kt8c8z#t2;gmhoGf+ z6}%}`@P?zH{tANd|7q{L;-W~lhZR9VR8W#+)I}5(L`f0{U3F1`ktkU~vVdfXMXGDS`GYm+M3K9io$$92qefM%#yItVvd-;|pe%(D)r%tL1*66KqW!r82`-_cozZ-=ookt3Gbjs zgwlae?0V(CnUxhnCUmYHqU8%Z9FR%>6k!uoqRj?;ei^LB+Ct190U}%%GxDKLAYGsPIRU;0?ZVLS4_ zDjs1k|Nmmq6VtaTJP}X{+`}!E&2MYG8N=iVXssex@fvR1Fq-2~MLVejxFtlY1Gstn ztA~0VD2J6InG3E22O#tkLM+i&sbZv^{0aI}=UcnV*bAK=rRz&;G%awRzJ|qBn_D2J zi#SLW0!?gclpm66{DVZ~{Xcr&{pGGl{)W~FcJ2@{^PJCcPl?sca07p#(|DKH;ko`R zz((x;Ba#tzh&ahjEhxt*x>S@Y;x^M3aneq;y1B%CiMOoq*Kh*&3$=-|Fyli=6A=DH zJ+i#Ai^Ny062WX-GeF*!TtNBFvZIm2XBwNVTPJFqcPUD_q@RU0CA{W5OgitP(x_Ot zX_p2&dHXsWpI#;F9!$WtxX2m z1)ZeS0(AMz1@{U3xV?bie_~E*16hi@W@aUf-<(7*@fNs!y=2^p_zt#HgI|tod|npm zKe$?>_DS5Tequa9H5i3Jkd)g&q zieJ=oW4uLDmy(^Y__LpubDJ6F$Qn4S5L!w{t+BL|1Kwka$U()z23BKZcqDvrYY_9Y$0 z`qEQ-E{`)zI!(llqMBz!#I!bE(KS9p{-mM0)0K4vn9yRdmZ?#8czbf9&VSZ&X0&Mk z^t*+K9J8Q^XSzcz_S5jDRR|dd4v18`m6L#^AWy5o^FexpdoE9!c%Z$^H4v`jyR>HY zuW8#9C0rksg5j>!!>S|S&e-#3NIQ*Qv;JmM3L_$dqk(T=ERX5k#lS#9L9g=6Q>!pv z*1fbT!vm+`ogs0d)PjPHqRwM&`$a6TT#4msFeB8Gd9!pZN@O=~^JgwVb?$*D6SuVU zL)WF5SHtW8V>46ia90fR5)}&z?WGHGUSy36{ESVP;`Rq^+<2 zN}!YYWf(^8qO8HWGbdRRQH~9{JoA3=skH}oR}h?qi1)yo6Ax3Z;G@Go1U!8i@{)wS z@7S%fHykc-RBVNL=p)PytkIIaYcwvL!n;VA5zW6 zkiUUFK{Z1@i1EfKgbxBpf(Pw}3<4T51J|B9*3a}kY-CVg;pcubByG1~M?j3VsBDg` zAN(aT7eZ8v+x~Sj(bj&0QvmqiZPfU1?ZKLAB>t0g3~nDV@)3I=FV*tSC|(3%Y=BG_ zTI+4XILn55$BP$%on5Aka4C3bjo zxV1^X<2M}CNSO8=yfHHh2eq?Hx%E~l962%Ui8(L8>bNmC{vPZFACVa>CLyT+zAJt= z|JwSAwP296;w?NXYfsjIH9rpq(X5;|hc6R88^DMfz{pRu^Ig;c!L;$8l#*1Iw zXuU*dn)K4ibg3Nz`_-ibQ0Q?X0%Ge)Q2I=w{fwC{8vgT%EV@I@-Xfwg`n* zVz>zVWDC|3Y9gD^EZ*wNys+Z;OvJQ~A#?a3z2?`2-5YE+yZ4&^#&@JQ=sJ;^4#bcP zRKV>_6mAKqg4+DS7iG(GLM4495!b1&!%fM?Tpr~;4e^(UPRTtp)eP_i7T%B1`3V)H9KW?#rzGx{obS6c)Xnf_y1S^JkuBC?RNXpyeO5%d zGlHTWN90MCySLL(56ExrL6ERn0Bm{HVkFFzw#d!*ug?bgohU?eIkhQx_uG@e-H@*1 z(%d{rn!@Qqna7SjtKsezW{t-5BySH+LFwBs=Cm)S<+e%YcHMfB+#$Jse^u-pA2Aw* z_98d4LfFbEc7bCTH4AOC7I>ds+&rr)949qwhoW82&P1CGCKJN@e@CIuFzaSONnDM? zUJEyFU5OMu3eHhIZue(5AXN5i)EO#;#RHm`PXZPy>-z^hB#4y_Wd6*)JY!zb9yIP>t{*{6G(I-57G3F$Ck~&H$lb ztK%OS_Vpm-Fp=l-((`AZKIb^rCPMaDva@TuDqtd8FW&jet|fVub0$PZo^r6~j`8i{ z`L`D*+u6<;4L&vXFBptIB)(A9ky*Ynt=tU7z;82jJz>DLVCifdPKYti)6ew-u9z#$ zTAl(A76%U< zmGLr7<2wa37uxMJHPb1=WlK_Ir{(VU6J>gop-kevX*L^7f0|2QvRQ0>VBRvGwIOTh zxVKf6bYAal?|u<`b(^}ZnhXhw#$5*wx&+JY}2WS_$Pq-hEt4|{>^LlW-d!XXl(&u-AtHkVE=xp&)$}yAl5!@Z}w^unj z$8#!;a%5zU>KNoJUlfROtW4|>F{(@&Zj5&j@72)Mk<-+9W*cKQ18NXe?%?%;1f9Lp zro`2sV^(9A+baIfDn8HQo5=COm?9O^*KdVee3fIQnwM?~AVlN`6^7n}4Wp$VsA)F1 z56S>6vdkfLc@mVsdFs`o?)~0?tokz1Zx+p=7}n+S)gs9u;qa;`+p;Gy(vxlP><@$& zeDiDsET%_W+SGE}4=?VUme-bF9dAK%&%n(Utp~)*+ns#7+#u7V*JNkSrw(=r8xK9t zZoD=+AwBo#O@|7R)#ti-Hcn#6(;lOgiZTO@+k(~+6&K1D79;H%;arSWL;^DG7LNR&pvm~kFW7aBnUZiuXj934lGH&37i>3bZUuME@v--m&s9Ud!2vBpVQP!U z-8;t1%wD}-dE@QQ`NpBDS)wwlp5ax4sD|KZbSm@omzp?Msw4D5Ck?q=nx2VuD1GD8 z(2yFao9^#dkxOlGBrgtr@HV+%x;57E08QYOhNI3w#*nj$0x@1T>4L;RDIP&h_R@|H~J~fqEt{`_hhDxs1=|Rhq>yd>9m4Dk5b~EX_PU?N)d4TyB|3y6@GU z=i;qFnnr!uehz`biYtqD3H5|xhkBNNfh!MH4|+As`GA-!`Qo;BB8s|H@^wx+iyLyAgSuD|%K zM$Fbk9!^Mo*vjGOcksF%v?&~zd!-*a@8wS7_$Zurh4qr6z>d->ot0UTSOX#u^$NBr z91U?KpVzwiEUJm}=Cbf!_Z1tTR~*Vx%2vzsoVEdGvF=B?FIZzE64LcYGbFD#>Is== zT^G8oRtR#RmZY@WlPHSYjOrqI-*k$vHZNt)hD9;U@g`3-&=l;v!s|7o=;eA-Q_o#XJu3Crj6;&F$(9-J34bs@62#;FNxbTT(|J{ ziL&Xc;AeJSA25VHTDm6Q$7lX13&WIA-d^m#&mjMZ1(U1ys&J})=Zydm?3__DsVVez zDsLstuDrC!L?O1~(e?@drK!|AV~@=GJ|xD~pFM1qQ823Rk}#@}?2GQW^iE1mOz2Dl z={*zujpyAi?LuCqbEEtx4*pNoO~=t3hwne0bkrj^}(eYWH$z5pp7Sp@_RBdRZCd z=hVf+_}L6a>7SVFI4|7mB`rm6qBOmlQjzj(JFr~Ucv;B6{3;i1$L&=oqr~xCA-#{J zE~k1*Um&F`oZBX=*)+4gn)9o$>-r=pcVsgEaF>|Cna<)lI4avcsG1I{p@d#mmH%Pu z07S#qLT--1NEV;-mr{$FwOq7INv9@#w#`M3S{%CQ$$oK8{)BX#;I0^n&y~X+IUm)> zEv2t=JX{?8X4}_AFLX?_+m_U8vh{hzqf?|^Uh}Jx-?}cpF_7rE-re>kugr$XB)9DG zTlDSGcI{3Ywg}-s=~1E%=`xE4*>NoSamwEKv@R^Jue^n>W<_K$&Nf!3=5YneBIZ-> zYOZc|hWN_)+}`M%%iN+8jE;ZaSj`$mC08__G2`MrT`!|1p57QfWUzmKxS<$-e$L?N zv6`MDlDfGnNZkCEO%~D3(57#ll8(cOhz81=Tr#&#Yu0+CexerPHu%v(YGFNMhDxfB z&Z+l|1S^C56P^p9VWVk%v&>v@K_oyPe6i z08D|wtvo!dQ&0FHWLw;9y*#8YLwOP;eQ*#IRMc5cPCZN9TNABH%Q-7Q6|6&25~vA^ z13IllvM5%Ne|)isd#80&p>y*6L14xX@ykkEdoIT^B^wOeimG~99yqO4siD9s9k?geB9o@V-H7k2?M+MbM1F~ zX)Rd|vut@5mTI(lj|ml_vX&bWE(V+qI6p;ZHqLj=qr04IWVIQR8}XXDw`4SIU3xq* z9t#Zu?TgG2if^AbjtAuRBwuY8z{q;v57RNqyk-@kVKl%J9;8l}aOc>bO6E9~ae~Z1 zgidM+b6!*n`K98MzUI~*|BJjBsUD6M8&?11Z?VB^Ur>}=`@#{tsl8*r9KD07>!Z0zAu<&-qe(H*;7J*ab{%5u<}u2?33Mgz_@vz zBG4?}vr^!3Bn515eH9MM_&9l-RMH3x2Q`^uq+AfJvOKRX2vl}Uh_Z_Uik4=!~t373OM7jXJbY&mXLLM-~HNk zvTHxsR+~G#-Ur{X`)KWAvNgJc<9PPxl?D>d)3}=5omr?AIQVxDMjOvbF6O^`;V?w- zo(pJydh*8Em4Uuv{rJ4zhOA;YB^IBlbe=fJ@TPwV$rZ`GH&_J zr{s<+JD)b?$dbQi*^TecGYtm_>lm8%X`OA8suyVeq#~74J)7`Ke-w8Hi<|GEoCG@a z`7KbjqD*-#ySqiKTHP%;B|rv=veatVg{g=GPINk_;*CB9NW7o3 zaxYj-r&MDmJo$>6nowxDh0}lSFv`h}Pe3t-*W{-fJ0-Y17vAQ`dZjq%7dby_cdr+3 zUUYmeVin#2*iO{wYm($>{wFnw%$Yy@YHs+9g^#z+odRBlw)yfyZ!XKa6ZQ>7+j%^D zxU&fBette}suU~xGT7Por6#s^ zqR0GxT#fIsnY66L#8}q@v3Eub#+F#4$ft69?4L+=h8f(EX4@r2={sh$vOw1!&up&v zHVmrl5V-n@*XWBk>%$npOVgLM8CIq|srOZ1JZycD*9(2T z@cr3#ugS}Hp^-pVx0lSBt_=KfEGs>MMMsMAysXN~wm3BB#BS=M}JSg}4}Fq?{s0$%D~Jw&SX0cslC%oywrl)us67 zPt9VF5;$)g#hl|l<#=aC-U8+9`MAsMYebhBe;GJC^CLYg-`l6e4l1qQJ6e7W&q}DV zQ)ns$S2_}62N{L--ik;S;5FDY=5po0ONSn9f$F-`cy%)sP-n^ig^J{%A_I<|{nF02 zUVeUGM8fRXwV6wOHKlBEQKH-4U1s4uQ~OA_bGuNBzWeO0GD$|qDZ7i6G7j~jF&G&( zxx%?6-JRV{EW<}dlT3yvdzRE*y3R%Bn5`_%^jlh7JxzQwA!Su*BTdO|agG=G6b&85 zoC}R>0__Gr)cl&_rCu1YbV>_5+;)`ZVPj4siU^JooUJ{#t(-fdBlJs5yl#q6NXoAG zG*L#!PVV_i*?HLz{Z5PJG~;)(Eg$AC8>))Mvh674@C?^4ydK>lYBt`u3KFdk?UCgR z(=%#tEUcbein`xlOfOtd7|-w4ocuV8G068Cy<1l4!|VA6H}7kbP3DyEN49hplAc%d z>|__cuvwzlaunY9NkEIR9xJUNx^3M%16(ML&MC&Go_napc;Mo>dYAHy=dIQr(*MKzL8CWdXw_wAd&L{!*?9S08M~E+)#u=h(r)Lb z$nuy_Htbtb{HXv?;j>F`P!^%&7ya65S5?Y8qX{{+vsXvDz){fuSbFJ!aZ_CjKJ&Ie z_uAFbnVGgW$^-$U>(+63@%o?kEyciYvAZC2P0XrZ+t)UT&A^RcXtmR+y+E`^ zKCVUHjWq|{PQM*M`iQ@Kg4JY(YD2j1rWy!WYrEAmlWH*gsso{Vz zLWy&yNQ;hfsKuN;<$lnGoqxWx9v9OJkj3Pk%cT(9c`NTa2odI{Tf+=(MqZt&=PW3% zqZcmW0Qc1AolCL{(V%b(2s@}&OpId#rr<9{E~T!6f&D=v;WTDD8B)yzG@2Egof^YZ zs8{=jtg3(#9 zu!}uRh$XiXg^uk1QWL!o*z<)%Q+%@)K|_0VA1`oWK66th8-X0-7!0{8y#LLyjCzSj z%(Xf;Bm6JigC?{G5)$J)MIP+ojMZ1cMmp?>-hUe3c1YTW&=J4q((V>YRYyabRqNPv zNXDGHA>WZ%yHzEM??oPr)cA$@iPM$hWj&&-5tyE?jw^xT20Y9Z_u` z>Q@2jOfUPLT69j#wK*+kOXJ5=yGjywFI)zpGObRzN?W5mt{tX%;Fb3&*C{t`yuv|v zm;c9%rQ~}m*48Z_XQLR3L$(8HQ7Euf!YpR$s9Db^F7`Nn;}!v75J@K(LnaiTJ%x7V z4x0?SiQsMXk4irZY4q!oq7%|glBw-fp$S2)ZLhq?o;j)#EftohItwLr_jzmvw zN9*jHPC^;}tZsZO&Am(Kxz=?>fMAjVa6@*P@krT)b@cq#NcrWJ^8CKhqX)tUmW7xw zlGih~&)=?YXRCH6VM21`XKqj`RRuJ^R&HLrG#)h4Il3YBm@FQwwi7HKuH#pVZP4|lg3 z3IvW}bez+Ug2ZKGj^2R06=}J}nQ4yt;dX~GNlA&8dY@eZsp%zWiZpfkj_CiEV4-y3 zt04VAo=taQm2>Bh?w>(o<_R*|Q_FYkn9p@;EUV70icLGQi>@c>=#T zc>d!6Y6e%P>Po5lSO*a1SAPEV2A3eB3b;~exN#hacKKN<;`Xh8^w$P<#=bzIX@p~+ ztt*Ep&E;CNZheGerjnIN@(K#JDjuf49M`wKPlq`K{8pPY4Tp8FlY_LND) zas#|ZB$Ssc*w%c!zukwAD4P6cI|z+%X!QL7R{%Lg9w^?SKP8e09`Eqoruf$@;so^R z>b@vG_@_8!fCMQEz3-Jae4_t)-?H_=r@2Mq7Z5%Ua|`e$jI{+G)c2j+Zf#5)4LEY^ zY|#iun5#RXJKSLJQ}F8lh{b?tf=pmkWj;UzAflku4~QL z{}e|D83`x{M2rw(3=}R0pjF46Mh1~dM05j#q?wUEz?TW14fx0og9r$*r-T6br&wR$ z$V^$_7e)RC{shMX07&!0^}KNzT8~ZwRITZ}b~nf36q(hV_NAHKfHa_;WBl5x6+> z)FDjs=JaNw;lAyBi9*)|avR0U$?CfB;XRhhTjdFE*X-J9BHN#IB80j55c(<>mwg+v1YwdwovQ8c$Rd|`+z<+k`Dqhu56Lw|4Et=!4Q8yw+mY<6*m(jpvlf7s~r9T}NC z3NNjiq{vr*LVua*ZFQBYKczyKGV(HW16vpXfQ~Dl7(qSxa8j;EY4q63=b<$B1n)WS zhZ&DJH7dpJ_ukx!@wsQ3Ng&;s)*`ok`*5c%`I*JW;rYV}<+n=xZB_h+=Y{)8MGPP0 zxsxKEqtFudCi-wv*U&$gq7&vQo$KPb++ltlSpLAq) z!kMd;_X3^z>d-!#d*oX;>EXXD*Tvr4rf~jH6}N3{f?q3|ct_^pw+~0$NeWnLjhs>5OJD)24s-O;66u>GqqB>7&p3`$7SFdC{ z)_2P98=vnG(KI)~Kh2N|+mk82Dq`Xs%;Wnl<6i%`H`|M`2MWE8s_kCW7 z!cm$DP#VA;P=S~f3D`I^9mU`2H`prGL8TD&lH@~h@Q@==(~g0ZglvHjJYqU|sFv^D zFJ(Xb5gd6#ATC-eBd-}Y2-X>lkz*WKh!8aR0MxX<060RvwlTv?r!+x19@ATnuj@Mf ziywyH0F;I&X21i%KBIxKoEsS11XcKMX9Mr~oI?hY$1R%ocVXFq%i3IG}w8EYo3+@5lW5*TzZB9 z2{-bIB_K;mKu-m1HWXBRhK@mH1or$VP+*$?-c;joOE4zDN&(5MAZQ~8t8>}*L3OQMJMQ)r>NGl2@aA;4X;TcQ84**p; z98~!?UI{J~;4O_SH31F=6WA+a_P2e3A?c?h_5da5)>~~08)GXK39O|=pnqs%qHLuS z0E0-K$)te|f@KBlm2*2uXA||(UV_ajr1oVKd|MY)1b9;Xgx-vg%oyN_nAd*9OgQ9ddLrcfd4Fmth z-uvj5bI$g6{I2Wcx|n$<-uGSWSx?^Ue&+2HX;DmcB6J7@f+_a+ksJhqAqat>R$saR z-eHl6heIGJszyRWPsD_T$e&nSJU24chd^!z*#%ZfJhZyuMJ91wJdM2Z(*unU`Il_W z?%ugh{pAJ>Vb6xy3e~{8Or$nKlq5i5Y+_>cCJO#4ErEi_1dBSYG#2J&*yS0qJ2?|m zH!0{XA)oQ|V!w|*)z!!yCMHIg*Z|J?577^JqqO7_9eHmtx;nY^S>&oh*`6b~cQqG1 z#o=zD87t3?lWg1%hckFW7#F@-d`QUlWgWcrYAP&0-%-@DHZbYcE<-!pe&@HaTk-79 z!EbXdrAlQwOb910>YRv6#Frb77Uvqx*e*JOgpzc9$oM(!Kj z8hn4b!1Ec#OE&B2J1t&;)bCJLCvOYe)~{n+e2;^crG0WdDWg>7m5z@xE`yi#d7W>o zSWjrUQvelTM*LpkY6pCAr+ZN^p^1-nVvwV4?mnmYB(nd$wv6N^62iSYk$H^LcTu-W zri6zN$oieWir8~0DF_`nz63dsLIgnrM=0Q*ABFh)u?Wg-$hkk>M}|EK5t`Ft+e3vv;>x(5Co6Hx#4Z4AMLbN@O@!ciGgQ%U2A=Pa~neo z+p9>ydGN+%%g3rV5C|U4=|75?9Q7Kw{(zB!imi&2B)6`G8Iz8l#WQ^-M>EUQ>p*xN zxxt~CzO4?qqnW9>4Ywm7pka|dnEGL>EIO~rJ=2@B{ws(gM$N;!#ySoYXfE$E-o(SyR6Kttc>6rj5bc@ zwmOcC<~CG+UgTfbd8BWnYi(p{Yh+=&5RefY+24n{A!OwA*mG_VD|Jx@&?)bMeReqew z%E@{6@2CFlqqC$jf{>^}mVYPdWebE)X<7IxqA0 zMdL@WPKFFM{( ztZ7(x_vm~m%H91jgM1$Lq1#3Nk|J2lAgpee)hY@3Czq;rDIZ@~P*C_t^=j;LqHz9d z%qLQNdkzYUAw7=6(K)Bldj{<>T$@}4V=nQ#5hvSuhGdg3A*h$gJ^t5+(lS9q!?Zmd z5Bp8cXHLIy0rIDp_Kr3h1Qa~jISv2!`;&WkRG@zeSQSDubQmS+fBnCX|MZT}Jv%#} zpmsjL=8q!?K{@|FKGbTWG2mgK{C~JT3b;4+@7=o%&9(4G;n%i-#*P1R*ndq_(*ts! z8TEHo-tm=322v6Nrz(CYO!+_S4UjvE;n@Ey?9)-N-A17kbm_IvQ~6()3Y=Z3?g1%u zSQU^7_}?|fL-aC^$4(mJS>A8xxnqvU*JoEzJI5+cc)5N<-ZyClA@HeUUo@)!UDgv- zsOJ-^99EsIe?wxt(m-MjW`r0bzhN6LXqNwA{e@9|5Kt%$ES@C>-W2qd_RT%In zAc$C(4*B1am=%y1pLvVQ-QQTMF-Ac&!__hOxSPMB-vL(>PzxJOaWRDdcX2~dXuzGv z&i%$JSQ~40;vs5+-IcYN107Dlgw}NGy)(X`Twuly>_(x!)Rmms}?v z!S8uM860v5;&R0oqN~5*`~~sJA#FbYyG4RCZc+h*)-8Vb`u|_&dFeFR0mHbe{+05# zW(<7bEZ=X43W5@V15{ho^t#WZ-&1W!)b8(`c%E0J_F3MWfE{d~hRpZBC2o%abl~~n zS#zI$Lu6}`r}1jGI?wnwRJ&3Rcwc369&EqgaDsD}|8#;*hxPA%XW-(%C1{l)c<=v? zNz(&Y)G^AV+aAY~xa#a`}Lg29C81LV3z_kTv zyi5=`+W9;Kp91G!E%zFMXK2%P=TNC^El{2HY5(B1t31z;tFo_rA=kfi!T0Me6Q05J1^jOad{sV&`guD5b z<0t zR7-auUy;?OpF~%sDfnx$#j1Hdi(e_d<@O?*QRn6=4i+O_7P^a4^R`~()X-tz^Byu1(rWZtmW;2w&kND}^jWyR z2ajQ|oZ)Dee(L>&?-TNvyYvJFZnN_)>{pRe@Ct_GGl+9-!eqYnOw?mB(qpF_JP&`` zHud75cz1qNjl(gQ)n;F#>!*_}Tpg6c2swVLq197UzO}l`U}_w5DJk*c=)LEy?Cs^; zU!3Mswe^;YW9yODHNg^#{p%e5MqgrTUt>gk6fcUZ$5a%a)rP`#Nkm1bj*%DTvLCWt z#;UfE94HV~-Y?Z+oEnrT)^6KZOOcG!VHodVPG24_80ECLqe^kF=x~XfINVLvOK-k* zZDWvtJHg#zJx8{UGsW|}R!z2@m|HfAA8Rw>c$<7 z+szwscph==y8f*(`wW(v34&17qtVLSJa->VqdlX9@R@#5xqM0GIRlfB*Oh#yDe?97 zb(RC(qN_J-W$2W$&0kgU6k1TV2^f*+227cw7;aCDGpJDOHb}8vado?HoVaEdd^a(t zOZ41#bE&ODdnhFI8dB)8dKLCd$DwlL4XB)PS6X6uluO@@GseIaJ)lH8SFo_ckr%O= z4%N2jK8l6Ba?yMwbIrp)?Z(tHng*!{^oaA(7_(A)Hl-zV7Ui1vj>P()E-u!-P6xCp zo;g6TF_2#*zK--x*ep19qGQO(8P?5j!aBUio;b>izEh5J1I+?4oPk8w7Y ze6xgVMFBzfs|)L8D>ZRZ#;cc@w|w=9@J(c{3T1Dto!;N{v_5DRu-=@Nx}&nj)`S!v zq*!V^pOB+j!E~_@VxQ7Vm^`tRBmUvhTj~!K&4;^WjYGf-aG9B5-{cL=RJ|v$W6CUX zu(jZ8fSzMD*RFZ_N+r2Ocvi3?te-&0X1bB0&TFeDpulL8MkcP6)4*(`+D-JB-(HSM zvz%Him^wV7;CT=#+J@1m4aa_ppku5nmAB{4oh#yEHrbVA8q#W~53undEImU-*m)i{wowaOAt){%7HLgyZuL!-Ar&f&3`(;*ma~^+q zb$Od@b;w1KRlk+|>$@rgzASf`3ki??!{W;12zYDCB$9{!^$6BAaT8blqKliS@7$aI{MrX=D$HieYx|=gdumQj zPTfAea<=$t^~;#-xiF2K#})Qj$+qd=um;loSF6?O?isXQ#f27~=(UH6)%%k&gpMrLn+&AtP_b1t}BS`U8V$e1ufq5bCNyoE4 zus_L_!DCc=MwI$ugRjCN=!5Wy!D7kH%0`QZV~(M0#N2^P-m@9wrNVrjQS_!@nh-0~ z;aqG-`XoPMrFo&{jxZ)oIk;=T9Jl?-%Gyd8qq_J7>_wCFZ_HM&hK*-Oi6Wn0#3rRN zzIixq;dO=Z%lL`Vex)78RCtE5Lpp0%A8_SC*78rs8%xOo%7NXN3c=0^1ZkX*h zgCN3iY+ilmJhIYBF?oWyP|!q$43~k=Whc`L&JM{!Z9Fa_djGJrUNG7VU9i22P6z*v zMq|prh_5L`4ehnbfDyGZ=A_%=Kn^`$`D>(W@qlzRzdAO>@D7&=KI4IZYv+s7V%&f} zXXAeJ+Z@^BmiBMEIG%6ay_2JeS&ZC52&iBrnCBv_;VZp)vG+~jwVVcISW37J?#KJN zR%7gts;4?0zJxrVIOj4G>tXL^`f&;hAhvfHYpdK2ciWi;U>X*qm1?lyqoa3UjbEHp z$;&-_c$3)14W3aZ^mO!?ui%>y0r+2%;0Yc%2?&TC9#&z9S z;d#$z+1ZtA=)(1|XD@LZKaZ%&Q^E;YJoVHWsTPB|L&xmWCsp00 zvTh6THbUbTHOXR)O z))@W=ta^``=}Lzed+by0eyBMSWlhkQadUOt^uKve77to6_+FXKxOeZd8oLFo5Seq_k(GCT0UM*+M1ebkTFhtYEx@B3fJGT?q{fXJQOiZ z6He)P&sb0$WfDX8guKSJWNpE!(vjc!d@U>3ufb6ChKa522RuS>Jlgv zy3r8tE>N}d3m0J8g1+<`iz>OX090Hlv;N1=rdSImxmiN+|-p1T3zB z3fX$uJDE&!18{!ru}UYsbfv0j?C;rthruNPVfeZ|3;W?k{__#eY3&>DMaryM&JdQt zi%FwaqBHq|>%)u2{*L2w7iS7OcvP^371u{g3@V@`T99(p&5pt~ghjm_m-TdDA3Z){ zLq`6(3t1?OzhWIbM02~2J0+uGab%FCZu@C55e(IT_rt*E{j8k*te-`h8`& z{5{WGgCg%45T`0aoYx&TeRcbCvA^QokyDxNh&A^ubDQ%IWl(J5RPuW+MQlW|z%1!j ze38d~IapdV&PyT-NhNwE{GFPxE*TkF7LiRZ3GbHA$4)wUie%VBE%E67OD{8A(p}U9 zc5qX}bn~vwNIjS=f<-(oHf3%>3_DCO_L*2C>oLomHp5-lpt54I++qA-$#9ta^dlCK2y)Rtt}$#`q4iyya4* zr51XYB&_f}vOg$R-Q>6RU@0E=(8+f$D$C!UjNg6BmT7*a(1bySfLym;`tJ5kP#4;3 z^2)~}@2SDm)GwxY9`OiEMEYhvn4CXGq`g~$DKT{KwmF}yRZ|gr6k}ry*C-3Wt4yq# zySJq-vRwj0MGlv&-Ve`tv5Qf&-wcEVwy`pU&egSilpn;UzE@HK2+>B(H z<1+@E1EOEO*nCt+#)z^Y((^Wo;qEAzlGlI9BEJWkJOE`J7(tvt zUE00fqLni0xLV~P)qv+CjAck+INTv~(P8Pq;2LV@Dn307&1IE1qAy2V+1YkUj|3)S zcXD98v#grb!45%WUMnDauL+AfT7>P-WO4XBCd^W^gcqj!EyWKwYC#S@z4VsbLUyMZ zffP}V->k2-S2_E$w>1K8m$Zr~84n&RNFiw0!8F*+V9B6ch2`J|auj+P<~>_&iMFUt zy!at&fTu$GwO9zvW&u`Ljr+ku?wyZ3M&AhTsD3-A>x+Jsgli-9$ZqR>48NOFd#nJn z`>~S(jFm*sSJn?N{(jI7LSW!XgX1gxc%*qy0^8Ou>#=KFu*_ST4&>f|6TVU#gj(ZXai^MJgzf273+M?>aS0 zM)Da{cV)$3FT3M47RBYdizvD|e=fb+-*ez#!gyqHc&z@iqzgIhv^!d&-|s7y;^OUq z6A39qS3XJOt1)wQn@G5t{}9$`h8$ecRB*3Q%;@Xh+5KQ=EE`s_In$y`0;>n*)r{AU zxr%_@Qg3(0BZs1!i=W)K8wf#Z&T?Q%EP>}fbvJeU=r7QtU#N%7j3D;!3ZVor-(ho1 zj9=EzgLt5Ro(D!P2I|hwACKninuBl4QX*Yd9_Sl{S=YsM&VKQ-qof`bEPNaf%)9qrWnIY_NHd5DFicYJU{2N=jXGGvXDD_nHj4m$>L#wZ>QRD6a7N$F%57Nuy5{-IU4j?8YqTSUGunk&psc|1KD1h zgg&t{Qa#35%)WfClds$%=zwgXIIh2D&K;TM8^6Xdva%HY1j=115j~#QT)6Q0F4pG* z#NMGh^|^!XD^qk0E1*g*&}(8K?q}qXVl`MnjlAy^)n$MwDB56AGVhW+1M;K#k*h|b z45}KpqzLqhjB5h=LvRb57m`G=@@{gwy0guhM6%8pv6<;xl5 zvl+<&Zj8DYPoT*+T29j&!$deMbH%q2`I&EgdGBm`LbW6Iz8UDI+L|2sDD!`LT|Xlq{1d?xNg`bm?*U7Fi1T7$j$XgAjo+}kP>V=| zJLVz8Hq{?dNH>5fS+_h+X!5>av4*s#t&Yo55yH(4t=Pf+Sm$(QDzsp6SlfP;O1;>W zqh5s=cv*_gIerXI^~0?3oxZ8Q8nT^b=*~rqek<1>=yGX11h~uL>q@VFC029lQ+N5q z3AjtO+R});dkfuF)G%c+*%Zu*eZ>5mdh>eycoTv)jcf7nK8)+r-`3_*rhqL~=-di1jM^2Z3KUnS>) z5Ft?((6A1N1Q^RtpTDrP1 z8GA=BmCy!?#fy;zBB1oPM~E!+SOi*O_q`XeNCDVy;L{s3fS9H@TioGwSB_iZmI zg?6aOCFkg9Q%5YhDrZq3r%Fw5W2Pl3K(^-X;xSo^z)8%#?Dd|9C!ap;`b{a^k#AN) z1fcX#!gx5`OX5mPjqiecfHM=Urz#6nWB{p+t+5kKdb0RDLfV^ z6UEm5vJGU7tctQqb6F_!An|+L)E%Y}v7WA06uh;voqThG?`UbYdpV@Po~w@_DXYx2 zYz@{5EqEH_OKOn4Hk>4iFBZaGq>%YUDc+*{;{vO}7)MH($$@f2iWKpD;w|+uJRCoZzN2z zI*oxinDqJ19J>Iv2qTr@J3RuZ(53f@3tYB`@FiOgAt@ zq~oUM%#?FcOpH^1a$Ft1Z)Q8U3tr!NMjvf=aa+&Y#>| ze%NORWPSuo*uiLyc7-IXezW0LdQn7AM(HqAj-V1f&W&StgEh~= zlrOw-#u^TQL3xUIE&H*Ur%A@RmNX_o=zX7dWS_M=-vz5N9Vz|lJin#>`u$v6B$Gv@ z>=S|Ul9Q+MeQWoPx*K=0Op4s+zVvj!#%H>c+=*?{-Mw4m*uHXV-N=;`@g*<;`GCI} zF*VpxN#V!(Tlp#f#}+#pr)Hv`@h{)arbo8thECw`I9`2mnet9t<)F*-| zU1BQ$Jp_wrP#JsNpIBfB&RC3M*ynV(LmJ69XQE1yJ3)g_VH4CJvFNqrcv`z%x~$T5F@Mp zqGaUB_QM{wjB7S7jFoO1(|1&JErVF9?Uus3XAAHS^4vHbyT7o=<$t+YuX0#F%Q#$Q z5KVJ(WYcadt{4Mda<^!n@T~gU(b2&<#{hAgZx{`}J6S+CW}MTkxYt=K!iIHR+LBgl z%B|y&D>hsLLP3;siBVr_k5Pv?a!_FEeOKM|Vwedl^qWG@VK|4yO+wbRoavT`2IusJ z;Zr9owT!ha)IL;T5W)sS-IAS*Es)-9dm+qfKSI5fc;m0E6aW-JiTbwbD#45xF015g zym;|KA!0$k%o=U~A;rO@2K2 z&{^9@$!sPy9?IU%>J(T5t$s*kQbN;l%9xL2X_*7_QW>o~zcvW<&TcWJfNG6Td6b2tvWlAOb0 z%s%+OZ}jH0hDYq_5JtzU4W$g@wGKqfrRo8%L>6X>*+Gc|-1&~%sP3Odx9=d#r2 zz0W6P(Z!v(Nx^Wm^W^O0x95!HX&W!D)-3H~H(dW-8))4E`zS%g>CXc$?pJmJm&d4`9SnxQ*z{WC1()f#{*Cu+pl4wQw5!=R z-EIH#3A$nN(LW0K?+g7m9d>*VvN`PGyWwY+djj`V0MDZ1`9AWTPY`0nyIk&~ESDm= zZ>m%HpIyxNNm~kmk(rm?VYqx|f-p1&HLNh8T~(-ggdWxSt}@|_noKohT$GouQ3uLW zi8@B||3d91jKHw?%oCx!|#MN=|du?ID$p z=chO6Hwz3&m6iZqIlbAcLd~H}Iz&^=F9*>DbH;NY6kCiZ3aG)t8IuJ)kFs4QXMaKJ zCszZiAc{d1a&|yCW~d4t{_M?bwB;ugo~DDKX^?j>&_Y9awu5J)4cy0medQwBXvoc~Lm%;Io4U#*o9wk0pHvN+SfJJ$Z&STk0Ln6-eu1pT?P9Sp*ziAuXFW;y|sS1IKGGB|~$!b1w9_a*AN@vh- z3CHyDfu0@x85Ulo8ol(^@~A&0JS`(~^IPR&SGLME*zr7~zWqaompQ!l~;g6F1l)LhU3kBD!+8U9~>$s(o|6Dvt(Mx(h zh{Dikr=gl3F0dtVv>mEhetm0DKAdQl8(1BwBgKt_Z5vbr`g3M))qsi^CP5E03Dh&V2cq>O?)_X_@P`|8(n4u&7r8$XU8Errl8H zG1MT=mD!qQa>922%FEDXqy7uMqokb(LNUy`(EqkTnc8e|`c*tt$>^Cis1y-=onSG7 z9?Z+d`X(SCpn;DAY|ZGjn4aqdaBFbzSAjQqiZT2Ss@D1~1iHKO9OX_+DOU(tC2I`U zpMCu@UL)c=79ahqT<8O89Dzr*WK@5a) zE+akHJa$SMec&&2sUV~o$k$FK=A$(C?78^aVxj&+7xVkamEbJy!608;{{=5TO^Rz`NqR-1N`dil4lf; z21OB#Tb5E=ES|lrffo<7_6=pss~du(C}+HsiAuz`8zy+Tzb`h^95y}bFdnqG&O66^ z;e!SK`!m_w_w?@1xK=BF{`A(1@vvYfDQmGH-nXeZ1=2q&jHk+tQsOPa?9nU1%K51Q zUlku6_k;AMGE!9gsyd3{>z&;^T~>z`z*-r1x2x+)5(P^#U-I_rKW3~}+O<8Xo$e$R z7Be>EugSNvtG(lY9Q>q5qt@g1LXjTPuWYO$u~~1r6lCMheE94fM6rwbxH9#85l! zqX`DEb$KA918z?I|9Dl;QW_9|%@MRRXS%>AZUe;r3OGjPLK)yBM7{xy7iyigK$bf0B^`bP8*$Z9wZ?4@4;5e=;BZ1ka`S(N83jm{Bwc&CgU`jLAO5Bqv%m_+C<|?N(mul(*woi=F~4*wN|fz zaHe_K*7I{m!q{yf#S8Ya5Zm6s%Yve90kE^F!Ovw_r347b4hRmJpJR?=5*Q`HpdA>A z&@C_|f$Tq{i6ah+@xOix;EWM`f4Rm4a*wg1ao(R}21p!0BS5hV!?z@4-8ZplVFhXN-Zr^e52 zB1Y}3ut$UgPGvKX#fc2qF{OxL)(#&PSPqKlP6=bx7q55{kzOVIbSPi{AW11(PW34G zped&Yd8;8HJ`fcR{qd&(?M(u&Q%?6#_sqs&5LGbw15`pb>sJk#vH#Gbh$DZR0E$N) zo>`|a;ioDSSaW@g^TNtCWJxJ>Gi6!8@=1FPKYfYCcu=8H&*S1{W{Lg$WE!gvkGkCJ z?mpl0g4h;3Z=2a#knhgdmoV!7nCE(eWLg-=i3fW|3hZWZ0Z)aXh#zl}T;%5~(ufcR0+yHlxPO#!AtJ6I9 z*$mN8wM_&7Y`llR29RkR4`fi#__$A4w&RkH-S99+s+t%LCU{=;kPf0u&Qvd{$IY~Q z)*k3C^wBiZ`k(+5r5fy}D)_WmIvZ(TZ$%2eMOn>ZyD z=Y(aa>fI74|^^ z{0EO=#+C9Ht`H<_Uw z(`7F`rtAmgN3j~{xh)AFeEM6*$81`9MA>H}<_{n6FX(GC@Mrg>{6~O5?0!V=H0d`F zl~ONWq@$6z5#nrT%zepjxmzgbJYs5!N}krwj+1QkR10tN*k@KEcTRjEwuuj4>otcq zbx9GKZI%f^xZyW%`OD~G3a*Y-Nw{}|RWQa);CSqV$N15x=hjuI^Y%rYnxmtF>GlwH ze#aB!C2jmZPq1d8UAlnKp^*0E0i9wdPT!rf|Nip=o}7TN&fRX#h<%1oxCWRr^8}8# zymugcRvWfl_D8R>yOAx@!Flas z8U8lp*5kO5vYCN#Xowb{i^SVtnvbHp=9AVLCLOUn%wR|Aak=eErgv(I`S2}Kr~swI z>KMr5rX+@}^^;{*$E4@>*Bi+6t!l4v?d-CYIWRv4yNC??8*^dLrJ}{NHOfe`_W{DG zcj!;*?A|!lU_JR6tt$4uk(^jO#Y>|~^u}UyWO}*`>G^T&@D72KhpQ)hQ_ga-7zIpP zB;*1&_hgTc4=tSb))J|uV^rY9$cOv~^Hfs@=PqJ37B1ZL)g2ZoHXYJyoOn>IsZ)He zh^-@vP2%`yin+`lk?~PFR&8Utjh;*ic8iA1=1`_Xt7>~rG8%M5lHuFWyKjUV0kXgY z>lqwEinQ}A|_gB)}xw^$!6t0IGZ02$~@0RH&ox(k5JOIAm&(h2f( zei8R}Z&S0LIUa+v~JM4aI)Gg!h_*X;6warH274D^x7xRtxB!jfp!+I}q(w#RzWb zp^H%$0HpBl44Rw)>{Q8E%Gc<4g>kIaWQK_dx-i)MW=7TC?9x8qXOyNOWCK?CroX&R zb$|MlJDv128q~`W(C!zK7Z-E{CJO1d%rYLNqnx|&<{$tm+LotN$9=eB$TRkF)ct)i z)>10)mK~V$>J1{>hptZ(e92@W+!_8FXF=KTu5yC(G=b8Mclx=3hL&$DgaX`1ZJWb9&&BWbuc#-p?`@eG9JY(La&jEy3dXo z$!ZtHaM_WF;55o94VAq8C>betytm1mCBBBPy9`(%;>8j1im1wc>C9S{Y4J5sM0sl* zpSlG;lZFbNVzwUOgaERK9T8qJ=;_d!04zy#JXcKyJf9dIcdZLpBu~qa=ev^fpUuz> zOXzK;q@t|6IiG+{dLUMAyYN9f2X$xOgpHy79-zs@?q6RA-54(rILwJZ*CA& zbAeS~ZvxV=3vG*HV}0JL;^te>+!*iLtsx!DogA<1B3~tfiQp2_AIKh6n^`*NTm$#+ zGg0D3)}0%M6!P!Yxa&0q3+Edj+92U6Ld4k23*#u)X=M^@`n6U4KxQ)S}2 zP&?YTHt9GkpMK&vrQzyUnmySASy4z3l?cI{DKY3u2?D9mqUK-0%v8pE2z1W?&gbnc zIoo5@eW|dBx|rJ8M_Foi)9@nLMkQoxsv#ixc^lk%cZF1TaxSN4AAV!G+G^9Q_oUSG z<_o2;(1A=%n#QI5SFNNE-1GLRN&ydIuEB}j8!^dIJ+rr#FEGKg@XI9F3Zp> zN6>3aA8aE`%I)EW3;B-g&#H2Sys_k9N>V*ec2CIwpgt9ltW)QuX2|!tPDR;Xqw_P^ zt~{8P+QRYFT-{YPX zsTltP1PPmSVWxV8^lB8BP0EeV7Y#e{#b(0`50r8DM$2rxkw!?)a@0=w6loSkXM5*@ zyWCVn9!g>1hsXH5=3__KjdrvlBlhr|nq!gK*2p9WsaSR?^y=d%E9c>21gl{uIkMCx zU`4J-9Cs=vt4_2}AUOL(F|rsdO*y9;>>kT1a5_)bZ(~g^oaU2qU+F*tx5}^&Dyz-x zm8InR5;I8olf;K0tm#c@XqfZ<3t2uACzyhxAahd_S7gG z_&_)B1H5YCwOX-j*zz8<1nQu;Z$B7#9DH9am_QZawri1DD29r{PNU^)li0_rrY+%F z(;)ad(@bBb^5Us_jws*GcNt(pjx;OMQ=3HGNxhZ6hALMe4{RoEqfZbh2+DH!O*L3z~vC7iz`gYo#8n~`PcQo=r*ao2~sk_y6Mr(e0DGFree{1V(DZ~ig zX333rcyY6#R#U^l2f^devVkjeE^__b*O0hT9?(7*sp%k85qVi~*mICn?Of+Vq2RJL zBLQ)c%xiSqnaMiutArT=fCe6X13HE2z20@zBU_;?cx!Q}M`z`Y{iFMk(R3U9{r%K< zO75)t#=VdEk%eJKN1^FGdSZeeVHqZxA` zyu?;?{)`}y<2amxVrE_M(hm$zavi(z9IYV-5!&v6wpVkNbgV%X4n0l>^blr|{mX*h z9Y{))dC;av6jC2RHg4$MN5BD%0Tj}~$wFGRge=9JKA}g`k;Lq#w;9!o@A7T-nGArQ zFSzq~1DQL6S)pCUNHjUj9olb}<(IrNTh`Rr+qxPyQbyLD7JR64HfAMRw;JDSuH zpX;1E*U{2+Jyow`tjf7oL$xM^HdOUB=!uxv735{%|s4$z{8m}RMuL}qmD>?$_I-SAiu zc+iHY#3tb+A1${VXt*-)qSVcKx67T@ z4s_MhJt(nqHXF*Hp`o76`zRGH5}u>7{%}&$0!xs-7tkAuW!HAc0sU3a+_rc-QNBD)dy^yIvNe^U^E3$dG`pXHCHB!hj({?Zh2AQ z`4P4;ZU(036FOqJ=%u3B`yxJMuw6WV{xQ&ANeLG~7rH{s{}AIaB0QL;4(mvr-jEj5 z6gT-@(>n4@_gTf_nPQFjm%t7bpWaC|@<0a!r;oxuc>VJACFn|k0rE#)Xc}4LDNE=@A5!IF;nvisq;>7E5JpW6Y+k0{Rn#HE7$!cNEI?}QC z#jZ7l(Tl#HOPV?l!Ue82H6-grixd$@n9baA7i|Z~>upy?#I#%xie zp2=+mB^i^6iBdf1O?(Vcm#t!?K=ttfG2=2{!#tBlX|80{*8L~uws7$41(g&oYDw4R zXOW55f{cLz4{C%I5#wU|E!@@0OqG1{{~h(8kOkhB&$vQ`;b+vN76Z5^C`w_Y);BTS z1oy!TZ9GOTqDj%M_4T0ika`ivBcCgPR8$T3IiJwydlJJ#ix@770L9^JmzP>qE@H{= zaO+44%!cg=?;AdOKUcCkIExbp?Sd4V%`D!vFtm9F6jtpGS54QZ3e0#cQAl)uvqQj- z-@uPf5hjjZakmJ;IlK)!o}}_>0bD8zo-c`6bhO}yMFuZD;JMPttsuMrwzUo26#{!E z3jv9S!(xb1$omRgzfzH!;=))P2{(tdhz->msJ1D~qKd7P-^o?G?i*I0>-mRF#o-j0 zkFA;(JEO5N7^he%9~y2#?5cj@*0JMSplj7r*;jJ_UDu(DzyyF?oK_L1X8BgWtJ9ad zCF2KlIJ{Qf)I;U^FkaWa&O#BzzEZOaW@?ML$`q)<#Z#Z8ZPXW%h3lWC3kr$b+HPzT z03UGfW?@G(@dB$Ns4-zby#b> zz&OPba-)U0g*M*xTcL3glA6zDJG{ze=P@Yf_1oZm*JKWLJ?7l9wJPZ9ys#q1p@(gH zxB^huJDMqlg(d^ia;f4owo!k`|BgRFQ2x^ovi`{_I>)mNluOrxs=EZlhL25J z^Dop(EKWPpX_E2g+hS;ZsJk+*iq3AXhPcm+2+YmY`w@Seo1+CqUf1VOcPQ@(`v$lr zysnms;iLc+Lm&hEUh0v6ivy~G{OF$55zoE)r_1V;zHHqhkBEmH5(8;&Br7ymOUS9p zJ-(yBML1lX(xtIFXUHqB?I6a6cQ=YBn&;kbdn;-DraPZa$39{X8GTSQ%~R79 zWWB`awDC$hhBMi9e>45*r;04LkDP+nZe1z6_5n1!-hmVAjclI`RZL6#8@$s zY{~9mdkJ>5zmXiFJjM6(iGR<&EYrbNBCMTTp9*=qr2+3hJaD+xqsX=r60|c{=xTGc zC&p&jJEHS;X&@^&K0aQE5c{Vf=OJ}k0?F1>Bxuz~+#beo{7j27KaIEs9`?J4J+~+= zcScnG2w0lA(crxLl~AN}hQ_|^zT@G?2<7R28rR#?aozoYlwEfq)c^lKq@_|xWmhVp zNcL8WBrBXvvI*JSktDm4Y-eU1PWC>T8E5YqvYma_IexF}`}ux8^!xeD!BTriaHhmW%RSEft2h%I+slow564 zr^^?Bs1PWV`Qq zMRx-J-p32CgQ(ouRF^HdIjb7vL{`EVSzVCQ7il>m=0`Ko*g6M081A&)LR(L~01L|# z%ZhFd6n?`;+^N|IXj9BaMJR@HOk{S3p?QF>?)8t+_NR;v>faCHU{tC;{&6tt4RM=f zFr7;7l=%zqB9zX03{dSeIjx)JgpM3Fudc;W^$OMxhMzp}P-h=^{@P!cUC^gOJAZcp}5Og1sOow7m zxOBRcjI^&#iuS`PN|<%_uF6EM7MGQmXBvY1QxWvV(!Opyf!((rPf354oX~x}0%BWa zm18quq&^otW?9;-m^$4WlRREal93RKaPJ%(#`UFV%H_&<5$&DdQ!Qw85 z3~c4vuk>@TGA(T7Mq@}SILwxX;E7vqopB;idwL?s2YX(awtI6hK`P^F9JZ6W(jMFVDxd{cJg&~bF-VA>sBS2+rvB0ZbMrK25kMoC`s0|9&3F-U+h}uSI<9Hh zNJj-JLV{guMGe3cecq2Qwu2I2RzdIfj$zkZ6ttnKsYx4}qOBMs;x@3SIW^J|xi;J@ z;I#T_j@#Ifo!3$uR_?DoJJhaSAT(oyofoaydpYtnVmAT+P|u^gT%Vn$=5|O$XqCRL zR!28_lI)}!kkvcAE$4j(un)^6vx?3n_PY5BT%)RiWH5cFrYM@RR+TzfHa?H7mF!>B3Q01M;g;q?ZCIvJt{st?@FOg`@KIXUr!~i3xIX z(W@6)q`AA%%BAuQ*4SC+tHm-|(ubBJGw7X{iMrFVdBlDfIsA(cMiN(I2z&)#bo?N; z0^1`tJKTWJBJ)W6ps6^NBLC|ffHQ+1J#xZ3ZmFWw!>}bXk&+e4a{cf2q(2@Mzx)nClY^f5NN6#4OJf%&kPZvsO30CgSpYO%kX_eSQ zdsPJc;pnJj&->JTGg>}5GO+zDOT*Ug@ZkEvCO22tJgaKUGbxf$q1>jt9mToR3mEl$ zXIY@0V9Nr**U=#7CS~as+{}4(b#+aLr*2?|3tOQVrj6nskaFwpUZ!NHKWilHeel}< zP$Q60c8|6SrxODWSXc&v~ zGmMULVoI#*Q_u!wGhYQBy=h28-KGLJpxdHXFPo}6VMN#XMRr@0l7Sgn56?&gcVJ*% zpuA6exTM?=#$$PrO+CZG$8AQwz-fYEXJc@i8r#maVa*A_Z|-ofZfq2UMet6YXq%F1 zE12J&)<}ho(#w*@p+(51TcN(^YhMmy;2%CH)a~kVJ1i1Edib!fNpB>4K5`qY5AG_D zA!X~Kr`P@E0IFZJ`+TXqJ?n6ixNX+K(uwmQAD^fffEM=UCa#Q;S7&6R3QhK2FJW;@ zW|Z{w7Tnxk1%_M2dOiif-b)!YeB`gVstKhBE-p*AS_fg^K9FTO-Q4@`oZidep6QZ& z)=++%o7~3h8Rs5~=ptD)3IZyk@S)%W%yt{ax$kYOxTsA%jmTSU4c#%QWx+0Vk7`?t zJdF}i2v&0J)7}_`87U)V^>DdPop=oI=|mo@qj7F-oGiDSSC$6QiqT+5pBudoAC*fXGTj! zdN3R~czb?1{~s-c_%R1ZOHG|V?6NV7WB6=3QHNf=w}*7}g>)lTB!fkv{EvRQic?}y z1{5N6deI{IA}2Gg7#*kTlca;OHq$Mcp{&H2^%Z!ZTeoJ6G(rJpX@fzoHifsd`1|>F zbau}RM*rBYB-u3U325+R9UA&7F39*}x5TY%o6NnKpfl2T zR_ZAuIcy5V;g<&T6_Bx(15Fp*P)gsvg#~mXkTceg->HlAKCSgXri$&&(o&f(V4wZ* z&1+)=BoOW6OVfSu|7H`njab+xq(3oP*$~^V+WY@s1H+2kjlqoq5b2>6Ke=ERzFd2> z*gk%vDbICVu3)OiD3m35uE}>I19XNL&Lp=W`Mbi33-d;(I&`S;_e>XxTCszcFupEw zH>0>nZgc%m;nAr_m;o$O+zsU}tc-17%EQCysPDc?tu|?HukHo>6)xF0i^Vnve2MZZ z7OPw>(K=hx5OT&Y*HE^bWOLLgwA-?6D1PJ=pIijjeNY(BecgWtz7z*2r-L|N%Z-2) zS^Prl(82nahY^8LGN5!5^h}MKNojKv&0OznKSy+A{2U)_tPC_z->_syI;zY6{geog zX@YwDP`PwVTNwt`2uvooZjL^zNDMqCiEbvsZ+V z%Ug>j#ihWr(m@`|)D=@=Ozd-pu4CskOykCBnw~J&#eL&^lTCZCuTx%i z1Bo#58chsP)w11brV>_9OCTmD21pBY<~GJ*5*;GRZK@R9FN7A6d?;}lbrWNhsh&?r z^XB?(2oDF@ZFh)aYc73MZQJp?4PB-_7kD>zbUg15 z#sc%2=)DZhZ3MRh0LL;s<_9fN$x~=L82S?qI=;=wu9_`BQ8&DceXdvUmT+>C)v-nz zi|LhvW#K#3=Oeih6Ph;lLF}`Yp7^<;;@p8k*tg?nkv;FPihsHxeUX&(PB7>_ydBM< z_qO2Wu;HCMl0gg3E47!DlU|MG6)E-neLsm<4k)HE`M2r`lJ7syn?h?C>%b=JPIpah zUvw^&6eWab+Oc;uc*^lT^UjO?MhgZUmLmHv(hXZ<6Pv==1(ghd{%R|id4{&|2$!tt zhFxl|a5xiB@MY{*9*d!utU0jHcQopbUvaQGE*cdI%mMFiz62HLNObineqQsvvNH@K zFBqE2IOMY3f9&Bh-fu?plW|WXkamj;{60KWquxg^oR;6;6IMz~FxsVyttMMO6t!D{ z`xO*Yo9_*{@7nsi50}_kq0B5SEEnHyAFDA65WU@-9&wKe1tgsFN!eJlfi=?E&wEkZ z+EY{ju|;Z^cLUkKFm&k1u@Va6HZ5&TLV@`}A4yw(?sQv6vcK>Pv(3f96kiHdc8_}I zoMN3XWM%)DaIoXmi-(-Z!As^LMhtElMP;!#qL~DF24qXSNBdk^RI@$G%4p>*g8XZD zOUEggWM{X0DWH{Gu@6XM@e?K$F;CDMc?(H+kQ+6LQ!UqMc~VHpc!3NOP2U2i7)rmLb(yB*X&vy z05`kMu|{4aT#8B?uO%L01EgiQ8n6aE8U1;nE7k0p2E=)$Ek0eLy8PI zk@STGf*L@0~0?dZ=sU;&34=evHm;jo=>v;Dk*EVW#L z7LfwTdRzR`<@hb?4T$Z^_zf<%ojg8VQht?#&*_lu&OP8dR8SRe9RsVXe`zirdMbhs zVWR{z?Psz_#s9Qrze4KAUcchc6DPzHOgUi0dz=yvrs#jTVqojZwIcQ z0Z@CG5T&9-jC7M8iPO5{49Zv#fjCtT^pyA%|AL&!sptuV^{#q)J((UHk*2TdruOJ?z^($ zw>sqtg^8ToetfGFisH7|RSjiPdj_N&yFKiSLKz?_n8_>a0b}nZBo(1s|;(pF-e%Iy6 zwhQ4mCcikA8i{(pecRY{Tm)taE{_{Hc!jSz>KHagTy`d>b;dC-kNO!kZw*`x5ONrC zmD%blrtkv#b_sEDlV9uL{AQnT(u_@Sv2mUfHXq=kWWD&Kt>%=@=0blbi`j5V{!~j0 z;@!LB!03A+EhW$~n=z|DTPP3~V9R%Q=Bd6mqKR#^2OWV62`RA{)UO_e>4@UDLa=;Y z$InFV`#S;gF`1^%ckFKQ$eAsfMZ1@Qkl)98P<-7Esg^qcU07}X@#8tS#ZZli1wi)# zgv0e<_M4|cvm+U&$l;^?*KHP4KMw-^&-PyV2LnU!{i0vBY*0W?AQaFYo)?)luV3(p zy@xR~A1Lci0M*rpZqDTxHXdBjkvPl+lPSZM@#LME#P%L%&|DQ?fEh?v6;p^2a%$vL z-qx6Z_#$`p+cAc&Hzx{-TkC@uIsvZ;v&7-tWz5R;@@;Zy*+4Bg+4>F9k3c;M9sja( zN~X@YdpPsnTHfrXfkKsH>&@A5Z-4coSMeMhJct${VdwUQM`zp;kHw)+a&F;_Cnc4W zttqui-L=*N?k)mzohhP>P|k(FGpDH$!jz~WM+zh(m@bRzmyNnl=+B0tvYtKuZs4K? zY8ci%<}_T+kO8Qn`$ZO|$D0?}GIICvDP?uceTkBR0iaq|gpXLUu*tl~IW!!nOG3$h zF%Gaw=7UFJg+2x7ql+K|ViMyu8+Z!nf7v}9*$U!VOlN(G!{(*6V>~-phUYSCGl{`- z+t541!Z#-V9s+%zP6%H^;SIl4WuA!!Z$FYE$qzL!U?QbBZcK zJ>PU7-F9)8zq~EWOZW&KCnP4?Zt$irl?OALbs-Gt`QXuZ%2LOKn39Mu{#`#)02rMCf#2g z$pnz~%np|3-u^IlZ+Y|Q^mG_8CnxFO83_n+8WX6eVizK)4p$AX7!cOeBbNyd!ME2> z0Bv?B)+2PLN8%F`55*S%5X$I*;m(kRM(#0zhcE_n9J2aTd4H*v%Sw&+e`L zQomW|6`L>3)SNqRg-8(E4f;|D-%na0AAf&!%A~=Jc4ueDP{~`8CDpyWq;9r}n|5y8 z`SBBoGl(+km|GLU&`tDGbx|F6)5r53v0NrVq%6|lG?g%<98iY?>0CI6gq+uJDQ9W& z_v96li80v?7x*R|iwiq;Cj@p8rlDL02O%PF71}Iw2jCE)!G&@e1+&}`{NNJG4D_~O zmNXF1JKU){t$WSCb-n)ONFc^BU&TB4|oFo=`qBk$6{THZ8e2Rj*)kI`(Mgr zS-UU;;`DLTshoRYkX54XwivGEx+W#?UNmMYvXPI!?IS;i2Xb52qm z-n9c}#B-emT!r$*+e^PG<30b?fmv)J>rsG-r4d1DmuAiPBGnkDzkd*Jq0mFc@@v2{ z_XkZo$NLS__tq6HR2wp{o)8<&d5mzF@@*5eU&yPf_w@8Ec{TPrziXl2#(3o;!%xg4 z<#Y!HjYklDPaxGR9;Ul;csjo4aoj4+JEv*(pslgOnI(XGhEU7>(&M(yz5;?{90SZ) zY@Z0)>5j)yF`eiQ9zmDL-TIfweF6?mb3Mbn&k`*At?D}d+GIn_AWt-&b7x?jOlpwE zWd;q#l;|(UJ7H&53Kp4dgMBJaH2r;SRml%x=NA6$9N6t+DX#sX@p;xvQei4rolv(K{s$j$ovCh&Rr?9Y-?!O=g5 z7>*nTzRlAs!&>ENTrizz7Ek7&>I5_ss$4zl!rn7<0)$w(7K0C^Kqsk=B2rrzWXTkR zuQpl*f60;DIPK;Tj%~4CViv#*XQo+Qep0fZ2=>;l(z-t)MJX6Wi zR`8!zCuGygQ;QUF4m2(xB0g`>`dQ0-pa2Tp&)CQ>!hMl!)$X~FEFIc`K-ybv+6Me> zPltzCI;eQaD!bqOOgNM zg6%6~=j2$Wr<$SV+d%JCCEu)?Q1lZto43Kvm=rRF)37^W%dwX?y*D}=y z;2{(qJjc|^9MeR0jPtm)!3?vmL?b!j)yJe-C(rcMuvc{Lp!RZFDgPBE9hCvCy9w7>jvmFYQEHU2{-lyj7tBxFq&>ZHyoSLf3})oQf;(xT+ykd!odEb}I&6 z?!2j>ub=ef^R4)-w?zNst^U?@6IzIi4T;;nyrw~7_7}Qp*i)|afq`aJT&{i3C$9It zJW*it=mwFo%B>RnfC(nqR6H5of^N^2#8P{rPb81q%?eXSR~L1lv|Dg&QICg~(=dQV zIo+6j&tcP|e07y|WBQE+HMfQSk#v{AsO!8C^H^g1hK8jX$a6M0CQ3nwDBDtEZgZU* z;#Rli=^ZABdMR2yz@x1R2T}Jin)@q2Kcg?@j(nU4$gT+aPT(DgR)#7^`F7p>Vr%~Mj+Js%hADiW5;p*g|K>YjBu7HDcKMOnHVODG#elC}JLDFW(*L!MK z0@ZwW9n22Pw{3Xlv+NLY&j7%Y(x+*7noS8n)Ww^?oo`D9Q72a>d-hDM#u==(j$0y1 zFh<`)&z`2{Q`I;vI5@iqOhmeJX#vR1vYc$D)%A+NugbP%X}QqxTlYl*oY}t4eRzl! zQHj<$dYV21$OJOO_IBrb3xlJK^nPn@J80~msQ~*ox5FuTIC%8H0S{0*stT%>1z+Dt zzM20%rYGPw72tQFSd!2{rkvad2w4{rWmg~W#|R_9F}|fyuuw7`>+*?T@yo+NgQNbf z(IVynR!=La+?3n4M1T;q&TGB!_z^eUMpHeLm)|Aw$4XcDzIn!E2mu--;8}lpmMq=K z>xB#{PwLVv+-_Y1{}Q{`m!{^Nh2SNj|EZKlCR3KHf(iuY1 zW}$E8Y)srHtJn@Yo5#SuAN~jdQTjvU5z_ zN4Zp%4piW0p*I|U`{e^KlPJJlp4De``c0&3{j|4?^2^dUT4z=D<5hbsJL);fYfuyLW! z|3_0i^Ihqk7{YT7YmEFgkMXxh{PnUD3!YQUvhm%aw*b#6P55AdFd7YsDX8!sLQ#X@ zjMwn!!D{?(&mso#Tqlg&E-nvvXPrftd0_7eKY9M*^2(E<5xRUpO$hSyy9U7oS-!~= zx=A#XS0dVupKc058QnV~`XlJSUg% zEliwZ#L1L`kak=l|KDZ=@e!I|e!SZplL(i@=i8Jm-9MZLzaJoWuK;a8{UjjJy_KBE z12(_iaFyk^Mf>fg1rRF4(5~dS9iOJ|`0cn|x$oIb<#s;9LGlKZSgAO7U3fI;v$_5u z7=S7#By0{n;BSio@f1`CvL-fzFd!>rBcFHJ`dBc&_lB&Szp;SY5a%gAolQ9h&Qxw# z**_o9UzS?Xh}PPRA}%H*;qU=`pDhLz1yvE%8N)k7#zvny6o5R(tTCq(L4a)OBAbRtWdf_ zqO4uFVFWS~jmAI|&c1NeyVTAKO0-AXM;gpj@M&2ArHtja;5dbn} z87|UcJ>L})FBEaf2Mg~NNd#@(mC0DK_b1E|&0qAtcb?)-l{?!iuDl@HFmf0M_ayA) zT#y-=n1fTk|3HC>9=VuNYpl3*7@O>HZE|(LInfNVBJvApb^`z-D8622`$xlESmq(*JraL$6kPQapVpy+0%u{~cJV6YG?R5d{q#L0k$8FN_5VcqG z3^dk;I;AfS72ABgdrj;7c>tJBqoWX|izU*8Cik35F>d2NdHl|XRH|8I8V#3YHozVL z4stThD0tDtQ0w-QgTc>%GY(8(-c7<9)A8GYkw!Mpe!HCKFMfvuI%3s>XG%(+$^zIG z3eCbl&v~(ro;;nBY%O5(kJZe1V);@J&p)25zG>NZ#$7#or9?uNUbYW<^x<#XFn zS>0I8QSKK7#i1`iYQZe=9I=S~dMco^DtD;v>q%TLG9Toz+W2b6GrIl#L!$Fc{ITv_ zNpjY8{2DvT7*~KPv1RVtG0HH^jHKpz71uo(@^vE5Y0Yrny)Dj@MJxT2`7NJTQ0On; zFjet>>&=|_HC8Hwsa9PQXc1j!x4ffXR5^#k_HuF=wP@P8%%l14(B9nIul6K4*8Npa z(nWdH9p9CG-wl^5XcpJTi!Ik8~7v_ z&wz>%zmsI$q3_K~9A`~SoJOPjbH9t489Hqna;+MCuy8>>DBd07v3Di09I<*h*+l7! z6p;B0_^IE_BlfVo>ie4#W_3nUyxk+^IAFL%dpJR`Gj#k*4q3)FhPRyaC*3bz;7i_$ zI#g11z&?|{Hpn-7%#h`#hz^i1bj>Eq_N@7{SEOFjSujTC4xjo}T^|*?>eM}_{PjUi z!Fzjv1!-LJX$8!5v*z&NPmGdh2*_IQRO{SOf9}a!(5FC~wylbkxB7d5^V*s(6THob z!Sy-ioj6*nk57>N+$Ev&qOrwvQYo8!}Zw}NquI<2sY^;*jg#O$HMkm{}IV6UL z$2bYpPc>SB!V*VScfX!JudIQ))Uh)Qg^f%E=NNdUK#*Pv{?uYx z`{N-a^FGeQ@~GwT-Fwfq>&U4iQ*Icot|=ddudgZkjGg;X;?CGC&@IromFTNeka3dC zVHmFP5`d)U=T~5WrZZYM$&Ei+mM9&@-qf`9VcfyzjMB&ukYgy-j3A<5ylX$?h)Zk8 zH|_0t|ILfG1kC?^=(aiR0F6M9w1F~xFWjtGU61@SpFFUWUt8(u&t<8UmVE)O?WzV~ zVzg5GwMPrsf+#>I1J0veQ5pWx@~DnRh$@_d$vqx4&h@Y?wZ)eU*p)c><583#^wnWu}xOd zi$wIO>UE`QiOWQBe0OuV1OprwwyXfCzypn7C21p+ zF7eK%Gpx{xDNIkdx^%VI#zu!rv5ieg)k!PTP_*9+xOm@R7L*PHytRQ3TasosX9xI1 z8Jj_S`}&fB^qI-hpVh0Ae)={SY7`>o7_Twr*<;}9c{46%-+>Zcs@#%x7Im!E-!InV zuwRie)PXdvI-t5MmIe&l+wMOlQhIOqr3*VdID;m8agvi!?q|N_meaxySm2~oG2`zB z2I#pI&3=4mcS9@3Idn)IyJktk`}Z`B#y{IM3G4+~K=!qfm9ns#T2Lz&To8|_H=l0) zAkJ_KRxbi%LIp{AnQuSeyU^I#9a~`Nmh|G0+v-ZVD(fp1h%<15pjnXDtO6*Xr9;t? zU#EEXon|{zkjmQS5_S_^>+xR)`iTEcB-87zSGl`TJ_cwK@XWcHtJA;>ORwP&2JIj!4O4k7p%@ip|AEt7G(Y14WE3& z;f5K-;>ilr(9&+Cl|o?vI_|)d3^5ZM$wos#2C?|5w|k0C@)PQZ78^_l#5f<$d)T)y zH)Os&<)&lQ8WR#`^$F(zXtt@(@8eVn{Dq;U>`K5|=?0ZGvmT=WiVrRuGxTPpizmfk zyhcGH`wMHTYqcu!CAKCq5%>6^`F9{O>^kmuRPVAw-CRilp@CDjz`{)V-}vle*fG-C zYI2dhMIE4Sju{vc!V6Sb31zxAeo7lCHVbp>CzJ?XPHX(rOt#0WptM#cQlJh_hep6q z5^LB4^Ufknr>KhrdS2t3`GiYV8ji9Nkh$C^9OP_vTyf2D>5q+(+c@7S;6XlGVEuR`XP}(gfyOgnWY>_=hv)DRa zKK`}yoNxU{p=pc&J)iZHTK@}0TAXv8#g!ibC&I&0a3082m?raTFHz424paV#I>KA) z>+9VadSw800J}X6uT6hq3K^iC$t)b{nLpVnTp>m~6-dcgoL!ye zpq<6(1`~s5qvXml<&T^XBNuT?4QJi(^SV^XvvpL0K3J0C(@$KWOO&mZrt`*A+7DwyYE^vE8;#*qK7dXjG5TeM%MaH351>9O|=$ z=Bke2rah?!<px3T=@nZ-%plG??$jV+nC;CSrpG7C%IkXJD zZ>q29+4R}$=eu(~c))d40%Ae)B42erQh1Dj?6su4A03$k9Ozu%*F@p7BdJ!5*x6yh zuT3lA8z1UmS80LJcS|&XBBA%H<{df4WrBnK+k<~^|6#LCC?!0;PYC#ROIabq&wmI^ zU;LqukVX5=H+1l0M|SZ7*`j^%y*ZnmmOwn_b0_saTC@k}zU=%+`S|y-<;5uyq8Zie z7yi1S*Pns&dF|V{i7Z5bKKybmP|x%zTD7W~3AWqmig5HfMMkay;0I-Rd#{SNgjk+Z z+Q+#a(`iTC^+HgfvL@}6+jqv!%>!z9VI9}lJlkfHknuy7RpO`=UI*3sJHjub8&uH5SHqM%L7P>WK_r8 z^3UNOvdo>$*CW&@^w{KaF;HTu<~?$t>DU)YY{nSp@Cg$5x;LO8l2X0Stg;NECZLu# zCD*?(*Dh1*Pg>+=4d!MrZG@jlIQ9v*F^_l)YV;Xy0A>f2f4Hi_ACc>vyiTs6xwp5s zx~?uK7cG7O1w#oqxT}G-TBy}JB+rT1D)DU~<$3Eh+jRhu_g0e&UnnoN6Ls6M1q`;d zwWb(7?_BiJhSOsEt4$|Q(@Z(8+5rI`F8c+vLs0$|-V3`s^G`B?3@3p?w`LSoza484 z4xKtN0+$VcetNh_fl--yKe|Ld!>g`nnGr1j$S7c9hfeL1&yqqkxpIiH4> zJom{gWF5Qw7;m%waU-@YVfp(l%7&;0z8HaE*D}jJ!|w39s57LjRmLh`p7R(q{iMiM z4@3IQj#8)ucoio3)mp1#!;q4f4Z`v*mYhiUtlL=3y0eoO*{#=(80QY}!#mzv$Jy&`?2VD939Fb?espju|Zq*6?{GC|`UNqWNuoys9 zw%)eii*5aSHnV>lzG}Fs*u+ArC;N@_&kC*>HRWRr#1^D$BY_iQEyw5`#X!Hbitt3X zoQgJ~Jhk`Qq1gJd+3kP(l!iN*pd#xXdOzj@pY?j`K)$(=-iW5rH8z(CqrRMi`q;m~ha*jo#?*mc>dRnw6OL^bD zP&N>ZQp%m{$pkZXa?NlB=AhHqvxjCPJWQ>(0#8Oj`@!x;-CwvF2yai8E_BcDFIt&U z+8gspl$$8P0YE2BI!q&e)na(0%cfO$x?nqj+;w4#!)p|bONOU^3Oih=!%3LP1Rmfr6tVWs~@oMqunaKhl?|HcyM6HV+mU9%*6Y{7l zQ9(*W5tm{qk7CI zFj2xTXIzT-3;`s&KKrJXo4u}~o#PlQ_1QS7kP4-#r(gF;o>&8}nr1EvFRSx3+E_*- zRsO0Q4zmz0{c3P6SQMYM>4UOlKwJ z55h*lz|LTXHjt$Uw78z4LY! zrb5`T$Fi>Xr(E|)8Pu2E|bjb&LpnCoW@7%Tt~R&tf0 zPzG*9L6gm#)?k;)8nvxBUKZbU7ip)5@{D$#Vs}{RyAO2z3bh5ZAbDzE2`yAWbQsW?E%P~1;chzfJLxO? zx7kcP!gSO@j30;gyQ5J!m)Ndn`}4alA_gN3!u$0FP|jJYJyVC=TK!5X=n8~QpQOmf z5OiDepMMkb5inv%fIl2A)Y0L7*;d(~)nMT;h1&1h+2#S!Zhjs0zcB9b1*;gU9{?Jr z7TG01%qq%>qycVYD-ONWz8En`u?+P z5MiEIsMk=soStZoT;u@vt+XBTQCIl(ysYu!D!wPJO@yk9a!c0^5wm?GjmUTq(o_)L zvt_yWm0r}bJb~rN&umbF0^5tIJTAw>_tbl&mGjzE^*3ju#*5zCD5rZi^AgG3 z@#?xRqZmo{w9OQl#(k5uyy=o|;;u65`v$Gi_sIf7vMy!v=`Rf?Pr8{xXDwVtLAsQi zZ5vVMoTw`mdQUd0f|~j&3{|vW(Ix`n{p+bsB(7v0jgyHRDR-Gq3>N7yg1dbIkY!0t z0NC}*Aza5n8`@VVdnO>CQ4U+w#22qk+iflDf_B`efNA;3>B%c_7c-bA$ixPL;n2u4 zRv@sLpbP6p5B1-iq2)^jJ*cTb6(y9{Qp8CT*I<)!?1_H$2A#lM+cz(ucIpp84TYod zQ@*rUozQ@BIfx#43T@W^~p(1xQy7k7LcX z^AsK%?=Ja${jLMkN{biwQBTGUQ;SO$6FhhE20OE!>o zXctq#Oy#k$y3w)vf%~Pj_14RKj`?;UZ5DUcxJozmHcH--K$)-Ie&Fpt+4VCkxUVU3 z)HP2Z>8@r|!xG7v5ovunMLbGn9kOmz7k(q)>w!jbA;rp=U+R~}d%N2g1Dtj&UjQ1~ z3I7P)#nnl_>qECrcUu$NQV#@tQa?#F^XcQpu2YB2zw+Y##IUNW2b1$r3Zl2QlQQEdvX)_Xykh3!ptO8bCsvpkrR@1TzYe4THF64cV{YW(P zhr=7c?&AIvUgEfso-@^)v`qrf9*71}(#8_raF`dV@&MU&>Rs;A7x8b@%l)I!VU0TG zcI-aviS0VXwrwWTY9skC1@=nLBSVycbm+dfklWe?h)oZ@0PP^W834mmgRh8ft6U-% zO#v=fddF^%EV&-CUJnmY{?Q@Ey7kg)9<(M5W#1Qgn@89 zahpSz1BCrINyWc9-hKptO0vFoS(?ONWqWL^Iv{ zvE4r_@d7R^*T3CJhC&3Ki}7N~=wGT39L9Rns(F&X%L7 zw%ot$KS9j+vTPbJ=WeQR9*Ik2wfYk_b1d)xMYidd7)3yV1M~(_W*{r8Ug277^<8iB z`c*Vg_%$CaPzGIfT+Zt=*8|VxhEP$r=qzW2*EYDbeQILw*Sl^HA%qjs4{!jBmzsHW z>6aSP5qKfR<6xqhAUd56PZAskIfBLZVqFoRH>L$wrhuH_K$%l6o6Z?PH_TspNIdcz z&H4Ze?0E$6LYThmA;AckJbtIjU~tHMT=TX43K2JDl7e;UQu4jxLf_ualoJ~&@~FW$z5oOkD`m-2ul=_W=SABC>$5Gynq1k8{bcIK2UicHRq-Xxo_$x!0>qT1fUjTy7 zAg_9o(*PKNd4NhBdPk#Y=jo~#hXAPc5`BCfte~I(nmXD9WuAhWATlpW{14PU4{Yqe zt>yArLf&bvWO_6XO<9ntp%mCS-7P6iZh{k?j@GaZfG(a9)2X13zv!i+miw74L}fxy z_<|m3N1n1I7w;=1Aw@3VZ&ofB*^xt(-ABKegCZR>DguvXLi++=A%s9t!UZXu@TAtJ zZjM2vh~F@AYk-ToNPR4Rj762t=ZhWUa&8osR(M8esXSd`d5{lz0#SeDFv7iF}8xvf3Dx} zzVlZ$Ipp*!@Ua1vE}ApyDWA4z%-PwQUpZ1vYxDSKR$WWzD%yV%!LC&N?0)%RPDb_P z-Up1`_BHBS<*wB%!So(M?*g7xSD@4@kNItFQ|>weGu&?7U+iaz#AaO?imov+$CoFV*M9tZS;}r)u7H<~0{} zmMX8e%x-MPvQufJwHbsj)7cDfNE~RQcYNakD#<|ZCzMLP0x-81OP53fsW@*o90g67 z)+WpS1!sXcmv7hhbx4fBVj2%C(Tq}}(ThVBtp7L#DSM5{=>}cU(br_X3jcFdGeNJPk{Q`62FXgj^x!#$U(qu_241Xa4&*} zwdmx|ac&!R+2s2-3_7Y8Pv(K>+&FZwqUO|jo#J!xM#nO9($SFBCiGIM&QXSLx4ZC6 ze^7tokxO;g3pfYmeLbKpakunI?Q2u*S0i~W{?*2jfI>Ra2uauMi<<#+epp0=U|ji|BIHZ zTDbK3t?a`>BlY^W1VRX8rMGu& zmPiA4rx>(Q)@w>H*YYMy7hAqq$VksiPF$bqhSBEl)KPkz@qhPh(?lcRa>>c%@%A=| z^uMa>B7#9pTiC%6joB|!zPKh`$^n~QNIP5GYgikU8=3t)EKAE?C|^*#?v!(Zy@$4| zfc^Jqi0xB@*gp#ht(31MAp>3S=wDYXRp9b~QYn|`Lx_M~p(lYMnzFS3>|k{Ci9dh- zzizt_D0=7FL`{SAjUU$tYc*SM7Osm4TM<=x8)q5Ri}UVC*S=ZEuk5GI#5U44CH}4P z<#i+jbF3mD5xsKWYwE4Gok5wE?8h#w-qT?`r}9w$lRZ7^_Wn~UB_W;957%ugWyDRSd|FZ{*7FeAx!rI4SHJsvC?WXa8Ew7znrEpM&g-7aep(ZJc1sG74ge#L z-BmOIl<2gomZbk`%>JyD(Sufzf#N_w&mPe9q$OHn|Zm}_MOytxAn;A&>U{8~YlT-y-wSE%+M)&neS zr5A9hf`v}NS41I>bLO<_5tExuwAhq5^D8Mx@tqnFy2F1EJFX5p5Ep}Ae?$y^v(z|( zjRrI$HQk~RJ_|@rkb;8VW0y#V-CsH6ALnroJ*Uz^h^2;uV!x3UUTO2&Onofe z#^H_oTDT?$`+h^|0XKHw5y2YTN|I95MmjXYm{$2$zs+n zC$v%ogh#@YE~%C~2ZC`xiIS|!N@8LjgxL_>D126#(`u?j;G7gSC%3?(hY~YD@2n?X z8F7K0J}XwZl;)=QGd4VfJ>+WB>+8Et0H#SniHu{WEIkhGRzusVxe|v^WtLPQSH><@)xLm$z z39phQMBv+hq;u(RK-@&?%xuXksaeBR&?&|9ph7rvb9SV>lt7D0 za+n8AWORJlI)Kmv#ci-(CK~UizNh~VsFQ7|=nYyZgL~$LupLf6hEW ztdu@fc@GP*R{tGrFe^zo`7TnB0e+@~)V24qq^_Kf^L3MFov3_7r<-FRMeMqEc1yKQ zHMI6xzL_0QM)>)C+RZUgRt4m~aewef;y^*c=7~MRVi>2&WOn?B?v(Xr&eo*1=BEej6gUfi+PULN3pm#lknjoB3GJ&6J=yqDd?a1@$Z|~obx_gA4FF`KK;C<$0DNmXy_2hkW zVdtJWPn}V?OTPF0(|xjbyUum&x^Th6?9yCz&jU$*>yHn@hkU-ah%DxpT(S=t9`wza zstv|AL<_`$j7(%a;fNvmq-nG67^j% zG=2v(-iF@Vj(#1kWtmp_+}+jmUxR*u9tJ&I)Dr#?Y(Gf;&r$3@dd5iOAr*B+Qha=$ zM#1QN$5vBy(B`|ga63}y2Ag=_yL}RU7w-FjMRlG+nL&wdg!5c`X(iu;vDAS~$1yp@ z38fgJ$c3@`ktH23J{5AIiVJV*E&-&k?^6xvsg$qTWsH;_p?-#dF` zl`@tRCeusZ=GcHHj4IfTKv zv?@P8b4eiC+eBya+oC42 z+r4j?9AWWFVH9?~98+0&N#WUw(T!0lTZ)0M(m7`}bFJ5wYB?z=7p!yz1MV9dT8@VF z{I>bEfqN*i!2ZMJR_2B>P>auS+r5c0P$_k_VeAEkW0mM4YX|eZm^~B}ptM6#*y)Zi zEVK>)6~Hur_0ZD>HCo|ka+ac$9fV-vdv@=uSv#ekDjv5~q8KNJ1lumq-a%RRe3Z&x zo_jo45IcpM!(gEghVmvBqCwoG%(5f@X%jJctvA;=wN~l1k)4>sda=vQ#6+ry$6{|^ z^CKXZPlktzyTU{K(SNwT>2%%_Hm7nLJk8W(WuGWFuiT?Wq`U?+s#(A830+NMX^AUH z#UU4=M}X}yi$iPXnOSwW#Go9R0bW={FEBj4DEpZ4nMdS6ytm~LP|FCh{wvzy}EE7_j}YLtuS>v^+;7xQLQ zxFX>TE1p-jU#kBu_X|?L_O$xWJq^qKi2`)nt#8tFlXk+WMvj#HtJBr>b4Wpy8}5PH zkEYD$zFRPW9gX5PbVcJKSfgES4zx+WUI)LiNef4JAF6x&__2^)L#${Z82%X9A+|OY zd&?0;O%>7nQhQ$FP6j`E9>sZjc=}13lfwCT1IbRQU!#&3OMxT(=sj5GIpxo{&>37& zmjlSWeKCo#Xw!#kPH1*jNw%atf48s3mCkO?RLiS+ebwP@j_=kcKuF5Go5VFYl^ajk zX;8iO=1kP%{BkI^rKZ# zZuhU>&B>aNr$x_^vqk<0b*%_eD_AT{l%>R$jK-FIAQ9u?XdVKOqQjB9jA|IfPb8J2%#T=V%_AoKi=CXabJWVV)|!!Jf;sN zIhx;!>0JGmB2f1*OrAtQoy8LXVr6|mzAi_1<3g$ow^#AWe{$ zu^(*vx+|=wqU5jvFS*R|?*viSUU#d!n%@bkhKju%y8e>pi8t)*ytO${E6EaF_nxv- zhymarf963-4XXSQ8$(BsP`s}sZX;YU2v$_U(eo)Nf-S5&WVbdbM7TwUGH*}J(8^7G z1ql0a7DX-WTk`KzjJ?>Erz1KQ)+K1X*VCiYeB(Tr+|^_kEWeP~$_E!Pi*!I|sQ0C9 zzEdRPaaY;oT5~C%BM4K*YU|k#nBB%_PA9ec5LeT}lCtbewY^L9iLQ9p#VT=RrGf7T zUm$;;qhm~Ofy?TGxCY|$Ci`XiS6OSrbI{k%0=UWMXxa9_Y?eeFY7PaxOSm2A z_)N2CxS{GJ*m0WnE+zGJ4j5z(PSTi$aLDQ<%kd2qJLp6BbM;|op0(=d75LtB!Sn(xs7=qFZa$+b zGA!{Ezft{5yI&BJRPaDj1^}mZ)Nw(O;(pI^=M>9T2^+*4yj@qCML>~p#sym}J@Xtq z=!XnnGj1`m#ZS+E(wzUX zDQMluo?_Tu;j<<2st*4>_Fz=XX@Gjr9JZPesFwKINxER-xRBTAhY-dsu2UN`SHE-> zx*RORJhR~@ZNTE#HXs*3q_K>iA8^YWTf<|`)W;OUF9lZ+ZINg^agGvQ;f=t4J5&ii z!9bQFv*9UTGFktlHQ#8{D|7A@M>LWEr&)$=j3;Kklu;N23sD${Kq@;d=w&s4tHXF} zoLRw}8^ij-=QA`;URg?WoM^Bqkl9?QrRPIV*M`+eRoDuLSdpzY3(!xmuR3X5_E~*4 zCI`+mHf%(Mk&(&Xy?g7kK8f1)YatM$WJ`T>Wh40u^WV=(E)Dd~W$}P;AOM@+%#4J8 zs%8$PvH;@@>40Tn(CtJ6syBv=EbHybUeB*p1;NDH4);n3YTRr8>?CKTex7ZJQevod_9|d5-3!x*REaD zDHdFKZ`Kmq-W+|S;hkWfZ;Ogz#%z6XCp;M+t&u>$RaZi#~->Y^d&Ik*IQEr_} zt|UE)JrPBF;z^Wl+D6T9akjblzbwgS%S7-PUs_#Vvz+QkK5*cGiWddIeT(A(LZ@q0 zp}ct51=sPVqJo{WUJx)kL%twkTxm5l=q3d4M+L)>;JaKOe zQKsoc`k8zG$b>4O*KOX`jRVE>ezX0_nXb5g3yw+? z`OlP;=jO(KB+F;$re>qn@-#SHrutbI#?0#^A5(Sq@>yl!!Mu_+#usJooydQSY7 zuS+^@3*@sV29NlOIpMSD_^clc$XBed0?*3~wrP1yIp4MHIKH(nP)o}a+E}y7(Z!Z& zWkg5^GYo$)wPt}qV(bCQvWsi;sc~5;occnnZrS}|Tu%Qfb^Dz}1U#8Axx@AMdjSla z=+DV)18RH~+kDaIzqTOekJgjEibx&)VE)yUswq};6&o7FK3v~qI?Hou>@mZ`fNYk3 z=`pKWH2~P=u=53uU*xP-)iX6u`|H(JEqswb32ZS@tmnOPm2GuxLQaAohBrHD6cUDXM%T=}HqTIEMg5-tklSi*H1>hjB| zJys;$y$8Mo96X81w@_uoe{XmyuqVDUmKZD+cdZ^3!z7AGvy5b;D#C-26Nr~R`RQg& z8?Reni99b8^0l>9$*MbBIYZW$TIkN&7K^di<}G=kMF?T7)#mwkw}%=2S=A5SCrY`8 zBJCrtChTu50B~8xH$LSc^Pc>9kHfG+@ATCNYDu++lhoS_?L^3_P|h1wZwsExd-qm& zm+sN>XZ?>txBq)Cc-1L!a zV?rhFeTcHj+Dm1dUN1ho!8;&^6KVMDI4{Aidf$Xb+TB46+H-59?QD|hk2&(ZVGK@} zPUu0J3sNiheugGjqGdtPi*qIiQqixFEeDEYiVeb0Aq4&%)#iL)!z=HBm7g*?#1HhfL(d`TNq+I- zNyZk)(S&J#xem7)$@fC~5VM7P1V3dEqku-MC^5_1`u+ilp~K}?Y6jWXm7ym=swOS$ z{0u^2@)32ApQo1AYbdIw6%Eb4XlvvV|GoJ2+a2)Y0;!^0U)P|pgVk{B=+8nBQgMM> zm&xcRaj_) z7p)4dQR{>u4W}-$r8jwI=(KxDX_EIve6h$^Q0ofl#A3Vc+90-xF}O-EV6B%E!K%`m zLzwJQ?JKm+iyOjLWxWKo$XbMp!_-^SpABo#M_EFa%ZV)VY-USdRGP@2Gn8H_1$SD! zB|%vjTA0!o@&7{nMJ{&&T~LJeM;vG;{6^83F>G z&v#RV=y8)72qB?jYiU9iM8%t2b?ZCskiS1lyd-h+FEFzUY^PJ7IdU5=zY9Ts2$gw? zCeoSTY>vCTXi)B|&}r6$2@?-(xKeI|SY27UY!}-v&5eAdys=c-kXMME-+-pbpJxY* z^6AGoU^wxupFb~KR=w}IO!hgim9O^-Y|*tSP;5N{sxyuFWK!hRUp%j~hEqXApQiI! zn@Z(#|9J+2n7WK&-5ek9z_y9KNkt8* z5LnTgG%O8K(vd{=n0;5y7G6YRO$)|AMZAZ&neUQ0+h1WUUfF#E?DN!`?70nFcC|%q zt;!TwVm@ZeWRqujGE*kjPI0L7+Eqa&_XlaDFsPs$v|bDwJXx9QmlQ z(Zm_J3*;i)#d=@El<^C6zrTGoM#!b3*X-E&tO3kE8^kmksv3Lu4yc5HMNyuNn-WK( z(BJd4t;P#d7B8Xq5%ZpjMPNrs^82l-K4@ItyQk*oy1;NOpS5Y9I0*SkLtLpjSXL5= z4U;+QT%HCU))2N&B?1Tg50_^`caVK)R-e`*>&d#;hKP^wIFn+G2oeHkb}-Iph!Ktg zKe|&n#18?r`fu{>hd;gLx5;4FAL*)FFU5ix3Cevq(NW}G&B}M_*z3VXF8mWE=6l+k zD=Ae|j<_p!c!Cv#z{3s>1TCK{u= zllrbo{;UgSj>^f&0bFp#aUWI@l-TnfTlk-Ce)|S2QWf`S{kylH0#)UE%0O)7#5p`q z#kyw5ih)~{Y_^Bh-pN~^0Lu7u?DhxhJ$fh8G?0&H>C|)dJw)}hUX#KRInA{TyZw=U zg%-n~q%bj<98Jw+xkxz*w`Pv*Db>HzGS3b-h>z%-9nu+R=J&hnlJy=3tieh}=uu}G zz%oZfk<>)}Z(Te>cOv7gx-Z2dpfB^@A##8){%!;OiT+?=p}isU@*o+P2=UW}g` zN`;a~#{FbDx#&y50)rHY{}R(-dIG5c<)@a!9pB1CLRpYogSZJ;V7a!2w(t1=9UtrE z;f)tO2m3j;jnxYV7$L;>bodkCDVC4$3Hq<+_;Unh4Io|&?_M0Y-4-7Bk6!)``UxLC zaIgMB&t>Ncq_hEq4*audd~MtJ?W`P1ERZ&3S*(EDc1+y`8FIUW649+s$eekJiWkXZ znwYK^ZU2>>)A5~T5LL8tYDWnCeJ?34N!gWu(o6LV;RLY%i!Lwz*XHWa}#AYARAdfjEQaV_3M zS)KJ2ddg*c9m#+69BI()M~>x+)kfLdc}o00jrzv-xT4cOv&*Y?wbD(N&GW0ReKd=Q zt+tMzouu4)-9!HSyor#Ul$fd@Z~tv6@0@^t=k`SzbUnnsO)z>1=y4HN>eJR4Osy}7 z)wC887nG;-E7lxtolcg!N0I2UeIn|WNGI|5vBX_4>tg>ev)<3tZ#<}s?D49_dEAda z^Ru9zZr-%|8_HpO`A7EUui4Q`|9^ZD{giIkfnraVYJo5@Rm+WQS!xe+YJMLexL)ob zhakz>-TgXk{IL-Mm7BAG|GPQOD*$K8Nq_pNoXhIH*W||H_)Gd79}Z3+u>zx5tMzBq z&QnL78F#7${W9wrh=W(ku1$ztw_ij7Y{6CZElDomE z{GTJ?smyo65cPD?ZptM<36uIlH*0P}1>-2>;nTry`Jlcc^`po7=r@w9JF+xQFZpA~ zYHDX}IRX&tG_)K#YD(hE4-(63Vur31;PKAO2Q-TDOF2ZB;Wp(luf!*g;)}Q55xk9- zrE%}_WX~4OO{Ql=s%4mLTyL%Ro7^=N8j~XK`^|Ju!-o1A@-f@G=hS4(Z2Qrn)>S5X zhaHNOf0spHCXmiMVq2UC!l}$QULCp1v*fEJUH;Fs5XSOpZo=SGKpse3|D93k|KL1q z1oOq}l~X2=e1IGxkx7<~d=eB>;z87Jx~a#>b2wlkl1nLeMG{p9$nZJ;nu|F{Pl?}4 zJkb=FdjHEai%);dqg;rEyV&+>5x5D_B@N48&l|XiKlRSbsi2$RUHNB0Md}(zf*|#B zRgw)oZ=ZimEuY^Pr&Cl=P-OYY^Rij{CmjLnhl;bkNelr8(`r8qI`k4^zho9HVx=&r z48_GoHH%QOnVKAmPHjCURru2fosE`-0s-##oSRkwtaQ| zeWhJ+f{jRxr#~aMyG@^tR(UaM%WR;H;H%e89Kj3rzk{n<;L$_pA1k+$Wy5ZUifVk* z8L}phMd_oQfY#z$_GDqA5&MD5jK%HYBbTLCV@#!B;9z+saAv1UCSr4aMiTQjE15;! z|NOvB%cgf1^4*suf)scVsBFL4rIV~o5zv!iEEVJcWvGJ3LdZG>BhCHVdm;hYO=hoDz=Ugdt{v&ESTLZiWwu{*z>#M0XVh2uK zP6Jtz>1+GEu^1bL7=G2OX5PpbFN^{mEIQwV8^`Y zYztv5o$+1|@?A{RO?~A_m}bj+q1lI@n;NZG#bd{-K`bQko+Ra|O4hESgaHvALRTIk zaBY*w(ViX2L3}GV)2;gEs`zmn-QnNEf*0;^Oe4N)yF;aT&Udr@d-eI_3`dVDq+5&# zsH3``xAz`PgtFJoG~S6vM^1?kUxm)ISNVDaJLJkA9@-A57)itzMDkg6e;r!M7s^>7 zDf^tf@;WDw*+;8JCa5bTl3hL7Qhj-5*z?8pP1n)hJB3Ep<@+TgS}Df1ac*S#$a_JI6M3uoWfpDkS^h`uxC&jq4t-_`XNtIhM2nqV(w)3|o7W zzfAszUrs$hx0W7xkIn;j>*BigV6x1vw(ykc=k=Wr9)~QBH)jI3O1EmfMBAnZ56;Vv z__Gbu)zTT*uNJvyK60HKG{%lE0n{Sf@>_iNMla~KptGcOvFr17&n819199D8XX=?* z^2)1JZ|l@nA#O$;sRKgQT|>hvT3W?}mNv5%Ipw0$<*%z}(3!7}JS;ru@b8`IC-LJL zDT~(r+EKT1G|xKTNeFQ-6Ppz`Q%{3jm0M&?-dyr z57#ZyLU3@X!I}Dw(F`Pg`SuCB*eU7ar02$t0MFWFad)4livG6~eg@^Hk@NMN&R~r4 zC(OZ)rMIteuW@t>LuS`hN6+rI00UNJ_fTk>^Y?~vP4A`L7TngrbnilR>zLWPXbb!1 zUR%A2`|AGuW;9`X_eIY z6E>Cc877%A9^Zs+ON=Ny?M=Ld6USP)zAP0`gUTB=k#Q55@rmK)6JAD1@|E1 z+9tuZ&uN3!6-^KM^o1%jH4QxKg$zqw%b`+YtRA2UIAC4hexrhD!*f6~UF=9U?DE?z zk2q^g0YrXi>iSL}sqo2^QZ3(br5`A#&wzg6sl|{&ANou|d>sci;;f|SVw>kOGq)P( zeHDeUtFz_2YL1?K%EHu*&g{PC+JAvVXC3K+Y-&vAb6BsVd9?EE?<1EK<~&s-1tyoy zkegF`(R=e-Jfm9oY11Kj7EGh_GG!!N!|cMyoF5zxDc6PrD;o@GXsWzr1RmLDI2zGn zI~PcVjB#E02m}-tZH5LZ8VeAEG2&IexmF8rW$&w4s`ihJMJ(8Jc9=zvoj>!wJKR z(=?tf+WAj14m%=I?p~r3#kg1h;jH>X?^l$@!U$UF%F!%pizPFd6rnrfX-Hwt+T!YB zpzGZhVf3Rql$AzPLm@P?1&+KKr+z-BmE}~Q-s{a{k+rcF5>q*y*)ufhHZl}D;liO3RCM>K8FCDZZbF~CARC&g6RmNE@+X?ZAW8MM2ItXy=ul$I9@J0pxj5eX z+Kah2|I%d5{5v<+8Qk;;914eRK7s#T$_wQP1Yo`24V~Qz;A)K(P6gv7-9>)OuDkx^k;TWW0&IT~;p%S98QtB13KqB7qjfN}L(N)@77rFEo*)h|y&a6|)opqD! zO4#T-K($|)%~(7<^-f4(D0FL2GryTfzx?t%YZc6ulcBhZEhh*I6@0)6E)a8#>(Bsg zN2rFzimDgLnLrVYp~anDp;C$j{36E z{X{XbZ+-0KF*UYt`M$sJ|9xkSj)5#+xI6cp^6oaIC2bpmcJZ6QG1YxS+2E^tQwhu|4(t)I zTz{o*gbmx;P=YA0aLCG<5{t3xpd2{2DQX4n%w=%j(vpM&OgP^z36C3ed~G?AJz$9z z`XS(hpJ`VIYbKXspQT9$bavlYOM0OPe)Ds}G+T;=M#DvPA`kvRSKv~E7YIsN?iP^} zpN+=`J_U*B%>-o^lq-_1eXZ@c%Z6+hwE;BqC}aKM!~vzC%*d@R3++YmJ((I*ZIQk? z(;Y*;SdfwwWqJ(uiT-vfuVlM+r3SS*)VT>y1KN$yZ&v+qFQ4~X6kbebb6piV_-uvN z7|vQXkhY%bwx%R$Il&2v?3@$uW#+h5W;SQAJd2hQu+=L%?BEVk_D^bqP9yJt+Dv|* zq9r;zsj+s5ah2Iy?aT9%-9Myg?mg&pSuAgAG`VIyc{kIdJ@E^jFn=Oj6`+w)svl8E z&svHblvox(o!d4>hRJU3h!Uk0#wRsF^6@vbOqGHRPy7nk1KY|M`>1~$^%KjVV%fOv z@OZg8Dy`_p$VBGPHtx)lpH^H`1tD7-eh$Q-y=yj7w_E};cB7_zl|)at6r1w<$eeYX zy^NDQjdr(OGCWpzyL0@A9RZvxq(fv7mzI`wSc z3ZJcCd>lEnc-V5P1f`C|CyPFwd^sQn zhfq?_T_A1GUzC5CBa>lyb;vboHSm)SoTG+%kbqalT*I6R%M8On(f@!FP%eZELa zL0fC!vSjuZGVtB>y`JUTJgrl18nYoTq`8g;UUOup+5CSPAG`^JdpkR|bg!KeZ<)6`@lLp@^(zqJ)_ z1qJ}p#X`pK!)OAbkDUyqTpbqG6vcL9=_A5t4FDei@YZ0QD)lLD3E+qo#IcM&>fsQc zDxA-1l4~in>}bK$JC9|I7j9HBN%&kQY^i&J*Zu-N2CdEs;irF!zkl?lwNliu7=n zEn*RM;O&@q5p2s3D_$R0E~~3IdHZ{`_?;Z!qj<6kIEWBSGdWlRyU%Q@75&(Z5r0F1 zB$*IK=0@O!D<8axt}b(fHK-aAsAwUAE22d_W+Mdj!yFEMJ&rCuCg^x99+K z9Jg#fDM$jkGSqL;TJ^mHxUWj*B^v)JkUF!h4cf{u=v(_dLF{pw$hR931L2)B)ekZA zC5BGf^uAk39*mw^^FN9w{|tg&2}WxZCB2%&tHP`Xo8!D5T`PwZ!A2V$!P<$$0y<0+X`lok*j!Ab z$;{cps8zck`lZf6Nc!&IE5qN(_d!ix2+RzjMER4_$Yn_0Q3)z**i zM^gKm5BmE@(jGtle&vwF&>>WMgTH!~%X3=xl>NtQb?d?^*BvHbfY7fMpWs2Z=#!+x z;Y?l+S0O3lSA$al+x;wADeeZl24|Grdu}Xf73beyJzzy=m+_UM&%3UBxiU1a19fl2 zWigH&6ETL$*YuA{^d0(!iSAipMC>c64^oO0iZOO4G^FS0bd5=7A^_7uZL^{*e&_AI zX5uX)kMb^5f{i?$VAEOA?vKVIoy=~GrIAloRm9*TV{zfv1+Rbfh~^KCGu5v*_^DjZ zlNc(=rMqmMms@=@DMAeEEAH+(xw6IL>s2Hrt{7_)W770SGSagmHPCUw857C>d+7U5 z#Sr*U=SflUCx(%81aKI6l=wK_=GYg$b?Xp$nAZk%OYFOO`Wwxffq0v)e2d*l-$E;0 zY<&b>Xa2B6KV1>nrL-p=f#1BFsp*>vI>T0D3w!b2_S=@xAT&JSly8Cqmr>Xy?_uC2 zh4hp18QRC{?)IA1=CBC;B;Jq*FWP76HrNvwhnwDK$ztw)Y{DMi#i3h~3~~)@fboNl zet}}qyCdY2q6ortdB~hLb}t|nZmur0WBA3N-_KOkFVxfazGftm51yaSwLx#d7xtrh zx3T4^>*gOYIl5;0AqVulj_Ip{u?Y$`d{sXtTbJ z6Pe1|T-P#Q>(#}K@yX5hwF_!wYk^O%x|okpV?0|0(vt6liZIyV zDnl8%E5>Ms2weQgoYbL}oC762g5Y2`Tz4>Y?fVnUsrE~b9o(5chy(m$*NrO91-@%# zzMd7y9FpJ5?348(gL=w>u?|00H67f$Ii^<%ODTs=VMEK}>ibZe%iFfdKbJrBx!i$n z%sBVn;Vm~*3Iw&gjx23J7Upr(iA?D74X9*o|dV^cyKY9)v&dWUBuJqhW#R^(ofdDW?G3F@lC5e`apyJROT}z#8eJ7eE zeVAT%krsI8ohb?hA(}bbN%tfJwd-v93RJ^ugAgCk=jp?_3pvw~R3WsV z&r`-P9_LE&8>C6tcs>54zXIYr+*<+?tv0&M>$yDe3NxP(DuyZ9sMM`PQxMcz>JCaV zofw%%S8`fvx1L2gjii(-8G~>8-A|jZ_7Ly?CzL1*vS^u4?qq@4d*YjI&W zPSUdEZxuBX3OYYC_)+cO-~K$gQRhn$c%{G3))x}$9|7u?TIG#{G1nbFSppb(ZL)nN zLto&>P?P}zM;lDMcJ2_Phq2RmQ}@^QxXYT^GF_#b0_A!sYNL$|zr%zj&e8m;D%nSn zIq&ja{Kh7cdOKW)IrP~+I%)lnq;nR;ZUGXwTyH+%ofuLwto$ zK>m6Cam5U(+}slngiSc)w+`wNS62n~`!HG{PowZ|vG`!?>Qk*&iDp&icZBH_`CKDQ-e@0^Rz7PC;ES>=~7A#Wix-9|!(S>ulg z7Dsc`&&=fIUIa36Sw4+ysjLVwz4oONxePL=iAeea()>-0;T0I(4gmHMD${R*hm^I< z)4WvQt34My<}7gimLVV3T-|}cna+!8BQTbVeq}41bWnH9KAJ(tEk?R43dUVYWXXt# zj59o7CTad(jklv}&=7sNP%E^WH)qZ7W6EG9P$c|X++b+2$I7<#Sl^ywEDGq8;i=jK z_}Rhnd?Mul(R=_E?0H%BlFg=1aJf==3Npx^Fjw2!xY32wWdVSbdgk;(i$3C-X_Gsn zsB70?_c0i;+)xUt?jINBkuGr_;}*-47;UL%$2+Dv%?cbkPXxzt*H@&fv!9^9F}c;# zD)`$ePUiplS64$dgfy{R&QqAieR_jor)7!O{ijkhUHCzZB#6wp_nO5u)2_RzfKY@A z6d)8s1r7kt=ng18sr`9o@}?FYQH6kX{utDnO87|1-IjfY3ik;kbsjs1vjG z3Ur{UQPfK$%;g-QZIGeI$~^*-`=19i4Xro3T2?&JFHX_Mo!|8VouR2pupQ9rx%qL% z$-Gl(Z8&cVQ!cJu@=&hG@_SeHA#x?VBg)HyX6@%P_|p*iK5!e&z0T7@L}h)f-LvFl z=~5fz!LIv@XLZ(gimUe?nzD(~^Kk=xM9zhp_u8aN zM1ev2iNnqlrY~H%o~$_G9rdq9FW{l z&_Pz^3a%`F%(40|!z`uS9ZBH^E!FixvSMx8`1{Gvbn-ld3ue|=7bC8kDQXtJuqJ+c zSa;fK{O-nn9^boTjTDT>T?KBjswAr{3dU(O`#cSD%^_P#SQeiSY&FvwXw0`wO!Uu@ zVX|cG!_)AQl^f&F;Wk_g(5VkPJw3;R{mhMxt?a=GD`X3$eiG~3%KM+zL8%-7iQbn8PDc4S4O{k``>xzx9OwG@ zs{W;59tHKx#D~$W9;bqh2}TXw`lDaaA3bhKX#^_HyWa%aQJyyq*gdZ}bW_@s&a>qT zA3Vn_>Zt}nlF5MPU*#7nf>wo>RKOp5bbl#nu9}3{z$vs5Cc{Iz<*XIZTWt;Q*{$#tN8!uksH|RRdw{<*C%zgKup6 zi*HxXd`r0b*bXOD5HpxsLvgIWzN{#i`GUc^u9#1SC7+#RP^r$K+aH|k4xdr8SDut1 zhUIW;rcYhU|17T14B4611W4B9mnq#U7E+qOe_)bPIk#`x+N&q;K>>)*t_+1kz$-7K zWN8t4Lql`uI4k<+B8^6*d7svz=;sxiJ=n)ecdIoGoOObG1^{AM`?lKH#kAFDv2Bx0 zBk7}oxkjB2Q(tu#3W?>{hb~VLus~Vt|ihRV~Wi2{Wa-Z3Q z76#|N6VGb0#w(q`16pOG#qfo8un^$(z?2-pU>eWvQ;j_YY35BeGfq_50kfpqFn79$`6#5HMid|vd`f61>F<%V^Bp^*ojF>C$R))Xy zs~qxI5m;9}NSEXF(Gd-i-}A3K4xaUQf*2NWL{`6ogWoI=5pRv zn5irB3rAY(X-YLzyqEWlZJW0dc6qR8P#h#qG{$h(}Wfuv7jk)x?nZ-Ah(B=!#8}5DA3APvtW+9qvTi3?Z<+*f8 zQTl=OwHL9R!45^?tHY1HiN1L$Q$2Zsj;AWa{I?km{03tAtHf(Rmx$FmZK;kcV;8dQ3dM$Ia=3%rLj(`T zgz(jTmaexZVGz(U^hz7w5)4U|3#&hJa_H1)XO|mP*R_*SOQr3o&oX4a@0@Q(k)yoW zerVE+b7||*dX_QTAYaopwLVbD?5;)4)RQfpG`xdJs0l>60M2U3+5CTXK{>Mu1tCR- z*1@=8 zLy9sv-=ZVKH0(}+5ksh6hGoeO$mAcd3YO$W5KBT6*$!A&^}PJ zb_0mI@Z1*8Z;gP>Y>e8<4dr{($~b77!>+lB9_6a|&>I7H{6PeM7CotK>^$9do9MoH z#(V8hhH7e|PQEp#xS@EURblwr@=zB*?UPBG1MP`>3&*dQ%Vgggs7Z6yEs%@69_*I7 z_(eVn+(^!oj_%H&zW~W*a-qTc7^^f+CP7nVx8vZ%!lJxGYXO04L$R{OFyn==+suXv zl!8(%)jDSPHX`}WNc&>YuG@T~|BFUj5C8SxdEMP?&InyymR5{-YAaieazWYfsB&Q= z)m-Vx?5+wsP1et8LX4}C{HoHlIhr+TvKyYGrbH+max`0F+J#zG%U;vG^lA0s;H0FN z_Rby=msxjxgc=E)OxO~gS@;>xuDR?IovpDYBOj@@O5Ix`f{6(s5v@tBbJeBU0r{Sf zDq}T_O0~bEI{qm)z375$h$WVV4v=3PCm1_J5u8)w1;VJfAs1^5{p~280s|lZQVKL{ zyc%l|#SSt#FUfYy-;T`gutc9Z;0rMANp;QwOWCxZif_&(<6g=P?*COWF1vMR62rkL zJF z_fngf^#Y$Q+oXapsNO^pdsy^)yMh}vomaoHns7xJZoauX^;a3l%K8pWTB7#;)uGM_ zXSkk7NGX+7nVfx0eH0Iax5`W0C)2!w?0sK}glefL8PkuPDiph^?>0b1Xw< znNwLqy($%=S?=W3ifoxGh-&8OysI6uoA7@`F-1ba)&RM4c3%7>q13K+JB04<)5*^a zCIV6WM*a6vEGb%f2OS3LZwLhJsapiShh$5l9>q`m^bSiP&ZEJN^qNr>nHBag4rbXr zKhxLPEuM#s&$q;j*MAxZsCmn_5_= zAWjYCO^g|Por-Udio0y{c*%jzS3Jg!VgM97X%dzIYy{2C7Q)rT#ycMFua9SbxkP@V zj?&$cynP_O(|3A*0IGid1uk{&I4PU)D?y>FZlQ+uKvo2+s>RgDi$J0pu1UT|MW5*AZ!;_?v`BK z5z$hT0)@bUfcm<9909`pQs>0MEo*Q$I10uxCxur?s2r5=U9V5oDY>6a>s2UP{udXh zP<2rM_`Y(4W~1k!_Ob9(B+cH2vNXq-5e+F}R*LwELR?Bb`&I+qm!)aCneQ<{9sh7u zFCr3iXid!wziGPMs=9u9@6zn#f|i?bHry0QePYZrpm!i_-7;gNgO4y z9QH7?6>U3>_nrBEh6J{AS_Bv#)4dLOgP5f_9=FL@($g22&%X*`6t(Fr*6WKC6G&@lp$x2*?=gXS6!)^afn4iEkA(XLi;_nUc*PGl{AR#x@ z{1h#R{5kunfdltq@@3ZE5N7d&7p2wEOobw+qeuA{CEX$raWP&qY}uL;O!{O4XGhs) zY}qPB6I(}A$h!}=XT3wRFHyRn$c?uhccK4TsgP&!i>K@&cY|6cn3 zy{?xA8BEeM`yFNZUxy{)`%{B*rWt?rm$OF!T0NUL*7CpaiogHf4?`$itVi>n|2+l; z{OJ!8NeA$!#a=;N!%v^j50-)(xLw@0Y*2Dkc!J$AE;~Q2Lrr&0{9wqA?|zv=Ixa*s z|Nmj;Byxe+dEnLM&8h8btDo_AD&6@Ezr|vZt=p35@6SW4cl?$C7##QRrhfV_%5}#t z?D+WKz;}2eMkXf3y_2K(V9@U>5p|e7`TI8BF%(c(XC#MlnB2MTtLT3nORUP|y`m4` z7gl-b{;z-Lj0dUwV9**}x?NNEWfCcoY&IJ;j_{`A=9?_2cm&3b_g zo~s_~;Z(Hk-6b6Vgj#|&%m3$d{aORS{`!|{00?g}hM!^ChLyASoy%CXI)H2#dbgo+ zw~c`;3U0yFS=S7I=3-MVE-T_?c z)7%{4lQ3{uP#qGA`Efs`)KivF^evX?XfWwwgH_&Al3UhMpj^Sg~B|Fz=o3|4*^)!Uwnt z_fVL6ZodirDM|F(-Jw;{Y!Y^x!z|6wm6sLSTr9iQRzK#{THMhSf=)WZ+@;V(jsqM$m7Q!=(*=yVw&xVQpSwON@_?dKMkX-8l6VQ)H!sB`L0aG7*CY* zRASj#vH?<5d)-Hm*{e+*l#|+|lYZdIk``ROW<(Rp0al&Qz4%|p$y3tR^21kpW;?YP zJf-1XXID$E^+toLL4VsoTj_LvK@_-^My@8@q2ryD)Or;8qCWsPr6#!^)J`-#@h7CtT5`dvufn-OcK)? zq=nYspt?nS)}p-|=o0!vgY2^f%FB4jM1k8Ec}4pZlOLx>*6T}mPR;QWfzX|AyFp>n z^ui!AQ%$4cIIBJrqLLA;33C`m{>N4F=Vkt@KqWLKB0sysm$ji#7>J|sRj#Bmg_tR-DP(I8I49-m4W&hc~+7HWNe(`l%^-| z2j_X+?oT&sNJ%aBIz;#ltCd@VK^_2a&T8lgqc3%tJA3sH>YLPYcAb6Kx57V?&E_j z-Mfs!6`5{>9-239{B_E>8HBAy8TzzmX&X*`23n&lF2mXsl!iN^?J%Wgr+N<2Y=J;k zZ3s~BXhv0 zvuuxt{#hU2_2KF%$9m-I?%1ituxvs~wcp8HNG4k%p${HP$zOT2FlL|`qr>-OhNhbw zL=M=bx87f91KufOQm~N7b~irWw8{R^Zb}M`LQ4Cj5N4x492!q2^drixtB2?XvW0OP z?`3I#f2{L{*Tm6N)X`XPR~xBlQ94(a1oeieA^|Se8ckG(4;O?0o`#y?nk=>(8Oo2r zybyFUJ`HYzL6Lkln+ln%bQyuD5U%{wz*iXE%`pO3cz{qFn{ z@xK4a_K}b{{;NJ&o6BoLM#j^2`_>J$zSLdL5rLESolK%c>{>HDN!f+P`0+sALrX8* z^S}E@>+6fHsCA`V`>s!pD}Z9pASyUf>NyaH?5_8#;H`VqKR(z`QdC+@uG}gtVifec zRTsio&;rgZhN}caG*VUR?AdCKEs)Kc1og?TV5~sC`~3YF{)`*ZIlNp^?H>{(ks}E2 zr}AVd?Zp#9poGS!kFo9vl52>JUQVtaz?%_a2{)*wZdeeGcsh{x-(=-^A5uy z_CKPxzr*SyvUH>nrPgVbbH{GIPb%>_7l*N&Cu3Y(ywk>BIop$&-f601C89cGQDD`{ zd!su~0ivu+)dR(we>etM-m527dY97^aGH;*zqF#6_Z~ zo8(-EcPSM~-U^LJ&*VgK*%=UB%qX)d;=v9k9jrxkR7abml??C1zIWc7no$L*Imymc zrJ@!nRSCOICF%>iX?LIG(tdBPo!3+Mxc{*7h_u4Y*~!E7-7J%of=y*Y>v_4hFO+|`j3{Z#Olaq-?$|QKUlaz9C}2>{X_ty-Yz01AE>eDq zsoVGSFw-}~H_Q#A_;=ZN;BKeAxORb(T!|u{l=hERv7NBG6ZvxMy0ffJUw*;bHIQUL z>J*?RjP3czz>4M~=}&2C!>QqT!f&>1*oN`CeHC4vbC1f%Tt*;6 zt=&+CexL8=m$lL?g=oxzQZ!~5RTKwT0G{RR=6_^hh48d2N;aBFK>&^1;as+>2{>kC(ctAu25~~zJ3R@EB27Y9H{2axp=iMQ0+T(H(+5b zsVDm4D(EQQD~RII)L=e*>IhP4ltOcN+h5SahM^%tD@<01NWjL50r_N)Qw4@pW?V}F zYzZgjLv$aI8g?)rlx(SggHBnu)!bP{3Z=*Y@1#VNgrMO031AF&%qi4 zDU6&_IO2crynwKo5{bB2!gF9-8X!@H_>*PMu*_5O2ZB0x6i54ihK01>-xOMibqcw-|Kz*`dp(Y$7{8#aK7aHw7y08%2V)%FJRfL9?dzT4D5JWvTX zrA5W_nppr0LYFQ&6tqHs8kF!`5^6O}9<5_yo%I08`IE?RxBlzs&pZd8VV>XpAlW}g zUwX~&a7SP~8*zVq=c`1aD&T^r4rS`?tX=`&sqcwx*Gl}@&JA#=7mj^eXyLqEmf#q8 zX?Zrr0TA_S2kK;TA1z>LV?&v6Vcqd)P`OR2Ce?AHKfJ;QrBcPIUqHq{r%RsV-%h=XzUEv`&6#HB{ zRD5foV_FedlM`xV!oTGBw;A}I0Af8WU`+a(rD+9-@qik$j>K~V%CMwdeYfq3@9e4% zvJ>o7_Wa@y093*#CMXL%Q^~|<3zn++D1fn+4h!^<+uz{rf6)TrF$($+AT?4ekJ8|H z2=GAa8K_t=2^nTos7*SW91QvqT|qI4VuOJT{$>@lk2Ky6XZu>f@cq%gVX$mVO{Aju zQO14w1ap|FNF2XS0&sQ0BpD32O6*FD9@Clbz7o#ZpE2C}MF6p4o)RJmz#Dz)i>X|m z6Avg!3;u1|12|~DL4asz3DZ+!^q1M*t^ojn!$xY%7*IG0P!4TP$pUN?yL)@Xz?u9o zQ2!F;Cn2t9psB%tvLz0C38K|A-rvUboWlox%(nxtUbs8*an37Lg(&m23<;I{19?fw zwFbU3^JWDOC>JqJGcDd<>t(;cJzGV2j*McYqtXt}1hmz8 zev^{&)MfWBSf`9Gxb@WW>j`k*Bp1^F+`c-+;SOwSo;>@QV3I2Avi@`x4uecW-CkS} zs;H~8j9NgwWEN-!-ZoN6@l3#KiegTDZi0Pjs12pns809(+*-? z)zl{DmXOnO^9Pc>g_tLqP^--;7oc)A2#TwW1~e(%e&M-iRZDPWsy+;S;qv9t>4HKH za!In8YJW9OZB&zy6~b5>Xw|cW?qHU#oZdPFdSav*v``*+03_cZM(s*QM5arcLFJ6@ z3~&BA{69_e_U8+aLCG&{?{WwHb?zXNJG8H?iOe;_1U2I{?lk;3U(H%V3eN~v=2+`GrIr6->e^!uCOV*J_1}E@B{mtKo6dxMy*owxL_6O ztMe#SD8RfZz3O?|dQmRrDG6|(@J+LE2>I^5HY&H6zWMN5_T%X)FwPTbP1shznHPRf zmQE@tKD_&goc^)(>f`h0&#(6O^>M8ZEpu2;{G{M)d3JlHFFDvoyGr_k zQg@?kM}+waBeFL<{qIEbA0xVZkBBriYG`(;;y*-|&%c$<&y>X6%8lo96%Q!6)$TEO zBr(k=RU%H%CIS(Vz?Yw21JKA)VpO(DJQ);T{?~QzBfhBa2h>)3*}0qkt|3=Nh$$pH zB8%07fk` zhFckZ_a|inKH9%HTmKl$C)!lTjrcB5dBCi_9@pPmmp@I{PZxOHbX!N$??d}?;SWQT z*m`N;kcAgy17Vg?{_6|>({u^O09z5^0`sW&?P&~3w@dygL((9c8cfLnCNRZ_Jos$_ z|M|QL)<#gdm?wkm?~D8S8L*=6)v^U38|EkH1`dxLp8g*vYIJ5%H86?lzdfyyisYI$ zNNXivhGDHHupVwz*ZnH{Bhw%LjcNYV;(SBdzt!16K z*)+LDA&-=YB#VEDspQ%I8v}x{hcN#?zM%tH6Jdkd?QZoV7PlgXi>M5D{y&Z5q8=dl z=Y2yNR?c(JUTOZa9kH;sceTulOZhQt?HC70(ao&v5Ic2dRWkl8F7M`lQA%)pTD)x4 zJUYub9*GZ}#?ybzd_`o;p?SCSwpfi5C4L%{gX+}IWDqSox?5}I^xZ3Z)s{jr?)Ss_ z-)Dp5owKnn%shg5$d(WqslsjyayJF0VzwkcG@M*nSm~X%cXfS!Ta5EO9y|aIy{1nFr z()1Hn*@e>y;Wu*5Y&5`7_vNlrx`fRa(s2ZM|a< zbA1;M(3rEfM>3fYiw>J{wi=-IzB+Wq3edm2vKe4UU);D|cbKnh;w}5btm;a;EpP)w z2gh4!dvdPx8(Yf{4`oBqj#LAL18Phci#4V**v0cOK}N_ZZV6El&d)qw>ABJBbmw>* zM?yxHuA40mcz3GLFeGJccU0M{%$*p;z?Z;IbooGSsbqJbm8OyL9@ABp+4NYZ)D%HiE~?cEoh5t= z@|@DsU^4cV{@X>IfhP22Ht{-Q_IPnTT~@zd&~5#gr;Fahtc8gOkCuVHyY>p$&P;nX zO5<0E4=0NH2EG0$_v`zY7_C;MghSUmfs6beVfk(!-f9V|U1NIKx;^Mn@@UfIMpO*m z!e#xDIMW0VG-lLCzfbIw*y7Elp#m@qg`HN9C9K-k7$jU2*mn9EC_lF7=C_`xzF4de zi%4BsTKY)WD(wXpJ?UhrWi(uVfB@dR@hyYK zPhlOy-YL4~&hjVy|Lx{lP4?CE>uDpliTh!QGWaF=qkT10XNO2-b65`J3 zX%&Ga?1qG{1ZCt%F3|u};iu%X&{4*ZBw*zSfd3p7Tf0FU_!{DyO7#DFm@eJrKCPBP70Bqa?qaFmzG5R`o@sg%{Nw z;z7sG6kbOD$h^;!iG4kI>{Ldc=H zkX`sY@wg-0#ri9k`^9T(>fRsh-2BCncN3%INTcnh%U>tXhFk*3c^)OG{3?>SI;?&_ zE#0H%bFGP6s&^{$v)x0xN3`SCH&kq&7|{290#)lkj}>2A<9I>H{@LLUUx6R@y`8d^ zr%SKxnMJuFy6!1U>Y(l-0U8pCMAHxOd;AA(=L{u&&h-1;-;FciW|iXKTL^aCgrD>SHN)-gsY9;o6lbU^#cv zJS`GB$IYb%M3CgFeQV~#TA*WPn8Pa$y__l0KFaY(CK*@wyBx6`*$>Nt&@BOmBXFTG zEWro%vS>FmU3C0RD6KKdin3rr!Bo?9+f)C+g{&vpaRE4xvf6|DW)Xkb#&TjpBo^LEokkNIP7{j z0300-c$d-IL&SOosApe0=aPxfWZJz;^b|1DLPa@dz~)b zO`ax;e57Lr5+;3L>B{)Tx*Yp4XDt#a zGVDrq>87*H8yHWE6F1@qx&-{F1gJZMh;W{ho^j^kMj&A=xs4b84@k;E&fO-w^Xpqh zz{NDx+)sJ4)6znR@EHpVNp;j9kq1X?l6a0?yZ>)dP7Xuar55A^xh?{H30A=pprjgQ!^r%SX&!aU3QKw`GdkCO1yG+2$N zc9-5|IrAk7aPgl>=;)5nCUDQH|JoiOU@UFhss3pl;x0_w^n+rSXvJ6eIP{>oc^m61 zVK-@=Qmy^>v3uUP`M0Wbf&+NHyxt=PD)xuJMSm3_fM3I7o*}19N}E(wWbp8m{Ay33 zdSP@DemmXrYgk?}52*06tE)T_d~xpAmoZv#y&vn20mP3*G*oy3$98(2A}8x zR0S$FW5mr`@Lx=Yz1nIjU;E;P`1rSBbS&n|`y1j2Z;XN;GODa01h-z?idau{vcw7mLg0Jhb`=IFB z=)n~$Ee6eonYVUJR~mMm9F;WdPDLi)78=vdT=QR}z16plc^A};>9hS*zL+vqXHK-r z+nw;jirr}0>;^c7{M^9c4_;I&P&+R(W9_^-NS~ILX7Aw8wEu8LKM~;33QK7q%Tqk< zk_gIHxXCQQhBj3rO+|c}Oq^A3t-k%{@#Vmgd@mWs?kW`?zA9@$@FLCgw((?o_Am5X zTewzzp*WBLF zt0VVStNh*fu@{Fj4;nXaAoe}NId*ZIu-2m_F*haeItNRd9tge1-qKUo&x5rEefN>I zcl*}RQQ5z~H<6o2U!7x>x6I$0sdpg*ntKG9)t3K?5()N{@PYeFpfQtsU0KgP^vfI^ z@ziXJh}~#ZUc=k8)5WB{+a9}1rnnzvfc4fPxIrV_@uKT^qu=DGlwXu(#!iM4!njbJWr zin2Sk)Zxk`GVB7izzyT$$3JH9KVI|fTWGv0dRe2hIQ$^%mQ~#@(WrJ{(@7&A`ZAB*c6lN(Q%gBeSexfIsw``_bIVDB$#oWo~KTq_2=K zU{IyLC;dy4D~4zlVEd6oI8N?E9hb9NiLO7jf&ox2vP~*4O-GNrp?^=E#l33!C5}N$ zfGY&gOgn~|uDuooDzDfn6SWOwx;1zjaJs4l^DE3Y7_T3eEWN_`Jf(HOcjFE%p za*Y)Ry8hrsef?w0r7ss`HiqpUr-=C$;jz1kJVMR*32VU3=jRiOO~3TWZc-I2b54sB zl6&Eh`jjj0yvq)LPShM|>t*8c^F5v&B8TCq^KAi>Vcr^b#;2dA3=T3Ys-j06qSj^j= z+xS}Ablju-vC|Lo+OCp)HabfuqBV}DEx*!yTD^=PhSjA8e&Nl+G}qm^T@P+CZFuvZ zh^n1QygGZ%x5aMy#Z{kkKze7Nzvd3|bO~{c%`tGNeOY$ptF?KD0_*c0eV@sj!>4pF z1Tp)1DXZ`kE92gTHfuV>ga>$~ZP2)bBox|GBt~{%HAqTN=fBB*=hq`lccvAR`~8jG zD_5?xf8tTLUtX7(dVKJJ@s^K>D-)2%*G!EVdJt)V9c%MXA>bm%h?V zxUf~U5TE@opB$Ed-FKrGn;y%&xJNa;?-90OTBzh*ba}Zp2;x-HRrA8WK5WW{LK4}9 z2-FXj>0!K)Z!3`Vm6BRJ9!@SaxR@NvXjk6Bn*tZ33#b4-RT0=vKaAo>fAAQ$!tH5@mfiW4ufO&{ZHPOrj#^e$|geeq!GUbFb*&w5pXU-Ol9?o{#Ohoc$7jhV zY5ZcIjg$Q-E%l~+rEQFr;@Wi>tbdrtzLmz>!P8=wW?4lc*)6c)wa*lBLMhi~U0%{I zWI}?-r4C9AOa&yj`-|1Mp485wyb^=U`xZ(M+rB;p_5mwRA}zJU%@Gqn_PNZ{_6Vbb z1Z#eOgYT{$E#Ffu-?P`Pe1kio%dFtT8-(7J11tx$;Ap4^%sg&8Ndc)gxbJHuPn-rXs+b| zTCo;i*r=y&9f9Jcf3`(mooR6@`L<5&;ag_blcjD55h_?kbvB&H{Ahb?EfbRC+Rfaa zT56JMQfP-f3PyK8^DWDaKR?o#tShbL7?MHM1Kw#nd$+|<&BA=xv8fXyfVS|byXNp4 z`FZxmkndVf* zV<6|pvJxL#Bw(dl_nD1rO1D$x^ZQk*#urI@b`!}6PRP+iFIDz54`md=%)~}ddkO&C zrNfOLyoWVz33boIjH(h|ktWOX<#FfTHhY$e{kY!=0V}iU*YH}Q@8pQo$4(LffdOQ; zR$IjioVHST2O5K_B#>03$audKPj4HyHQ~@apAuAzdP17IeEW!8^(C55O;eV(t&kVl zMmRm7uP+Gvf~(qW+VYScMK4Xv&~`W1nLiV)zIi)Oa9fo&X}NC$dhe~*TY=I3-C#Pu zN^8uoBr2}lnX7l%Es#`@pkk~vZ#UP>@3{3}vJ|Z$XPRa-Lfk{rS|xIY*$|%+oMbUH zQX>f7eLC|l>qY2FcsebZKZ4^P^hT*&aUYM!!$ED*01>xasmYwDih_2|$V^VHFB-PpCDE;3+NE6%?G$=hUJpW0NfN#{ zSUcoZx79mSu^pGK(qA61@4Sk->2=81{v(q^8h({;*$=AwwtjUQwx#P@De4-Y7mc3u zy_qk0f~L-9!RbRiGgoXhU~~z-H<{uF+qFpl0Gx&PV)J;OjNtt3bF}k?hcX;G6wuH~ zUzmPAZ2P{5CTVK;Ge;q}7EXPXcsSP!7E%Gsz|_0;ls+SY0sl2tQN7ejr1Xd$mJ072CS?NeOWvQ3S-)(pr(_ zi_}e&ZERNZzSn^=U?PBZ{pB0=aY3Xy zQwgEG7!>8+RM?AgD%V{fOaYZU{6L_G(I~09K;rQ6x|oauJ|{f^+r0=ZRI5m42QtuM}+{fKZ+kE&0fPRps=~ zmapRKt~OQpoEnSE(Zb~~@RqdEQDf~g|69sLQU?GV7=2~~f+KV7b0}Ved0oGZcJ-qK zte^eiU>fRmYLY8xPqX#kex*{$$Y**JU*kYcusG(qIYLeu{Q^lL6PXxMhLj653|koT zM%wtKk;j(qIeEH@m4weXJUdhgZEU7L$~#WH7=#N$CDD$Qq#D0QEtoPat-&KXlk z-s%^~>gPi^bzz%`aFT|ZQb;KKFD|K7f-VF2a=W~1p@dlq{!l{1U+kOUzX-j;ZN0@7!OL*H+xA)Or^n*|UrS)#Sy zXKc($#4lnk@6)vhBG$2g$=Q?R+d+@TzbQvR^K6$^CAmK zx75MsyUpM$k$X6Y;ng)Pvh`ub?BevpR|hL?bRG?`ex01Dve4o$`C>Ww;xDzoj^<)M z6^lj57CAz5Cbv0kV)5n_lJtez)U?xl;~0m)|C%K_gH4$M*i=SQlk|HX=4KFbG4UbU z;bw^8qBaX>>|ye8PSy=&nfSnTI30LwrN(>tW>8pMPM%C8K#&~IYck*}eS}4pz#hA_ zdylde=U9tcx=S<=V6=XC+hyU?%E|qTd2&<5k9A(`xTNyv;7BH^6o^jPvzcGS18^=p z6Ks1b`&cnikT|{on?wiS5wiV}`>p~ojn}W)4Hi(Xj~Aw`gyb_vLPVvJMOpK13(t>u zj3wQ0Z?)cQkb+~mOY!1fsKZ%RzSSRrzb%T|0wO4hxI4zc5R&oKH#m!cPhd ztvVtK@~Rm2+F~12Xjk`BQsRVc%EiO^$DRNIS`UyY2`VTMo7y=YCJUkE9N?S|BQiJg zt3k`Spg&`?G`sH!3SQrA_0>=N@#?D%@SRtR6@Z(XpbHC#)4AkwDBw_oC-cXR?hMV`CF5AqPC^6cRF( zF2@WG1Fq`b45*wpZ8YK=E7qq~;ZD#j>^O+b0Xial_~3A)a1{Xh%RFx?g;xmQj<^Y6 z3alE4^3OaVpS4|Dx#X>EeCpTnJA~>t%PU#pnFTna#l?*<7O7*_fY?~HqmfTC&;*EW z`6JDzl13YXth+rYNO5bXEk8T!(yv%bhIVrFok(Ci4QrCG5)b?%L3sxnS8CUU5iD!l zU(^X0JohEjUfiQg@TW1Kg3Zj2F;wIRxg7_$W0(F8oxpYu`>X8k_3-<=&H4=Q&b3hj zSofnmM3o+ow$;l27SX@GJ$F_n!gK%x5G?s3;{|#oHrjllk5_?^J`D1d{2#%@_WB7c zxkR^Qg;(CEwD+5Wv>e}`#VXkBd)(3fnl{W0Tj%&N$<5MI4j%4k24J>^6F_d6_#N+X zgz zUxP-ybtd={Q?4>XS1A|Uz)t&>S4OR2Hiq^H`h{>LE67SbLHN|wwqcX!u=AfRHwg@49_nv zT35oSf?TbSdiz3GMVg!5IxuXb#U4D5?*_$cjUOP56!_SO6o^WNko z1t^d4H*SGv^QPD$7(W0#)ioI5ZjBFSs$FExzTNaFx^ZrxS9j-^ua_G>fncd%z>kkF*ZBh=}v?*MET5E9eY8<4IEmDkrdv5Q2 zPm-_;cy_T^K!>I<##(<6iAN|#LZG*p?%lhGjwH;y9n=FqwisE(V!meI&E~MHRkC(l zG+2(!^CryWI}pir_{4G>rx})#F1kdO8u9JUF9LI+X596{7Wjj?y0&Al4N<#Tcbq;U zLXpW!*aB`MxxG4KRI!9D;pL8?V)jX3*!G>K9V}4ow!~!J+7eu?juW?Vd}=c&dZikX zXX#@*O^9pF_dt!6zzbtl>xzJqYU1-3uHKgP`|F3N<&r0ry*H1kG#LT@Z)o_zxE4>o z(U{540D_01T%x!bmpCD8wc0w^vda6ka~|ukKQZBo>g6cX_1NS@AK%(;-PINDu<(hD z94pkiH=g3PP;p(%RBof9gPG%4O?(2=nEq{8#IB~)(J8z`UDwU3{_uFZvjVn(@4yZ- zyA}*>|1wexM^oQ_S;ud)n849r=vc_bhD>sk_THVGUqTAH&3H>!XwP{f1FAQ=ZbcnR z;Y;kS8ps@}wL zoG*0?l#xl`6cuq@c;h5a|Ea;KYHfQwPNBekX|MzH8PYEQsWP`#M_Wpl$#?gt8nIO) zfyt}3AR_Zo6yox9)^{OlxI?$Uu@9;^$j!z1MoLh-5l)(xYS|`!@ z(N}^1G-~(9{g6dQM01PW|6^l?Sbui=ArXni?f3U4O+$+uMph*{Y-Eekpi(@=Xy8_>O5myF8w7z~WUz-LYBk=`C((czX0bn>_`+)CP;B zjY&B{&N?GFAd#P2`g}?j`(Nc3jj=ERy-kOFv5Lcn!3bvgh+BN@pCj$&#Dr2X-O-BP zH`L)`4=lFob?V#?lk$AWR+wL7)~T{;L+}f)e~o)$VH;EG(Vc~!TCRK1Z5qx| z#O%7MjowAU)siIax9rlrkd>WBOvnZr2>95@@f4Y?7Fl+9q$&;D4G5mQL6xn8)^bef z)0&;JOPp|z&g|muNE#}g$ihVNtaNm~o))%p3-iTHl`bB;^m{X6L{D5!@0+-^>!Dsm zefQPX>-TxW9wAIv#_o@atq(Q4fyiwYK6x9&7K+;b7B5%#0whcgC4rwD-?D4lbeoHE z)-j2WPDeV(sMoFa;LjP2tPZ|D`OL;ZJ*&2*Rj62b^L%RAJqrfn18VF>Cp}{HmThr$ z?!i0R_G{fP5iz;G8tfJ`4}yHL7IKUN;x&2~h*o8elWwJx`bHNZQ@x79+vO8f3L18s zbc2)P3hI=ivd|c>qFnEXLO?T*mp~7kzg2m<65tlqY-4vzkME30hgLv$v<&;UgdJ9h zaYLTWd-&P3Jiiufm$MTM+x8MbL_e(;k;o?%~;C))?mha2r44ck-F`rC(6Vy=J%2FPyPZ^6eCV)Kh$V(n_PZxck z(U5~Npg$62ZKd5fe-YICeW6qgCjTKQ8M-!$kq8N90*eOu2mn%-L~aP}VCV zkHKY{y$1O*5O@BqTBLssLj95?#Aj<6y@u4k>z_AGaPipnnLEnpC!>%f$po0bb!>=M zkD=q|Q?0&@y*x9oN9=Eb?(F3r2y-}erT26QrS15c4*eEV7?l~3EXwP;df+Yx5#|uG z``&eAeUcb$Si!Zqh*L>Do{fCjUU0*SP#=ZoT`0?aY@dC|`3;IoF;AQJR(|k7CcT>x!!Qv;voNS0qHWfaa}g!`SP~6DEs|z!m`wd zy3KN}q=x?5&nCyRy2Jx(U|&&GAa=c*XRT$aqRCU&Fnx>Ba3WH9v4Zktd#eM?T5l3F z5WZNP>zSp`>?6W*xGvzv`fLBF}o#@>*!e9-6ztv?Usjs9kvUN z2h;oYsSM!G(<#jBdoeR*mYGSXk4UU<%)s27H|7evB>R(mT_}7|4H-6bK$j%8!$=+} zB)D{K{$yqA>f56gof)Fz<$SyFrv6^s_LMDs3X`mxZrbj5j)-pEDQ6A#L+IgY$l>le zqE*L>@QeR>00Mt`?{M*gFdZ{2V{hB2D^0?01Y_n*$Jb)cQ+*H`uds@DNVA_krgXJ<>h$~1^yCG3{ywp0- zt`FA}nhP<5(eax0;cR;IU9}(5en`1RS3Ki3hv4mp-i2a!Q5hbYw6USSOpcNT)z4$u zXSse6i*deg<~KCsIZZCE2jYQ=yL-T$U zha;C+RtU+2y4A4~mvA3Tt9nB3cKY_H-J_AM!HV#j$D2n0E>^4r@-$%Ajr79fASZ~n zSiRR<6Pt>4tyiYi38CX+7`%XQ=-b^?*ph#K&B&gx!nPWfPw&symdG0acF6s&Rc;y+TIF%io z2WW_)jo)irh2rQ&SCncDe%;z`E2Gy-ev0$lo;AdYxfXc~34#A`|G@ZYwK|Gb#$?Ze zm~!94R&w-uxZB+htL@$CiTy^g{8EOWuoChZl@NQ-h?b{GehLtUJ_-urG4UyP>45 zL$chOi1Pai2@IQ4mAQ_Em7x9JDx65lkw-uR@9}=vsG4?7m(N<1x}KLvQ4M}9qah2l zKa%U@He)rKw;u6nt#SWZFcV~o%2VN~&D34nnuQ@tqyFi)&|&92)80k>aedM4Wh{S1 z%l<>$3cer*O0>HFo{YiU`U!+-Ry`D&&7f^_>f8cwYq2)O?AwO9_>9sRreNl#jz`9z z1c?ZF*XFGmhso-l`r#EuE+L7-ZTmZmyTI!Di_%UUB+(;6o6=EFPxh}21{4v1_MgzT;RR~Mgwc358PhlEtj3OEq7J<;NlL_A zdJMrj`3W_Y9VF)J7IVNzFW+K5Njj7p8hJ#!i=VI6<AjJ@k0t|!89(^$6fmM_P4%{ak{R`minOwbxD-FxI#p;_jHgl;-LV*2uJONI z<*;?S@)pbq2ij5jaTV*F0~3~p`w@9oMT#i{4)G?7`@<_iw>czAF`e0M84shPvhZey z;a6liRgWCiB1uxqx-1?OyIi}D8~x(Gx>ObgO&-@_tvI(2=(g_Lk7c1Q+% zecGBzo6+OFqt0}!9Pz+#yJA?~m9_X&q93oNu++eCQ>hkqCp3#;DB$0 zjxy~PYj1xxgZSQy*B0Jyn61>l?_&v&g*;wGRL_62iV|O&1s6B$&b-@p>aQ1y*id2D*wcceTeV zv30a|=7QW3`5ojfx%Qy!+gBSN1I-vjm@r~T6RRcdGvS_H5MCbI`{G$Txi679r7%UGwT=hp;g^fMh*st1tl~*iC61i!y-(NZ(b>ALVRX5Ka1W}p zP}cuB(BRQT&HEVl@j9P@r?dI^oiQD#?xWePN#fYUwqLKmULh^68@g8FiLAwGI{63C zNe1t4O+ml{Jf_*=_EqnK#|BxKCo`00CF(10e~2%WMIc77Exrji<&_uK`P9wnIk}+(+B0W;2M7;xEgliOP(P5zxy`RM;5E?}KlmyMFb!5(LoQh#%T-kD zT$o~t`~9w!p39S2GBXDshJUnlai~#+8JP@{xmptNra|_zzS&N>x-K3gqnh zW!$!!L)>S##<<=zmyrp-z3SV#3$T+)T*isJY(`wi9SkgK)hTqh>lY=Rtl=}#hGGGY zf&$L=VoT%--e|Cs4HIFa%xsLl^S9@c|Kc^kfz)ppCYr*V>0X1)Iwbx9G}v-cKJLF| z&jsfbp5RNDl}yJZFfIIyWJ{Xw}_M znK3$duFUurYnT=CEuvUj76a+^WjDu8)!GpK;$?2mx)y;;^#Di4vEdQd z3XfB8_NFo_@j7PaS z`prbiO=3H^hcAWae94rEN^R-#0@+KC+3qJMP+8SAlI2*5< zqquNI)ZP-r*Y)Xk;~Hbybh&Nx`2gf)Nf>&?%VD`fpdW*r>Q#mv?S+Ba)TaI2=a3ow z!4x=t1x1qY!y<~~`)}+fl$q2u0P<|l9_Pm6QVzR<>)Bbz45a8zf%3cU;#%Az=$Qd6 zu>uUJ*YTXpyX^yKjhf2w5Dw?pfju&JV}ZA2-#QCGSIGJ=_l!S%=^2Y!VD){))qBfN zZvvxrA7C%%f{D+0Y`28u&bbbosJh-QuAcul_;;J_{P|S+XE%0%LL<|ot&?p;jP{ls zZrMeJHgjKpeaJUnVl@>Pr8uuvGXVl>+b{cBz9M#^!Jc844PMLrp!f+4=Sdfc3GMzp}><4V*)KYMysOKZQrw-gY%&4wKAH^@GM3xR!2i>pyzQaZVY z@@-2jEQ41AIF5U~zRYbN)sPp5Z*$--73_+y37xLh>w_D#vWQl99pJT_Ftny6+o~q7 z>30F?*X!zUob{Z-C-51pKQz1PXgBwmX2A0$JVv|U&F5-eHr!A%`sW1fAVH$A#jbqA zUtd@{Srx<%zOVk=AG&-bXhi)V5a^j(EP3V91xYit@4KMAdJze3^ATtF!`fSRint^f z;}OgpNx1IOF;533v;@)KR&Oxh<+I}EjR(&ER7#20;1#EiUUe0emXM?;HjS*6F40aU zQ&IS*_gtWQCjaPht=6Y1RZG@*T|&9?M*Xm>>Q=lyNO%^wA>YwjL$4EmEZ=IBH#06= zk*ffSiUc67+J_f)v)z)Ri{Hxf_C5ACF^I8|{(}2*Nh+CQIHz3NcM`GdZe8fXJk@UY z@fEix-dM^(!bWI5NvU?FIa3FNgT0RPQ3a3JVNwn!Xcl0dsXpHI-}8D=kKMiHFg}Y> z_j>8smtR!s$l$i$^x6k0@+vbFh?tJVP9~@oLU|-`G<%1d0}XEQled;tNaQ!ZScxZM z{cr#`t!_EgZd=1~%OylgtPD)p2k1w;y@qB>^_=U6-4Vx~cC&9sJLlk1afcyiK#^IB zZ_OBHvAKSnZXYkN_^2TZP(J4;9pt2kpu`Jj5;qz$J<;XnY*hTa5Q9{b4Cy~b+`5K0SeS^^9(#uCV1>v*4jegf9z+1&1 zL955sqbput|MXvQwtRq$rFoBA4nWqt!RX9!#2QjhfvNrsO=HD-NM^Lu1)e7G z7@2w>9DKoovA@idr>jOA@qjtUuWb&Yev)V?%IO>0}?d=;v6m`eJ#Y3WQS*lgV78V2w=ear3X2 zw2)IA4XlUs`e16-m-y?+BAijX8k`q7$6ZpCvlV35g~6w-8aAWRDBZ*$_u^50%)VAf z7%sQ34gl#QT>pJE1Oc|x)*bO{oH3Q2NIsbfNQJZAPX;mzSAk}5pTRf<#k(=uwl%9B z&1jXs$u|JIn|gr+usubq6@d^4kS=gvk4GAXkE(~O6>4X?QriNczCw6zuDrH5VKLvh z1G!HPNHtaPsS$j_IQ@X$mU!zg4uroj`4Vuo6ZcF}L~^{QK5$S8RQq_{oc8>Mr}d5L zkz#cH;wL)0sR0CZq=r*3(`CY2#lN)xApaz4zya}nZAmVn_?je{8vx9)i}`kzjLrwD zb!{=));FhZ8$1eqbpG;l|BW-lF<#a_xB=2-l})}yl8TbcWF;b&=Gs|OR&0w>6sNsq z{S$m@1NRBlY1#c-1nO-)G4a4bzK_iUvMW6!U_dI!JNDQnOxbAl=k{4fBC6Y}m=EK% z42}59&r=sjc7Z-sbS3AUTVULd>p+8GA=N8UERwf7NB|NTn!@Sw&oA%Y6B1V*X8n7g zE9lJUs@wRI27d|X?TcKlbB-83W@0YXuE;y-^}P1ynKl{%%cFOG-_@^=LK7s+E8+I{ zmh=y0pou*Tk=B#1JmapjCR;!rm#hJ;W&Ryb`M0s(1~pv3lBDuV(fRfD^w0i&WdHkL ziHO_o-3ICE98_xkO9aopqe(xr4c%Q`Kkgo6K7xb*QMYEr`BdILCxJix^tY!J5c4|1%We`47%~9p~`#si7Om>>yoZk}91)zv|!i=#LNnVZg!3yXeIGm)9)$1G;|a z!8gYLiwT`QA*UAPYzh=!#2?ip{&|dlok(gmFow|lIW^fouc;x;+5V^kaO(fd{c#wb zw*0d^y$u7TFf?@?cs&cbq}dA6_J3K1GjE-%$Wxp1&+8DPbQ?egOiWCaz8$}dQEa>B z*H@tR|KDuRP`>eBR|cdH6=?mqN@%XIU(W!j~!^& zI?W&O#m_sm?#PtjZ_&kj!JFwojuk!Y#oU(Dq%V`rryjXHu3Pp>)l&a(-c0}VYl(=@ zMTyo||DWEzGOWriZFmE=M^O<_kgx!y1f*+QAdRA=fP!>Mcc~bp2PBjfln&_zgAnPK zRzNzW8@~JT%o+EyJuugKe|+;}t{L3VT6gzaiz+YaNZ;d)1L}pdA{k0{afJz`|I{C2gLF%DyS1bweGPOe)I5Td(5R&AJ_Y!i1UkpOk{91Z0U!I zS137s`_s-7%s&+4Ab&5Hw(_K*Nxq}C=bpL4VtqO1{(|?*qh;@%g(J!g+Kdmo)MUj@ zxnGMAz^pw^m+|uM%D=fSf`3j?(CX;D>ukPN*45t$hSb--Wv5ON*voH=2<9@O-q~r} z>@aEhvk?6YnE&c4lQ9C7DnTthuJLnyM1~MiPcM!tf^u2vPwI_^$`o(bqSdpuH^jum zGK?DO;Aub-T!OT7A4rSwyox4xa2Cb0w#fFo9X!W6o87)+ed7_OF%( zs(aaQm^+_xyShE97G74;g-6r4g7m2_Ve;fD$agg<0f`G?Cg93UOA;etU4n70lA+_6 z@Q8qPss$43HmtEXx&G1oH2C^NaNVW5K<$?MqBvy?dUT~rQtw{;d znqf$B!6EN$of}%o-!(b^+rW|8Z=zxykzckeWAgSClMwDb zElcepv{*#xw-PQe=-#xy?tw;9j}cAqn&zY%Mfx+7v&2}F)|nrQw(08SgEEDOQ=s$0 zlzMCMOJ5p+TY-haCSH#40N5&*6Uu}rD615(7`q~Yw%i~Ser$M~^KDNGK|b;8`~vEh zOIMl?K-u~*eYl-nLy_d;{iXxMG4i8+)jJ4=4D~4z6t^39z&J*^sJO;P2aC)uwc_Eh zBdcQ)so&H$ju}j*IeIZ|2=(?egbLEPbT|eo>h;Z?aIF0#BkVIwLVqQSPAY0VO`<&D zG0g!e>dW`74VTrc?-T2?w)Ui1zXX#doJ*79=`Bf-mF)&}??>e&vQo?@BX)*8k)d(s zQqIt$>dNXoFXS*Z6~tyMeqJWj#NnNKupDein_?Ycj>RLU+tOE7~}rfYaJ7Qgeu?K z!=z{FTv+~M`%uWs1w^#V?9ZbDf?x9Bdg~yFfxmdrP85O9KZhXTQiVJPH%Nn^{oGSM zxMwRpTB@(Xqc$PKSAD+^@A~T?L3=B>R#Si__uf}la*D54F?j^C`@|yl6MoMZu~swi zIx;i&EQr%l#LL>qvFd&5hWLRqc0Z?b<~W%i5S=vmdCjoOV~$Xngh($db3f2UXF?xxKWoO-L<6l-ehH;GcX zUy>ei8~p6v=;vhc{4fq?nY*A{Na$BR0QHasq3;<%=WWf-9{IwMTrl>5;*4E*$Owm) z*?Hqmp5&a_`xGm86Ru(SRD8>h%L;?(uvk(Z=ePDGbt+WL(Cy$Wa`@I9bk6LC*_p!h zX{T&8YOm`Xf(*|4>_;EiEUz;9HCn8^Ebd_8OKBF2_6k1&W$?Hr@4AzI2Gz=0o@*w> zk*ir}35Kjf1H5i#b)MQGJY$B83Jl9N`iQdsAg2ocp3#P0=6&S#?B`>w^A(q+ZE!6vVs6NV`)N7bS`*KRRqo(xP%RI%; zEc}Dnc@DbNU}}@Lu^)g!u$pytPr1m-dhTc41!_xu$<=S=ug7Hu=MvKVW=M2Y$$FfB zTr)EokzO;0Wr{DQbm-}102z~WVI6;+6JwG2|vs{pS ze3+WwkffN`u;=xp(Fzq66gNEr#yd)jxK%?ks$a5kOf0WVu`$l|#Lez+%vZao%+zJ+ z)~~!=+0Q0iS|}Rk`!FK-yaCxtmy_+tgJV)>lleEL2`$iM*UgL_D4GO?BY~=fghbS9 zrn#3rk!It{@c(I?r-yC&oqgy%B{EEC)@sK{q@4Ee3Wy%sxxe7tBcG6b`vj^8^YJci zp>1jOU=-EN+*ndqPOl~G6Bv3=-#gAfA<>@AGv=bG`Iwn;`Hzhs=|KX^F}h8!uO-eq z2j9#Hq;Z(7lbaeCU#KZus9V$YqRJNcX51M;Tr^qs+Nd|SUQCzQF|B(dzvR)%*vpKK z!6BgvmZs{C4DU5)SL#u&jxkP6b7n)AaUw(2(CLQ|^u$^O1KKalHF(q{@t8az;>U77jAz@;q=>k%G5xMyA0n9~tB-Zr zLQiyRirMv2j!A}P_dRT4sgEjNq$8DIXN&d;e}0R4?RzVm_E2`kRP@dXD#SdSg}~{~ zzlH`1Lpj%HLrlTZbG#$dh;lH@e86Glt{qqfxeE&WI^MllZibZiyPM8F6T{ez)lK%k z?sKQ^}L*nzOB!e0Aja^90KDR+6jvkf#*Hwa<~W6tWfBefN63_I1Tr zvPk9_C*OqN^z;6lY3ard-aHw}BfMw-3hdae=|@CmiqDBSP1`nD_XM+g1sHXlD*si? z`fpVFR~D&p2ozzq^`n!gR)9Vww8xpE*_9Y^EbO*jOt0USh&5`=%J^yc`v<6gI!Lx= z1o>Ha!DkXUnMYb^x8MO~Ejs>->Sp!tblYF+`3toPfjxyddRLPatsiDKX@&Y|x^~so z@x@M-`NFAQed1%Qs|i!nH@WG@{fQc&t=3c2SIjo_zTD50yWON#aY3dyY2I)j4jXX6 zj;KS*4QqX0#Mm^;5*1%nUUyTY7)8Zgu1vcexO-!Cy9@M~@+~@;JhO%#y(OBBOi!ME z{pU$%n9(d`kCqI5nPKvFJZm%yDT*Q!X|KZ6jj>v09EU-0zjf`=&nQ%FLII zdB&*MuV44Nnrqj3uXqnr`Z*o*%P_KgrYV(#bxv18U3fQBB3o#W)Sn6eTYCrRpzsqov8Jq2rMz93N(zMKVS70l6rWf<6Ks=h~uz-Yj2oyk3y1TDQTcjSUC-q zl-&CdSEdfRs2%5_7TZD7rf^q6PHNV2q&aym~uo9>SA2={OHPqSRY>ol{v$gn5J>wq)^w|2oBuXt@136GU#>k1Sr3ffQq;( zQDVb0T*<)E2wLlHNcX6PQDRMy!+tA>Q6mF9t*Bu+FE-WaqCfd;yW!tt4>s>_uXO_-}T`0UW=v< zo=bXWOwC1>873X<${D(6{|L=OHJ7mmcfGz;+Za>pzS}RlRE8w_^5Zw{mjkr|ubzG) zF>N+DIPJR|8z^zO!kS>{#F-4OP0|}g5bs{04JWGeCxD?=l0G_VFEPKEH&&0rNYk}z z;~d)9aAXx~ld;%FIxjhXL2j=sBjqyRapfzG(Oxr7Z?xiwSN32B9gmJ?V_;;|7F82P zEpdQWwv*89kPFMiS!H;{28RQOUqVv#>ZS$3=s_1X%(F_Ie?ln(;#SW>xl`f8y{o@W z9r9PR%Mcuh?n#Y}KK@tVWD^ez%S9YO5};S^EofG_(LtoEORDAMJ~oha-tT-zCud5%2&wWQWFeq z$K*<)aYU(8gfEcn^dFDWq@vxq?epi)@c8P^J*f;aP>yEE6!h4f6tq1^KwEf!03Hay z!S_F;Ncsq*7*cuMv$F?%xp7Up+4|Q%C(`P z0c4`O{rs0ihzC4d-g#X3TD88W`QhQyn_;Vgf(uWixVtjMgV9z6clCE4065mfkQEet zT(BQ^J@@zDjphEsXu|s}CNw{jEq!_K?073{v~;Na_cFoxFM?b>hUsUGHnYOO@Vx+b z;ajr_RJ21txR3t!&LO5R`3~P4D|2sP2Q*6rC3D+{iHLVaZD> zFf+_rDod?`p~xTWlKjv#Iy(CM2>Bm7rj&_nE=h=)4=d$kV6V~P4IBvd~Ml2yY z#|CExA&Pzs0-z*riNi9`p8n_~K=xpV<6)Q__H0&A;q>Moc(UXju-`z>(nfdnT;I+(0bhL;)gAivJm0yx^H zUvc_mmk_iw-Bah6D<`I$Ro0_>1v+*T*0qsws%!^0Vcr_>sz&c znt*40j%nXe(XxK((m-&D7kAf7&$khn*+0u?B?)V)uk#D5+tuebhbi;Y7WNd`mud$a zUr&rcQ7?44cD0|Fia5c;;`a~tl| zf_df8xTN+H7uT5ml4`nqREPd#6)Q&2t}2LUttvO4Z$m#cvoHMddSSbq@J4TC&Z@hC z@4OUu8^ioYhfwqK-KYx~K1%npPn-xr5}qufw!bN#RM`2CEKZs{G0M^0P8j+)fv7-TU^2&FRC#*N*--<-NnosZ`&{WI;v%=VC%` zfjrf`(GS|psxmMkM2L@RMnQ#L-wP)7BSi}*X6?sGpK=lz!B7DsAK^*p-=^Oz_3NRT zy|X$x(4koq!b@sI6`;nq99|#OD-euGUekH`WJL1BPggzog&rEIFhJ^CbCdh;lE;y# zu1Zw5ApGN=z)a`fipKd)$LufKqs)GN{F6o8YL4Sx{W-5+p8~(*+XusG>@_1jth_bz z3g@p(pVa2$(9DtIG*KL=dvq-xBh$>u|2{(x`fV`9@NSN91B zZ5hDWJifxAg|Y(-xfmw^bLi>3 zr88!ghF|w4=HJ}Jv$(|6$0Za^r6;ei-R>V64}>wUyH zd`eS3j1rsvRIHMc5}1A2cd)rI7bUr)4CS+o zq)crep6MT#;&0WqJjGaKo$~UN0E}~Q?Az2exSa;qsyLSc4}#&);gd7MEd#|?7_HZ9 z>?`q;mI}-2b+0V1C>)rWy|pxzQZO&lX}M4+)|jPYLTW!&WbnOGi67eX6mMM35NbVk zzjGFMMI56a@eTRG_NFM*4S9vpn%yKdCz0K>}^Z7pXyBfUL?Lb!4X?Wo-1}UAXVj*I`neGWQhjgz@Sw^!BL< z%|Kq z7KA6Mi`VCN+-wiQ;Ts;vWb)8yyz{+N6mMZ^SooWvxfxsu6vE^o_H&~BpE=YY3#fXN zm1Uq&)!qIxg~|K$nf3oRw{qZ99xU7hU{RI6pFe^o`X_flRQ||}&H;j< z)j0nbThN5b2}Gt;orvRaRr(Js{@cYRB%tG-cJ<&f0OP`+%$p4MBr>d+*XiSA&{sM;(OWVZ7`SS_4+M5r?)r1NFGlFaas9H6;>Ftqwqqr z{VrH02mx)+Ls&^oT6tqDj^qPJG+15ne&VVR_%&bMlYaq|_jc645=Vv6tRo<7L*@yR zW9o6?g0PkgOh)>vAW=<-%&w(Q-;Pfotn${Ai@DN~Wi)d;D;lrDf%A1N2#Lj7btk%W zu#Ex|*1T74=7tUgL&q4ehRF8_OSwD{!U6l6x_Tq-6?llJ5TFizlh z&0NNaP~B6p!Hs* z{_rv{kH<8&Ogr{1GiX0}$>hc`fY0wtk9atKC*J)+0fG(8-4bPOl~3I| z(;oy6<03-EjNGC(LIbJJ-^EP%ux~U3BweU>d91Phc?+i#ri6i#*LBzNd4MCJ-VCM-(G|sk9 z-vq%`XVmFN|MHisc()2H9E|CsK(YIPq5z2Y(HxjebQx^9Pm=T3$s!@?7R#wC*A&8b`X2+qCS}EwYcgrcQQiXVd6p`_BnH zaQ60Wk-eL>m$tdffIC>!H!el-#4?8cb&fSH`dC2;Bt;(DqtLdYblOL?s2RdjXJKRIb=B*YE#@_t91YDo0Sw7@= zJwwjan$AKejZSJu`?a9M-Mt4h-Co_+x7aZ3XrC##6!y!4jUK>EPv^% zNGBGYeWn;?zfj6fOpMY86wG%KTLBeEyt?uWq=aSuv48@~Zz-SsXZ%9Jh!m`TW}Jez zMNgZLH^s??G>w*oglF$Y;fm785g4*pRXDST#_C<r|$yO}_6f1EF?`j65{_R2y?8GjB+gd;Ms`d#?;ng6If#W1} zl22OIoKLpgN*7Ih`(Y2nRIhbgjM0xCtQe%}#N@JHJ7)m@x@eqYJ3ZaOrh|Pap7l5|; zwkKtkl_`J@a>-+ofCj&}$X00VN1%vJzlnyz2|+`lkUcC3V^Q{S$5v>ZKkWDV zHALK5KR@ph+XH8SI21&J&)vD0Vbsb(;s3n<^Ycwh$RJ<`fCt;JiQtWx5F)24A~aeo z&k)vG`hO00G8Z4b4A1FCK`5B|e#dCJasD_Nvr5LN@a;ioP=*B8V9`ECs!cgO(dg5# zSI!`Q5)SlgEoCf2s5;PTvD0z!+GYL0F3VOWdslP&mC%LW##$ktZy!Z3N0oWO)nYYM zqj20giL+JlYhl|Er0@GmJ1I0j!xgNhqza`z!s|hjiEvV_K7DYi{M>E!y4kFhz^ zBcr|W6N9nz57U*UY@!<+%Gvs=eRGDKKzj-Hg)&`JwWP){mtgS-O zi;~+Lsp9j}2;aH*+~h;yt-zZ4!RKl>%c|#*lI<09gM##0UivccwKD-~c5y@IBXPN$ zyy=?@YX2*6@YH10&ruFO;w!Lo^jhz)rqoJ^lyEfg2OmNEO^Tt@;n?QBD&J|;3P3dR7U!-fF zUQl)T##^5u)_7LNadwKnuf9A?vYo5V<|EJT;$r#Suxb)yvVNdjkyvQ)cERj4V?{{~ z&l*h6B&$wHHF%;-0!pZCAqxx@EoHxn3K|*q0Bh|6mfA-*NCoXIe3-Mp2!Kw)$w|$= zS&kZMkvL|I;7QUTAtBNb>0&<1u_G~at?`XLd!W&!o|GP; zLbjZTnZ4Nfz0@nEaNVxcy2sfsm)f!E&(!J9jDw{GQfQ})%avzHEiG61=nN{zcGdV9 zNiMhT!WOTWshEO+IhC&45iJ$M{nmL0hw_gks8(=&9;E)e@f`4WZN8&?(m7jBh_$>E zr3NT$JyancOAUO7i#6D9EU7C@_(LLk@p`czOw4_h%NHURnCxX>X7=*+_2pUr5~b06 zlftT84d!o}d1&mz9cy^mtj1*OA$j^@?$f0i<;CqS61NaYzNvL}!LA|t_}ipK-A_BV zOXrYF*m*s(5UVmJHs}K1-O*u`Z#h=fLBkOw)n!cTk{m22wD1y&9G&+*da+py)wye} z_QEL7SbAEX}aIVoh!C_+Qb3#hl+Jdlb>cf59o#)o`YP(4X_oJ3Wk$Kw)GU~%k zUx@z6yGW#Ef<-!WZ?v>bwKrVZprhPhQE5GVC??EIV@G;y4{&yF=5u+sb(f=c!Awnl zMN^=vRofTCMk&qaW_hpg*C#nyQ96sl+jSXawY65l1pSk@3<$2WYC)LU?c}QP4*PzI zu=YD~Z{W@$nWtr56guZTmb(B~;S`6_&~DWN>q$9Zy_Adwanmt2(ZP;GRe_sE8qefF zfd4u^iz2~Op!p7yhs!&D%@NRN!6C64iaOSpTzW6x|1sj6fYcbLhrMfe5_^xP6d!*v zExf+IplFc9Iit5cAdXrOS7JZ$f}VyjK1JIQ?4Nu8Q7IDG6waL zwnz(2wh7IN!~ISUUF^TVi=-Q#UwHcIQJqVcm>AdCSsC z9|4Nm;vWuau}*8tH4BdNij3Ll?jtT!VGw5*mfJJo8d|Nfbcj8~rX&*#sTHo2J&%(c zU44x-miK>|OtG9$5BCO1s{dSE1R2%6g2e`jijwUSGjLt;rZZptNQZu+xdiPtB65&H zsXJ@`?W8sQr<0aqTGAa8Lgq&&lRTv?Y?M{bz!rb>!Qn6`-LwY_j?UjgRCi#?5+oFuAq$N2oEs)8V2J59s zN2@*$e#l@ruU4GCU_!WkUaPBhIjP4$m^c`YYfgTjadeyypB!Ywbd6D6r$O<(|Ju8K zb-bf+uGoNkH9FYDyE-_#-*68#O%su9j{u~Bo!gc@DMI0 z%?Z{#NiZ}pbcr)zXk^0Oesb+XqFN!J)nqpb6%|$L*E|Ewrr2xEon^{fkRJxY2Ghp( zOQAGRis{)Yh|5S8V(8w$(Zq+DuRJE~>=c+3-!dfK`SSLT>C#vmbWh8 zft>0l-|#Wi_I2Wf#xBNhjLA&NAW?Y6&eN|Vm@VwXf9F;R`+EP8cDC~m=w&w_l#Jj7 zjSNm_jYoS=hrNIY4EELW8szk$d^y^T-GCrS^IdZwG=Sg;6ri8t8OJBMa5EZ0A!EbMWDc#3B*x4`>eM*mhTRmG4^ucje|5H88lsD zb$%?yVrE`M3$-h*R1y$Y)58H@2f=FxQMmQ1AnG$#jIr1sJn?CZ&$WP6fl@jrP+uR2 zMZAZUVzB)+An%0F2-=OJnD`PZ9C^9Rukh^Wvr}RjbF1QMms2%$bOJsb>}0+GyHEFaV5^LCQMN=N-4p)o<#2wYJ7V103*XvO(3aSC{$!? z?l2oJbWkM=-VLiV)hsXT%uVlm`{&6O2lb@K&^GlQvkxs)wbvYO&`Px&%{s!SVFQ6< z@6eHk`i0vvThQmF8elW5@*0aW#h+dQ8zpq@UJZU8vmBjxnmIb*U9FOJ?3{T7#zMhb zp(?nTA*^jpl1~RNPMW$OlI4;i}dj z%e+!GN_84`rfaJnmZOt#ntvmM<~7O)zd&aCZsZ@vy}E*ckQW&rd{sXgTud9*o|#a4 zlnBm#&9w3NZmf4W4j0syA0tty4W~T$h*+k0q5D)}f7zQe)V|;s z=Hus&TG%o8l%%XYLrn=VtY?T#k(amxbol6Bt#g>Y~;W7K`$m3e^(oML()I`abOK>0ZG8A9(lz>w5~W z-MQE(yj}rU-@bmzw)VX-vM`C6%cP6KBe|GO^$s*WMTO_%Y*ryMd~$NX4`WKs>N6_m z`I*OkA8C}rgoKS6;!KB2Cxz}xW>Ui`0SU9OmdQc(T70)Z_gAnPv|J$~o=4r1f+k>u z9^$XEIQO7@it8~jf(mu38boyujHarad%RPeH7)rJN7{5s-AwFfZp(dkf4YwX_CB&k@1zWpUhfqRH`&I_BzwpaPHxy1{)`EN1xr~+OUk#0nh%+kM zj2H0Ce@WH4A=h~rYJMSSsVuwhZ=afNtSx~Hw`j~+!c~XO1~zx^yUrud?81*MJby<7 zu`96)$Cm^%!a5&;W!=@$VkhqTi7rYNE|aJ9S%yzfi8Ul?OKzA(BzH-E zk}_1mD4+ObA0_t{QBhGQH3vt}V{DN_xjRs10%g~Bo%aEsF*AGdG@9hM!(q5W=qdX; zD;$}Dqe-QoZ}te>%_c7%a+|8LzGd@iMqd~b-z?ppQKK(8Z1RbVlFMdrHN;d)cF}3I zd$aY9#PiS5JK>tntvL!v3olnZTI?mC^aO)|SpTlBt`$a}xu&OVE55}&8---h9x`~< zzVH%+(x=ZnJpbgl<>apH3k&1@o7>HZ7l<6?^6R7JNMO$?u|tG)q!vXXnA!IoT^sLw z`Z&T1Pv+(2H7JBXBamuq&ZL@WxG`SaSOZl)nA~Kwo7$^+b>*49u@*C0VsT>)R|>=>9%yYq zGdMz$fEydQyOlrb3uYEPMx*K@Vw#r8@#4U$Fv`NGvwxlxDcc#?rFh{ckqkV7^Cd>v zL?QXsQG?bbnZW#6Uy0t=e$t684K16O7Z1cn0diESM(Dh6oBM%#L>33H674&~g(+n1 z6d3vOu`eLlc*wlMQPZ1m`csZ+#RsAC8-1@Z7MzE7s`mwib%fJ6uTC8iTn@^yTVH)o zf8+w1wzy=kdk%qzR2$h9bZ}R*y%VGQo(7vrFtpUlGsJ1#m)U7b%0YGrBsE@kmDnzr=huY~EjH*tKIY)4#sfmI|iWy9N z)A+Sxs6eUz1_;3YGIC0n^$+C5$3`dDo$?yrzPi*`Fr!8zS1ZJrm!IF4Jelle;yjpt zjp1;^LZIsE0-Ih#$)0!$n|RFZJE3N~e3+)!n(hzc9F5dxHlW&q>wI7wTaR{Hq2auJ zz_q(72{TK3m8g(~3)7WfHpkt0SjMnhpw3K>VfjOLq3t_1|DwY#$v5u(SaLh{lrg2? zEENMrFemUJdL1-QfKasn$V8Ly3%R`oZdSaD03`^=`$!di#&rG+V4`2&$@+ZW52~kGCM?9bcz5<0BZlbTxkdYif@G znYH6!@|T?9_ZHO(RY3DZ^`CYCvIB#fW{IzpqqED1Fxm_9LW$5Da`LgqW8zb&Wqm` z=T7>Rz>UuuRYUce9iPxW8C-Kk0LPWVu~24u;c7M1TCWkhT|5rCe58Kp1;VrywAFuqTJWPByZI5;WXS z(DDR|mgr2R9Vsc+wBTVHft;ikh>fmh;N|(x@|v*w~*rN z(&D|?Y?}vETTIYK#Dfgq{GNf1oe#t+(u(;uprf|{FO$0PF*T$vM zcJRL%ZYucK}p|vzC=8wB4E?dEJRUZdd z9CMW2j$YU%8A2{|PO~4p!~{byDOeJF()-DLR@O0#rh{8BR{sp>nuMwW9%HA0v6beP zV~O&_SZngUzW9WJEB5yG1&gJu?lU#~tRmh={%mtP6SBD_jYtJ*d(CC@qrv3)i`qhp zZ#*X{xs2V1a*YfsDSUdMswk(wIXTzZR3KMVl+R>rs6JKqTl49ZYo8wi9VXLlzPi$s4hn57&5n+4 z%$xN2r#O@rDXgQeY(t|6W?XPt5J~l?chFZQk$o_BKe#jXrCjjAt@&Z8fbrP=0A7yAc() z|C~#f7;0P@V0{u}H9lf45=St^+>uopIcnnhn*K)Nq$rZ6Sgvn$4o*JVNo_-`YS@;h zq5%=&2$SJvcmDysT|1Hai0J11=+?ne$emeUDVYz{_|(+Y9AUqE74hEDQvCcvjvek6 zZr6$GJWO)VQ1=w@wzs#>KaPNlhjc{_UMgO0PAOZ?pA-{SE7rYp%(Ud-l`8fvuyuKt z4(Qe@FXCy`OQiJqP}*VDFT4D;7>VX`Wy}?OnR~WyliV|>82?>mk_EC~m8Y>;T#Q!Lo6mt46PY9xW z7F~%;T9P^<3kwCi@4a6#ZK+fvgBl=F)sM|i03j;0sVqTZmDD2gITR|^hx?{zgjZ@U zvaPG^>s z^_#-8rRSwVehF8gJV7ipJDIxL7cOqiH(Wx}`;V{S{>_}MG@) zPR(!i&h~pjl^kYS*l9j}v7cVppMA~8y5OX=@LGo1r>ZSt%umS6cHY60L#WN`;H-Qd zX+|{Mw$E0n?$Aa${5Ca8v^>&n!&1|fZRYb)KR}baIFoN8Z#4P2-ukL7TXcErW(Tj4 z$iekGh?hh?J6?gT2`N?)>JSX=`7v_NvN_(Q-tHM`(RR(K(i#{N89r0`KMMU73QkvJ8z0^6{GtD|B~(|q08Od zK0`*uQp?d+<2?cNX8~4NVuU7eHvR%|Hpgg{&*$+}>68-hcxuR#Md{O~u`xfY1w3 zi01{4XlwHyFP+g(NiY;(m~d$ekJoe+^ikw(0AB8)^;dCGt5?hNC7iC~kJ;*)YY}8* z;bK=98qNshO!c~v^1K(kYMIsY9@pZck=UjW_E44Rh6E~b#JKK3yzcSaEzxkCB}sDx z4@BJEbYFu6otzs-_p-MwLyk7l@kT3r4>sG-fXZ`IQ-F=w0k(h>n|TVY1FswN@vNFn zSKkWpG*J3bHvl)0{`pwNGrTb1IUUr5;HKGhr`W;z# zj*kJE20DG;5tYH!GS>v#f2i`XyI5T)T)HhH<)yXinBDU5tks~3anY-it^|&PZi1oi z_!MXmDz84T@Y8Hb^oTbKU z*{rI96ffR_L zEzrA+vHQE3A72jLEEC63mEP^5G^+2O z?V(8Hnq}8tFWMLICOi6)2#vWUlbS^}_G6_}E6fR*3{ViM`j!?lnp^X(N9xTh zXUv`Ft;W506{>triS-Ued3!GOy#0}zk}#hO)oK-pP@Pt%$~9+)G(SdzH6$L^i7`eJXO=2};e zOn4}t>BXv|S!e1WMat?FU;s2G{PmXnqy;&<=aQ}EM;W$isM5-sgY3T~=|Hn!*K;P2 zefG9=5=0RPKN6Qe7Ag=3?X=%JtLG=}rBFD++WRF{vsWddI9+(PbH%v+LxN@%Te(2~ zHBwE1^%Z0wbG%t|VnX@HP)w%BMPNz_- zn#x`y6Wc~t;)KN{u<93mOZ*ko{KJ56?p_(_D~r%JRuzJa(GP}r*Qfla80$#fx!&)c zWA(mw_B%MWzUj*D#)Wr-0;}dO!_MinR<&{6Ybt(z z$_#VM?5;MFKb#i7sf*aFs7QwJ92fb6My+e#vJ!&+-%Un6&cB2HN{BfiBkE*%+mAQN!ynvYC}UITp{qRjMQpb}7A`*Aj&emT_+mL7snpM|m5> zU`}J)KBcNXxr|)KcIT3MNjbDjs$Qf_MxF3MgNN3T^C_Spzs)^9QwNz1nJa=b5d1|y zYE63_7vAI{k8W`neY+nb#=rSR2rgJg$cM5ol82(pVaj4Z`#r{Qyva-hAb53#6I)ZG zqSQ|-Z3ejs}7)JQgl4N+3Y2ZeLh}GQGox>@ZO^5xoNc{hk$Q}nQ0sY#}sUj z;w4bHbc6el;o$H>&oC<2{Cg;uGeI1ar=3BD>H(vZDcuXO0GVO@NtC(54gh00dM@rn zB?;&+;gVH(Fr}HknRsMpkoiedmf9Motw^`c42d-#(D9@5lDkmq{MrGv80u%`5@vT0yHD(=#u90A7lB~pb8`Lbi{ zeUWQE5<=zB@3CdXV_(VcA{de%Pd49@SF%VgxAY+y9#Lkv?bOVNHhDlk`V1j5cs3U zVGUb~c5D)SYvh=O*GBk^%*KjVA44-AZ9un~L6<7jgNq+sNKiMDQD+2E3uD4)B<{u7Qut4tLzwbIV9&vF$g&H4hZ5&b5C^u~vfjq61o#c7g zTT_nNpjLgx>ngb;f+HsJ_Ld+2&Xah$XSsl|mD!eo{y!k}3^_Vil_~ii1qZ%}{HEtW z>(@Qq{OB97fBP98pstd;e-5O+(0`$U7F9gC`VG*2C^Yi*tXbRrJG%Vyl>Glf6<%F~ zDTRsRMpPjAzd$_j={eY)==L{T&VBs8_s@{mdLuOKe{O(F6|DBQp9eImG9)&=1LU6< zoMr|SH@VJ_z7PL@vaV`3c-a3L3E`vX>Hu?PeBqAP`u~z~q)^_{R*AXy?><`sJ6NM$ z8@g5I@jF$pbblR?(n+&)-y%50CI5dGc_s`Y4_w39YDNDqKU9U7Lnqt%>=v!Rf7*{9 zw6!y{6aQ*Jv<>?0!@KZAA76f<+`rV;PDs%PlfUoZB4zjoLqVGl+S4{3`uSgKxcFZO z7n7AI-r`Hq*65`n0zJMS_b(O57+UF}!SeiDT+{!%s9;>jAZXJmek}bDnBzr^xGF`< z{kKcxrni#)cS6059cdP}wQM!g_77WQg`j*9T3f`w*?qjfiOElZT_urG-87^BizYz# z$=T6bp(zw-|}00AvWEBp3;Y1)wjfRp`X z|G$$=_R~LGdphx2?pqape@E}16X}0oG8)6X;-Kep9X+Ht|A)Bf41DG=-xc@o zjNe^(NF!eug?{*VpY_WCznumDy~h14?1omfoOy{BAYA_bgD_y%A?Sch9@RVkt%tQj uY*ANt+`rV;3D8#aRFcV~QZrMNk&)4A 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
qhjjNRD- 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
_;whI55*@e2$or3?OCTf!Z_ z#kU&AZtXq&OPn5+{s3x{ZEod&8S}90bD7m6O;x0XQYG+0Sh9$RG`Cgc&v1S?X-Dgn z*!JSn%Gyd>5nyktyrmbI=5{u%-wsxB2&(Xp%;o|Hd!D*WMbG+FxRolPFJwv*@p&I= zYidJHY>AX^WX&$id?m z8Fw%aLaFmoKzHv|tbfx*rd2v4MGJD(%eE{xbRzAWzr41|k|&KxaY-L0u??%vRgi*+dSKq@!DyN51KqpHP@%&wDwtUFSP)3M^mgx_-!=ZoQqzpKDX~s43N$UQIVe_k(|Y z&l&a(Oq^P~3CmS~Jg=G-i^dCru?wC7x3Y6VB?~x$Y=rOzZ;-4CX3$LxVPq8j4E&RTW$5KpjNx1=>VpdaxH@x^WN$hChvWD zO&#+`su%#lJQp0X^S#sUfzmEEZ2@PUCDluC7_Vd8BI;Zf!hjog?+Oly-RzDSNKC;= zzA#lF+|aeE)<)-Eh$Fyz&6*<>Ij224zTnVBZK2xEabajL|72o#(u$&xNxJWp429(5 zScqitgecst*tRLuv!QRB@(IJCrs>g6;xNCP^RUZkUR9}!mcH{9p>kI=?{Ie?i^;(^ z?U#yDGXs!uz3tiwoblK~YkZF6a>w+^wdI^Vb}Ws^Bos$%>$pn_? z45caSRv|v-@ygRlwM6U6K)45}M#glQ z5C3o=fVcu0O#QJ`qSRVs?TzOnA@NSryFa=D<-!cgQQyt2bsD@@BYAYS4B+Vb-q2Cu zEe@_#jxCNnp7u&~&PN`Ht@MIr7HT@W00INyr(#Oz_QCE zlUPgo@n%n$1U2{E7oVtW7>%-p6gn0r58;+5Ynn}g2JqfrEn6AcQid!)pPAt5t(*;x zm0qbMgm1fgJ1f68|HcFCuQ0u5-!#Sq#>HkVe&PLhk$6dhShqHG8O?a1(p#ZdCh@hG z^AkEIxIHYkVFB`5wK_#q$+RP3wUm-<^nIc^Jo6B4!Z2@|dGg3IN}#=XsV2s3 ztXyl3ytuZoa)&yFPAt}8#j~eOigPq0^=YgYYt_7UcwRBoR#5TclGja7#$}XUZ%xD1 zs2$U&IhH4>R~Il#P?S)ja9ou=E`TuZf*o`0SNLX)we4)7Z9gx>K+ zyoNe%UUEK&=d8*};NPwZaO%Dp&-kVLCWyW$N;sWEJ_jo6Mtua3`zuc7JA*qA$7ts5$t`H@>PsznH|gtFCu z4Tc~~ae-RyRNkri{*?gP;7Ivz=*4Rp2FN*ag2m{|wqQE1*-YxHg5|;H66qrxO0b#y zYg6UJ8T4?m1lF{Pk&Di%AmuWAs4^COe)1YE${KlZ4ABTdzXcJo2f~0G_aQ#}Z z1%ck^xt6MarT9t4L}kbD1gV=UZn5p8KC=P&Gs8GbJIyC!39%Go`O9Pd=k?^?MeTGt z6VrPNJBM)Lw%va4eSbLdLOd$pHpNz)J1Bs$sw+2RV&tf&Hs;akb@)!XblHTP;^3$h zcWgY9>UU{pIt+@BxYI^x;w9-QOg63hM~+EQ)ZEXY&Y-G%%I~W@l~$i4ZruD1`jlo0 zixU~DvT^I~@&RP&du*)6yG_vZ?i(}} z-xP(g8}Zhoj}gUP@6Xdt453TU8WHg{^*#5VA6}3vOQ-!jpW_NcFhi^=tR2SYm-tLQ zY^xQ-MxvBV)V1^4Ov(q{To3)?9=3jSmd5e^C^}4so{gMkK`3c?N5wALdA7uu!8`im zcs&^xm*`?a9i=Uz@uEwm53=>jLfvYxf13sq{}W;Ca$K0=7byYboC8Bb#j1j!NInuH z3q1(T5HFnY@J!+?RZo8NzG5RjZxvptIXsdwp)&&UfL^x|!*|CTA&1(~&S{M;cQP6+ z2?@`VX@lKxl^pEP4ZNmZu%JMLyUq9T(U)!5Doq}rAfMCBHSvNlHpKt}LzkRE*D+4-W^`|Y$l&+|_46%Xvjxa-bZu)nI|%)vQ^ zoT1$hCa-4f&Ccpd;d8d-S4#58zzdsM_R1MB+b4CWi^Gquf1q%93k}TU=B5y;T9)3v zxB!xdl2^m<8AG~!^|{a2^c!L{IE?Zq^$03uh2@R<&(Ire#Ie%(I|`6ah(#kL2X;6a zWFfGY+Vhj2=bW`|3fK=I)3%gEwYI(0&VZ-)2gc#c%%&7S`!zZ8O&fiS5 zto*nYMd3fQQhH*VciMp6?*+PcRK#?l<}3D<>32E;RBuHn%tp ztS3U!rZ3bv+|CMf`zm%~KtjYxGr>Wusix* zkbw-4Ne*11-P)Ff>n&A?u8OV1^B7s7zMAMI$HEGx2NB_OkRDzJuOA(;W(et`+c}*0 z#GMyh8Ol6m^bIC*vnkfeC4Uub8X9W1-&l5o;-Q5oOt_| z%e}ajpbIOQ6{!0c?eBtB1f^`LWOLZ6#&d5B!H{8ye@iHCT2c?I!6QHFm1D_eW<&Q) zmNxm`*k;OT)xAW-#reV}`Xy_|#nxA0*n6UtC|4$IiMr(#gf*(w1TthX`Pog&=)=lW zsl1pZSB!SP)~6#oJX?qi?!3rM$+Ni=oBdIhFGtQZc)x<=+k7up{-~Y2jWoighMMe* zAPN`KD{1$}?s`kO=Y(bMe7o%VSnt3__cQO(6C-CG(?K0aC0p5wP^#Qs9;q>yT(0+| zm+x%ZD7GwP0?X)rkcyj2LqcZyX!4gg1jeZOG`qJHYE@8jvs^^0@K~DUA5)S+uaI>7Q?)gNY8dL2 zX@|SE6XGHV%`=3usY1EayO3A29A8^$=JFR`mkxG)kHOtmqB#FVkp0_ntT1}|m3s!H z7+bYT0s5~N#3=0X+@p+_H^$VSFflbSpp5@AH(;k{t3r)Os6Pi45%x)fPP%u@&vu7v z8lyI-#3M7&#q5k!Xuib`dh(K4_jydVsLS%trq4}$W{2p>qrobu2H2a5f!Mk}bw5gw z5Js+6OgL}KXKinIDPDx{C3Pv|f7FNO?Sn+>fS>=6HI)_v8Qki)--OCP4JJg;5N~v$ zp^xQW(yfrDq5`*W{to|mFSYq+gX|pvNE_4Xy}_+dm)nUh$|gCLr+rPWzV|@(T{Fhy zyxJk5bgTv}rC0rL6FJ9gCkH4H!4fzGQDhztC`*n7{gCbuSR)CwX^MM0XN zC@57yI)aLwCMdl`KtOuvHGrZZQl)pKgFq;ugqDa12%)!75?Tl?5I{OM-f!El z*ZFsTobP-8sw5tCTf%35`w)5D;|`aNa~*Lm&V&Fh?D(Px8dTuNwvSe+CtJsp4g>u5i^$E zD3Tz$-NlsA1!C@q`3k3qghe*KSs{Qt-6eia+rhBNv=TFmiw5isd9H+cTJk1oV-((g z)&ybf^-MDYvojN6ufGJg&WH1A2L>z5p}wXzZ{dNgA2M1}5mszqXQavYEK{k*n2zvG zZJ^V4+agWc5#dw#HL)7RS5a538fW;D@=~efIEOj`KBu(&^1wjU&S*?D{(J38dTWU_ z9FnTvnrkyscCaVIxB<8vG|^0LrY1or_U>`QN2Hp4-Dc;Jpo4o-W8X?6)P%E5NF+KV z*xpAQ$7g-PKU!9+FT|HC^6BNHX_>tS6AYW*aN_H3i8TUyDlTsN-Bx>J{y^8Hi(aR6 zd8C1`3U|U`uUA|uVrU7|zWqz<=KfMqp`W58vw;-`F?O-|xP5)lEis8>UMOu6nZ&c4 zf6Jo7zemL3>gbH;K_D}QED4cVY-z0O5H@F9;H;v;p(DSZpFXrIbh``8)#?+=J=I_^ zuV-2`owGrA^*Lo0roRFxcqvvAC4F+tQv!u~v`SgJIA#ySmLtb4w;O6arWAdmA3Wle z8h4EL{IoKF-OF;z!WY^XRf@7L-DaYoq?nx8ZAR_`2*?VKzKe&X?IneLRzc1jn4x>J zu6d?83n&Q+^1-wEjg)hLc7HQA?JKprQS8~JD&PW_D z8E!aOHYJZ*Cw3mQiDhG+4*qzx)kqo&$K|Z+u?jk3?mp!SvO_pDEDqm|ZV{({!0Ix? z5#tIj4#L>^Th8h5@_VeEm(o#9SIB)9PU?!VHL1K<$B-?%W$uL6YO1bl*5n--~Kht3aUKx$S8eZ1kQ2I9Gkg?F91Ms0Lr z*4_KwwxoswhifOt+s8<%rV9N4AIu~kgc%vsWHDqWv)QW%kAtzHF>QMSA_LRzGJ-wC zz$#~Vkod^vCy~ce=|;%-$EoT-w;PX)q@Zw#j-s>8t!_H?^v>5f;U=dKO?N$72Q#N2 zve~$wTJw^DY(WG}mef+G4^rSOsHVi{b39SOW85`x2M(>I&zkisR&YiSTrXS0*y_Vt zvvCG{4dLS@Xias{()i73x)VA))7yD3|GEn+k|@?$517O7*pQnXBapMQ-kU0)NkvCT z=ZyWE&51u#sPp>Edbuwdu0AoR+QAx)20ZRZYOFue3> zD6ZqIu1-mq6S5_u#Wp#uD`9+IJ;ci^o8_b({Zh-pLX()+#6i4 zm7Cj~(EUjbg4^KEgXU|WHJkCywKF#!W)Qb)I`|Y2-Pg=_>MU5LnflfokS~6^sNC4w zDZ``+2ps0D&(;dOJ`XS#X};82(k;B8Hz{M=W-gz(R@yx^lyqB@Sxy==(v0j$J9T`f z`2I=d^3JS&dU9=$kI>_4kmMY^n_Iy`LI+NQw^3*r);A8SCF*sW;g6hP<;gyV-MFiA z&ODaigN~*>HI;4Hof|J-ga8dMP4ow7^*p2uGAkmzsSlN~Yit*xXXNy1Xu8+z{H2XB z>$3C4%lWvD74ddUJ>hD_y5q09TvA^gPaO*Eh##!oJw+H6ff=;Tq)u23=p2u5BeF4% zhM6mMr7ljEuD|CIHll$}BlN0UsyWAWMtzGkrHPk&e*K(Bi`49uT^KIh&B1EOW4g!X za`6*Gk7Xbp+ioO7;whtQd*_j;IU2zq;8n!U;c9{I+6s#zkS6I*DNVKV$SZN~l@ji_ zU>K1#6ZQ*cAwqmRYIlD*fevO3etAAUK-7dT9p(XbjRIr zzR^_m*|Op+#GC#)^HM9qaaitIw=R3qCLviSpAwyR=d0VqNU z4A6GE#VRK#wG6g*szy3@NqJ_*WBikySYuVH0e8Kaqbp6#7W%2eXsW!eA`cJ;kiptI zna63}9GvGJ3ZK(P>FpF9*NrfAtVdZ@TxTThnW2{Mqx1%0DRBdFnq)1)ClThuGv`#- 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

Z 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 xu7wmWuUa6^l>Q`6hjKeb7^l8+hhf)Alf9~h7K literal 0 HcmV?d00001 diff --git a/docs/playground/index.asciidoc b/docs/playground/index.asciidoc new file mode 100644 index 0000000000000..fe0aaea05a305 --- /dev/null +++ b/docs/playground/index.asciidoc @@ -0,0 +1,203 @@ +[role="xpack"] +[[playground]] += Playground + +preview::[] + +// Variable (attribute) definition +:x: Playground + +Use {x} to combine your Elasticsearch data with the power of large language models (LLMs) for retrieval augmented generation (RAG). +The chat interface translates your natural language questions into {es} queries, retrieves the most relevant results from your {es} documents, and passes those documents to the LLM to generate tailored responses. + +Once you start chatting, use the UI to view and modify the Elasticsearch queries that search your data. +You can also view the underlying Python code that powers the chat interface, and download this code to integrate into your own application. + +Learn how to get started on this page. +Refer to the following for more advanced topics: + +* <> +* <> +* <> + +[float] +[[playground-how-it-works]] +== How {x} works + +Here's a simpified overview of how {x} works: + +* User *creates a connection* to LLM provider +* User *selects a model* to use for generating responses +* User *define the model's behavior and tone* with initial instructions +** *Example*: "_You are a friendly assistant for question-answering tasks. Keep responses as clear and concise as possible._" +* User *selects {es} indices* to search +* User *enters a question* in the chat interface +* {x} *autogenerates an {es} query* to retrieve relevant documents +** User can *view and modify underlying {es} query* in the UI +* {x} *auto-selects relevant fields* from retrieved documents to pass to the LLM +** User can *edit fields targeted* +* {x} passes *filtered documents* to the LLM +** The LLM generates a response based on the original query, initial instructions, chat history, and {es} context +* User can *view the Python code* that powers the chat interface +** User can also *Download the code* to integrate into application + +[float] +[[playground-availability-prerequisites]] +== Availability and prerequisites + +For Elastic Cloud and self-managed deployments {x} is available in the *Search* space in {kib}, under *Content* > *{x}*. + +For Elastic Serverless, {x} is available in your {es} project UI. +// TODO: Confirm URL path for Serverless + +To use {x}, you'll need the following: + +1. An Elastic *v8.14.0+* deployment or {es} *Serverless* project. (Start a https://cloud.elastic.co/registration[free trial]). +2. At least one *{es} index* with documents to search. +** See <> if you'd like to ingest sample data. +3. An account with a *supported LLM provider*. {x} supports the following: ++ +[cols="2a,2a,1a", options="header"] +|=== +| Provider | Models | Notes + +| *Amazon Bedrock* +a| +* Anthropic: Claude 3 Sonnet +* Anthropic: Claude 3 Haiku +a| +Does not currently support streaming. + +| *OpenAI* +a| +* GPT-3 turbo +* GPT-4 turbo +a| + +| *Azure OpenAI* +a| +* GPT-3 turbo +* GPT-4 turbo +a| + +|=== + +[float] +[[playground-getting-started]] +== Getting started + +[float] +[[playground-getting-started-connect]] +=== Connect to LLM provider + +To get started with {x}, you need to create a <> for your LLM provider. +Follow these steps on the {x} landing page: + +. Under *Connect to LLM*, click *Create connector*. +. Select your *LLM provider*. +. *Name* your connector. +. Select a *URL endpoint* (or use the default). +. Enter *access credentials* for your LLM provider. + +[TIP] +==== +If you need to update a connector, or add a new one, click the wrench button (🔧) under *Model settings*. +==== + +[float] +[[playground-getting-started-ingest]] +=== Ingest data (optional) + +_You can skip this step if you already have data in one or more {es} indices._ + +There are many options for ingesting data into {es}, including: + +* The {enterprise-search-ref}/crawler.html[Elastic crawler] for web content (*NOTE*: Not yet available in _Serverless_) +* {enterprise-search-ref}/connectors.html[Elastic connectors] for data synced from third-party sources +* The {es} {ref}/docs-bulk.html[Bulk API] for JSON documents ++ +.*Expand* for example +[%collapsible] +============== +To add a few documents to an index called `books` run the following in Dev Tools Console: + +[source,console] +---- +POST /_bulk +{ "index" : { "_index" : "books" } } +{"name": "Snow Crash", "author": "Neal Stephenson", "release_date": "1992-06-01", "page_count": 470} +{ "index" : { "_index" : "books" } } +{"name": "Revelation Space", "author": "Alastair Reynolds", "release_date": "2000-03-15", "page_count": 585} +{ "index" : { "_index" : "books" } } +{"name": "1984", "author": "George Orwell", "release_date": "1985-06-01", "page_count": 328} +{ "index" : { "_index" : "books" } } +{"name": "Fahrenheit 451", "author": "Ray Bradbury", "release_date": "1953-10-15", "page_count": 227} +{ "index" : { "_index" : "books" } } +{"name": "Brave New World", "author": "Aldous Huxley", "release_date": "1932-06-01", "page_count": 268} +{ "index" : { "_index" : "books" } } +{"name": "The Handmaids Tale", "author": "Margaret Atwood", "release_date": "1985-06-01", "page_count": 311} +---- +============== + +We've also provided some Jupyter notebooks to easily ingest sample data into {es}. +Find these in the https://github.com/elastic/elasticsearch-labs/blob/main/notebooks/ingestion-and-chunking[elasticsearch-labs] repository. +These notebooks use the official {es} Python client. +// TODO: [The above link will be broken until https://github.com/elastic/elasticsearch-labs/pull/232 is merged] + +[float] +[[playground-getting-started-index]] +=== Select {es} indices + +Once you've connected to your LLM provider, it's time to choose the data you want to search. +Follow the steps under *Select indices*: + +. Select one or more {es} indices under *Add index*. +. Click *Start* to launch the chat interface. ++ +[.screenshot] +image::select-indices.png[width=400] + +Learn more about the underlying {es} queries used to search your data in <>. + +[float] +[[playground-getting-started-setup-chat]] +=== Set up the chat interface + +You can start chatting with your data immediately, but you might want to tweak some defaults first. + +[.screenshot] +image::chat-interface.png[] + +You can adjust the following under *Model settings*: + +* *Model*. The model used for generating responses. +* *Instructions*. Also known as the _system prompt_, these initial instructions and guidelines define the behavior of the model throughout the conversation. Be *clear and specific* for best results. +* *Include citations*. A toggle to include citations from the relevant {es} documents in responses. + +{x} also uses another LLM under the hood, to encode all previous questions and responses, and make them available to the main model. +This ensures the model has "conversational memory". + +Under *Indices*, you can edit which {es} indices will be searched. +This will affect the underlying {es} query. + +[TIP] +==== +Click *✨ Regenerate* to resend the last query to the model for a fresh response. + +Click *⟳ Clear chat* to clear chat history and start a new conversation. +==== + +[float] +[[playground-next-steps]] +=== Next steps + +Once you've got {x} up and running, and you've tested out the chat interface, you might want to explore some more advanced topics: + +* <> +* <> +* <> + +include::playground-context.asciidoc[] +include::playground-query.asciidoc[] +include::playground-troubleshooting.asciidoc[] + diff --git a/docs/playground/playground-context.asciidoc b/docs/playground/playground-context.asciidoc new file mode 100644 index 0000000000000..c0c4533fcb1a0 --- /dev/null +++ b/docs/playground/playground-context.asciidoc @@ -0,0 +1,68 @@ +[role="xpack"] +[[playground-context]] +== Optimize model context + +preview::[] + +// Variable (attribute) definition +:x: Playground + +Context is the information you provide to the LLM, to optimize the relevance of your query results. +Without additional context, an LLM will generate results solely based on its training data. +In {x}, this additional context is the information contained in your {es} indices. + +There are a few ways to optimize this context for better results. +Some adjustments can be made directly in the {x} UI. +Others require refining your indexing strategy, and potentially reindexing your data. + +[float] +[[playground-context-ui]] +== Edit context in UI + +Use the *Edit context* button in the {x} UI to adjust the number of documents and fields sent to the LLM. + +If you're hitting context length limits, try the following: + +* Limit the number of documents retrieved +* Pick a field with less tokens, reducing the context length + +[float] +[[playground-context-index]] +== Other context optimizations + +This section covers additional context optimizations that you won't be able to make directly in the UI. + +[float] +[[playground-context-index-chunking]] +=== Chunking large documents + +If you're working with large fields, you may need to adjust your indexing strategy. +Consider breaking your documents into smaller chunks, such as sentences or paragraphs. + +If you don't yet have a chunking strategy, start by chunking your documents into passages. + +Otherwise, consider updating your chunking strategy, for example, from sentence based to paragraph based chunking. + +Refer to the following Python notebooks for examples of how to chunk your documents: + +* https://github.com/elastic/elasticsearch-labs/tree/main/notebooks/ingestion-and-chunking/json-chunking-ingest.ipynb[JSON documents] +* https://github.com/elastic/elasticsearch-labs/tree/main/notebooks/ingestion-and-chunking/pdf-chunking-ingest.ipynb[PDF document] +* https://github.com/elastic/elasticsearch-labs/tree/main/notebooks/ingestion-and-chunking/website-chunking-ingest.ipynb[Website content] + +[float] +[[playground-context-balance]] +=== Balancing cost and latency + +Here are some general recommendations for balancing cost and latency with different context sizes: + +Optimize context length:: +Determine the optimal context length through empirical testing. +Start with a baseline and adjust incrementally to find a balance that optimizes both response quality and system performance. +Implement token pruning for ELSER model:: +If you're using our ELSER model, consider implementing token pruning to reduce the number of tokens sent to the model. +Refer to these relevant blog posts: ++ +* https://www.elastic.co/search-labs/blog/introducing-elser-v2-part-2[Optimizing retrieval with ELSER v2] +* https://www.elastic.co/search-labs/blog/text-expansion-pruning[Improving text expansion performance using token pruning] +Monitor and adjust:: +Continuously monitor the effects of context size changes on performance and adjust as necessary. diff --git a/docs/playground/playground-query.asciidoc b/docs/playground/playground-query.asciidoc new file mode 100644 index 0000000000000..11ed2e71b1a2d --- /dev/null +++ b/docs/playground/playground-query.asciidoc @@ -0,0 +1,51 @@ +[xpack] +[[playground-query]] +== View and modify queries + +:x: Playground + +preview::[] + +Once you've set up your chat interface, you can start chatting with the model. +{x} will automatically generate {es} queries based on your questions, and retrieve the most relevant documents from your {es} indices. +The {x} UI enables you to view and modify these queries. + +* Click *View query* to open the visual query editor. +* Modify the query by selecting fields to query per index. +* Click *Save changes*. + +[TIP] +==== +The `{query}` variable represents the user's question, rewritten as an {es} query. +==== + +The following screenshot shows the query editor in the {x} UI. +In this simple example, the `books` index has two fields: `author` and `name`. +Selecting a field adds it to the `fields` array in the query. + +[.screenshot] +image::images/edit-query.png[View and modify queries] + +[float] +[[playground-query-relevance]] +=== Improving relevance + +The fields you select in the query editor determine the relevance of the retrieved documents. + +Remember that the next step in the workflow is to send the retrieved documents to the LLM to answer the question. +Context length is an important factor in ensuring the model has enough information to generate a relevant answer. +Refer to <> for more information. + +<> provides tips on how to diagnose and fix relevance issues. + +[.screenshot] + + + +[NOTE] +==== +{x} uses the {ref}/retriever.html[`retriever`] syntax for {es} queries. +Retrievers make it easier to compose and test different retrieval strategies in your search pipelines. +==== +// TODO: uncomment and add to note once following page is live +//Refer to {ref}/retrievers-overview.html[documentation] for a high level overview of retrievers. \ No newline at end of file diff --git a/docs/playground/playground-troubleshooting.asciidoc b/docs/playground/playground-troubleshooting.asciidoc new file mode 100644 index 0000000000000..8fece498b12d5 --- /dev/null +++ b/docs/playground/playground-troubleshooting.asciidoc @@ -0,0 +1,26 @@ +[role="xpack"] +[[playground-troubleshooting]] +== Troubleshooting + +preview::[] + +:x: Playground + +Dense vectors are not searchable:: +Embeddings must be generated using the {ref}/inference-processor.html[inference processor] with an ML node. + +Context length error:: +You'll need to adjust the size of the context you're sending to the model. +Refer to <>. + +LLM credentials not working:: +Under *Model settings*, use the wrench button (🔧) to edit your GenAI connector settings. + +Poor answer quality:: +Check the retrieved documents to see if they are valid. +Adjust your {es} queries to improve the relevance of the documents retrieved. Refer to <>. ++ +You can update the initial instructions to be more detailed. This is called 'prompt engineering'. Refer to this https://platform.openai.com/docs/guides/prompt-engineering[OpenAI guide] for more information. ++ +You might need to click *⟳ Clear chat* to clear chat history and start a new conversation. +If you mix topics, the model will find it harder to generate relevant responses. \ No newline at end of file diff --git a/docs/redirects.asciidoc b/docs/redirects.asciidoc index 007a9d9f48cfc..be017fbd1c94e 100644 --- a/docs/redirects.asciidoc +++ b/docs/redirects.asciidoc @@ -432,9 +432,4 @@ This connector was renamed. Refer to <>. == APIs For the most up-to-date API details, refer to the -{kib-repo}/tree/{branch}/x-pack/plugins/alerting/docs/openapi[alerting], {kib-repo}/tree/{branch}/x-pack/plugins/cases/docs/openapi[cases], {kib-repo}/tree/{branch}/x-pack/plugins/actions/docs/openapi[connectors], and {kib-repo}/tree/{branch}/x-pack/plugins/ml/common/openapi[machine learning] open API specifications. - -[role="exclude",id="playground"] -== Playground - -Coming in 8.14.0. \ No newline at end of file +{kib-repo}/tree/{branch}/x-pack/plugins/alerting/docs/openapi[alerting], {kib-repo}/tree/{branch}/x-pack/plugins/cases/docs/openapi[cases], {kib-repo}/tree/{branch}/x-pack/plugins/actions/docs/openapi[connectors], and {kib-repo}/tree/{branch}/x-pack/plugins/ml/common/openapi[machine learning] open API specifications. \ No newline at end of file diff --git a/docs/user/index.asciidoc b/docs/user/index.asciidoc index bf21f7b262924..419574804312c 100644 --- a/docs/user/index.asciidoc +++ b/docs/user/index.asciidoc @@ -28,6 +28,8 @@ include::alerting/index.asciidoc[] include::{kibana-root}/docs/observability/index.asciidoc[] +include::{kibana-root}/docs/playground/index.asciidoc[] + include::{kibana-root}/docs/apm/index.asciidoc[] include::{kibana-root}/docs/siem/index.asciidoc[] From b3e6f74234298f5f042679fe043a8a5c8d067673 Mon Sep 17 00:00:00 2001 From: Artem Shelkovnikov Date: Wed, 8 May 2024 18:29:41 +0200 Subject: [PATCH 78/86] Add * as default value for 3 more native connectors (#182957) ## Summary This PR adds "*" as default value for 3 more native connector fields that specify comma-separate values: - MySQL connector field "tables" - Oracle connector field "tables" - Sharepoint Online field "site_collections" Similar PR in connectors: https://github.com/elastic/connectors/pull/2532 ### For maintainers - [ ] This was checked for breaking API changes and was [labeled appropriately](https://www.elastic.co/guide/en/kibana/master/contributing.html#kibana-release-notes-process) --- packages/kbn-search-connectors/types/native_connectors.ts | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/packages/kbn-search-connectors/types/native_connectors.ts b/packages/kbn-search-connectors/types/native_connectors.ts index 5f57f64f0a06f..3c235b0c3f4a3 100644 --- a/packages/kbn-search-connectors/types/native_connectors.ts +++ b/packages/kbn-search-connectors/types/native_connectors.ts @@ -2605,7 +2605,7 @@ export const NATIVE_CONNECTOR_DEFINITIONS: Record Date: Wed, 8 May 2024 12:49:12 -0400 Subject: [PATCH 79/86] skip failing test suite (#182792) --- .../common/index_management/index_component_templates.ts | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/x-pack/test_serverless/api_integration/test_suites/common/index_management/index_component_templates.ts b/x-pack/test_serverless/api_integration/test_suites/common/index_management/index_component_templates.ts index fce7e3c7c7a44..a086f80b0bee5 100644 --- a/x-pack/test_serverless/api_integration/test_suites/common/index_management/index_component_templates.ts +++ b/x-pack/test_serverless/api_integration/test_suites/common/index_management/index_component_templates.ts @@ -15,7 +15,8 @@ export default function ({ getService }: FtrProviderContext) { const log = getService('log'); const indexManagementService = getService('indexManagement'); - describe('component templates', () => { + // Failing: See https://github.com/elastic/kibana/issues/182792 + describe.skip('component templates', () => { // Api methods let getAllComponentTemplates: typeof indexManagementService['componentTemplates']['api']['getAllComponentTemplates']; let getOneComponentTemplate: typeof indexManagementService['componentTemplates']['api']['getOneComponentTemplate']; From 69313c3c017621504093c66f06f9f65ce73b3b0c Mon Sep 17 00:00:00 2001 From: Kibana Machine <42973632+kibanamachine@users.noreply.github.com> Date: Wed, 8 May 2024 12:49:34 -0400 Subject: [PATCH 80/86] skip failing test suite (#182797) --- .../common/index_management/index_component_templates.ts | 1 + 1 file changed, 1 insertion(+) diff --git a/x-pack/test_serverless/api_integration/test_suites/common/index_management/index_component_templates.ts b/x-pack/test_serverless/api_integration/test_suites/common/index_management/index_component_templates.ts index a086f80b0bee5..4b30a1e49c17c 100644 --- a/x-pack/test_serverless/api_integration/test_suites/common/index_management/index_component_templates.ts +++ b/x-pack/test_serverless/api_integration/test_suites/common/index_management/index_component_templates.ts @@ -16,6 +16,7 @@ export default function ({ getService }: FtrProviderContext) { const indexManagementService = getService('indexManagement'); // Failing: See https://github.com/elastic/kibana/issues/182792 + // Failing: See https://github.com/elastic/kibana/issues/182797 describe.skip('component templates', () => { // Api methods let getAllComponentTemplates: typeof indexManagementService['componentTemplates']['api']['getAllComponentTemplates']; From 958de39d0ceca43fa1e6733d0831de9155d71215 Mon Sep 17 00:00:00 2001 From: Kibana Machine <42973632+kibanamachine@users.noreply.github.com> Date: Wed, 8 May 2024 12:49:41 -0400 Subject: [PATCH 81/86] skip failing test suite (#182791) --- .../common/index_management/index_component_templates.ts | 1 + 1 file changed, 1 insertion(+) diff --git a/x-pack/test_serverless/api_integration/test_suites/common/index_management/index_component_templates.ts b/x-pack/test_serverless/api_integration/test_suites/common/index_management/index_component_templates.ts index 4b30a1e49c17c..b1f26ac562414 100644 --- a/x-pack/test_serverless/api_integration/test_suites/common/index_management/index_component_templates.ts +++ b/x-pack/test_serverless/api_integration/test_suites/common/index_management/index_component_templates.ts @@ -17,6 +17,7 @@ export default function ({ getService }: FtrProviderContext) { // Failing: See https://github.com/elastic/kibana/issues/182792 // Failing: See https://github.com/elastic/kibana/issues/182797 + // Failing: See https://github.com/elastic/kibana/issues/182791 describe.skip('component templates', () => { // Api methods let getAllComponentTemplates: typeof indexManagementService['componentTemplates']['api']['getAllComponentTemplates']; From 75f3290e3013e06cde76bbb59078789c9f7bbdee Mon Sep 17 00:00:00 2001 From: Ying Mao Date: Wed, 8 May 2024 13:03:43 -0400 Subject: [PATCH 82/86] [Response Ops][Alerting] Limit how far back we can schedule a backfill job (#182616) Resolves https://github.com/elastic/kibana/issues/182241 ## Summary Adding a limit to how far back a backfill can be scheduled. Went with 90 days since the current thinking is that we'll be storing gap information inside the event log, which retains data for 90 days. Had to update all the functional tests because they were scheduling backfills with a fixed time that were all beyond the 90 day limit. Flaky test runner: https://buildkite.com/elastic/kibana-flaky-test-suite-runner/builds/5849 --------- Co-authored-by: Kibana Machine <42973632+kibanamachine@users.noreply.github.com> --- .../alerting/common/constants/backfill.ts | 4 + .../alerting/common/constants/index.ts | 6 +- x-pack/plugins/alerting/common/index.ts | 1 + x-pack/plugins/alerting/common/lib/index.ts | 8 + .../lib/validate_backfill_schedule.test.ts | 65 ++ .../common/lib/validate_backfill_schedule.ts | 48 ++ .../backfill/apis/schedule/schemas/v1.ts | 18 +- .../schedule/schedule_backfill.test.ts | 5 + .../schedule_backfill_params_schema.ts | 18 +- .../group1/tests/alerting/backfill/api_key.ts | 57 +- .../group1/tests/alerting/backfill/delete.ts | 28 +- .../group1/tests/alerting/backfill/find.ts | 123 ++-- .../group1/tests/alerting/backfill/get.ts | 62 +- .../tests/alerting/backfill/schedule.ts | 615 +++++++----------- .../tests/alerting/backfill/task_runner.ts | 119 ++-- 15 files changed, 550 insertions(+), 627 deletions(-) create mode 100644 x-pack/plugins/alerting/common/lib/index.ts create mode 100644 x-pack/plugins/alerting/common/lib/validate_backfill_schedule.test.ts create mode 100644 x-pack/plugins/alerting/common/lib/validate_backfill_schedule.ts diff --git a/x-pack/plugins/alerting/common/constants/backfill.ts b/x-pack/plugins/alerting/common/constants/backfill.ts index 0a8281cba8186..b78d18f5550b6 100644 --- a/x-pack/plugins/alerting/common/constants/backfill.ts +++ b/x-pack/plugins/alerting/common/constants/backfill.ts @@ -6,3 +6,7 @@ */ export const MAX_SCHEDULE_BACKFILL_BULK_SIZE = 100; +// Only allow scheduling backfills up to 90 days in the past +export const MAX_SCHEDULE_BACKFILL_LOOKBACK_WINDOW_DAYS = 90; +export const MAX_SCHEDULE_BACKFILL_LOOKBACK_WINDOW_MS = + MAX_SCHEDULE_BACKFILL_LOOKBACK_WINDOW_DAYS * 24 * 60 * 60 * 1000; diff --git a/x-pack/plugins/alerting/common/constants/index.ts b/x-pack/plugins/alerting/common/constants/index.ts index 5dc50b91a4163..0acc25785d194 100644 --- a/x-pack/plugins/alerting/common/constants/index.ts +++ b/x-pack/plugins/alerting/common/constants/index.ts @@ -7,5 +7,9 @@ export type { AdHocRunStatus } from './ad_hoc_run_status'; export { adHocRunStatus } from './ad_hoc_run_status'; -export { MAX_SCHEDULE_BACKFILL_BULK_SIZE } from './backfill'; +export { + MAX_SCHEDULE_BACKFILL_BULK_SIZE, + MAX_SCHEDULE_BACKFILL_LOOKBACK_WINDOW_DAYS, + MAX_SCHEDULE_BACKFILL_LOOKBACK_WINDOW_MS, +} from './backfill'; export { PLUGIN } from './plugin'; diff --git a/x-pack/plugins/alerting/common/index.ts b/x-pack/plugins/alerting/common/index.ts index 2c71a3a17379f..320a5b29f6956 100644 --- a/x-pack/plugins/alerting/common/index.ts +++ b/x-pack/plugins/alerting/common/index.ts @@ -13,6 +13,7 @@ import { AlertsHealth } from './rule'; export * from './rule'; export * from './rules_settings'; export * from './rule_type'; +export * from './lib'; export type { ThrottledActions, LastScheduledActions, diff --git a/x-pack/plugins/alerting/common/lib/index.ts b/x-pack/plugins/alerting/common/lib/index.ts new file mode 100644 index 0000000000000..35888ab08952d --- /dev/null +++ b/x-pack/plugins/alerting/common/lib/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 { validateBackfillSchedule } from './validate_backfill_schedule'; diff --git a/x-pack/plugins/alerting/common/lib/validate_backfill_schedule.test.ts b/x-pack/plugins/alerting/common/lib/validate_backfill_schedule.test.ts new file mode 100644 index 0000000000000..fa512c1635afb --- /dev/null +++ b/x-pack/plugins/alerting/common/lib/validate_backfill_schedule.test.ts @@ -0,0 +1,65 @@ +/* + * Copyright 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 { validateBackfillSchedule } from './validate_backfill_schedule'; + +describe('validateBackfillSchedule', () => { + beforeAll(() => { + jest.useFakeTimers(); + jest.setSystemTime(new Date('2023-11-16T08:00:00.000Z')); + }); + afterAll(() => jest.useRealTimers()); + + test('validates valid start date', () => { + expect(validateBackfillSchedule('2023-10-16T08:00:00.000Z')).toBeUndefined(); + }); + + test('validates valid end date', () => { + expect( + validateBackfillSchedule('2023-10-16T08:00:00.000Z', '2023-10-17T08:00:00.000Z') + ).toBeUndefined(); + }); + + test('returns error if start date is not a valid date', () => { + expect(validateBackfillSchedule('foo')).toMatchInlineSnapshot( + `"Backfill start must be valid date"` + ); + }); + + test('returns error if end date is not a valid date', () => { + expect(validateBackfillSchedule('2023-10-16T08:00:00.000Z', 'foo')).toMatchInlineSnapshot( + `"Backfill end must be valid date"` + ); + }); + + test('returns error if start date is too far in the past', () => { + expect(validateBackfillSchedule('2023-08-18T07:59:59.999Z')).toMatchInlineSnapshot( + `"Backfill cannot look back more than 90 days"` + ); + }); + + test('returns error if end date is less than or equal to start date', () => { + expect( + validateBackfillSchedule('2023-10-16T08:00:00.000Z', '2023-10-16T08:00:00.000Z') + ).toMatchInlineSnapshot(`"Backfill end must be greater than backfill start"`); + expect( + validateBackfillSchedule('2023-10-16T08:00:00.000Z', '2023-10-15T08:00:00.000Z') + ).toMatchInlineSnapshot(`"Backfill end must be greater than backfill start"`); + }); + + test('returns error if start date is greater than current date', () => { + expect(validateBackfillSchedule('2023-11-16T08:00:00.001Z')).toMatchInlineSnapshot( + `"Backfill cannot be scheduled for the future"` + ); + }); + + test('returns error if end date is greater than current date', () => { + expect( + validateBackfillSchedule('2023-10-16T08:00:00.000Z', '2023-11-16T08:00:00.001Z') + ).toMatchInlineSnapshot(`"Backfill cannot be scheduled for the future"`); + }); +}); diff --git a/x-pack/plugins/alerting/common/lib/validate_backfill_schedule.ts b/x-pack/plugins/alerting/common/lib/validate_backfill_schedule.ts new file mode 100644 index 0000000000000..c8bc1467296e4 --- /dev/null +++ b/x-pack/plugins/alerting/common/lib/validate_backfill_schedule.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 { + MAX_SCHEDULE_BACKFILL_LOOKBACK_WINDOW_DAYS, + MAX_SCHEDULE_BACKFILL_LOOKBACK_WINDOW_MS, +} from '../constants'; + +export function validateBackfillSchedule(start: string, end?: string): string | void { + try { + const now = new Date().valueOf(); + + const parsedStart = Date.parse(start); + if (isNaN(parsedStart)) { + return `Backfill start must be valid date`; + } + + if (now - parsedStart > MAX_SCHEDULE_BACKFILL_LOOKBACK_WINDOW_MS) { + return `Backfill cannot look back more than ${MAX_SCHEDULE_BACKFILL_LOOKBACK_WINDOW_DAYS} days`; + } + + if (now < parsedStart) { + return `Backfill cannot be scheduled for the future`; + } + + if (end) { + const parsedEnd = Date.parse(end); + if (isNaN(parsedEnd)) { + return `Backfill end must be valid date`; + } + const startMs = new Date(start).valueOf(); + const endMs = new Date(end).valueOf(); + if (endMs <= startMs) { + return `Backfill end must be greater than backfill start`; + } + + if (now < parsedEnd) { + return `Backfill cannot be scheduled for the future`; + } + } + } catch (err) { + return `Error validating backfill schedule - ${err.message}`; + } +} diff --git a/x-pack/plugins/alerting/common/routes/backfill/apis/schedule/schemas/v1.ts b/x-pack/plugins/alerting/common/routes/backfill/apis/schedule/schemas/v1.ts index 791a5cce9ac38..527134a2b5138 100644 --- a/x-pack/plugins/alerting/common/routes/backfill/apis/schedule/schemas/v1.ts +++ b/x-pack/plugins/alerting/common/routes/backfill/apis/schedule/schemas/v1.ts @@ -5,6 +5,7 @@ * 2.0. */ import { schema } from '@kbn/config-schema'; +import { validateBackfillSchedule } from '../../../../..'; import { MAX_SCHEDULE_BACKFILL_BULK_SIZE } from '../../../../../constants'; import { backfillResponseSchemaV1, errorResponseSchemaV1 } from '../../../response'; @@ -17,22 +18,7 @@ export const scheduleBodySchema = schema.arrayOf( }, { validate({ start, end }) { - const parsedStart = Date.parse(start); - if (isNaN(parsedStart)) { - return `Backfill start must be valid date`; - } - - if (end) { - const parsedEnd = Date.parse(end); - if (isNaN(parsedEnd)) { - return `Backfill end must be valid date`; - } - const startMs = new Date(start).valueOf(); - const endMs = new Date(end).valueOf(); - if (endMs <= startMs) { - return `Backfill end must be greater than backfill start`; - } - } + return validateBackfillSchedule(start, end); }, } ), diff --git a/x-pack/plugins/alerting/server/application/backfill/methods/schedule/schedule_backfill.test.ts b/x-pack/plugins/alerting/server/application/backfill/methods/schedule/schedule_backfill.test.ts index 4767a344f5153..7edcb26b9718e 100644 --- a/x-pack/plugins/alerting/server/application/backfill/methods/schedule/schedule_backfill.test.ts +++ b/x-pack/plugins/alerting/server/application/backfill/methods/schedule/schedule_backfill.test.ts @@ -185,6 +185,10 @@ function getMockData(overwrites: Record = {}): ScheduleBackfill describe('scheduleBackfill()', () => { let rulesClient: RulesClient; + beforeAll(() => { + jest.useFakeTimers(); + jest.setSystemTime(new Date('2023-12-16T08:00:00.000Z')); + }); beforeEach(async () => { jest.resetAllMocks(); rulesClient = new RulesClient(rulesClientParams); @@ -239,6 +243,7 @@ describe('scheduleBackfill()', () => { }); backfillClient.bulkQueue.mockResolvedValue(mockBulkQueueResult); }); + afterAll(() => jest.useRealTimers()); test('should successfully schedule backfill', async () => { const mockData = [getMockData(), getMockData({ ruleId: '2', end: '2023-11-17T08:00:00.000Z' })]; diff --git a/x-pack/plugins/alerting/server/application/backfill/methods/schedule/schemas/schedule_backfill_params_schema.ts b/x-pack/plugins/alerting/server/application/backfill/methods/schedule/schemas/schedule_backfill_params_schema.ts index 0082181e759a6..c4a469da1b5db 100644 --- a/x-pack/plugins/alerting/server/application/backfill/methods/schedule/schemas/schedule_backfill_params_schema.ts +++ b/x-pack/plugins/alerting/server/application/backfill/methods/schedule/schemas/schedule_backfill_params_schema.ts @@ -6,6 +6,7 @@ */ import { schema } from '@kbn/config-schema'; +import { validateBackfillSchedule } from '../../../../../../common'; import { MAX_SCHEDULE_BACKFILL_BULK_SIZE } from '../../../../../../common/constants'; export const scheduleBackfillParamSchema = schema.object( @@ -16,22 +17,7 @@ export const scheduleBackfillParamSchema = schema.object( }, { validate({ start, end }) { - const parsedStart = Date.parse(start); - if (isNaN(parsedStart)) { - return `Backfill start must be valid date`; - } - - if (end) { - const parsedEnd = Date.parse(end); - if (isNaN(parsedEnd)) { - return `Backfill end must be valid date`; - } - const startMs = new Date(start).valueOf(); - const endMs = new Date(end).valueOf(); - if (endMs <= startMs) { - return `Backfill end must be greater than backfill start`; - } - } + return validateBackfillSchedule(start, end); }, } ); diff --git a/x-pack/test/alerting_api_integration/security_and_spaces/group1/tests/alerting/backfill/api_key.ts b/x-pack/test/alerting_api_integration/security_and_spaces/group1/tests/alerting/backfill/api_key.ts index 44e2c3f0252af..b079571b26224 100644 --- a/x-pack/test/alerting_api_integration/security_and_spaces/group1/tests/alerting/backfill/api_key.ts +++ b/x-pack/test/alerting_api_integration/security_and_spaces/group1/tests/alerting/backfill/api_key.ts @@ -6,6 +6,7 @@ */ import expect from '@kbn/expect'; +import moment from 'moment'; import { ALERTING_CASES_SAVED_OBJECT_INDEX, SavedObject } from '@kbn/core-saved-objects-server'; import { AdHocRunSO } from '@kbn/alerting-plugin/server/data/ad_hoc_run/types'; import { get } from 'lodash'; @@ -119,6 +120,8 @@ export default function apiKeyBackfillTests({ getService }: FtrProviderContext) } it('should wait to invalidate API key until backfill for rule is complete', async () => { + const start = moment().utc().startOf('day').subtract(7, 'days').toISOString(); + const end = moment().utc().startOf('day').subtract(4, 'day').toISOString(); const spaceId = SuperuserAtSpace1.space.id; // create 2 rules @@ -143,14 +146,9 @@ export default function apiKeyBackfillTests({ getService }: FtrProviderContext) .post(`${getUrlPrefix(spaceId)}/internal/alerting/rules/backfill/_schedule`) .set('kbn-xsrf', 'foo') .auth(SuperuserAtSpace1.user.username, SuperuserAtSpace1.user.password) - .send([ - { - rule_id: ruleId1, - start: '2023-10-19T12:00:00.000Z', - end: '2023-10-22T12:00:00.000Z', - }, - ]) + .send([{ rule_id: ruleId1, start, end }]) .expect(200); + const result = response.body; const backfillId = result[0].id; const schedule = result[0].schedule; @@ -163,43 +161,20 @@ export default function apiKeyBackfillTests({ getService }: FtrProviderContext) expect(typeof adHocRun1.createdAt).to.be('string'); expect(adHocRun1.duration).to.eql('12h'); expect(adHocRun1.enabled).to.eql(true); - expect(adHocRun1.start).to.eql('2023-10-19T12:00:00.000Z'); - expect(adHocRun1.end).to.eql('2023-10-22T12:00:00.000Z'); + expect(adHocRun1.start).to.eql(start); + expect(adHocRun1.end).to.eql(end); expect(adHocRun1.status).to.eql('pending'); expect(adHocRun1.spaceId).to.eql(spaceId); testExpectedRule(adHocRun1, undefined, true); - expect(adHocRun1.schedule).to.eql([ - { - runAt: '2023-10-20T00:00:00.000Z', - status: 'pending', - interval: '12h', - }, - { - runAt: '2023-10-20T12:00:00.000Z', - status: 'pending', - interval: '12h', - }, - { - runAt: '2023-10-21T00:00:00.000Z', - status: 'pending', - interval: '12h', - }, - { - runAt: '2023-10-21T12:00:00.000Z', - status: 'pending', - interval: '12h', - }, - { - runAt: '2023-10-22T00:00:00.000Z', - status: 'pending', - interval: '12h', - }, - { - runAt: '2023-10-22T12:00:00.000Z', - status: 'pending', - interval: '12h', - }, - ]); + + let currentStart = start; + adHocRun1.schedule.forEach((sched: any) => { + expect(sched.interval).to.eql('12h'); + expect(sched.status).to.eql('pending'); + const runAt = moment(currentStart).add(12, 'hours').toISOString(); + expect(sched.runAt).to.eql(runAt); + currentStart = runAt; + }); // delete both rules which will mark the api keys for invalidation await supertestWithoutAuth diff --git a/x-pack/test/alerting_api_integration/security_and_spaces/group1/tests/alerting/backfill/delete.ts b/x-pack/test/alerting_api_integration/security_and_spaces/group1/tests/alerting/backfill/delete.ts index d0b48e5753e29..cc86d9a7d157e 100644 --- a/x-pack/test/alerting_api_integration/security_and_spaces/group1/tests/alerting/backfill/delete.ts +++ b/x-pack/test/alerting_api_integration/security_and_spaces/group1/tests/alerting/backfill/delete.ts @@ -6,6 +6,7 @@ */ import expect from '@kbn/expect'; +import moment from 'moment'; import { asyncForEach } from '@kbn/std'; import { GetResponse } from '@elastic/elasticsearch/lib/api/typesWithBodyKey'; import { UserAtSpaceScenarios } from '../../../../scenarios'; @@ -26,6 +27,8 @@ export default function deleteBackfillTests({ getService }: FtrProviderContext) describe('delete backfill', () => { let backfillIds: Array<{ id: string; spaceId: string }> = []; const objectRemover = new ObjectRemover(supertest); + const start = moment().utc().startOf('day').subtract(31, 'days').toISOString(); + const end = moment().utc().startOf('day').subtract(1, 'day').toISOString(); afterEach(async () => { asyncForEach(backfillIds, async ({ id, spaceId }: { id: string; spaceId: string }) => { @@ -80,19 +83,10 @@ export default function deleteBackfillTests({ getService }: FtrProviderContext) const scheduleResponse = await supertest .post(`${getUrlPrefix(apiOptions.spaceId)}/internal/alerting/rules/backfill/_schedule`) .set('kbn-xsrf', 'foo') + // set a long time range so the backfill doesn't finish running and get deleted .send([ - { - // set a long time range so the backfill doesn't finish running and get deleted - rule_id: ruleId1, - start: '2023-10-19T12:00:00.000Z', - end: '2023-11-19T12:00:00.000Z', - }, - { - // set a long time range so the backfill doesn't finish running and get deleted - rule_id: ruleId2, - start: '2023-10-19T12:00:00.000Z', - end: '2023-11-19T12:00:00.000Z', - }, + { rule_id: ruleId1, start, end }, + { rule_id: ruleId2, start, end }, ]); const scheduleResult = scheduleResponse.body; @@ -258,7 +252,7 @@ export default function deleteBackfillTests({ getService }: FtrProviderContext) } }); - it('should not get backfill from another space', async () => { + it('should not delete backfill from another space', async () => { // create rule const rresponse = await supertest .post(`${getUrlPrefix(apiOptions.spaceId)}/api/alerting/rule`) @@ -272,13 +266,7 @@ export default function deleteBackfillTests({ getService }: FtrProviderContext) const scheduleResponse = await supertest .post(`${getUrlPrefix(apiOptions.spaceId)}/internal/alerting/rules/backfill/_schedule`) .set('kbn-xsrf', 'foo') - .send([ - { - rule_id: ruleId, - start: '2023-10-19T12:00:00.000Z', - end: '2023-10-25T12:00:00.000Z', - }, - ]); + .send([{ rule_id: ruleId, start, end }]); const scheduleResult = scheduleResponse.body; expect(scheduleResult.length).to.eql(1); diff --git a/x-pack/test/alerting_api_integration/security_and_spaces/group1/tests/alerting/backfill/find.ts b/x-pack/test/alerting_api_integration/security_and_spaces/group1/tests/alerting/backfill/find.ts index 43fadf5ee04e9..1a6d94a7ffafb 100644 --- a/x-pack/test/alerting_api_integration/security_and_spaces/group1/tests/alerting/backfill/find.ts +++ b/x-pack/test/alerting_api_integration/security_and_spaces/group1/tests/alerting/backfill/find.ts @@ -6,6 +6,7 @@ */ import expect from '@kbn/expect'; +import moment from 'moment'; import { asyncForEach } from '@kbn/std'; import { UserAtSpaceScenarios } from '../../../../scenarios'; import { getTestRuleData, getUrlPrefix, ObjectRemover } from '../../../../../common/lib'; @@ -19,6 +20,10 @@ export default function findBackfillTests({ getService }: FtrProviderContext) { describe('find backfill', () => { let backfillIds: Array<{ id: string; spaceId: string }> = []; const objectRemover = new ObjectRemover(supertest); + const start1 = moment().utc().startOf('day').subtract(14, 'days').toISOString(); + const end1 = moment().utc().startOf('day').subtract(8, 'day').toISOString(); + const start2 = moment().utc().startOf('day').subtract(12, 'days').toISOString(); + const end2 = moment().utc().startOf('day').subtract(10, 'day').toISOString(); afterEach(async () => { asyncForEach(backfillIds, async ({ id, spaceId }: { id: string; spaceId: string }) => { @@ -47,50 +52,44 @@ export default function findBackfillTests({ getService }: FtrProviderContext) { expect(data.id).to.eql(id); expect(data.duration).to.eql('12h'); expect(data.enabled).to.eql(true); - expect(data.start).to.eql('2023-10-19T12:00:00.000Z'); - expect(data.end).to.eql('2023-10-25T12:00:00.000Z'); + expect(data.start).to.eql(start1); + expect(data.end).to.eql(end1); expect(data.status).to.eql('pending'); expect(data.space_id).to.eql(spaceId); expect(typeof data.created_at).to.be('string'); testExpectedRule(data, ruleId, false); expect(data.schedule.length).to.eql(12); + + let currentStart = start1; data.schedule.forEach((sched: any) => { expect(sched.interval).to.eql('12h'); expect(sched.status).to.match(/complete|pending|running|error|timeout/); + const runAt = moment(currentStart).add(12, 'hours').toISOString(); + expect(sched.run_at).to.eql(runAt); + currentStart = runAt; }); - expect(data.schedule[0].run_at).to.eql('2023-10-20T00:00:00.000Z'); - expect(data.schedule[1].run_at).to.eql('2023-10-20T12:00:00.000Z'); - expect(data.schedule[2].run_at).to.eql('2023-10-21T00:00:00.000Z'); - expect(data.schedule[3].run_at).to.eql('2023-10-21T12:00:00.000Z'); - expect(data.schedule[4].run_at).to.eql('2023-10-22T00:00:00.000Z'); - expect(data.schedule[5].run_at).to.eql('2023-10-22T12:00:00.000Z'); - expect(data.schedule[6].run_at).to.eql('2023-10-23T00:00:00.000Z'); - expect(data.schedule[7].run_at).to.eql('2023-10-23T12:00:00.000Z'); - expect(data.schedule[8].run_at).to.eql('2023-10-24T00:00:00.000Z'); - expect(data.schedule[9].run_at).to.eql('2023-10-24T12:00:00.000Z'); - expect(data.schedule[10].run_at).to.eql('2023-10-25T00:00:00.000Z'); - expect(data.schedule[11].run_at).to.eql('2023-10-25T12:00:00.000Z'); } function testExpectedBackfill2(data: any, id: string, ruleId: string, spaceId: string) { expect(data.id).to.eql(id); expect(data.duration).to.eql('12h'); expect(data.enabled).to.eql(true); - expect(data.start).to.eql('2023-10-21T12:00:00.000Z'); - expect(data.end).to.eql('2023-10-23T12:00:00.000Z'); + expect(data.start).to.eql(start2); + expect(data.end).to.eql(end2); expect(data.status).to.eql('pending'); expect(data.space_id).to.eql(spaceId); expect(typeof data.created_at).to.be('string'); testExpectedRule(data, ruleId, false); expect(data.schedule.length).to.eql(4); + + let currentStart = start2; data.schedule.forEach((sched: any) => { expect(sched.interval).to.eql('12h'); expect(sched.status).to.match(/complete|pending|running|error|timeout/); + const runAt = moment(currentStart).add(12, 'hours').toISOString(); + expect(sched.run_at).to.eql(runAt); + currentStart = runAt; }); - expect(data.schedule[0].run_at).to.eql('2023-10-22T00:00:00.000Z'); - expect(data.schedule[1].run_at).to.eql('2023-10-22T12:00:00.000Z'); - expect(data.schedule[2].run_at).to.eql('2023-10-23T00:00:00.000Z'); - expect(data.schedule[3].run_at).to.eql('2023-10-23T12:00:00.000Z'); } function testExpectedRule(result: any, ruleId: string | undefined, isSO: boolean) { @@ -165,16 +164,8 @@ export default function findBackfillTests({ getService }: FtrProviderContext) { .post(`${getUrlPrefix(apiOptions.spaceId)}/internal/alerting/rules/backfill/_schedule`) .set('kbn-xsrf', 'foo') .send([ - { - rule_id: ruleId1, - start: '2023-10-19T12:00:00.000Z', - end: '2023-10-25T12:00:00.000Z', - }, - { - rule_id: ruleId2, - start: '2023-10-21T12:00:00.000Z', - end: '2023-10-23T12:00:00.000Z', - }, + { rule_id: ruleId1, start: start1, end: end1 }, + { rule_id: ruleId2, start: start2, end: end2 }, ]); const scheduleResult = scheduleResponse.body; @@ -235,7 +226,11 @@ export default function findBackfillTests({ getService }: FtrProviderContext) { .post( `${getUrlPrefix( apiOptions.spaceId - )}/internal/alerting/rules/backfill/_find?start=2023-10-19T08:00:00.000Z` + )}/internal/alerting/rules/backfill/_find?start=${moment() + .utc() + .startOf('day') + .subtract(15, 'days') + .toISOString()}` ) .set('kbn-xsrf', 'foo') .auth(apiOptions.username, apiOptions.password); @@ -245,7 +240,11 @@ export default function findBackfillTests({ getService }: FtrProviderContext) { .post( `${getUrlPrefix( apiOptions.spaceId - )}/internal/alerting/rules/backfill/_find?start=2023-10-20T08:00:00.000Z` + )}/internal/alerting/rules/backfill/_find?start=${moment() + .utc() + .startOf('day') + .subtract(13, 'days') + .toISOString()}` ) .set('kbn-xsrf', 'foo') .auth(apiOptions.username, apiOptions.password); @@ -255,7 +254,11 @@ export default function findBackfillTests({ getService }: FtrProviderContext) { .post( `${getUrlPrefix( apiOptions.spaceId - )}/internal/alerting/rules/backfill/_find?start=2023-10-22T08:00:00.000Z` + )}/internal/alerting/rules/backfill/_find?start=${moment() + .utc() + .startOf('day') + .subtract(5, 'days') + .toISOString()}` ) .set('kbn-xsrf', 'foo') .auth(apiOptions.username, apiOptions.password); @@ -265,7 +268,11 @@ export default function findBackfillTests({ getService }: FtrProviderContext) { .post( `${getUrlPrefix( apiOptions.spaceId - )}/internal/alerting/rules/backfill/_find?end=2023-10-26T00:00:00.000Z` + )}/internal/alerting/rules/backfill/_find?end=${moment() + .utc() + .startOf('day') + .subtract(5, 'days') + .toISOString()}` ) .set('kbn-xsrf', 'foo') .auth(apiOptions.username, apiOptions.password); @@ -275,7 +282,11 @@ export default function findBackfillTests({ getService }: FtrProviderContext) { .post( `${getUrlPrefix( apiOptions.spaceId - )}/internal/alerting/rules/backfill/_find?end=2023-10-24T18:00:00.000Z` + )}/internal/alerting/rules/backfill/_find?end=${moment() + .utc() + .startOf('day') + .subtract(9, 'days') + .toISOString()}` ) .set('kbn-xsrf', 'foo') .auth(apiOptions.username, apiOptions.password); @@ -285,7 +296,11 @@ export default function findBackfillTests({ getService }: FtrProviderContext) { .post( `${getUrlPrefix( apiOptions.spaceId - )}/internal/alerting/rules/backfill/_find?end=2023-10-18T00:00:00.000Z` + )}/internal/alerting/rules/backfill/_find?end=${moment() + .utc() + .startOf('day') + .subtract(15, 'days') + .toISOString()}` ) .set('kbn-xsrf', 'foo') .auth(apiOptions.username, apiOptions.password); @@ -295,7 +310,15 @@ export default function findBackfillTests({ getService }: FtrProviderContext) { .post( `${getUrlPrefix( apiOptions.spaceId - )}/internal/alerting/rules/backfill/_find?start=2023-10-19T00:00:00.000Z&end=2023-10-26T00:00:00.000Z` + )}/internal/alerting/rules/backfill/_find?start=${moment() + .utc() + .startOf('day') + .subtract(15, 'days') + .toISOString()}&end=${moment() + .utc() + .startOf('day') + .subtract(7, 'days') + .toISOString()}` ) .set('kbn-xsrf', 'foo') .auth(apiOptions.username, apiOptions.password); @@ -305,7 +328,15 @@ export default function findBackfillTests({ getService }: FtrProviderContext) { .post( `${getUrlPrefix( apiOptions.spaceId - )}/internal/alerting/rules/backfill/_find?start=2023-10-21T00:00:00.000Z&end=2023-10-23T13:00:00.000Z` + )}/internal/alerting/rules/backfill/_find?start=${moment() + .utc() + .startOf('day') + .subtract(13, 'days') + .toISOString()}&end=${moment() + .utc() + .startOf('day') + .subtract(9, 'days') + .toISOString()}` ) .set('kbn-xsrf', 'foo') .auth(apiOptions.username, apiOptions.password); @@ -315,7 +346,15 @@ export default function findBackfillTests({ getService }: FtrProviderContext) { .post( `${getUrlPrefix( apiOptions.spaceId - )}/internal/alerting/rules/backfill/_find?start=2023-10-18T00:00:00.000Z&end=2023-10-19T00:00:00.000Z` + )}/internal/alerting/rules/backfill/_find?start=${moment() + .utc() + .startOf('day') + .subtract(20, 'days') + .toISOString()}&end=${moment() + .utc() + .startOf('day') + .subtract(15, 'days') + .toISOString()}` ) .set('kbn-xsrf', 'foo') .auth(apiOptions.username, apiOptions.password); @@ -625,9 +664,9 @@ export default function findBackfillTests({ getService }: FtrProviderContext) { ruleId2, space.id ); - const start1 = new Date(resultFindWithSort.data[0].start).valueOf(); - const start2 = new Date(resultFindWithSort.data[1].start).valueOf(); - expect(start1).to.be.greaterThan(start2); + const sortedStart1 = new Date(resultFindWithSort.data[0].start).valueOf(); + const sortedStart2 = new Date(resultFindWithSort.data[1].start).valueOf(); + expect(sortedStart1).to.be.greaterThan(sortedStart2); break; default: diff --git a/x-pack/test/alerting_api_integration/security_and_spaces/group1/tests/alerting/backfill/get.ts b/x-pack/test/alerting_api_integration/security_and_spaces/group1/tests/alerting/backfill/get.ts index cce0e974032a7..7b051df51b226 100644 --- a/x-pack/test/alerting_api_integration/security_and_spaces/group1/tests/alerting/backfill/get.ts +++ b/x-pack/test/alerting_api_integration/security_and_spaces/group1/tests/alerting/backfill/get.ts @@ -6,6 +6,7 @@ */ import expect from '@kbn/expect'; +import moment from 'moment'; import { asyncForEach } from '@kbn/std'; import { UserAtSpaceScenarios } from '../../../../scenarios'; import { getTestRuleData, getUrlPrefix, ObjectRemover } from '../../../../../common/lib'; @@ -19,6 +20,9 @@ export default function getBackfillTests({ getService }: FtrProviderContext) { describe('get backfill', () => { let backfillIds: Array<{ id: string; spaceId: string }> = []; const objectRemover = new ObjectRemover(supertest); + const start = moment().utc().startOf('day').subtract(7, 'days').toISOString(); + const end1 = moment().utc().startOf('day').subtract(1, 'day').toISOString(); + const end2 = moment().utc().startOf('day').subtract(3, 'day').toISOString(); afterEach(async () => { asyncForEach(backfillIds, async ({ id, spaceId }: { id: string; spaceId: string }) => { @@ -115,16 +119,8 @@ export default function getBackfillTests({ getService }: FtrProviderContext) { .post(`${getUrlPrefix(apiOptions.spaceId)}/internal/alerting/rules/backfill/_schedule`) .set('kbn-xsrf', 'foo') .send([ - { - rule_id: ruleId1, - start: '2023-10-19T12:00:00.000Z', - end: '2023-10-25T12:00:00.000Z', - }, - { - rule_id: ruleId2, - start: '2023-10-19T12:00:00.000Z', - end: '2023-10-23T12:00:00.000Z', - }, + { rule_id: ruleId1, start, end: end1 }, + { rule_id: ruleId2, start, end: end2 }, ]); const scheduleResult = scheduleResponse.body; @@ -183,52 +179,42 @@ export default function getBackfillTests({ getService }: FtrProviderContext) { expect(getResponse1.body.id).to.eql(backfillId1); expect(getResponse1.body.duration).to.eql('12h'); expect(getResponse1.body.enabled).to.eql(true); - expect(getResponse1.body.start).to.eql('2023-10-19T12:00:00.000Z'); - expect(getResponse1.body.end).to.eql('2023-10-25T12:00:00.000Z'); + expect(getResponse1.body.start).to.eql(start); + expect(getResponse1.body.end).to.eql(end1); expect(getResponse1.body.status).to.eql('pending'); expect(getResponse1.body.space_id).to.eql(space.id); expect(typeof getResponse1.body.created_at).to.be('string'); testExpectedRule(getResponse1.body, ruleId1, false); expect(getResponse1.body.schedule.length).to.eql(12); + + let currentStart = start; getResponse1.body.schedule.forEach((sched: any) => { expect(sched.interval).to.eql('12h'); expect(sched.status).to.match(/complete|pending|running|error|timeout/); + const runAt = moment(currentStart).add(12, 'hours').toISOString(); + expect(sched.run_at).to.eql(runAt); + currentStart = runAt; }); - expect(getResponse1.body.schedule[0].run_at).to.eql('2023-10-20T00:00:00.000Z'); - expect(getResponse1.body.schedule[1].run_at).to.eql('2023-10-20T12:00:00.000Z'); - expect(getResponse1.body.schedule[2].run_at).to.eql('2023-10-21T00:00:00.000Z'); - expect(getResponse1.body.schedule[3].run_at).to.eql('2023-10-21T12:00:00.000Z'); - expect(getResponse1.body.schedule[4].run_at).to.eql('2023-10-22T00:00:00.000Z'); - expect(getResponse1.body.schedule[5].run_at).to.eql('2023-10-22T12:00:00.000Z'); - expect(getResponse1.body.schedule[6].run_at).to.eql('2023-10-23T00:00:00.000Z'); - expect(getResponse1.body.schedule[7].run_at).to.eql('2023-10-23T12:00:00.000Z'); - expect(getResponse1.body.schedule[8].run_at).to.eql('2023-10-24T00:00:00.000Z'); - expect(getResponse1.body.schedule[9].run_at).to.eql('2023-10-24T12:00:00.000Z'); - expect(getResponse1.body.schedule[10].run_at).to.eql('2023-10-25T00:00:00.000Z'); - expect(getResponse1.body.schedule[11].run_at).to.eql('2023-10-25T12:00:00.000Z'); expect(getResponse2.body.id).to.eql(backfillId2); expect(getResponse2.body.duration).to.eql('12h'); expect(getResponse2.body.enabled).to.eql(true); - expect(getResponse2.body.start).to.eql('2023-10-19T12:00:00.000Z'); - expect(getResponse2.body.end).to.eql('2023-10-23T12:00:00.000Z'); + expect(getResponse2.body.start).to.eql(start); + expect(getResponse2.body.end).to.eql(end2); expect(getResponse2.body.status).to.eql('pending'); expect(getResponse2.body.space_id).to.eql(space.id); expect(typeof getResponse2.body.created_at).to.be('string'); testExpectedRule(getResponse2.body, ruleId2, false); expect(getResponse2.body.schedule.length).to.eql(8); + + currentStart = start; getResponse2.body.schedule.forEach((sched: any) => { expect(sched.interval).to.eql('12h'); expect(sched.status).to.match(/complete|pending|running|error|timeout/); + const runAt = moment(currentStart).add(12, 'hours').toISOString(); + expect(sched.run_at).to.eql(runAt); + currentStart = runAt; }); - expect(getResponse2.body.schedule[0].run_at).to.eql('2023-10-20T00:00:00.000Z'); - expect(getResponse2.body.schedule[1].run_at).to.eql('2023-10-20T12:00:00.000Z'); - expect(getResponse2.body.schedule[2].run_at).to.eql('2023-10-21T00:00:00.000Z'); - expect(getResponse2.body.schedule[3].run_at).to.eql('2023-10-21T12:00:00.000Z'); - expect(getResponse2.body.schedule[4].run_at).to.eql('2023-10-22T00:00:00.000Z'); - expect(getResponse2.body.schedule[5].run_at).to.eql('2023-10-22T12:00:00.000Z'); - expect(getResponse2.body.schedule[6].run_at).to.eql('2023-10-23T00:00:00.000Z'); - expect(getResponse2.body.schedule[7].run_at).to.eql('2023-10-23T12:00:00.000Z'); break; default: throw new Error(`Scenario untested: ${JSON.stringify(scenario)}`); @@ -286,13 +272,7 @@ export default function getBackfillTests({ getService }: FtrProviderContext) { const scheduleResponse = await supertest .post(`${getUrlPrefix(apiOptions.spaceId)}/internal/alerting/rules/backfill/_schedule`) .set('kbn-xsrf', 'foo') - .send([ - { - rule_id: ruleId, - start: '2023-10-19T12:00:00.000Z', - end: '2023-10-25T12:00:00.000Z', - }, - ]); + .send([{ rule_id: ruleId, start, end: end1 }]); const scheduleResult = scheduleResponse.body; expect(scheduleResult.length).to.eql(1); diff --git a/x-pack/test/alerting_api_integration/security_and_spaces/group1/tests/alerting/backfill/schedule.ts b/x-pack/test/alerting_api_integration/security_and_spaces/group1/tests/alerting/backfill/schedule.ts index 4bcd91574997b..d5207718d844a 100644 --- a/x-pack/test/alerting_api_integration/security_and_spaces/group1/tests/alerting/backfill/schedule.ts +++ b/x-pack/test/alerting_api_integration/security_and_spaces/group1/tests/alerting/backfill/schedule.ts @@ -6,6 +6,7 @@ */ import expect from '@kbn/expect'; +import moment from 'moment'; import { ALERTING_CASES_SAVED_OBJECT_INDEX, SavedObject } from '@kbn/core-saved-objects-server'; import { AdHocRunSO } from '@kbn/alerting-plugin/server/data/ad_hoc_run/types'; import { get } from 'lodash'; @@ -127,6 +128,8 @@ export default function scheduleBackfillTests({ getService }: FtrProviderContext password: user.password, }; it('should handle scheduling backfill job requests appropriately', async () => { + const defaultStart = moment().utc().startOf('day').subtract(7, 'days').toISOString(); + const defaultEnd = moment().utc().startOf('day').subtract(1, 'day').toISOString(); // create 2 rules const rresponse1 = await supertest .post(`${getUrlPrefix(apiOptions.spaceId)}/api/alerting/rule`) @@ -152,10 +155,10 @@ export default function scheduleBackfillTests({ getService }: FtrProviderContext .send([ { rule_id: ruleId1, - start: '2023-10-19T12:00:00.000Z', - end: '2023-10-25T12:00:00.000Z', + start: defaultStart, + end: defaultEnd, }, - { rule_id: ruleId2, start: '2023-10-19T12:00:00.000Z' }, + { rule_id: ruleId2, start: defaultStart }, ]); switch (scenario.id) { @@ -195,92 +198,37 @@ export default function scheduleBackfillTests({ getService }: FtrProviderContext backfillIds.push({ id: result[0].id, spaceId: apiOptions.spaceId }); expect(result[0].duration).to.eql('12h'); expect(result[0].enabled).to.eql(true); - expect(result[0].start).to.eql('2023-10-19T12:00:00.000Z'); - expect(result[0].end).to.eql('2023-10-25T12:00:00.000Z'); + expect(result[0].start).to.eql(defaultStart); + expect(result[0].end).to.eql(defaultEnd); expect(result[0].status).to.eql('pending'); expect(result[0].space_id).to.eql(space.id); expect(typeof result[0].created_at).to.be('string'); testExpectedRule(result[0], ruleId1, false); - expect(result[0].schedule).to.eql([ - { - run_at: '2023-10-20T00:00:00.000Z', - status: 'pending', - interval: '12h', - }, - { - run_at: '2023-10-20T12:00:00.000Z', - status: 'pending', - interval: '12h', - }, - { - run_at: '2023-10-21T00:00:00.000Z', - status: 'pending', - interval: '12h', - }, - { - run_at: '2023-10-21T12:00:00.000Z', - status: 'pending', - interval: '12h', - }, - { - run_at: '2023-10-22T00:00:00.000Z', - status: 'pending', - interval: '12h', - }, - { - run_at: '2023-10-22T12:00:00.000Z', - status: 'pending', - interval: '12h', - }, - { - run_at: '2023-10-23T00:00:00.000Z', - status: 'pending', - interval: '12h', - }, - { - run_at: '2023-10-23T12:00:00.000Z', - status: 'pending', - interval: '12h', - }, - { - run_at: '2023-10-24T00:00:00.000Z', - status: 'pending', - interval: '12h', - }, - { - run_at: '2023-10-24T12:00:00.000Z', - status: 'pending', - interval: '12h', - }, - { - run_at: '2023-10-25T00:00:00.000Z', - status: 'pending', - interval: '12h', - }, - { - run_at: '2023-10-25T12:00:00.000Z', - status: 'pending', - interval: '12h', - }, - ]); + + let currentStart = defaultStart; + result[0].schedule.forEach((sched: any) => { + expect(sched.interval).to.eql('12h'); + expect(sched.status).to.eql('pending'); + const runAt = moment(currentStart).add(12, 'hours').toISOString(); + expect(sched.run_at).to.eql(runAt); + currentStart = runAt; + }); expect(typeof result[1].id).to.be('string'); backfillIds.push({ id: result[1].id, spaceId: apiOptions.spaceId }); expect(result[1].duration).to.eql('12h'); expect(result[1].enabled).to.eql(true); - expect(result[1].start).to.eql('2023-10-19T12:00:00.000Z'); - expect(result[1].end).to.eql('2023-10-20T00:00:00.000Z'); + expect(result[1].start).to.eql(defaultStart); + expect(result[1].end).to.eql(moment(defaultStart).add(12, 'hours').toISOString()); expect(result[1].status).to.eql('pending'); expect(result[1].space_id).to.eql(space.id); expect(typeof result[1].created_at).to.be('string'); testExpectedRule(result[1], ruleId2, false); - expect(result[1].schedule).to.eql([ - { - run_at: '2023-10-20T00:00:00.000Z', - status: 'pending', - interval: '12h', - }, - ]); + expect(result[1].schedule[0].interval).to.eql('12h'); + expect(result[1].schedule[0].status).to.eql('pending'); + expect(result[1].schedule[0].run_at).to.eql( + moment(defaultStart).add(12, 'hours').toISOString() + ); // check that the ad hoc run SO was created const adHocRunSO1 = (await getAdHocRunSO(result[0].id)) as SavedObject; @@ -293,91 +241,35 @@ export default function scheduleBackfillTests({ getService }: FtrProviderContext expect(typeof adHocRun1.createdAt).to.be('string'); expect(adHocRun1.duration).to.eql('12h'); expect(adHocRun1.enabled).to.eql(true); - expect(adHocRun1.start).to.eql('2023-10-19T12:00:00.000Z'); - expect(adHocRun1.end).to.eql('2023-10-25T12:00:00.000Z'); + expect(adHocRun1.start).to.eql(defaultStart); + expect(adHocRun1.end).to.eql(defaultEnd); expect(adHocRun1.status).to.eql('pending'); expect(adHocRun1.spaceId).to.eql(space.id); testExpectedRule(adHocRun1, undefined, true); - expect(adHocRun1.schedule).to.eql([ - { - runAt: '2023-10-20T00:00:00.000Z', - status: 'pending', - interval: '12h', - }, - { - runAt: '2023-10-20T12:00:00.000Z', - status: 'pending', - interval: '12h', - }, - { - runAt: '2023-10-21T00:00:00.000Z', - status: 'pending', - interval: '12h', - }, - { - runAt: '2023-10-21T12:00:00.000Z', - status: 'pending', - interval: '12h', - }, - { - runAt: '2023-10-22T00:00:00.000Z', - status: 'pending', - interval: '12h', - }, - { - runAt: '2023-10-22T12:00:00.000Z', - status: 'pending', - interval: '12h', - }, - { - runAt: '2023-10-23T00:00:00.000Z', - status: 'pending', - interval: '12h', - }, - { - runAt: '2023-10-23T12:00:00.000Z', - status: 'pending', - interval: '12h', - }, - { - runAt: '2023-10-24T00:00:00.000Z', - status: 'pending', - interval: '12h', - }, - { - runAt: '2023-10-24T12:00:00.000Z', - status: 'pending', - interval: '12h', - }, - { - runAt: '2023-10-25T00:00:00.000Z', - status: 'pending', - interval: '12h', - }, - { - runAt: '2023-10-25T12:00:00.000Z', - status: 'pending', - interval: '12h', - }, - ]); + currentStart = defaultStart; + adHocRun1.schedule.forEach((sched: any) => { + expect(sched.interval).to.eql('12h'); + expect(sched.status).to.eql('pending'); + const runAt = moment(currentStart).add(12, 'hours').toISOString(); + expect(sched.runAt).to.eql(runAt); + currentStart = runAt; + }); expect(typeof adHocRun2.apiKeyId).to.be('string'); expect(typeof adHocRun2.apiKeyToUse).to.be('string'); expect(typeof adHocRun2.createdAt).to.be('string'); expect(adHocRun2.duration).to.eql('12h'); expect(adHocRun2.enabled).to.eql(true); - expect(adHocRun2.start).to.eql('2023-10-19T12:00:00.000Z'); - expect(adHocRun2.end).to.eql('2023-10-20T00:00:00.000Z'); + expect(adHocRun2.start).to.eql(defaultStart); + expect(adHocRun2.end).to.eql(moment(defaultStart).add(12, 'hours').toISOString()); expect(adHocRun2.status).to.eql('pending'); expect(adHocRun2.spaceId).to.eql(space.id); testExpectedRule(adHocRun2, undefined, true); - expect(adHocRun2.schedule).to.eql([ - { - runAt: '2023-10-20T00:00:00.000Z', - status: 'pending', - interval: '12h', - }, - ]); + expect(adHocRun2.schedule[0].interval).to.eql('12h'); + expect(adHocRun2.schedule[0].status).to.eql('pending'); + expect(adHocRun2.schedule[0].runAt).to.eql( + moment(defaultStart).add(12, 'hours').toISOString() + ); // check references are stored correctly expect(adHocRunSO1.references).to.eql([{ id: ruleId1, name: 'rule', type: 'alert' }]); @@ -423,6 +315,11 @@ export default function scheduleBackfillTests({ getService }: FtrProviderContext }); it('should handle scheduling multiple backfill job requests for a single rule appropriately', async () => { + const start1 = moment().utc().startOf('day').subtract(7, 'days').toISOString(); + const end1 = moment().utc().startOf('day').subtract(4, 'days').toISOString(); + const start2 = moment().utc().startOf('day').subtract(8, 'days').toISOString(); + const start3 = moment().utc().startOf('day').subtract(14, 'days').toISOString(); + const end3 = moment().utc().startOf('day').subtract(12, 'days').toISOString(); // create 1 rule as current user const rresponse = await supertest .post(`${getUrlPrefix(apiOptions.spaceId)}/api/alerting/rule`) @@ -438,17 +335,9 @@ export default function scheduleBackfillTests({ getService }: FtrProviderContext .set('kbn-xsrf', 'foo') .auth(apiOptions.username, apiOptions.password) .send([ - { - rule_id: ruleId, - start: '2023-10-19T12:00:00.000Z', - end: '2023-10-21T12:00:00.000Z', - }, - { rule_id: ruleId, start: '2023-10-18T12:00:00.000Z' }, - { - rule_id: ruleId, - start: '2023-12-30T12:00:00.000Z', - end: '2024-01-01T12:00:00.000Z', - }, + { rule_id: ruleId, start: start1, end: end1 }, + { rule_id: ruleId, start: start2 }, + { rule_id: ruleId, start: start3, end: end3 }, ]); switch (scenario.id) { @@ -488,85 +377,61 @@ export default function scheduleBackfillTests({ getService }: FtrProviderContext backfillIds.push({ id: result[0].id, spaceId: apiOptions.spaceId }); expect(result[0].duration).to.eql('12h'); expect(result[0].enabled).to.eql(true); - expect(result[0].start).to.eql('2023-10-19T12:00:00.000Z'); - expect(result[0].end).to.eql('2023-10-21T12:00:00.000Z'); + expect(result[0].start).to.eql(start1); + expect(result[0].end).to.eql(end1); expect(result[0].status).to.eql('pending'); expect(result[0].space_id).to.eql(space.id); expect(typeof result[0].created_at).to.be('string'); testExpectedRule(result[0], ruleId, false); - expect(result[0].schedule).to.eql([ - { - interval: '12h', - run_at: '2023-10-20T00:00:00.000Z', - status: 'pending', - }, - { - interval: '12h', - run_at: '2023-10-20T12:00:00.000Z', - status: 'pending', - }, - { - interval: '12h', - run_at: '2023-10-21T00:00:00.000Z', - status: 'pending', - }, - { - interval: '12h', - run_at: '2023-10-21T12:00:00.000Z', - status: 'pending', - }, - ]); + + let currentStart = start1; + result[0].schedule.forEach((sched: any) => { + expect(sched.interval).to.eql('12h'); + expect(sched.status).to.eql('pending'); + const runAt = moment(currentStart).add(12, 'hours').toISOString(); + expect(sched.run_at).to.eql(runAt); + currentStart = runAt; + }); expect(typeof result[1].id).to.be('string'); backfillIds.push({ id: result[1].id, spaceId: apiOptions.spaceId }); expect(result[1].duration).to.eql('12h'); expect(result[1].enabled).to.eql(true); - expect(result[1].start).to.eql('2023-10-18T12:00:00.000Z'); - expect(result[1].end).to.eql('2023-10-19T00:00:00.000Z'); + expect(result[1].start).to.eql(start2); + expect(result[1].end).to.eql(moment(start2).add(12, 'hours').toISOString()); expect(result[1].status).to.eql('pending'); expect(result[1].space_id).to.eql(space.id); expect(typeof result[1].created_at).to.be('string'); testExpectedRule(result[1], ruleId, false); - expect(result[1].schedule).to.eql([ - { - interval: '12h', - run_at: '2023-10-19T00:00:00.000Z', - status: 'pending', - }, - ]); + + currentStart = start2; + result[1].schedule.forEach((sched: any) => { + expect(sched.interval).to.eql('12h'); + expect(sched.status).to.eql('pending'); + const runAt = moment(currentStart).add(12, 'hours').toISOString(); + expect(sched.run_at).to.eql(runAt); + currentStart = runAt; + }); expect(typeof result[2].id).to.be('string'); backfillIds.push({ id: result[2].id, spaceId: apiOptions.spaceId }); expect(result[2].duration).to.eql('12h'); expect(result[2].enabled).to.eql(true); - expect(result[2].start).to.eql('2023-12-30T12:00:00.000Z'); - expect(result[2].end).to.eql('2024-01-01T12:00:00.000Z'); + expect(result[2].start).to.eql(start3); + expect(result[2].end).to.eql(end3); expect(result[2].status).to.eql('pending'); expect(result[2].space_id).to.eql(space.id); expect(typeof result[2].created_at).to.be('string'); testExpectedRule(result[2], ruleId, false); - expect(result[2].schedule).to.eql([ - { - interval: '12h', - run_at: '2023-12-31T00:00:00.000Z', - status: 'pending', - }, - { - interval: '12h', - run_at: '2023-12-31T12:00:00.000Z', - status: 'pending', - }, - { - interval: '12h', - run_at: '2024-01-01T00:00:00.000Z', - status: 'pending', - }, - { - interval: '12h', - run_at: '2024-01-01T12:00:00.000Z', - status: 'pending', - }, - ]); + + currentStart = start3; + result[2].schedule.forEach((sched: any) => { + expect(sched.interval).to.eql('12h'); + expect(sched.status).to.eql('pending'); + const runAt = moment(currentStart).add(12, 'hours').toISOString(); + expect(sched.run_at).to.eql(runAt); + currentStart = runAt; + }); // check that the ad hoc run SO was created const adHocRunSO1 = (await getAdHocRunSO(result[0].id)) as SavedObject; @@ -581,84 +446,60 @@ export default function scheduleBackfillTests({ getService }: FtrProviderContext expect(typeof adHocRun1.createdAt).to.be('string'); expect(adHocRun1.duration).to.eql('12h'); expect(adHocRun1.enabled).to.eql(true); - expect(adHocRun1.start).to.eql('2023-10-19T12:00:00.000Z'); - expect(adHocRun1.end).to.eql('2023-10-21T12:00:00.000Z'); + expect(adHocRun1.start).to.eql(start1); + expect(adHocRun1.end).to.eql(end1); expect(adHocRun1.status).to.eql('pending'); expect(adHocRun1.spaceId).to.eql(space.id); testExpectedRule(adHocRun1, undefined, true); - expect(adHocRun1.schedule).to.eql([ - { - interval: '12h', - runAt: '2023-10-20T00:00:00.000Z', - status: 'pending', - }, - { - interval: '12h', - runAt: '2023-10-20T12:00:00.000Z', - status: 'pending', - }, - { - interval: '12h', - runAt: '2023-10-21T00:00:00.000Z', - status: 'pending', - }, - { - interval: '12h', - runAt: '2023-10-21T12:00:00.000Z', - status: 'pending', - }, - ]); + + currentStart = start1; + adHocRun1.schedule.forEach((sched: any) => { + expect(sched.interval).to.eql('12h'); + expect(sched.status).to.eql('pending'); + const runAt = moment(currentStart).add(12, 'hours').toISOString(); + expect(sched.runAt).to.eql(runAt); + currentStart = runAt; + }); expect(typeof adHocRun2.apiKeyId).to.be('string'); expect(typeof adHocRun2.apiKeyToUse).to.be('string'); expect(typeof adHocRun2.createdAt).to.be('string'); expect(adHocRun2.duration).to.eql('12h'); expect(adHocRun2.enabled).to.eql(true); - expect(adHocRun2.start).to.eql('2023-10-18T12:00:00.000Z'); - expect(adHocRun2.end).to.eql('2023-10-19T00:00:00.000Z'); + expect(adHocRun2.start).to.eql(start2); + expect(adHocRun2.end).to.eql(moment(start2).add(12, 'hours').toISOString()); expect(adHocRun2.status).to.eql('pending'); expect(adHocRun2.spaceId).to.eql(space.id); testExpectedRule(adHocRun2, undefined, true); - expect(adHocRun2.schedule).to.eql([ - { - interval: '12h', - runAt: '2023-10-19T00:00:00.000Z', - status: 'pending', - }, - ]); + + currentStart = start2; + adHocRun2.schedule.forEach((sched: any) => { + expect(sched.interval).to.eql('12h'); + expect(sched.status).to.eql('pending'); + const runAt = moment(currentStart).add(12, 'hours').toISOString(); + expect(sched.runAt).to.eql(runAt); + currentStart = runAt; + }); expect(typeof adHocRun3.apiKeyId).to.be('string'); expect(typeof adHocRun3.apiKeyToUse).to.be('string'); expect(typeof adHocRun3.createdAt).to.be('string'); expect(adHocRun3.duration).to.eql('12h'); expect(adHocRun3.enabled).to.eql(true); - expect(adHocRun3.start).to.eql('2023-12-30T12:00:00.000Z'); - expect(adHocRun3.end).to.eql('2024-01-01T12:00:00.000Z'); + expect(adHocRun3.start).to.eql(start3); + expect(adHocRun3.end).to.eql(end3); expect(adHocRun3.status).to.eql('pending'); expect(adHocRun3.spaceId).to.eql(space.id); testExpectedRule(adHocRun3, undefined, true); - expect(adHocRun3.schedule).to.eql([ - { - interval: '12h', - runAt: '2023-12-31T00:00:00.000Z', - status: 'pending', - }, - { - interval: '12h', - runAt: '2023-12-31T12:00:00.000Z', - status: 'pending', - }, - { - interval: '12h', - runAt: '2024-01-01T00:00:00.000Z', - status: 'pending', - }, - { - interval: '12h', - runAt: '2024-01-01T12:00:00.000Z', - status: 'pending', - }, - ]); + + currentStart = start3; + adHocRun3.schedule.forEach((sched: any) => { + expect(sched.interval).to.eql('12h'); + expect(sched.status).to.eql('pending'); + const runAt = moment(currentStart).add(12, 'hours').toISOString(); + expect(sched.runAt).to.eql(runAt); + currentStart = runAt; + }); // check references are stored correctly expect(adHocRunSO1.references).to.eql([{ id: ruleId, name: 'rule', type: 'alert' }]); @@ -726,12 +567,7 @@ export default function scheduleBackfillTests({ getService }: FtrProviderContext .post(`${getUrlPrefix(apiOptions.spaceId)}/internal/alerting/rules/backfill/_schedule`) .set('kbn-xsrf', 'foo') .auth(apiOptions.username, apiOptions.password) - .send([ - { - rule_id: 'abc', - start: 'foo', - }, - ]); + .send([{ rule_id: 'abc', start: 'foo' }]); // invalid end time const response2 = await supertestWithoutAuth @@ -741,34 +577,58 @@ export default function scheduleBackfillTests({ getService }: FtrProviderContext .send([ { rule_id: 'abc', - start: '2023-10-19T12:00:00.000Z', + start: moment().utc().startOf('day').subtract(7, 'days').toISOString(), end: 'foo', }, ]); // end time equals start time + const time = moment().utc().startOf('day').subtract(7, 'days').toISOString(); const response3 = await supertestWithoutAuth + .post(`${getUrlPrefix(apiOptions.spaceId)}/internal/alerting/rules/backfill/_schedule`) + .set('kbn-xsrf', 'foo') + .auth(apiOptions.username, apiOptions.password) + .send([{ rule_id: 'abc', start: time, end: time }]); + + // end time is before start time + const response4 = await supertestWithoutAuth .post(`${getUrlPrefix(apiOptions.spaceId)}/internal/alerting/rules/backfill/_schedule`) .set('kbn-xsrf', 'foo') .auth(apiOptions.username, apiOptions.password) .send([ { rule_id: 'abc', - start: '2023-10-19T12:00:00.000Z', - end: '2023-10-19T12:00:00.000Z', + start: moment().utc().startOf('day').subtract(7, 'days').toISOString(), + end: moment().utc().startOf('day').subtract(8, 'days').toISOString(), }, ]); - // end time is before start time - const response4 = await supertestWithoutAuth + // start time is too far in the past + const response5 = await supertestWithoutAuth + .post(`${getUrlPrefix(apiOptions.spaceId)}/internal/alerting/rules/backfill/_schedule`) + .set('kbn-xsrf', 'foo') + .auth(apiOptions.username, apiOptions.password) + .send([{ rule_id: 'abc', start: '2023-04-30T00:00:00.000Z' }]); + + // start time is in the future + const response6 = await supertestWithoutAuth + .post(`${getUrlPrefix(apiOptions.spaceId)}/internal/alerting/rules/backfill/_schedule`) + .set('kbn-xsrf', 'foo') + .auth(apiOptions.username, apiOptions.password) + .send([ + { rule_id: 'abc', start: moment().utc().startOf('day').add(1, 'days').toISOString() }, + ]); + + // end time is in the future + const response7 = await supertestWithoutAuth .post(`${getUrlPrefix(apiOptions.spaceId)}/internal/alerting/rules/backfill/_schedule`) .set('kbn-xsrf', 'foo') .auth(apiOptions.username, apiOptions.password) .send([ { rule_id: 'abc', - start: '2023-10-19T12:00:00.000Z', - end: '2020-10-19T12:00:00.000Z', + start: moment().utc().startOf('day').subtract(1, 'days').toISOString(), + end: moment().utc().startOf('day').add(1, 'days').toISOString(), }, ]); @@ -817,6 +677,27 @@ export default function scheduleBackfillTests({ getService }: FtrProviderContext error: 'Bad Request', message: '[request body.0]: Backfill end must be greater than backfill start', }); + + expect(response5.statusCode).to.eql(400); + expect(response5.body).to.eql({ + statusCode: 400, + error: 'Bad Request', + message: '[request body.0]: Backfill cannot look back more than 90 days', + }); + + expect(response6.statusCode).to.eql(400); + expect(response6.body).to.eql({ + statusCode: 400, + error: 'Bad Request', + message: '[request body.0]: Backfill cannot be scheduled for the future', + }); + + expect(response7.statusCode).to.eql(400); + expect(response7.body).to.eql({ + statusCode: 400, + error: 'Bad Request', + message: '[request body.0]: Backfill cannot be scheduled for the future', + }); break; default: throw new Error(`Scenario untested: ${JSON.stringify(scenario)}`); @@ -832,7 +713,7 @@ export default function scheduleBackfillTests({ getService }: FtrProviderContext .send([ { rule_id: 'ac612b4b-5d0c-46d7-855a-98dd920e3aa6', - start: '2023-10-19T12:00:00.000Z', + start: moment().utc().startOf('day').subtract(7, 'days').toISOString(), }, ]); @@ -872,6 +753,8 @@ export default function scheduleBackfillTests({ getService }: FtrProviderContext }); it('should handle schedule request where some requests succeed and some requests fail appropriately', async () => { + const start = moment().utc().startOf('day').subtract(7, 'days').toISOString(); + const end = moment().utc().startOf('day').subtract(5, 'days').toISOString(); // create 2 rules const rresponse1 = await supertest .post(`${getUrlPrefix(apiOptions.spaceId)}/api/alerting/rule`) @@ -927,16 +810,12 @@ export default function scheduleBackfillTests({ getService }: FtrProviderContext .set('kbn-xsrf', 'foo') .auth(apiOptions.username, apiOptions.password) .send([ - { - rule_id: ruleId1, - start: '2023-10-19T12:00:00.000Z', - end: '2023-10-21T00:00:00.000Z', - }, - { rule_id: ruleId2, start: '2023-10-19T12:00:00.000Z' }, - { rule_id: lifecycleRuleId, start: '2023-10-19T12:00:00.000Z' }, - { rule_id: disabledRuleId, start: '2023-10-19T12:00:00.000Z' }, - { rule_id: deletedRuleId, start: '2023-10-19T12:00:00.000Z' }, - { rule_id: ruleId1, start: '2023-10-19T12:00:00.000Z' }, + { rule_id: ruleId1, start, end }, + { rule_id: ruleId2, start }, + { rule_id: lifecycleRuleId, start }, + { rule_id: disabledRuleId, start }, + { rule_id: deletedRuleId, start }, + { rule_id: ruleId1, start }, ]); switch (scenario.id) { @@ -977,48 +856,42 @@ export default function scheduleBackfillTests({ getService }: FtrProviderContext backfillIds.push({ id: result[0].id, spaceId: apiOptions.spaceId }); expect(result[0].duration).to.eql('12h'); expect(result[0].enabled).to.eql(true); - expect(result[0].start).to.eql('2023-10-19T12:00:00.000Z'); - expect(result[0].end).to.eql('2023-10-21T00:00:00.000Z'); + expect(result[0].start).to.eql(start); + expect(result[0].end).to.eql(end); expect(result[0].status).to.eql('pending'); expect(result[0].space_id).to.eql(space.id); expect(typeof result[0].created_at).to.be('string'); testExpectedRule(result[0], ruleId1, false); - expect(result[0].schedule).to.eql([ - { - interval: '12h', - run_at: '2023-10-20T00:00:00.000Z', - status: 'pending', - }, - { - interval: '12h', - run_at: '2023-10-20T12:00:00.000Z', - status: 'pending', - }, - { - interval: '12h', - run_at: '2023-10-21T00:00:00.000Z', - status: 'pending', - }, - ]); + + let currentStart = start; + result[0].schedule.forEach((sched: any) => { + expect(sched.interval).to.eql('12h'); + expect(sched.status).to.eql('pending'); + const runAt = moment(currentStart).add(12, 'hours').toISOString(); + expect(sched.run_at).to.eql(runAt); + currentStart = runAt; + }); // successful schedule expect(typeof result[1].id).to.be('string'); backfillIds.push({ id: result[1].id, spaceId: apiOptions.spaceId }); expect(result[1].duration).to.eql('12h'); expect(result[1].enabled).to.eql(true); - expect(result[1].start).to.eql('2023-10-19T12:00:00.000Z'); - expect(result[1].end).to.eql('2023-10-20T00:00:00.000Z'); + expect(result[1].start).to.eql(start); + expect(result[1].end).to.eql(moment(start).add(12, 'hours').toISOString()); expect(result[1].status).to.eql('pending'); expect(result[1].space_id).to.eql(space.id); expect(typeof result[1].created_at).to.be('string'); testExpectedRule(result[1], ruleId2, false); - expect(result[1].schedule).to.eql([ - { - interval: '12h', - run_at: '2023-10-20T00:00:00.000Z', - status: 'pending', - }, - ]); + + currentStart = start; + result[1].schedule.forEach((sched: any) => { + expect(sched.interval).to.eql('12h'); + expect(sched.status).to.eql('pending'); + const runAt = moment(currentStart).add(12, 'hours').toISOString(); + expect(sched.run_at).to.eql(runAt); + currentStart = runAt; + }); // error scheduling due to unsupported rule type expect(result[2]).to.eql({ @@ -1049,19 +922,21 @@ export default function scheduleBackfillTests({ getService }: FtrProviderContext backfillIds.push({ id: result[5].id, spaceId: apiOptions.spaceId }); expect(result[5].duration).to.eql('12h'); expect(result[5].enabled).to.eql(true); - expect(result[5].start).to.eql('2023-10-19T12:00:00.000Z'); - expect(result[5].end).to.eql('2023-10-20T00:00:00.000Z'); + expect(result[5].start).to.eql(start); + expect(result[5].end).to.eql(moment(start).add(12, 'hours').toISOString()); expect(result[5].status).to.eql('pending'); expect(result[5].space_id).to.eql(space.id); expect(typeof result[5].created_at).to.be('string'); testExpectedRule(result[5], ruleId1, false); - expect(result[5].schedule).to.eql([ - { - interval: '12h', - run_at: '2023-10-20T00:00:00.000Z', - status: 'pending', - }, - ]); + + currentStart = start; + result[5].schedule.forEach((sched: any) => { + expect(sched.interval).to.eql('12h'); + expect(sched.status).to.eql('pending'); + const runAt = moment(currentStart).add(12, 'hours').toISOString(); + expect(sched.run_at).to.eql(runAt); + currentStart = runAt; + }); // check that the expected ad hoc run SOs were created const adHocRunSO1 = (await getAdHocRunSO(result[0].id)) as SavedObject; @@ -1076,64 +951,60 @@ export default function scheduleBackfillTests({ getService }: FtrProviderContext expect(typeof adHocRun1.createdAt).to.be('string'); expect(adHocRun1.duration).to.eql('12h'); expect(adHocRun1.enabled).to.eql(true); - expect(adHocRun1.start).to.eql('2023-10-19T12:00:00.000Z'); - expect(adHocRun1.end).to.eql('2023-10-21T00:00:00.000Z'); + expect(adHocRun1.start).to.eql(start); + expect(adHocRun1.end).to.eql(end); expect(adHocRun1.status).to.eql('pending'); expect(adHocRun1.spaceId).to.eql(space.id); testExpectedRule(adHocRun1, undefined, true); - expect(adHocRun1.schedule).to.eql([ - { - interval: '12h', - runAt: '2023-10-20T00:00:00.000Z', - status: 'pending', - }, - { - interval: '12h', - runAt: '2023-10-20T12:00:00.000Z', - status: 'pending', - }, - { - interval: '12h', - runAt: '2023-10-21T00:00:00.000Z', - status: 'pending', - }, - ]); + + currentStart = start; + adHocRun1.schedule.forEach((sched: any) => { + expect(sched.interval).to.eql('12h'); + expect(sched.status).to.eql('pending'); + const runAt = moment(currentStart).add(12, 'hours').toISOString(); + expect(sched.runAt).to.eql(runAt); + currentStart = runAt; + }); expect(typeof adHocRun2.apiKeyId).to.be('string'); expect(typeof adHocRun2.apiKeyToUse).to.be('string'); expect(typeof adHocRun2.createdAt).to.be('string'); expect(adHocRun2.duration).to.eql('12h'); expect(adHocRun2.enabled).to.eql(true); - expect(adHocRun2.start).to.eql('2023-10-19T12:00:00.000Z'); - expect(adHocRun2.end).to.eql('2023-10-20T00:00:00.000Z'); + expect(adHocRun2.start).to.eql(start); + expect(adHocRun2.end).to.eql(moment(start).add(12, 'hours').toISOString()); expect(adHocRun2.status).to.eql('pending'); expect(adHocRun2.spaceId).to.eql(space.id); testExpectedRule(adHocRun2, undefined, true); - expect(adHocRun2.schedule).to.eql([ - { - runAt: '2023-10-20T00:00:00.000Z', - status: 'pending', - interval: '12h', - }, - ]); + + currentStart = start; + adHocRun2.schedule.forEach((sched: any) => { + expect(sched.interval).to.eql('12h'); + expect(sched.status).to.eql('pending'); + const runAt = moment(currentStart).add(12, 'hours').toISOString(); + expect(sched.runAt).to.eql(runAt); + currentStart = runAt; + }); expect(typeof adHocRun3.apiKeyId).to.be('string'); expect(typeof adHocRun3.apiKeyToUse).to.be('string'); expect(typeof adHocRun3.createdAt).to.be('string'); expect(adHocRun3.duration).to.eql('12h'); expect(adHocRun3.enabled).to.eql(true); - expect(adHocRun3.start).to.eql('2023-10-19T12:00:00.000Z'); - expect(adHocRun3.end).to.eql('2023-10-20T00:00:00.000Z'); + expect(adHocRun3.start).to.eql(start); + expect(adHocRun3.end).to.eql(moment(start).add(12, 'hours').toISOString()); expect(adHocRun3.status).to.eql('pending'); expect(adHocRun3.spaceId).to.eql(space.id); testExpectedRule(adHocRun3, undefined, true); - expect(adHocRun3.schedule).to.eql([ - { - runAt: '2023-10-20T00:00:00.000Z', - status: 'pending', - interval: '12h', - }, - ]); + + currentStart = start; + adHocRun3.schedule.forEach((sched: any) => { + expect(sched.interval).to.eql('12h'); + expect(sched.status).to.eql('pending'); + const runAt = moment(currentStart).add(12, 'hours').toISOString(); + expect(sched.runAt).to.eql(runAt); + currentStart = runAt; + }); // check references are stored correctly expect(adHocRunSO1.references).to.eql([{ id: ruleId1, name: 'rule', type: 'alert' }]); diff --git a/x-pack/test/alerting_api_integration/security_and_spaces/group1/tests/alerting/backfill/task_runner.ts b/x-pack/test/alerting_api_integration/security_and_spaces/group1/tests/alerting/backfill/task_runner.ts index 72635b82c8daf..6b555198e5eff 100644 --- a/x-pack/test/alerting_api_integration/security_and_spaces/group1/tests/alerting/backfill/task_runner.ts +++ b/x-pack/test/alerting_api_integration/security_and_spaces/group1/tests/alerting/backfill/task_runner.ts @@ -6,6 +6,7 @@ */ import expect from '@kbn/expect'; +import moment from 'moment'; import { SearchHit } from '@elastic/elasticsearch/lib/api/typesWithBodyKey'; import type { SecurityAlert } from '@kbn/alerts-as-data-utils'; import { @@ -61,28 +62,28 @@ export default function createBackfillTaskRunnerTests({ getService }: FtrProvide const timestampPattern = /\d{4}-\d{2}-\d{2}T\d{2}:\d{2}:\d{2}.\d{3}Z/; const originalDocTimestamps = [ // before first backfill run - '2023-10-18T10:42:37.452Z', + moment().utc().subtract(14, 'days').toISOString(), // backfill execution set 1 - '2023-10-19T12:23:54.485Z', - '2023-10-19T13:48:11.654Z', - '2023-10-19T21:00:03.472Z', + moment().utc().startOf('day').subtract(13, 'days').add(64, 'seconds').toISOString(), + moment().utc().startOf('day').subtract(13, 'days').add(65, 'seconds').toISOString(), + moment().utc().startOf('day').subtract(13, 'days').add(66, 'seconds').toISOString(), // backfill execution set 2 - '2023-10-20T08:12:34.954Z', + moment().utc().startOf('day').subtract(12, 'days').add(89, 'seconds').toISOString(), // backfill execution set 3 - '2023-10-20T14:39:41.457Z', - '2023-10-20T14:39:41.457Z', - '2023-10-20T16:21:01.004Z', - '2023-10-20T19:02:12.475Z', - '2023-10-20T23:59:59.999Z', + moment().utc().startOf('day').subtract(11, 'days').add(785, 'seconds').toISOString(), + moment().utc().startOf('day').subtract(11, 'days').add(888, 'seconds').toISOString(), + moment().utc().startOf('day').subtract(11, 'days').add(954, 'seconds').toISOString(), + moment().utc().startOf('day').subtract(11, 'days').add(1045, 'seconds').toISOString(), + moment().utc().startOf('day').subtract(11, 'days').add(1145, 'seconds').toISOString(), // backfill execution set 4 purposely left empty // after last backfill - '2023-10-21T13:36:13.175Z', - '2023-10-21T15:42:31.145Z', + moment().utc().startOf('day').subtract(9, 'days').add(666, 'seconds').toISOString(), + moment().utc().startOf('day').subtract(9, 'days').add(667, 'seconds').toISOString(), ]; describe('ad hoc backfill task', () => { @@ -126,7 +127,7 @@ export default function createBackfillTaskRunnerTests({ getService }: FtrProvide tags: [], rule_type_id: 'siem.queryRule', consumer: 'siem', - schedule: { interval: '12h' }, + schedule: { interval: '24h' }, actions: [], params: { author: [], @@ -165,46 +166,30 @@ export default function createBackfillTaskRunnerTests({ getService }: FtrProvide const ruleId = response1.body.id; objectRemover.add(spaceId, ruleId, 'rule', 'alerting'); + const start = moment().utc().startOf('day').subtract(13, 'days').toISOString(); + const end = moment().utc().startOf('day').subtract(9, 'days').toISOString(); + // Schedule backfill for this rule const response2 = await supertestWithoutAuth .post(`${getUrlPrefix(spaceId)}/internal/alerting/rules/backfill/_schedule`) .set('kbn-xsrf', 'foo') .auth(SuperuserAtSpace1.user.username, SuperuserAtSpace1.user.password) - .send([ - { - rule_id: ruleId, - start: '2023-10-19T12:00:00.000Z', - end: '2023-10-21T12:00:00.000Z', - }, - ]) + .send([{ rule_id: ruleId, start, end }]) .expect(200); const scheduleResult = response2.body; expect(scheduleResult.length).to.eql(1); expect(scheduleResult[0].schedule.length).to.eql(4); - expect(scheduleResult[0].schedule).to.eql([ - { - interval: '12h', - run_at: '2023-10-20T00:00:00.000Z', - status: 'pending', - }, - { - interval: '12h', - run_at: '2023-10-20T12:00:00.000Z', - status: 'pending', - }, - { - interval: '12h', - run_at: '2023-10-21T00:00:00.000Z', - status: 'pending', - }, - { - interval: '12h', - run_at: '2023-10-21T12:00:00.000Z', - status: 'pending', - }, - ]); + + let currentStart = start; + scheduleResult[0].schedule.forEach((sched: any) => { + expect(sched.interval).to.eql('24h'); + expect(sched.status).to.eql('pending'); + const runAt = moment(currentStart).add(24, 'hours').toISOString(); + expect(sched.run_at).to.eql(runAt); + currentStart = runAt; + }); const backfillId = scheduleResult[0].id; @@ -414,16 +399,12 @@ export default function createBackfillTaskRunnerTests({ getService }: FtrProvide objectRemover.add(spaceId, ruleId, 'rule', 'alerting'); // schedule backfill for this rule + const start = moment().utc().startOf('day').subtract(13, 'days').toISOString(); const response2 = await supertestWithoutAuth .post(`${getUrlPrefix(spaceId)}/internal/alerting/rules/backfill/_schedule`) .set('kbn-xsrf', 'foo') .auth(SuperuserAtSpace1.user.username, SuperuserAtSpace1.user.password) - .send([ - { - rule_id: ruleId, - start: '2023-10-19T12:00:00.000Z', - }, - ]) + .send([{ rule_id: ruleId, start }]) .expect(200); const scheduleResult = response2.body; @@ -433,7 +414,7 @@ export default function createBackfillTaskRunnerTests({ getService }: FtrProvide expect(scheduleResult[0].schedule).to.eql([ { interval: '12h', - run_at: '2023-10-20T00:00:00.000Z', + run_at: moment(start).add(12, 'hours').toISOString(), status: 'pending', }, ]); @@ -556,45 +537,27 @@ export default function createBackfillTaskRunnerTests({ getService }: FtrProvide objectRemover.add(spaceId, ruleId, 'rule', 'alerting'); // schedule backfill for this rule + const start = moment().utc().startOf('day').subtract(13, 'days').toISOString(); + const end = moment().utc().startOf('day').subtract(11, 'days').toISOString(); const response2 = await supertestWithoutAuth .post(`${getUrlPrefix(spaceId)}/internal/alerting/rules/backfill/_schedule`) .set('kbn-xsrf', 'foo') .auth(SuperuserAtSpace1.user.username, SuperuserAtSpace1.user.password) - .send([ - { - rule_id: ruleId, - start: '2023-10-19T12:00:00.000Z', - end: '2023-10-21T12:00:00.000Z', - }, - ]) + .send([{ rule_id: ruleId, start, end }]) .expect(200); const scheduleResult = response2.body; expect(scheduleResult.length).to.eql(1); expect(scheduleResult[0].schedule.length).to.eql(4); - expect(scheduleResult[0].schedule).to.eql([ - { - interval: '12h', - run_at: '2023-10-20T00:00:00.000Z', - status: 'pending', - }, - { - interval: '12h', - run_at: '2023-10-20T12:00:00.000Z', - status: 'pending', - }, - { - interval: '12h', - run_at: '2023-10-21T00:00:00.000Z', - status: 'pending', - }, - { - interval: '12h', - run_at: '2023-10-21T12:00:00.000Z', - status: 'pending', - }, - ]); + let currentStart = start; + scheduleResult[0].schedule.forEach((sched: any) => { + expect(sched.interval).to.eql('12h'); + expect(sched.status).to.eql('pending'); + const runAt = moment(currentStart).add(12, 'hours').toISOString(); + expect(sched.run_at).to.eql(runAt); + currentStart = runAt; + }); const backfillId = scheduleResult[0].id; From e7a9291bb97d7a3bdef947ed8f8c39d8cc4c3a56 Mon Sep 17 00:00:00 2001 From: Brandon Morelli Date: Wed, 8 May 2024 10:09:49 -0700 Subject: [PATCH 83/86] Add synthetic serverless doc links (#182740) ## Summary Adds Synthetic Serverless doc links (and one missing logs link). Closes https://github.com/elastic/obs-docs-team/issues/219. --------- Co-authored-by: kibanamachine <42973632+kibanamachine@users.noreply.github.com> Co-authored-by: DeDe Morton --- packages/kbn-doc-links/src/get_doc_links.ts | 28 +++++++++++++++------ 1 file changed, 21 insertions(+), 7 deletions(-) diff --git a/packages/kbn-doc-links/src/get_doc_links.ts b/packages/kbn-doc-links/src/get_doc_links.ts index f42bd3b688e4e..16d4fc648c3c6 100644 --- a/packages/kbn-doc-links/src/get_doc_links.ts +++ b/packages/kbn-doc-links/src/get_doc_links.ts @@ -578,21 +578,33 @@ export const getDocLinks = ({ kibanaBranch, buildFlavor }: GetDocLinkOptions): D ? `${SERVERLESS_OBSERVABILITY_DOCS}create-custom-threshold-alert-rule` : `${OBSERVABILITY_DOCS}custom-threshold-alert.html`, monitorStatus: `${OBSERVABILITY_DOCS}monitor-status-alert.html`, - monitorUptime: `${OBSERVABILITY_DOCS}monitor-uptime.html`, + monitorUptime: isServerless + ? `${SERVERLESS_OBSERVABILITY_DOCS}monitor-synthetics` + : `${OBSERVABILITY_DOCS}monitor-uptime.html`, tlsCertificate: `${OBSERVABILITY_DOCS}tls-certificate-alert.html`, uptimeDurationAnomaly: `${OBSERVABILITY_DOCS}duration-anomaly-alert.html`, - monitorLogs: `${OBSERVABILITY_DOCS}monitor-logs.html`, + monitorLogs: isServerless + ? `${SERVERLESS_OBSERVABILITY_DOCS}discover-and-explore-logs` + : `${OBSERVABILITY_DOCS}monitor-logs.html`, analyzeMetrics: isServerless ? `${SERVERLESS_OBSERVABILITY_DOCS}infrastructure-monitoring` : `${OBSERVABILITY_DOCS}analyze-metrics.html`, - monitorUptimeSynthetics: `${OBSERVABILITY_DOCS}monitor-uptime-synthetics.html`, + monitorUptimeSynthetics: isServerless + ? `${SERVERLESS_OBSERVABILITY_DOCS}monitor-synthetics` + : `${OBSERVABILITY_DOCS}monitor-uptime-synthetics.html`, userExperience: `${OBSERVABILITY_DOCS}user-experience.html`, createAlerts: isServerless ? `${SERVERLESS_OBSERVABILITY_DOCS}alerting` : `${OBSERVABILITY_DOCS}create-alerts.html`, - syntheticsAlerting: `${OBSERVABILITY_DOCS}synthetics-settings.html#synthetics-settings-alerting`, - syntheticsCommandReference: `${OBSERVABILITY_DOCS}synthetics-configuration.html#synthetics-configuration-playwright-options`, - syntheticsProjectMonitors: `${OBSERVABILITY_DOCS}synthetic-run-tests.html#synthetic-monitor-choose-project`, + syntheticsAlerting: isServerless + ? `${SERVERLESS_OBSERVABILITY_DOCS}synthetics-settings#alerting` + : `${OBSERVABILITY_DOCS}synthetics-settings.html#synthetics-settings-alerting`, + syntheticsCommandReference: isServerless + ? `${SERVERLESS_OBSERVABILITY_DOCS}synthetics-configuration#playwrightoptions` + : `${OBSERVABILITY_DOCS}synthetics-configuration.html#synthetics-configuration-playwright-options`, + syntheticsProjectMonitors: isServerless + ? `${SERVERLESS_OBSERVABILITY_DOCS}synthetics-get-started-project` + : `${OBSERVABILITY_DOCS}synthetic-run-tests.html#synthetic-monitor-choose-project`, syntheticsMigrateFromIntegration: `${OBSERVABILITY_DOCS}synthetics-migrate-from-integration.html`, sloBurnRateRule: isServerless ? `${SERVERLESS_OBSERVABILITY_DOCS}create-slo-burn-rate-alert-rule` @@ -940,7 +952,9 @@ export const getDocLinks = ({ kibanaBranch, buildFlavor }: GetDocLinkOptions): D apiKeyPrivileges: `${SERVERLESS_DOCS}api-keys#restrict-privileges`, }, synthetics: { - featureRoles: `${OBSERVABILITY_DOCS}synthetics-feature-roles.html`, + featureRoles: isServerless + ? `${SERVERLESS_OBSERVABILITY_DOCS}synthetics-feature-roles` + : `${OBSERVABILITY_DOCS}synthetics-feature-roles.html`, }, telemetry: { settings: `${KIBANA_DOCS}telemetry-settings-kbn.html`, From 718e6f0348e23707f18b6dd0f287a87dc7152a08 Mon Sep 17 00:00:00 2001 From: Nicolas Chaulet Date: Wed, 8 May 2024 13:21:51 -0400 Subject: [PATCH 84/86] [Fleet] Support granular privileges for endpoint action menu (#182617) --- .../endpoint/service/authz/authz.test.ts | 24 +++++++++++++++++++ .../common/endpoint/service/authz/authz.ts | 6 +++++ .../common/endpoint/types/authz.ts | 6 +++++ .../view/hooks/use_endpoint_action_items.tsx | 18 +++++++++++--- .../pages/endpoint_hosts/view/index.test.tsx | 5 +++- 5 files changed, 55 insertions(+), 4 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 a3b3ebaf26142..b5e4e874c7537 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 @@ -98,6 +98,27 @@ describe('Endpoint Authz service', () => { ); }); + it('should not give canReadFleetAgents if `fleet.readAgents` is false', () => { + fleetAuthz.fleet.readAgents = false; + expect(calculateEndpointAuthz(licenseService, fleetAuthz, userRoles).canReadFleetAgents).toBe( + false + ); + }); + + it('should not give canWriteFleetAgents if `fleet.allAgents` is false', () => { + fleetAuthz.fleet.allAgents = false; + expect( + calculateEndpointAuthz(licenseService, fleetAuthz, userRoles).canWriteFleetAgents + ).toBe(false); + }); + + it('should not give canReadFleetAgentPolicies if `fleet.readAgentPolicies` is false', () => { + fleetAuthz.fleet.readAgentPolicies = false; + expect( + calculateEndpointAuthz(licenseService, fleetAuthz, userRoles).canReadFleetAgentPolicies + ).toBe(false); + }); + it('should not give canAccessEndpointManagement if not superuser', () => { userRoles = []; expect( @@ -276,6 +297,9 @@ describe('Endpoint Authz service', () => { canWriteSecuritySolution: false, canReadSecuritySolution: false, canAccessFleet: false, + canReadFleetAgentPolicies: false, + canReadFleetAgents: false, + canWriteFleetAgents: false, canAccessEndpointActionsLogManagement: false, canAccessEndpointManagement: false, canCreateArtifactsByPolicy: 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 f38a636b78211..95430a6df82fb 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 @@ -98,6 +98,9 @@ export const calculateEndpointAuthz = ( canWriteSecuritySolution, canReadSecuritySolution, canAccessFleet: fleetAuthz?.fleet.all ?? false, + canReadFleetAgentPolicies: fleetAuthz?.fleet.readAgentPolicies ?? false, + canWriteFleetAgents: fleetAuthz?.fleet.allAgents ?? false, + canReadFleetAgents: fleetAuthz?.fleet.readAgents ?? false, canAccessEndpointManagement: hasEndpointManagementAccess, // TODO: is this one deprecated? it is the only place we need to check for superuser. canCreateArtifactsByPolicy: isPlatinumPlusLicense, canWriteEndpointList, @@ -157,6 +160,9 @@ export const getEndpointAuthzInitialState = (): EndpointAuthz => { canWriteSecuritySolution: false, canReadSecuritySolution: false, canAccessFleet: false, + canReadFleetAgentPolicies: false, + canReadFleetAgents: false, + canWriteFleetAgents: false, canAccessEndpointActionsLogManagement: false, canAccessEndpointManagement: false, canCreateArtifactsByPolicy: 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 1ec8f84a87073..0ccefaa686f72 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,12 @@ export interface EndpointAuthz { canReadSecuritySolution: boolean; /** If the user has permissions to access Fleet */ canAccessFleet: boolean; + /** If the user has permissions to access Fleet Agent policies */ + canReadFleetAgentPolicies: boolean; + /** If the user has permissions to read Fleet Agents */ + canReadFleetAgents: boolean; + /** If the user has permissions to write Fleet Agents */ + canWriteFleetAgents: boolean; /** If the user has permissions to access Endpoint management (includes check to ensure they also have access to fleet) */ canAccessEndpointManagement: boolean; /** If the user has permissions to access Actions Log management and also has a platinum license (used for endpoint details flyout) */ diff --git a/x-pack/plugins/security_solution/public/management/pages/endpoint_hosts/view/hooks/use_endpoint_action_items.tsx b/x-pack/plugins/security_solution/public/management/pages/endpoint_hosts/view/hooks/use_endpoint_action_items.tsx index 1bd0c3dff62ff..5003aeae08840 100644 --- a/x-pack/plugins/security_solution/public/management/pages/endpoint_hosts/view/hooks/use_endpoint_action_items.tsx +++ b/x-pack/plugins/security_solution/public/management/pages/endpoint_hosts/view/hooks/use_endpoint_action_items.tsx @@ -43,7 +43,9 @@ export const useEndpointActionItems = ( canIsolateHost, canUnIsolateHost, canAccessEndpointActionsLogManagement, - canAccessFleet, + canReadFleetAgentPolicies, + canWriteFleetAgents, + canReadFleetAgents, } = useUserPrivileges().endpointPrivileges; return useMemo(() => { @@ -177,7 +179,7 @@ export const useEndpointActionItems = ( /> ), }, - ...(canAccessFleet + ...(canReadFleetAgentPolicies ? [ { icon: 'gear', @@ -204,6 +206,10 @@ export const useEndpointActionItems = ( /> ), }, + ] + : []), + ...(canReadFleetAgents + ? [ { icon: 'gear', key: 'agentDetailsLink', @@ -228,6 +234,10 @@ export const useEndpointActionItems = ( /> ), }, + ] + : []), + ...(canWriteFleetAgents + ? [ { icon: 'gear', key: 'agentPolicyReassignLink', @@ -272,6 +282,8 @@ export const useEndpointActionItems = ( options?.isEndpointList, canIsolateHost, canUnIsolateHost, - canAccessFleet, + canReadFleetAgentPolicies, + canReadFleetAgents, + canWriteFleetAgents, ]); }; diff --git a/x-pack/plugins/security_solution/public/management/pages/endpoint_hosts/view/index.test.tsx b/x-pack/plugins/security_solution/public/management/pages/endpoint_hosts/view/index.test.tsx index f625e88e8a30c..91bc557d94d2d 100644 --- a/x-pack/plugins/security_solution/public/management/pages/endpoint_hosts/view/index.test.tsx +++ b/x-pack/plugins/security_solution/public/management/pages/endpoint_hosts/view/index.test.tsx @@ -1455,12 +1455,15 @@ describe('when on the endpoint list page', () => { const hostLink = await renderResult.findByTestId('hostLink'); expect(hostLink).not.toBeNull(); }); - it('shows Agent Policy, View Agent Details and Reassign Policy Links when canAccessFleet RBAC control is enabled', async () => { + it('shows Agent Policy, View Agent Details and Reassign Policy Links when canReadFleetAgents,canWriteFleetAgents,canReadFleetAgentPolicies RBAC control is enabled', async () => { mockUserPrivileges.mockReturnValue({ ...mockInitialUserPrivilegesState(), endpointPrivileges: { ...mockInitialUserPrivilegesState().endpointPrivileges, canAccessFleet: true, + canReadFleetAgents: true, + canWriteFleetAgents: true, + canReadFleetAgentPolicies: true, }, }); await renderAndClickActionsButton(); From 0833045a42cd0b0f788e3a743953f9e364705350 Mon Sep 17 00:00:00 2001 From: Julia Bardi <90178898+juliaElastic@users.noreply.github.com> Date: Wed, 8 May 2024 19:54:21 +0200 Subject: [PATCH 85/86] [Fleet] rollback input package install on failure (#182665) ## Summary Closes https://github.com/elastic/kibana/issues/181032 2 improvements on input package policy creation failure handling: - if the package was not installed initially, rolling back on failure - only saving es references with the input package installation if the templates are added successfully, to prevent issues with upgrade later if the references would contain invalid template names - this is needed if the input package was installed before attempting to add a package policy, in this case we don't want to completely uninstall the package on failure To verify: Custom Logs package uninstalled: - add Custom Logs integration with dataset name with a * in it e.g. `generic*` - the package policy creation is expected to fail - verify that the Custom Logs package is not installed Custom Logs package installed: - Install Custom Logs package without package policy or add integration with the default dataset name to succeed - try adding another policy with dataset `generic*` - the package policy creation is expected to fail - verify that the Custom Logs package doesn't have any `installed_es` references with the invalid `generic*` prefix `GET .kibana_ingest/_search?q=epm-packages.name:log` ### Checklist - [x] [Unit or functional tests](https://www.elastic.co/guide/en/kibana/master/development-tests.html) were updated or added to match the most common scenarios --------- Co-authored-by: Jen Huang --- .../single_page_layout/hooks/form.tsx | 3 +- .../server/routes/package_policy/handlers.ts | 35 ++++- .../install_index_template_pipeline.ts | 23 +-- .../apis/package_policy/index.js | 1 + .../package_policy/input_package_rollback.ts | 136 ++++++++++++++++++ 5 files changed, 186 insertions(+), 12 deletions(-) create mode 100644 x-pack/test/fleet_api_integration/apis/package_policy/input_package_rollback.ts diff --git a/x-pack/plugins/fleet/public/applications/fleet/sections/agent_policy/create_package_policy_page/single_page_layout/hooks/form.tsx b/x-pack/plugins/fleet/public/applications/fleet/sections/agent_policy/create_package_policy_page/single_page_layout/hooks/form.tsx index 83453496507b0..b256349f5d6b9 100644 --- a/x-pack/plugins/fleet/public/applications/fleet/sections/agent_policy/create_package_policy_page/single_page_layout/hooks/form.tsx +++ b/x-pack/plugins/fleet/public/applications/fleet/sections/agent_policy/create_package_policy_page/single_page_layout/hooks/form.tsx @@ -272,7 +272,8 @@ export function useOnSubmit({ setFormState('LOADING'); if ((withSysMonitoring || newAgentPolicy.monitoring_enabled?.length) ?? 0 > 0) { const packagesToPreinstall: Array = []; - if (packageInfo) { + // skip preinstall of input package, to be able to rollback when package policy creation fails + if (packageInfo && packageInfo.type !== 'input') { packagesToPreinstall.push({ name: packageInfo.name, version: packageInfo.version }); } if (withSysMonitoring) { diff --git a/x-pack/plugins/fleet/server/routes/package_policy/handlers.ts b/x-pack/plugins/fleet/server/routes/package_policy/handlers.ts index 7631e38f8df31..86d9be70435a5 100644 --- a/x-pack/plugins/fleet/server/routes/package_policy/handlers.ts +++ b/x-pack/plugins/fleet/server/routes/package_policy/handlers.ts @@ -48,7 +48,12 @@ import { PackagePolicyNotFoundError, PackagePolicyRequestError, } from '../../errors'; -import { getInstallations, getPackageInfo } from '../../services/epm/packages'; +import { + getInstallation, + getInstallations, + getPackageInfo, + removeInstallation, +} from '../../services/epm/packages'; import { PACKAGES_SAVED_OBJECT_TYPE, SO_SEARCH_LIMIT } from '../../constants'; import { simplifiedPackagePolicytoNewPackagePolicy, @@ -229,6 +234,7 @@ export const createPackagePolicyHandler: FleetRequestHandler< const user = appContextService.getSecurity()?.authc.getCurrentUser(request) || undefined; const { force, id, package: pkg, ...newPolicy } = request.body; const authorizationHeader = HTTPAuthorizationHeader.parseFromRequest(request, user?.username); + let wasPackageAlreadyInstalled = false; if ('output_id' in newPolicy) { // TODO Remove deprecated APIs https://github.com/elastic/kibana/issues/121485 @@ -258,6 +264,12 @@ export const createPackagePolicyHandler: FleetRequestHandler< } as NewPackagePolicy); } + const installation = await getInstallation({ + savedObjectsClient: soClient, + pkgName: pkg!.name, + }); + wasPackageAlreadyInstalled = installation?.install_status === 'installed'; + // Create package policy const packagePolicy = await fleetContext.packagePolicyService.asCurrentUser.create( soClient, @@ -282,6 +294,27 @@ export const createPackagePolicyHandler: FleetRequestHandler< }, }); } catch (error) { + appContextService + .getLogger() + .error(`Error while creating package policy due to error: ${error.message}`); + if (!wasPackageAlreadyInstalled) { + const installation = await getInstallation({ + savedObjectsClient: soClient, + pkgName: pkg!.name, + }); + if (installation) { + appContextService + .getLogger() + .info(`rollback ${pkg!.name}-${pkg!.version} package installation after error`); + await removeInstallation({ + savedObjectsClient: soClient, + pkgName: pkg!.name, + pkgVersion: pkg!.version, + esClient, + }); + } + } + if (error.statusCode) { return response.customError({ statusCode: error.statusCode, diff --git a/x-pack/plugins/fleet/server/services/epm/packages/install_index_template_pipeline.ts b/x-pack/plugins/fleet/server/services/epm/packages/install_index_template_pipeline.ts index 8092a133490af..ad738d1710fcc 100644 --- a/x-pack/plugins/fleet/server/services/epm/packages/install_index_template_pipeline.ts +++ b/x-pack/plugins/fleet/server/services/epm/packages/install_index_template_pipeline.ts @@ -68,16 +68,7 @@ export async function installIndexTemplatesAndPipelines({ // cleanup in the case that a single asset fails to install. let newEsReferences: EsAssetReference[] = []; - if (onlyForDataStreams) { - // if onlyForDataStreams is present that means we are in create package policy flow - // not install flow, meaning we do not have a lock on the installation SO - // so we need to use optimistic concurrency control - newEsReferences = await optimisticallyAddEsAssetReferences( - savedObjectsClient, - packageInstallContext.packageInfo.name, - [...preparedIngestPipelines.assetsToAdd, ...preparedIndexTemplates.assetsToAdd] - ); - } else { + if (!onlyForDataStreams) { newEsReferences = await updateEsAssetReferences( savedObjectsClient, packageInstallContext.packageInfo.name, @@ -103,6 +94,18 @@ export async function installIndexTemplatesAndPipelines({ ), ]); + // only add ES references if templates and pipelines were installed successfully, to prevent upgrade issues for referencing invalid template name + if (onlyForDataStreams) { + // if onlyForDataStreams is present that means we are in create package policy flow + // not install flow, meaning we do not have a lock on the installation SO + // so we need to use optimistic concurrency control + newEsReferences = await optimisticallyAddEsAssetReferences( + savedObjectsClient, + packageInstallContext.packageInfo.name, + [...preparedIngestPipelines.assetsToAdd, ...preparedIndexTemplates.assetsToAdd] + ); + } + return { esReferences: newEsReferences, installedTemplates, diff --git a/x-pack/test/fleet_api_integration/apis/package_policy/index.js b/x-pack/test/fleet_api_integration/apis/package_policy/index.js index f4f3069922c1d..8cb9cbd66a186 100644 --- a/x-pack/test/fleet_api_integration/apis/package_policy/index.js +++ b/x-pack/test/fleet_api_integration/apis/package_policy/index.js @@ -19,5 +19,6 @@ export default function loadTests({ loadTestFile, getService }) { loadTestFile(require.resolve('./delete')); loadTestFile(require.resolve('./upgrade')); loadTestFile(require.resolve('./input_package_create_upgrade')); + loadTestFile(require.resolve('./input_package_rollback')); }); } diff --git a/x-pack/test/fleet_api_integration/apis/package_policy/input_package_rollback.ts b/x-pack/test/fleet_api_integration/apis/package_policy/input_package_rollback.ts new file mode 100644 index 0000000000000..50c325dac22fb --- /dev/null +++ b/x-pack/test/fleet_api_integration/apis/package_policy/input_package_rollback.ts @@ -0,0 +1,136 @@ +/* + * Copyright 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 { sortBy } from 'lodash'; +import { FtrProviderContext } from '../../../api_integration/ftr_provider_context'; +import { skipIfNoDockerRegistry } from '../../helpers'; +import { setupFleetAndAgents } from '../agents/services'; +const PACKAGE_NAME = 'input_package_upgrade'; +const START_VERSION = '1.0.0'; + +const expectIdArraysEqual = (arr1: any[], arr2: any[]) => { + expect(sortBy(arr1, 'id')).to.eql(sortBy(arr2, 'id')); +}; +export default function (providerContext: FtrProviderContext) { + const { getService } = providerContext; + const supertest = getService('supertest'); + const uninstallPackage = async (name: string, version: string) => { + await supertest.delete(`/api/fleet/epm/packages/${name}/${version}`).set('kbn-xsrf', 'xxxx'); + }; + + const installPackage = async (name: string, version: string) => { + return await supertest + .post(`/api/fleet/epm/packages/${name}/${version}`) + .set('kbn-xsrf', 'xxxx') + .send({ force: true }) + .expect(200); + }; + + const getInstallationSavedObject = async (name: string, version: string) => { + const res = await supertest.get(`/api/fleet/epm/packages/${name}/${version}`).expect(200); + return res.body.item.savedObject.attributes; + }; + + const getPackage = async (name: string, version: string) => { + const res = await supertest.get(`/api/fleet/epm/packages/${name}/${version}`).expect(200); + return res.body.item; + }; + + const createPackagePolicyWithDataset = async ( + agentPolicyId: string, + dataset: string, + expectStatusCode = 200, + force = false + ) => { + const policy = { + force, + policy_id: agentPolicyId, + package: { + name: PACKAGE_NAME, + version: START_VERSION, + }, + name: 'test-policy-' + dataset, + description: '', + namespace: 'default', + inputs: { + 'logs-logfile': { + enabled: true, + streams: { + 'input_package_upgrade.logs': { + enabled: true, + vars: { + paths: ['/tmp/test/log'], + tags: ['tag1'], + ignore_older: '72h', + 'data_stream.dataset': dataset, + }, + }, + }, + }, + }, + }; + const res = await supertest + .post(`/api/fleet/package_policies`) + .set('kbn-xsrf', 'xxxx') + .send(policy) + .expect(expectStatusCode); + + return res.body.item; + }; + + const createAgentPolicy = async (name = 'Input Package Test 3') => { + const res = await supertest + .post(`/api/fleet/agent_policies`) + .set('kbn-xsrf', 'xxxx') + .send({ + name, + namespace: 'default', + }) + .expect(200); + return res.body.item; + }; + + const deleteAgentPolicy = async (agentPolicyId: string) => { + if (!agentPolicyId) return; + return supertest + .post(`/api/fleet/agent_policies/delete`) + .set('kbn-xsrf', 'xxxx') + .send({ agentPolicyId }); + }; + + describe('input package policy rollback', async function () { + skipIfNoDockerRegistry(providerContext); + + let agentPolicyId: string; + before(async () => { + const agentPolicy = await createAgentPolicy(); + agentPolicyId = agentPolicy.id; + }); + + after(async () => { + await deleteAgentPolicy(agentPolicyId); + }); + setupFleetAndAgents(providerContext); + + it('should rollback package install on package policy create failure', async () => { + await createPackagePolicyWithDataset(agentPolicyId, 'test*', 400); + + const pkg = await getPackage(PACKAGE_NAME, START_VERSION); + expect(pkg?.status).to.eql('not_installed'); + }); + + it('should not add es references on package policy create failure when package is already installed', async () => { + await installPackage(PACKAGE_NAME, START_VERSION); + await createPackagePolicyWithDataset(agentPolicyId, 'test*', 400); + + const installation = await getInstallationSavedObject(PACKAGE_NAME, START_VERSION); + expectIdArraysEqual(installation.installed_es, []); + + await uninstallPackage(PACKAGE_NAME, START_VERSION); + }); + }); +} From 50b04d5cd518f461981ee62daa9d24ca89e42a42 Mon Sep 17 00:00:00 2001 From: Sandra G Date: Wed, 8 May 2024 14:44:32 -0400 Subject: [PATCH 86/86] [APM UI] decrease bucket size top_dependencies sends to get_connection_stats query (#182884) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Fixes https://github.com/elastic/kibana/issues/178491 ## Summary The user receives a `too_many_buckets` exception when querying for 90 days worth of data and in many other longer time ranges. This is due to the date histogram within each service having time intervals that are too small. ## Solution Lowering `numBuckets` cause the time periods to increase because the algorithm divides the date the user selects by this number (duration / numBuckets). The larger the time range is, [the more likely it will choose an interval that is larger](https://github.com/elastic/kibana/blob/main/x-pack/plugins/observability_solution/apm/common/utils/get_bucket_size/calculate_auto.js#L11), resulting in less buckets per date histogram. The exception can still be thrown when users select time ranges that aren't caught in the algorithm, for eg selecting 4 years or more will cause the error should a user have around the max # of dependencies (1500). This is because our [smallest time interval is 30 days](https://github.com/elastic/kibana/blob/main/x-pack/plugins/observability_solution/apm/common/utils/get_bucket_size/calculate_auto.js#L26) and that interval becomes too small in a large time range. We can recommend in this case to increase the max bucket size in elasticsearch. There needs to be a balance with how much we try to stay under the default bucket limit vs letting the user change that size and get more data. Scenarios of duration and numBucket size and the resulting # of buckets with the max of 1500 dependencies: Screenshot 2024-05-08 at 7 41 22 AM ## Changes - lower `numBuckets` to 8 when calling `calculateAuto.near` - add unit tests to `calculateAuto.near` and `getBucketSize` ## Testing 1. Change the [many_dependencies.ts](https://github.com/elastic/kibana/blob/main/packages/kbn-apm-synthtrace/src/scenarios/many_dependencies.ts#L18-L19) synthtrace scenario to generate 1500 dependencies by changing these lines locally: ` const NUMBER_OF_DEPENDENCIES_PER_SERVICE = 15; const NUMBER_OF_SERVICES = 100; ` 1. run `node scripts/synthtrace many_dependencies.ts --live --clean` locally 3. run local kibana instance and navigate to APM dependencies inventory http://localhost:5601/app/apm/dependencies/inventory 4. try various date ranges --- .../get_bucket_size/calculate_auto.test.ts | 64 +++++++++++++++++++ .../get_bucket_size/get_bucket_size.test.ts | 48 ++++++++++++++ .../dependencies_inventory_table/index.tsx | 2 +- 3 files changed, 113 insertions(+), 1 deletion(-) create mode 100644 x-pack/plugins/observability_solution/apm/common/utils/get_bucket_size/calculate_auto.test.ts create mode 100644 x-pack/plugins/observability_solution/apm/common/utils/get_bucket_size/get_bucket_size.test.ts diff --git a/x-pack/plugins/observability_solution/apm/common/utils/get_bucket_size/calculate_auto.test.ts b/x-pack/plugins/observability_solution/apm/common/utils/get_bucket_size/calculate_auto.test.ts new file mode 100644 index 0000000000000..34f920a2a68dc --- /dev/null +++ b/x-pack/plugins/observability_solution/apm/common/utils/get_bucket_size/calculate_auto.test.ts @@ -0,0 +1,64 @@ +/* + * Copyright 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 moment from 'moment'; +import { calculateAuto } from './calculate_auto'; + +const numBuckets = 8; + +describe('calculateAuto', () => { + describe('when using near', () => { + const end = moment(); + it('returns 30 day interval for a 4 year duration', () => { + const start = moment().subtract(4, 'years'); + expect( + calculateAuto.near(numBuckets, moment.duration(end.diff(start)))?.asMilliseconds() + ).toEqual(2592000000); + }); + it('returns 30 day interval for a 1 year duration', () => { + const start = moment().subtract(1, 'years'); + expect( + calculateAuto.near(numBuckets, moment.duration(end.diff(start)))?.asMilliseconds() + ).toEqual(2592000000); + }); + it('returns 7 day interval for a 5 month duration', () => { + const start = moment().subtract(5, 'months'); + expect( + calculateAuto.near(numBuckets, moment.duration(end.diff(start)))?.asMilliseconds() + ).toEqual(604800000); + }); + it('returns 7 day interval for a 3 month duration', () => { + const start = moment().subtract(3, 'months'); + expect( + calculateAuto.near(numBuckets, moment.duration(end.diff(start)))?.asMilliseconds() + ).toEqual(604800000); + }); + it('returns 7 day interval for a 2 month duration', () => { + const start = moment().subtract(2, 'months'); + expect( + calculateAuto.near(numBuckets, moment.duration(end.diff(start)))?.asMilliseconds() + ).toEqual(604800000); + }); + it('returns 5 minute interval for a 1 hour duration', () => { + const start = moment().subtract(1, 'hour'); + expect( + calculateAuto.near(numBuckets, moment.duration(end.diff(start)))?.asMilliseconds() + ).toEqual(300000); + }); + it('returns 1 minute interval for a 15 minute duration', () => { + const start = moment().subtract(15, 'minutes'); + expect( + calculateAuto.near(numBuckets, moment.duration(end.diff(start)))?.asMilliseconds() + ).toEqual(60000); + }); + it('returns 5 second interval for a 1 minute duration', () => { + const start = moment().subtract(1, 'minutes'); + expect( + calculateAuto.near(numBuckets, moment.duration(end.diff(start)))?.asMilliseconds() + ).toEqual(5000); + }); + }); +}); diff --git a/x-pack/plugins/observability_solution/apm/common/utils/get_bucket_size/get_bucket_size.test.ts b/x-pack/plugins/observability_solution/apm/common/utils/get_bucket_size/get_bucket_size.test.ts new file mode 100644 index 0000000000000..6d3434b0cc9e2 --- /dev/null +++ b/x-pack/plugins/observability_solution/apm/common/utils/get_bucket_size/get_bucket_size.test.ts @@ -0,0 +1,48 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ +import moment from 'moment'; +import { getBucketSize } from '.'; + +const numBuckets = 8; + +describe('getBucketSize', () => { + const end = moment(); + it('returns 60 second interval for a 1 minute duration', () => { + const start = moment(end).subtract(15, 'milliseconds'); + const minBucketSize = 60; + expect( + getBucketSize({ + start: start.valueOf(), + end: end.valueOf(), + numBuckets, + minBucketSize, + }).bucketSize + ).toEqual(minBucketSize); + }); + it('returns minBucketSize for a less than 1 second duration', () => { + const start = moment(end).subtract(500, 'milliseconds'); // 0.5 seconds as milliseconds + const minBucketSize = 60; // in seconds + expect( + getBucketSize({ + start: start.valueOf(), + end: end.valueOf(), + numBuckets, + minBucketSize, + }).bucketSize + ).toEqual(minBucketSize); + }); + it('returns 1 for a less than 1 second duration when minBucketSize is not provided', () => { + const start = moment(end).subtract(500, 'milliseconds'); // 0.5 seconds as milliseconds + expect( + getBucketSize({ + start: start.valueOf(), + end: end.valueOf(), + numBuckets, + }).bucketSize + ).toEqual(1); + }); +}); diff --git a/x-pack/plugins/observability_solution/apm/public/components/app/dependencies_inventory/dependencies_inventory_table/index.tsx b/x-pack/plugins/observability_solution/apm/public/components/app/dependencies_inventory/dependencies_inventory_table/index.tsx index 7cf39b8bd1097..ee4cfc5d89fac 100644 --- a/x-pack/plugins/observability_solution/apm/public/components/app/dependencies_inventory/dependencies_inventory_table/index.tsx +++ b/x-pack/plugins/observability_solution/apm/public/components/app/dependencies_inventory/dependencies_inventory_table/index.tsx @@ -38,7 +38,7 @@ export function DependenciesInventoryTable() { start, end, environment, - numBuckets: 20, + numBuckets: 8, offset: comparisonEnabled && isTimeComparison(offset) ? offset : undefined, kuery, },